访问动态生成的控件对象引用未设置为对象的实例

时间:2012-05-03 10:39:13

标签: asp.net

我在一个条件的基础上动态添加控件到我的页面。这些控件中有一个按钮,我已经附加了一个事件处理程序以及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;##

        }

2 个答案:

答案 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