如何在PostBack之后从动态创建的DropDownList数组中获取选定的值(按钮单击)

时间:2011-05-05 06:39:17

标签: asp.net controls postback viewstate dynamic

我有一个包含向导步骤的员工姓名的CheckBoxList。选择员工并更改活动步骤后,将调用Wizard1_ActiveStepChanged函数,并为所选的每个员工动态创建DropDownList数组。每个DropDownList指定员工的条件。 DropDownList已正确创建。当用户单击“提交”时,将删除DropDownList数组,并且不能从数组中提取选定的值。

我理解这是PostBack的一个问题,可以用ViewState修复,但我想弄清楚我能做些什么来修复它。为checkboxlist和DropDownList启用了ViewState。

这就是我在System.Web.UI.Page类

中的内容
    private int empcount;
    private DropDownList[] DDL_Emp
    {
        get
        {
           return (DropDownList[])ViewState["DDL_Emp"];
        }
        set
        {
            ViewState["DDL_Emp"] = value;
        }
    }

相关代码:

    protected void Wizard1_ActiveStepChanged(object sender, EventArgs e)
    {

        if (Request.QueryString["type"] == "Accident"  && BulletedList1.Items.Count > 0)
        {
            this.empcount = 0;

            for (int i = 0; i < CBL_EmpInvolved.Items.Count; i++)
            {
                if (CBL_EmpInvolved.Items[i].Selected)
                {
                    this.empcount++;
                }

            }

            if(this.empcount > 0)
            {
                this.DDL_Emp = new DropDownList[this.empcount];                   



                for (int i = 0, j=0; i < CBL_EmpInvolved.Items.Count; i++) 
                {
                    if (CBL_EmpInvolved.Items[i].Selected)
                    {
                        List<ListItem> cond = new List<ListItem>();

                        cond.Add(new ListItem("Disabled", CBL_EmpInvolved.Items[i].Value));
                        cond.Add(new ListItem("Diseased - Fatality", CBL_EmpInvolved.Items[i].Value));                          
                        cond.Add(new ListItem("On Treatment - Short Term Disability", CBL_EmpInvolved.Items[i].Value));
                        cond.Add(new ListItem("On Treatment - Long Term Disability", CBL_EmpInvolved.Items[i].Value));
                        cond.Add(new ListItem("Treated - Back to Work", CBL_EmpInvolved.Items[i].Value));
                        cond.Add(new ListItem("Treated - Relocated", CBL_EmpInvolved.Items[i].Value));
                        cond.Add(new ListItem("Treated - Transferred", CBL_EmpInvolved.Items[i].Value));

                        this.DDL_Emp[j] = new DropDownList();

                        this.DDL_Emp[j].ID = "DD_LabCondition_" + CBL_EmpInvolved.Items[i].Value;
                        this.DDL_Emp[j].EnableViewState = true;
                        this.DDL_Emp[j].Visible = true;
                        this.DDL_Emp[j].Items.AddRange(cond.ToArray());
                        this.DDL_Emp[j].Items.Insert(0, new ListItem("-- Select condition of employee: " + CBL_EmpInvolved.Items[i].Text, ""));


                        PH_LabCondition.Controls.Add(this.DDL_Emp[j]);
                        j++;
                    }

                }

                PH_LabCondition.Visible = true;
                MV_LabCondition.Visible = true;

                Label1_ReportTitle.Text += "Control Count: " + PH_LabCondition.Controls.Count.ToString();

            }

            MV_LabCondition.ActiveViewIndex = 1;
            MV_LostTime.ActiveViewIndex = 1;
        }
    }

此代码现在给我以下错误:

  

在程序集'System.Web中键入'System.Web.UI.WebControls.DropDownList',Version = 4.0.0.0,Culture = neutral,PublicKeyToken = b03f5f7f11d50a3a'未标记为可序列化。

我尝试将按钮更改为图像,并使用AutoPostBack功能进行播放。我迷失了如何将我的dropdownlist数组保存到ViewState并在回发后访问它。

1 个答案:

答案 0 :(得分:0)

听起来你有一个ASP.NET页面生命周期问题。因为在ViewState加载后创建ListItems,ViewState不知道ListItems的存在。并不是控件被删除,它们不存在。

如果要在页面初始化阶段创建控件,则视图状态将知道对象并保持状态。您必须在Page_Init中测试导致回发的控件,并在那里执行一些逻辑而不是控件的事件处理程序来获得预期的结果。