C# 所选索引更改了不应触发的事件触发

C# 所选索引更改了不应触发的事件触发,c#,asp.net,C#,Asp.net,我刚刚在ASP.NET页面中遇到了一个奇怪的情况。我的表单有两个控件的AutoPostBack=true:一个RadioButtonList和一个DropdownList。RadioButtonList还具有EnableViewState=False。当我更改dropdownlist的选定项时,RadioButtonList SelectedIndexChanged事件也会触发。如果我删除EnableViewState=False,那么这种行为就会消失。有人能解释为什么会这样吗?我在下面提供了示

我刚刚在ASP.NET页面中遇到了一个奇怪的情况。我的表单有两个控件的AutoPostBack=true:一个RadioButtonList和一个DropdownList。RadioButtonList还具有EnableViewState=False。当我更改dropdownlist的选定项时,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>

然后,直到您从单选按钮列表中选择某个内容时,才会发生此行为。非常感谢您的帮助。

当您将EnableViewState设置为false时,表示您不会保留对象的状态。这意味着当您执行自动记账时,这些值将重置为其原始值

当它是回发时,您正在更改单选按钮rblTest.SelectedIndex=0的状态,这将触发事件。因此,您更改一个单选按钮,将触发两个事件

还需要指出的是,请记住,每次回发时,都会在服务器端重新创建页面。并执行页面的生命周期。ViewState在该进程上用于填充控件。您可以在以下网站上了解更多信息:

对我来说,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;
}

感谢您的回复-实际上,如果不是回发,测试代码只会将rblTest.SelectedIndex设置为0-因此这只会在第一次影响它。我的观点是,如果我更改下拉列表值,单选按钮事件将被触发。似乎是因为单选按钮的viewstate已关闭,所以事件将被缓存,并在触发任何其他事件时持续触发。对我来说,这似乎不是正确的行为。但您说过,如果删除rblTest.SelectedIndex=0,问题就会消失。你能在那行代码上加一个断点并确认它什么时候被执行吗?不,问题并没有消失。如果注释掉rblTest.SelectedIndex=0,则在选择其他单选按钮之前,不会出现问题。执行此操作后,单选按钮事件将继续激发,即使激发了其他事件,例如dropdownlist事件。很抱歉造成混淆。可能在您提交表单后,单选按钮的值由于某种原因发生了更改。请尝试为单选按钮设置默认值,然后重试。感谢您的建议-我为单选按钮列表中的第一项添加了Selected=True,该行为将消失。因此,当您从单选按钮列表中选择一个项目时,该值在每次回发时都会被清除,这会触发单选按钮列表的selectedindexchanged事件。
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;
}