所选索引更改事件在不应该触发的情况下触发

本文关键字:不应该 情况下 事件 索引 | 更新日期: 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;
}