Addressing dynamically created TextBox Controls in asp.NET C

本文关键字:asp NET in Controls dynamically created TextBox Addressing | 更新日期: 2023-09-27 18:00:44

我正试图创建一个页面,将未定义数量的行加载到表中,每行包含两列,一列为字符串,另一列为TextBox。当我点击提交按钮时,我希望能够检索输入到每个TextBox中的值。

我可以做的前半部分,很明显,在实际代码中,这将是在foreach循环中,文本框ID分配了一个唯一的值,我可以稍后复制它来调用它。

TableCell myCell = new TableCell();
myCell.Text = "StudentID";
TableCell nextCell = new TableCell();
TextBox mytext = new TextBox();
mytext.ID = "TxtBox1";
nextCell.Controls.Add(mytext);
TableRow myRow = new TableRow();
myRow.Cells.Add(myCell);
myRow.Cells.Add(nextCell);
TableStuUploads.Rows.Add(myRow);

当我点击提交按钮时,我尝试运行以下代码(只是临时代码ATM,概念验证的东西):

TextBox tmptext = (TextBox)FindControl("TxtBox1");
Label1.Text = tmptext.Text;

但这将tmptext设置为null,并且我在下一行得到一个null指针异常。然后我尝试了

TextBox tmptext = (TextBox)TableStuUploads.FindControl("TxtBox1");
Label1.Text = tmptext.Text;

同样的错误。然后我尝试了

foreach (Control x in TableStuUploads.Controls)
            {
                if (x.GetType().ToString().Equals("System.Web.UI.WebControls.TextBox"))
                {
                    Label1.Text = ((TextBox)x).Text;
                }
            }

但当调试这个时,我看到TableStuUploads.Controls的计数为零。

我应该如何处理这些动态创建的控件?我四处寻找,得到的答案让我找到了我已经尝试过的三种解决方案。我哪里错了?

Addressing dynamically created TextBox Controls in asp.NET C

您可能没有在post-back上重新创建动态控件。这对于查找每个控件和检索每个控件的值都是必需的。

此外,最好使用中继器来创建这些控件,这样更容易维护和调试。

编辑

你需要在每次回邮(page_load)上重新创建你的表格,就像@ShaiCohen在他的回答中所说的那样,然后你需要类似的东西:

foreach (TableRow item in TableStuUploads.Rows)
{               
     TextBox tmptext = (TextBox)item.FindControl("TxtBox1");
     Label1.Text = tmptext.Text;
}