Событие SelectedIndexChanged не срабатывает для 1 элемента списка

У меня есть список радиокнопок, метка и раскрывающийся список следующим образом:

<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", "");
     }
}

Теперь, когда я переключаюсь с радио3 на радио2, событие запускается как обычно, и все выглядит хорошо. Но когда я переключаюсь с radio3 на radio1, я не вижу запуска события (я вставил точку останова), ddl остается видимым, но значение lbl изменяется на 1,2.

Мои 2 вопроса заключаются в следующем:

1) Почему событие не запускается при смене радио3 на радио1?

2) Как меняется значение метки, когда событие не срабатывает?

Любая помощь или комментарии очень ценятся .. Заранее спасибо!


person user841311    schedule 29.05.2013    source источник


Ответы (4)


Не знаю баг это или нет, но...

Когда EnableViewState="false" с DDL или RBL и пользователь пытается выбрать первый элемент списка (индекс 0), SelectedIndexChanged НЕ будет запущен.

Если вы установите EnableViewState="true", то DDL или RBL должны работать правильно, когда пользователь выбирает первый элемент списка, когда был выбран не первый элемент...

person Community    schedule 04.06.2013

Предварительный выбор переключателя в вашей разметке вызывает ваши проблемы. переход от любого другого варианта обратно к варианту 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;
        }
    }
person Mark F    schedule 29.05.2013
comment
это частично решило мою проблему! Если я добавлю rbList.SelectedIndex=0 внутри if(!IsPostBack), то это не позволит перейти на какой-либо другой переключатель, это всегда будет radio1.. У меня нет UpdatePanel на моей странице.. - person user841311; 30.05.2013
comment
Для этого вам не нужен UpdatePanel, событие SelectedIndexChanged — это обратная передача, поэтому блок if должен оцениваться как false и не переназначать выбранный индекс на 0. - person Mark F; 30.05.2013

Насколько я могу судить, программная установка SelectedIndex (даже в первом сообщении) приводит к тому же поведению, что и установка Selected="True" в разметке.

Кажется, единственный надежный способ — использовать UpdatePanel с RadioButtonList в качестве асинхронного триггера, гарантируя, что разметка будет меняться при каждом изменении.

То есть, если вы не хотите идти по маршруту jQuery.

person syntax.error    schedule 04.02.2015

У меня была похожая проблема, но она была связана с тем, что для свойства «ChildrenAsTriggers» панели обновлений было установлено значение false. Таким образом, все остальные индексы переключателей работали нормально, кроме индекса 0.

person Larry E2A    schedule 06.02.2017