我遇到了以下问题。我已经谷歌了很多并尝试了所有方法,但无法解决问题
我动态创建控件,然后从动态创建的控件中读取值
但每次我收到错误“对象引用未设置为对象的实例”意味着即使它在页面上可用,我也无法找到该控件。
这是我的代码
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>
答案 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);
}