所选索引更改事件在不应该触发的情况下触发
本文关键字:不应该 情况下 事件 索引 | 更新日期: 2023-09-27 18:02:33
我刚刚遇到了一个ASP的奇怪情况。网络页面。我的表单有两个控件,有AutoPostBack="true"
:一个RadioButtonList
和一个DropdownList
。RadioButtonList也有EnableViewState="False"
。当我更改下拉列表的选定项时,RadioButtonList
SelectedIndexChanged
事件也会触发。如果我删除EnableViewState="False"
,那么这种行为就会消失。有人能解释一下为什么会这样吗?我在下面包含了示例代码,以便您可以自己看到这种行为:
<div>
<asp:RadioButtonList ID="rblTest" AutoPostBack="true" OnSelectedIndexChanged="rblTest_SelectedIndexChanged" EnableViewState="false" runat="server">
<asp:ListItem Text="Option 1" Value="1" />
<asp:ListItem Text="Option 2" Value="2" />
<asp:ListItem Text="Option 3" Value="3" />
</asp:RadioButtonList>
<br />
<br />
<asp:DropDownList ID="ddlTest" AutoPostBack="true" OnSelectedIndexChanged="ddlTest_SelectedIndexChanged" runat="server">
<asp:ListItem Text="Select One" Value="" />
<asp:ListItem Text="Option 1" Value="1" />
<asp:ListItem Text="Option 2" Value="2" />
<asp:ListItem Text="Option 3" Value="3" />
</asp:DropDownList>
<br />
<br />
<asp:Button ID="btnSubmit" OnClick="btnSubmit_Click" Text="Submit" EnableViewState="false" runat="server" />
<br />
<br />
<asp:Label ID="lblResult" runat="server" />
</div>
下面是代码后面的代码:
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
rblTest.SelectedIndex = 0;
}
}
protected void rblTest_SelectedIndexChanged(object sender, EventArgs e)
{
lblResult.Text += "RadioButton List SelectedIndexChanged fired<br />";
}
protected void btnSubmit_Click(object sender, EventArgs e)
{
lblResult.Text += "Submit Button Click Event Fired<br />";
}
protected void ddlTest_SelectedIndexChanged(object sender, EventArgs e)
{
lblResult.Text += "Dropdown List SelectedIndexChanged Event Fired<br />";
}
另外,如果注释掉后面的这行代码:
rblTest.SelectedIndex = 0;
则此行为不会发生,直到您从单选按钮列表中选择某些内容。如有任何帮助,不胜感激。
当你将EnableViewState设置为false时,这意味着你不会保留对象的状态。这意味着当您执行自动修复时,这些值将重置为原始值。
当它是回发时,您正在更改单选按钮(rblTest)的状态。SelectedIndex = 0),然后触发事件。所以,你改变了一个单选按钮,触发了2个事件。
还有一点需要指出,请记住,每次进行回发时,都会在服务器端重新创建页面。然后执行页面的生命周期。在该进程上使用ViewState来填充控件。你可以在:https://msdn.microsoft.com/en-us/library/ms178472%28v=vs.85%29.aspx
对我来说,selectedindexchanged
事件也在我没有预料到的时候发生了。我的代码所做的是改变selectedindexchange
事件上的选定值。因此,下一次发生回发时,也会再次触发selectedindexchange
事件。我通过首先将selectedindex
设置为-1
,然后设置实际值来解决这个问题。
初始代码为-
protected void rbl_selectedindexchanged(object sender, event evt)
{
rbl.Items.FindByText("something").Selected = true;
}
修改后-
protected void rbl_selectedindexchanged(object sender, event evt)
{
rbl.SelectedIndex = -1;
rbl.Items.FindByText("something").Selected = true;
}