我一直在寻找如何做到这一点,但我找不到解决方案。我从原始项目中简化了问题,我必须实现以下目标:
在.aspx我有:
<asp:ScriptManager ID="ScriptManager1" runat="server">
</asp:ScriptManager>
<asp:UpdatePanel ID="udpDynamicControls" UpdateMode="Conditional" runat="server">
<ContentTemplate>
<asp:PlaceHolder ID="PlaceHolder" runat="server">
</asp:PlaceHolder>
</ContentTemplate>
</asp:UpdatePanel>
在代码背后:
public partial class _Default : System.Web.UI.Page
{
protected string TextToShow
{
get
{
return Session["TextToShow"] == null ? "Original Text" :
Session["TextToShow"].ToString();
}
set { Session["TextToShow"] = value; }
}
protected void Page_Init(object sender, EventArgs e)
{
var lblToChange = new Label
{
ID = "lblToChange",
Text = TextToShow
};
var chkChangeText = new CheckBox
{
ID = "btnChangeText",
Text = "Change Text",
AutoPostBack = true
};
chkChangeText.CheckedChanged += ChkChangeTextClick;
PlaceHolder.Controls.Add(lblToChange);
PlaceHolder.Controls.Add(chkChangeText);
}
private void ChkChangeTextClick(object sender, EventArgs e)
{
var check = (CheckBox) sender;
TextToShow = check.Checked ? "Text Changed" : "Original Text";
udpDynamicControls.Update();
}
protected void Page_Load(object sender, EventArgs e)
{
}
}
正如您所看到的那样,当更改复选框时,我正在尝试更新标签,然后抛出更新面板。但是udpDynamicControls.Update();不会触发page_init事件,它将获取其新值。我已经查出了类似的问题,但我相信这是一个不同的场景。
我将非常感谢任何可以提供帮助的人。我为任何糟糕的英语道歉。
答案 0 :(得分:0)
所以我通过其他方式解决了我原始项目中的问题,但我想我也可以将答案归结为我所做的,以防有人遇到同样的问题,他们可能会使用相同的解决方案。
由于我依赖于page_init在更新后再次运行只是为了更新我的控件的新值而这并没有讨价还价,那么可能的解决方案是更新复选框中控件的值事件,在已经创建标签的地方,并且在下一页生命周期运行中,它将保持其值。
所以我唯一改变的是ChkChangeTextClick事件,结果是:
protected void ChkChangeTextClick(object sender, EventArgs e)
{
var check = (CheckBox) sender;
TextToShow = check.Checked ? "Text Changed" : "Original Text";
((Label) PlaceHolder.FindControl("lblToChange")).Text = TextToShow;
}
更换:
udpDynamicControls.Update();
有关:
((Label) PlaceHolder.FindControl("lblToChange")).Text = TextToShow;
来考虑它,它是一个更简单的方法,在我的原始项目中我有几个动态控件,我只是在我的控件ID中设置一个模式来找到我需要的模式并更改值。控件的事件不会丢失,我可以在没有浏览器回发的情况下显示更新的信息。
我希望这对未来的任何人都有任何帮助,因为我几乎把所有的头发都撕掉了。