在asp.NET C#中寻址动态创建的TextBox控件

时间:2013-02-24 17:17:49

标签: c# asp.net

我正在尝试创建一个将未定义行数加载到表中的页面,每行包含两列,一列包含字符串,另一列包含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,我在下一行得到一个空指针异常。所以我试过

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

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

2 个答案:

答案 0 :(得分:2)

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

此外,最好使用转发器来创建这些控件,它更易于维护和调试。

答案 1 :(得分:1)

修改

你需要在每个回发(page_load)上重新创建你的表,就像@ShaiCohen在他的回答中说的那样你需要一些ilke:

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