【问题标题】:SelectedIndexChanged event not firing for 1 list item未针对 1 个列表项触发 SelectedIndexChanged 事件
【发布时间】:2026-02-22 11:05:01
【问题描述】:

我有一个单选按钮列表、一个标签和一个下拉列表,如下所示:

<asp:RadioButtonList id="rbList" runat="server" AutoPostBack="true" EnableViewState="false" 
            OnSelectedIndexChanged="rbList_SelectedIndexChanged" 
RepeatLayout="Table" RepeatDirection="Horizontal" RepeatColumns="3">
<asp:ListItem Selected="True"> Radio 1 </asp:ListItem>
            <asp:ListItem> Radio 2 </asp:ListItem>
            <asp:ListItem> Radio 3 </asp:ListItem>
            </asp:RadioButtonList>

<asp:Label runat="server" ID="lbl" text="1,2" EnableViewState="false"></asp:Label>

<asp:DropDownList runat="server" ID="ddl" Visible="false">                    
            </asp:DropDownList> 

我的 rbList_SelectedIndexChanged 如下:

protected void rbList_SelectedIndexChanged(object sender, EventArgs e)
{
    if (rbList.SelectedIndex == 0 | rbList.SelectedIndex==1)
    {
        lbl.Text = "1,2";
        ddl.Visible = false;
        //ddl.Attributes.Add("style", "display:none");
    }
    else if (rbList.SelectedIndex == 2)
    {
        lbl.Text = "3";
        ddl.Visible = true;
        //ddl.Attributes.Add("style", "");
     }
}

现在,当我从 radio3 更改为 radio2 时,事件像往常一样被触发,一切看起来都很好。但是当我从 radio3 更改为 radio1 时,我没有看到事件被触发(我插入了一个断点),ddl 保持可见,但 lbl 的值变为 1,2。

我的2个问题如下:

1) 为什么从 radio3 更改为 radio1 时事件没有被触发?

2) 事件未触发时标签值如何变化?

非常感谢任何帮助或 cmets..在此先感谢!

【问题讨论】:

    标签: c# asp.net radiobuttonlist selectedindexchanged


    【解决方案1】:

    我不确定这是否是一个错误,但是...

    当 EnableViewState="false" 使用 DDL 或 RBL 并且用户尝试选择第一个列表项(索引 0)时,SelectedIndexChanged 将不会被触发。

    如果您设置 EnableViewState="true",那么当用户选择第一个列表项而不选择第一个项目时,DDL 或 RBL 应该可以正常工作...

    【讨论】:

      【解决方案2】:

      在您的标记中预先选择一个单选按钮会导致您的问题。从任何其他选项返回选项 1 不会触发更改的事件。

      这条线是你的罪魁祸首。

      <asp:ListItem Selected="True"> Radio 1 </asp:ListItem>
      

      如果您删除 Selected 属性,则事件应正确注册

       <asp:ListItem> Radio 1 </asp:ListItem>
      

      您可以在后面的代码中处理预选。

          protected void Page_Load(object sender, EventArgs e)
          {
              if(!IsPostBack)
              {
                 rbList.SelectedIndex = 0;
              }
          }
      

      【讨论】:

      • 这部分解决了我的问题!如果我在 if(!IsPostBack) 中添加 rbList.SelectedIndex=0 则不允许更改为任何其他单选按钮,它始终是 radio1 ..我的页面内没有 UpdatePanel ..
      • 您不应该为此需要 UpdatePanel,SelectedIndexChanged 事件是回发,因此 if 块应该评估为 false,而不是将所选索引重新分配为 0。
      【解决方案3】:

      据我所知,以编程方式设置 SelectedIndex(即使在第一篇文章中)会导致与在标记上设置 Selected="True" 相同的行为。

      唯一可靠的方法似乎是使用带有 RadioButtonList 的 UpdatePanel 作为异步触发器,确保标记随每次更改而更改。

      也就是说,除非你想走 jQuery 路线..

      【讨论】:

        【解决方案4】:

        我遇到了类似的问题,但它与更新面板的“ChildrenAsTriggers”属性设置为 false 有关。除索引 0 外,所有其他单选按钮索引都以这种方式正常工作。

        【讨论】: