简体   繁体   English

用户定义的Web表单控件

[英]User Defined controls on web form

Using VS 2010, C#, .NET 3.5 使用VS 2010,C#、. NET 3.5

I have three User Defined Web Controls: 我有三个用户定义的Web控件:

Control 1 has a ListBox and A Button 控件1有一个列表框和一个按钮

Control 2 has three Text-Boxes two DropDownLists and three Buttons 控件2具有三个Text-Boxes两个DropDownLists和三个Buttons

Control 3 has only a Table which is populated in code. 控件3仅具有一个用代码填充的表。

I have two pages: 我有两个页面:

Page 1 has Control 2 and Control 3 页面1具有控件2和控件3

Page 2 has Control 1, Control 2, and Control 3 页面2具有控件1,控件2和控件3

Functionality of Control 2 works perfectly on Page 1. 控制2的功能在第1页上完美工作。

However, on Page 2 when the submit button is clicked, both DropDownLists ALWAYS show SelectedIndex = 0 and SelectedValue = "0" . 但是,在第2页上,单击“提交”按钮时,两个DropDownLists都始终显示SelectedIndex = 0SelectedValue = "0"

All three Text Boxes and Buttons retain their value on both pages when the Submit Button on Control 2 is clicked. 单击控件2上的Submit Button时,所有三个文本框和按钮在两个页面上均保留其值。 Only the DropDownLists fail to retain their value. 仅DropDownLists无法保留其值。

For reference, here is the code in the Submit Button OnClick event: 供参考,这是Submit Button OnClick事件中的代码:

    protected void btnSubmit_Click(object sender, EventArgs e)
    {
        clsLog.WriteLog("TrainingForm.ascx - Submit.");
        tcCategoryError.Text = " ";
        tcDateError.Text = " ";
        tcDescriptionError.Text = " ";
        tcHoursError.Text = " ";
        tcMethodError.Text = " ";
        foreach (Control c in this.Controls)
        {
            LogControls(c);
        }
        c_iTID = Convert.ToInt32(hTID.Value);
        c_szUserName = hUserName.Value;
        bool bValid = true;
        DateTime dtTrainingDate = DateTime.MinValue;
        string szTrainingDescription = "";
        decimal dHours = 0M;
        int iCategoryID = 0;
        int iMethodID = 0;
        if (!DateTime.TryParse(txtTrainingDate.Text, out dtTrainingDate))
        {
            bValid = false;
            tcDateError.Text = "Please Enter Valid Training Date";
        }
        if (!decimal.TryParse(txtTrainingHours.Text, out dHours))
        {
            bValid = false;
            tcHoursError.Text = "Please Enter Valid Training Hours";
        }
        if (this.ddlCategory.SelectedValue == "0")
        {
            bValid = false;
            tcCategoryError.Text = "Please Select Training Category";

        }
        else
            iCategoryID = Convert.ToInt32(this.ddlCategory.SelectedValue);
        if (this.ddlTrainingMethod.SelectedValue == "0")
        {
            bValid = false;
            tcMethodError.Text = "Please Select Training Method";
        }
        else 
            iMethodID = Convert.ToInt32(this.ddlTrainingMethod.SelectedValue);
        if (txtTrainingDescription.Text.Trim() == "")
        {
            bValid = false;
            tcDescriptionError.Text = "Please Enter Training description.";
        }
        else
            szTrainingDescription = txtTrainingDescription.Text.Trim();
        if (bValid)
        {
            clsData.UpdateTraining(c_iTID, "", c_szUserName, dtTrainingDate, szTrainingDescription, iCategoryID, dHours, iMethodID);
            TrainingID = 0;
            ClearForm();
        }
        OnEvent(new MyEventArgs(c_szUserName));

    }

Code to populate DropDowns (part of the User Defined Control) 填充DropDowns的代码(用户定义控件的一部分)

    protected void BindddlCategory(int iCategoryID)
    {
        DataTable dt = clsData.GetTrainingCategories();
        ddlCategory.Items.Clear();
        ddlCategory.AppendDataBoundItems = true;
        ddlCategory.Items.Add(new ListItem("Select Training Category", "0"));
        ddlCategory.DataSource = dt;
        ddlCategory.DataTextField = "TrainingCategory";
        ddlCategory.DataValueField = "CID";
        ddlCategory.DataBind();
        if (iCategoryID != 0)
            ddlCategory.SelectedValue = iCategoryID.ToString();
    }
    protected void BindddlCategory()
    {
        BindddlCategory(0);
    }
    protected void BindddlTrainingMethod(int iMethodID)
    {
        DataTable dt = clsData.GetTrainingMethods();
        ddlTrainingMethod.Items.Clear();
        ddlTrainingMethod.AppendDataBoundItems = true;
        ddlTrainingMethod.Items.Add(new ListItem("Select Training Method", "0"));
        ddlTrainingMethod.DataSource = dt;
        ddlTrainingMethod.DataTextField = "TrainingCategory";
        ddlTrainingMethod.DataValueField = "CID";
        ddlTrainingMethod.DataBind();
        if (iMethodID != 0)
            ddlTrainingMethod.SelectedValue = iMethodID.ToString();
    }
    protected void BindddlTrainingMethod()
    {
        BindddlTrainingMethod(0);
    }

FYI, the DDLs are NOT populated at Page load but implicitly populated when the event to show the form of the control is fired: 仅供参考,在页面加载时不会填充DDL,而是在触发显示控件形式的事件时隐式填充DDL:

    public void ShowTrainingEntry(int iTrainingID)
    {
        clsLog.WriteLog("TrainingForm.ascx - ShowTrainingEntry(" + iTrainingID.ToString() + ")");
        hTID.Value = iTrainingID.ToString();
        hUserName.Value = UserName;
        int iCategoryID = 0;
        int iMethodID = 0;
        if (iTrainingID != 0)
        {
            DataTable dt = clsData.GetTrainingRecord(iTrainingID);
            if (dt.Rows.Count == 1)
            {
                txtTrainingDate.Text = Convert.ToDateTime(dt.Rows[0]["TrainingDate"]).ToString("MM/dd/yyyy");
                txtTrainingHours.Text = Convert.ToDecimal(dt.Rows[0]["Hours"]).ToString("N1");
                txtTrainingDescription.Text = dt.Rows[0]["TrainingDescription"].ToString();
                int.TryParse(dt.Rows[0]["CategoryCID"].ToString(), out iCategoryID);
                int.TryParse(dt.Rows[0]["MethodCID"].ToString(), out iMethodID);
            }
            ShowChangeMessage(iCategoryID == 0 | iMethodID == 0);
            ShowDeleteButton(true);
            ShowCancelButton(true);
        }
        BindddlCategory(iCategoryID);
        BindddlTrainingMethod(iMethodID);
        tblMain.Visible = true;
    }

Anyone have any ideas on why this is happening? 有人对为什么会这样有任何想法吗?

Thanks, John 谢谢,约翰

If you are adding the UserControls dynamically, you need to make sure they are added no later than Page_Init. 如果要动态添加UserControl,则需要确保不迟于Page_Init添加它们。 This is so the controls are present when the page attempts to set the values from the PostBack. 这样,当页面尝试从PostBack设置值时,控件就出现了。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM