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

本文关键字:控件 读取 创建 动态 | 更新日期: 2023-09-27 18:21:23

我遇到了以下问题。我在谷歌上搜索了很多,尝试了各种方法,但无法解决问题

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

但每次我得到错误"对象引用没有设置为对象的实例"意味着我无法定位控件,即使它在页面上可用。

这是我的代码

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>

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

这是因为单击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"])
{
    ...
}

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

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);
     }