无法从动态创建控件读取值
本文关键字:控件 读取 创建 动态 | 更新日期: 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);
}