我有一个问题,我有一个带复选框的页面:
<asp:CheckBox runat="server" ID="chkSelectAll" OnCheckedChanged="chkSelectAll_CheckedChanged" EnableViewState="true" Text='<%# CommonFunctions.GetText(Page, "CreateTask", "chkSelectAll.text") %>' AutoPostBack="true" />
首先我遇到的问题是,当事件被引发时,复选框没有保留checked属性值。这仍然很奇怪,因为我们在应用程序中没有将EnableViewState设置为false,默认情况下应该为true。这个行为是通过将EnableViewState =“true”修复的。
所以现在,我有一个复选框,当我第一次加载页面时,wworks正确。我勾选方框,事件被提出Checked属性值好,方法执行。回发完成并呈现页面。我将该复选框设置为false,未触发该事件,并使用之前的数据重新加载页面,但Checked Property保持为true。
因此,在第一次回发后,我似乎失去了事件和ViewState的行为。
我们怀疑我们动态移动页面中的控件(参见答案here)
但是这种怀疑并不能解释为什么在第一次加载后一切都能完美运行并在第一次PostBack后停止工作。
修改
我创建了一个测试项目,您可以在其中体验我的问题。在加载时,如果您选中任何复选框,则会提升其各自的事件回发后只有第二次提升两个事件。当我在移动控件后注册事件时,我似乎遇到了问题。
答案 0 :(得分:4)
听起来你在回发上覆盖了复选框数据。在处理页面加载事件的方法中设置动态控件,如下所示:
void Page_Load(){
if (!Page.IsPostBack)
{
/* call methods to render a clean page with fresh controls */
}
}
发布示例代码后更新 -
我原则上是正确的但是在看到你的代码示例之后我能够更好地解释:
在您的用户控件中,您有在页面加载上调用的方法,需要告知是否第一次加载控件或在回发时加载 - 否则,它只是不断重建控件的新副本。
以下是您的文件“CollapsiblePanel.ascx.cs”中修改过的代码:
protected void Page_Load(object sender, EventArgs e)
{
if (!Page.IsPostBack)
{
for (int i = 0; i < Controls.Count; i++)
if (Controls[i] is CollapsiblePanelExtender)
while (i + 2 < Controls.Count)
{
SearchUpdatePanel(Controls[i + 2]);
plhContent.Controls.Add(Controls[i + 2]);
}
}
}
通过此更改,复选框会在回发后保留其值,并且每次更改都会触发您的事件。
答案 1 :(得分:0)
我有一个解决方案,其中Page_Load似乎不适合放置我的移动代码。将它移动到CreateChildControls似乎解决了我的问题:
protected override void CreateChildControls()
{
for (int i = 0; i < Controls.Count; i++)
if (Controls[i] is CollapsiblePanelExtender)
while (i + 2 < Controls.Count)
{
SearchUpdatePanel(Controls[i + 2]);
plhContent.Controls.Add(Controls[i + 2]);
}
base.CreateChildControls();
}
非常感谢所有试图提供帮助的人(对于这个例子Rob)