1

我正在尝试制作一个将未定义的行数加载到表中的页面,每行包含两列,一列是字符串,另一列是文本框。当我单击提交按钮时,我希望能够检索输入到每个 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,并且我在下一行得到一个空指针异常。所以然后我尝试了

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 的计数为零。

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

4

2 回答 2

2

您可能没有在回发时重新创建动态控件。这是查找每个控件和检索每个控件的值所必需的。

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

于 2013-02-24T17:26:07.413 回答
1

编辑

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

foreach (TableRow item in TableStuUploads.Rows)
{               
     TextBox tmptext = (TextBox)item.FindControl("TxtBox1");
     Label1.Text = tmptext.Text;
}
于 2013-02-24T17:36:00.667 回答