我在一个条件的基础上动态添加控件到我的页面。这些控件中有一个按钮,我已经附加了一个事件处理程序以及click事件。现在在这个事件处理程序中,我试图访问我动态生成的控件,但获得异常。这是我的代码:
protected void Page_Load(object sender, EventArgs e)
{
String Method = Request.QueryString["Method"];
String Tag = Request.QueryString["Tag"];
if (Method=="ADD" && Tag=="METHOD")
{
//6
TableCell cell11 = new TableCell();
cell11.Text = "NEXTLEVEL";
TableCell cell12 = new TableCell();
TextBox txt6 = new TextBox();
txt6.ID = "txt6";
cell12.Controls.Add(txt6);
TableRow row6 = new TableRow();
row6.Cells.Add(cell11);
row6.Cells.Add(cell12);
container.Rows.Add(row6);
TableCell cell14 = new TableCell();
Button submit = new Button();
submit.ID = "SubmitButton";
submit.Text = "Submit";
submit.Click += new EventHandler(submit_Click);
cell14.Controls.Add(submit);
TableRow row7 = new TableRow();
row7.Cells.Add(cell14);
container.Rows.Add(row7);
}
void submit_Click(object sender, EventArgs e)
{
ModifySessionAnalyzer msa = new ModifySessionAnalyzer();
TextBox txt6= (TextBox)Page.FindControl("txt6") as TextBox;
##String message = txt6.Text;##
}
答案 0 :(得分:2)
TableCell cell12 = new TableCell();
TextBox txt6 = new TextBox();
txt6.ID = "txt6";
cell12.Controls.Add(new TextBox());
这是错误的,你没有将txt6控件添加到单元格,而是添加一个新的textBox ...
答案 1 :(得分:1)
动态添加的控件应添加到Page_Init
方法而不是Page_Load
。如果它们被添加到Page_Load
中,它们将不会被添加到控制树中,您将遇到问题 - 即它们不会正确参与ViewState。
因此,(TextBox)Page.FindControl("txt6")
可能会失败,因为文本框不再位于控制树中
这可能是您问题的根源。
进一步说明
您的代码应为
protected void Page_Init(object sender, EventArgs e)
{
//.. your code goes here
}
不会强>
protected void Page_Load(object sender, EventArgs e)
{
//.. your code
}
通常的做法是使用Page_Load
,这对人们来说只是一个简单的习惯,但是当使用动态控件时,这就是例外
当我说动态控件时 - 当你动态添加控件而不是在你的页面中声明它们时,它就是任何东西。寻找你要去的任何地方Controls.Add