【问题标题】:How to get selected values from a dynamically created DropDownList Array after PostBack (Button Click)PostBack(按钮单击)后如何从动态创建的 DropDownList 数组中获取选定的值
【发布时间】:2011-08-19 02:44:50
【问题描述】:

我有一个 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, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a”中的类型“System.Web.UI.WebControls.DropDownList”未标记为可序列化。

我尝试将按钮更改为图像,使用 AutoPostBack 功能。我不知道如何将我的下拉列表数组保存到 ViewState 并在回发后访问它。

【问题讨论】:

    标签: asp.net controls postback viewstate dynamic


    【解决方案1】:

    听起来您遇到了 ASP.NET 页面生命周期问题。因为您在 ViewState 加载后创建 ListItems,所以 ViewState 不知道 ListItems 的存在。不是控件被删除,而是不存在。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-16
      • 2013-10-10
      • 2021-12-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多