从更新面板中的表中获取动态添加文本框的值
以下是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(); } } } }