2

我被以下问题困住了。我用谷歌搜索了很多并尝试了每一种方法,但无法解决问题

我正在动态创建控件,然后从动态创建的控件中读取值

但每次我收到错误“对象引用未设置为对象的实例”时,意味着即使它在页面上可用,我也无法找到该控件。

这是我的代码

protected void Button1_Click(object sender, EventArgs e)
 {



TextBox txt = new TextBox();
   txt.ID = "myText";
   txt.ViewStateMode = System.Web.UI.ViewStateMode.Enabled;
   Panel1.Controls.Add(txt);

 }

 protected void Button2_Click(object sender, EventArgs e)
 {

       TextBox txt = Panel1.FindControl("myText") as TextBox;

       Response.Write(txt.Text);

 }

这是aspx页面代码:

<div>
   <asp:Button ID="Button1" runat="server" Text="Button" OnClick="Button1_Click" />

   <asp:Panel ID="Panel1" runat="server"></asp:Panel>

   <asp:Button ID="Button2" runat="server" Text="Button" OnClick="Button2_Click"/>
</div>
4

2 回答 2

2

那是因为您在单击时创建了控件Button1,然后在单击时尝试访问它Button2。必须在每次回发时创建动态控件,因为该状态未得到维护。不仅仅是在 click 中构建控件,而是在其中Button1设置一个标志,Session以便您知道也重新构建它Load。因此,在Button1_Click方法的最后,添加以下行:

Session["BuildMyText"] = true;

然后在Page_Load

if (Session["BuildMyText"] != null && (bool)Session["BuildMyText"])
{
    // build the text box here too
}

最后,将文本框的构造包装成Button1_Click这样:

if (Session["BuildMyText"] != null && (bool)Session["BuildMyText"])
{
    ...
}
于 2013-07-05T12:00:12.610 回答
0

您需要重新创建控件,如下所示:

protected void Button2_Click(object sender, EventArgs e)
     {
       TextBox txt = new TextBox();  //add this line
       TextBox txt = Panel1.FindControl("myText") as TextBox;

       Response.Write(txt.Text);

     }
于 2013-07-05T12:03:44.787 回答