从更新面板中的表中获取动态添加文本框的值

以下是aspx中的控件。

      

单击按钮Add时,我正在创建一个动态表。 下面是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()); } } } } 

任何人都可以帮助/给我一个提示如何解决更新面板内的动态控件。

问题是,当您在AddTxt方法中动态创建控件(表,行,单元格,文本框)时,您正在为文本框分配ID值,但是当您在OnInit事件中动态创建控件时,则不会创建ID值,因此ViewState无法连接到用户键入的内容,从而丢失。

如果您创建具有相同ID值( txtBox.ID = "txt" + i.ToString() + j.ToString(); )的文本框,就像在其他动态控件创建逻辑中一样,那么您的ViewState值将被保留并且正确在OnInit中重新创建时应用于文本框。

注意: ViewState严重依赖于服务器控件的ID值,以便在完全回发和部分回发之间正确关联控件的值。

以下是更正的代码,现在效果很好。 我在这里添加这个,因为它可能对某人有所帮助。

  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(); } } } }