我有一个带有Label控件的LabelPanel,Label1和它外面的按钮Button1,以及UpdatePanel,Label2之外的另一个Label控件。单击该按钮时,我希望Label1中的Label文本更新:
ASPX页面
<form id="form1" runat="server">
<asp:ScriptManager ID="ScriptManager1" runat="server" EnablePartialRendering="true" AsyncPostBackTimeout="0" />
<asp:UpdatePanel ID="UpdatePanel1" UpdateMode="Conditional" runat="server">
<Triggers>
<asp:AsyncPostBackTrigger ControlID="Button1" EventName="Click" />
</Triggers>
<asp:ContentTemplate>
<asp:Label ID="Label1" runat="server"></asp:Label>
</asp:ContentTemplate>
</asp:UpdatePanel>
<asp:Button ID="Button1" runat="server" OnClick="Button1_Click" />
<asp:Label ID="Label2" runat="server"></asp:Label>
</form>
代码隐藏
protected void Page_Load(object sender, EventArgs e)
{
}
protected void Button1_Click(object sender, EventArgs e)
{
Label2.Text = "some text";
Label1.Text = "some text";
}
这应该是直截了当的 - 我应该能够通过按钮点击事件更新Label1文本。 Label2行成功(显然不会在没有页面回发的情况下出现),其中Label1行失败,“对象引用不是对象的实例”。为什么Label1为null,当它就在页面上时,只是它在UpdatePanel中?我应该如何实例化应该已经在页面上并且可访问的控件,就像Label2一样?
答案 0 :(得分:1)
您的异步触发器必须在里面更新面板中。可能找不到它,因为它不在更新面板内。此外,因为您正在进行异步回发,所以只有更新面板的inisde才会刷新;因此,您实质上是“重置”标签1。
这就是为什么您的代码无法找到Label 1.执行此操作:
<asp:UpdatePanel ID="UpdatePanel1" UpdateMode="Conditional" runat="server">
<Triggers>
<asp:AsyncPostBackTrigger ControlID="Button1" EventName="Click" />
</Triggers>
<ContentTemplate>
<asp:Label ID="Label1" runat="server"></asp:Label>
<asp:Button ID="Button1" runat="server" OnClick="Button1_Click" />
<asp:Label ID="Label3" runat="server"></asp:Label>
</ContentTemplate>
</asp:UpdatePanel>
<asp:Label ID="Label2" runat="server"></asp:Label>
</form>
这将有助于您查看。标签1和3现在将始终更新,但由于标签2位于更新面板之外,因此不会因为页面在回发时看不到这一点。
代码背后:
protected void Button1_Click(object sender, EventArgs e)
{
Label3.Text = "label 3";
Label2.Text = "label 2";
Label1.Text = "label 1";
}
结果:
答案 1 :(得分:0)
代码在UpdatePanel中有<asp:ContentTemplate>
和</asp:ContentTemplate>
而不是<ContentTemplate>
和</ContentTemplate>
标记。我纠正了这个,现在有效了。由于代码无法找到真正的ContentTemplate或其中的任何内容,因此控件超出了范围。