2012-09-12 40 views
0

我是一個與ASP.NET生命週期事件混淆的小問題。我有一個複選框,當它被選中時,它會動態地創建標籤和文本框。這是在checkbox oncheckchanged事件中完成的。我在沒有完整回發的複選框上啓用了Ajax。檢查複選框時動態創建的訪問文本框的值

現在在新創建的文本框中輸入值,當我點擊保存按鈕時,在按鈕單擊事件中它甚至不會找到創建的控件。那麼頁面視圖狀態如何記住複選框事件中創建的動態控件,然後在按鈕保存事件中訪問它的值? 標記:在的CheckedChanged事件背後

    <tr> <td> <asp:CheckBox ID="chkType" runat="server" Text="Medical Procedure" OnCheckedChanged="ChkMedicalProc_Clicked"></td></tr> 

       <tr><td colspan="2"> 
        <asp:PlaceHolder ID="dyna" EnableViewState="true" runat="server"></asp:PlaceHolder> 
       </td></tr> 

代碼:

TableRow tr = new TableRow(); 
      TableCell tc1 = new TableCell(); 
      TableCell tc2 = new TableCell(); 
      Label lbl = new Label(); 
      lbl.Text = string.Empty; 
      lbl.Text = (_queryParam[i].Param_Name + " (" + _queryParam[i].Param_Type + ") (" + _queryParam[i].Param_Length + ")").ToString(); 
      lbl.Style.Add("font-size", "11px"); 
      lbl.Style.Add("font-family", "Arial"); 
      _txtBox = new TextBox(); 
      _txtBox.ID = ctrlId; 
      _txtBox.CssClass = "textEntry"; 
      _txtBox.Text = string.Empty; 
      _txtBox.Text = _queryParam[i].Param_Value; 
      tc1.Style.Add("width", "21.8%"); 
      tc1.Controls.Add(lbl); 
      tc2.Controls.Add(_txtBox); 
      tr.Cells.Add(tc1); 
      tr.Cells.Add(tc2); 

      _tbl.Rows.Add(tr); 

      this.Master.FindControl("pagecontent1").FindControl("dyna").Controls.Add(_tbl); 

保存按鈕單擊事件:

for (int i = 0; i < box.Count; i++) 
           { 
            TextBox boxValue= this.Page.Master.FindControl("pagecontent1").FindControl("dyna").FindControl("txtBoxParams-" + i) as TextBox; 
            //I get object reference error on boxValue 
} 
+0

您是否在每次回發中創建控件。如果不是這些控件在回發時丟失,並且您無法訪問它們.. –

回答

0

動態控制丟失的回傳,所以每個頁面請求你必須再次動態添加它們。

儘管對於您的示例而言,在頁面上始終擁有標籤/文本框但將其包含在您切換Visible屬性的asp:panel中或通過javascript顯示/隱藏它可能更容易。

至於回發期間這些動態控件的值,如果您使用相同的ID重新創建它們,asp.net將使用視圖狀態信息自動將它們重新初始化爲正確的輸入值。

有關處理動態控件的詳細信息,該網站似乎是相當準確:http://www.4guysfromrolla.com/articles/081402-1.aspx

0

使用下面的遞歸功能,您將能夠檢索動態表

公衆內部的任何控制靜態控制DeepFindControl(控制C,字符串ID) {

 if (c.ID == id) 
     { 
      return c; 
     } 
     if (c.HasControls()) 
     { 
      Control temp; 
      foreach (var subcontrol in c.Controls) 
      { 
       temp = DeepFindControl((Control)subcontrol, id); 
       if (temp != null) 
       { 
        return temp; 
       } 
      } 
     } 
     return null; 
    } 


在找到它之後接收控件的值,您應該知道控件的名稱,然後您將收到另一個具有相同類型的新創建控件中的值......「將從DeepFindControl返回的控件轉換爲」
...

控制C1 = DeepFindControl(DynamicTableName,ControlNAme);
TextBox _txtBox =(TextBox)C1;