2011-05-05 15 views
0

我有一個CheckBoxList,其中包含嚮導步驟上的員工名稱。選擇員工並更改主動步驟後,將調用Wizard1_ActiveStepChanged函數,併爲所選的每個員工動態創建DropDownList Array。每個DropDownList指定僱員的條件。 DropDownList已正確創建。當用戶單擊提交時,DropDownList數組將被刪除,並且不能從數組中提取選定的值。如何在PostBack(按鈕單擊)後從動態創建的DropDownList Array中獲取選定值

我知道這是PostBack的問題,可以用ViewState修復,但我想弄清楚我能做些什麼來修復它。 ViewState爲複選框列表和DropDownList啓用。

這是我在我的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',版本= 4.0.0.0,文化=中立,公鑰= b03f5f7f11d50a 3a'未被標記爲可序列化。

我試過將按鈕更改爲圖像,玩AutoPostBack功能。我迷失在如何讓dropdownlist數組保存到ViewState並在回發後訪問它。

回答

0

這聽起來像你有一個ASP.NET頁面生命週期問題。由於您在ViewState加載後創建ListItems,因此ViewState不知道ListItems的存在。並不是控件被刪除,它們不存在。

如果要在頁面初始化階段創建控件,視圖狀態將會意識到對象並維護狀態。您必須測試導致Page_Init中的回發的控件,並在其中執行一些邏輯,而不是控件的事件處理程序以獲得預期的結果。

相關問題