2013-07-25 72 views
1

內動態添加文本框的值下面是ASPX控制。從表中獲取更新面板

<asp:UpdatePanel runat="server" ID="panel" ChildrenAsTriggers="false" UpdateMode="Conditional"> 
     <ContentTemplate> 
      <asp:PlaceHolder runat="server" ID="holder"></asp:PlaceHolder> 
      <asp:Button runat="server" ID="bt" Text="Add" onclick="AddTxt" /> 
      <asp:Button runat="server" ID="btn1" Text="Refresh" onclick="btn1_Click" /> 
     </ContentTemplate> 

當添加按鈕被點擊我創建一個動態表。下面是C#代碼

protected void AddTxt(object sender, EventArgs e) 
{ 
    int tblRows = 3; 
    int tblCols = 3; 

    Table tbl = new Table(); 

    for (int i = 0; i < tblRows; i++) 
    { 
     TableRow tr = new TableRow(); 
     for (int j = 0; j < tblCols; j++) 
     { 
      TableCell tc = new TableCell(); 
      TextBox txtBox = new TextBox(); 
      txtBox.ID = "txt" + i.ToString() + j.ToString(); 
      //txtBox.TextChanged += new EventHandler(txt_TextChanged); 
      tc.Controls.Add(txtBox); 

      tr.Cells.Add(tc); 

      if (Session["ctls"] != null) 
      { 
       Session["ctls"] += ";t"; 
      } 
      else 
      { 
       Session["ctls"] = "t"; 
      } 
     } 

     tbl.Rows.Add(tr); 
    } 

    holder.Controls.Add(tbl); 

    panel.Update(); 

} 

當局部回傳發生在刷新按鈕的點擊我不能夠得到這是由用戶在文本框中更新值。控件將具有空文本。

protected void Page_Load(object sender, EventArgs e) 
{ 
    foreach (Control c in holder.Controls) 
    { 
     if (c is TextBox) 
     { 

     } 

    } 
} 

protected override void OnInit(EventArgs e) 
{ 
    base.OnInit(e); 

    if (Session["ctls"] != null) 
    { 
     string[] ctls = Session["ctls"].ToString().Split(';'); 
     foreach (string ctlType in ctls) 
     { 
      if (string.Compare(ctlType, "t") == 0) 
      { 
       holder.Controls.Add(new TextBox()); 
      } 
     } 
    } 
} 

任何人請幫助/給我一個提示如何解決更新面板內的動態控件。

回答

2

的問題是,當你動態在AddTxt方法要指定一個ID值到文本框,然而,當動態地在OnInit事件創建的控件,則創建控件(表,列,細胞,文本框)沒有創建在所有ID值,因此ViewState無法連線到什麼用戶在鍵入從而失去。

如果您創建具有相同ID值(txtBox.ID = "txt" + i.ToString() + j.ToString();),如其他動態控制創建邏輯的文本框,然後你ViewState值將被保留,並適當地應用到其上的文本框,在OnInit正在重建。

注意:ViewState在很大程度上取決於服務器控件的ID值,以正確關聯全部和部分回發之間的控件值。

+0

感謝您的快速回復。你的意思是我必須在init()上再次使用相同的控件創建同一個表? – Naveen

+0

@Naveen - 是的,這是正確的。服務器控件和ViewState並不總是方便的現實。這就是人們開始不喜歡ASP.NET WebForms模型的原因,尤其是當您開始在代碼中注入越來越多的AJAX功能時。 ASP.NET頁面生命週期和AJAX往往會讓人頭疼不已。 :-( –

+0

@卡爾·安德森當我打電話其中創建表AddTxt()同樣的方法,它給我的錯誤!「Microsoft JScript運行錯誤:Sys.WebForms.PageRequestManagerServerErrorException:多個控件使用相同的ID‘txt00’被發現。FindControl需要控件具有唯一的ID。」 – Naveen

2

下面是更正後的代碼,現在該功能良好。我在這裏添加這個,因爲它可能對某個人有幫助。

protected void AddTxt(object sender, EventArgs e) 
{ 
    add(); 

} 
private void add() 
{ 
    int tblRows = 3; 
    int tblCols = 3; 

    Table tbl = new Table(); 

    for (int i = 0; i < tblRows; i++) 
    { 
     TableRow tr = new TableRow(); 
     for (int j = 0; j < tblCols; j++) 
     { 
      TableCell tc = new TableCell(); 
      TextBox txtBox = new TextBox(); 
      txtBox.ID = "txt" + i.ToString() + j.ToString(); 
      //txtBox.TextChanged += new EventHandler(txt_TextChanged); 
      tc.Controls.Add(txtBox); 

      tr.Cells.Add(tc); 

     } 

     tbl.Rows.Add(tr); 
    } 

    holder.Controls.Add(tbl); 

    if (Session["ctls"] != null) 
    { 
     Session["ctls"] += ";t"; 
    } 
    else 
    { 
     Session["ctls"] = "t"; 
    } 

    panel.Update(); 
} 

protected override void OnInit(EventArgs e) 
{ 
    base.OnInit(e); 

    if (Session["ctls"] != null) 
    { 
     string[] ctls = Session["ctls"].ToString().Split(';'); 


     foreach (string ctlType in ctls) 
     { 

      if (string.Compare(ctlType, "t") == 0) 
      { 
       add(); 
      } 
     } 
    } 
}