无法从动态创建控件中读取值

时间:2013-07-05 11:57:23

标签: c# asp.net .net

我遇到了以下问题。我已经谷歌了很多并尝试了所有方法,但无法解决问题

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

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

这是我的代码

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>

2 个答案:

答案 0 :(得分:2)

这是因为您在点击Button1时创建了控件,然后在单击Button2时尝试访问它。必须在每个帖子后面上创建动态控件,因为不会维护该状态。而不是只是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"])
{
    ...
}

答案 1 :(得分: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);

     }