DropdownList.selectedIndex всегда 0 (да, у меня есть !isPostBack)

(Чтобы найти решение, прокрутите сообщение вниз, чтобы найти решение.)

Получил страницу asp.net, содержащую список данных. Внутри этого списка данных есть шаблон, содержащий раскрывающийся список, и каждый раз, когда список данных заполняется элементом, вызывается ItemCreatedCommand. itemCreatedCommand отвечает за привязку данных к выпадающему списку.

Я думаю, что проблема заключается в том, что я использую ItemCreatedCommand для его заполнения, но странные вещи в том, что если я выберу «зеленый» цвет, страница будет автоматически отправлена ​​обратно, и я увижу, что раскрывающийся список все еще имеет зеленый цвет. , но при попытке использовать его SelectedIndex я всегда получаю 0...

protected void DataListProducts_ItemCreatedCommand(object
    source, DataListItemEventArgs e)

 var itemId = (String)DataListProducts.DataKeys[e.Item.ItemIndex];
 var item = itemBLL.GetFullItem(itemId); 

 var DropDownListColor = (DropDownList)e.Item.FindControl("DropDownListColor");

 //Also tried with :
 //if(!isPostBack) {

 DropDownListColor.DataSource = item.ColorList;
 DropDownList.Color.Databind();

 // } End !isPostBack)

    Label1.test = DropDownListColor.SelectedIndex.toString();
 // <- THIS IS ALWAYS 0! *grr* 

Я немного сузил код для просмотра, но все же вы можете видеть, что я пытаюсь сделать :) Причина, по которой я это делаю, а не объявление источника данных для цветов напрямую на aspx-странице, заключается в том, что мне нужно запустить тест if(showColors), но я не хочу загромождать html-страницу кодом, который, как мне кажется, должен быть в коде позади файла.

РЕДАКТИРОВАТЬ: после попытки изменить SelectedIndexChange - теперь у меня в голове "логическая" путаница - как мне изменить элементы внутри списка данных? Поскольку, насколько я знаю, у меня нет возможности проверить, к какому из элементов списка данных относится этот конкретный выпадающий список... Или? Я собираюсь попробовать несколько способов и посмотреть, что у меня получится;) Но, пожалуйста, напишите свои мысли по этому вопросу :)

РЕШЕНИЕ:

Либо переместите событие в ItemCommand, либо обработайте событие, получите родителя отправителя (который является datalistItem и манипулируйте там элементами.

 protected void DropDownListColor_SelectedIndexChanged(object sender, EventArgs e)
        {
            DropDownList dropDownListColor = (DropDownList)sender;
            DataListItem dataListItem = (DataListItem)dropDownListColor.Parent;

            var item = items[dataListItem.ItemIndex];
            var color = item.ItemColor[dropDownListColor.SelectedIndex];

            var LabelPrice = (Label)dataListItem.FindControl("LabelPrice");
            LabelPrice.Text = color.Price; 
        }

person Israr Khan    schedule 23.11.2008    source источник
comment
Можете ли вы уточнить причину, по которой он не был добавлен на страницу? Я не уверен, что правильно понимаю. Вы говорите, что не хотите загромождать ASPX/HTML, но я не вижу причин, по которым привязка DropDown немного по-другому приведет к этому?   -  person Rob Cooper    schedule 23.11.2008
comment
Ну, если честно, я думаю, что я собираюсь отказаться от того, чтобы не загромождать html-файл, так как я искал его часами, и кажется, что нет простой реализации того, что мне нужно. Но причина заключалась в том, чтобы сохранить строгое соответствие между кодом и дизайном. (Теперь я должен добавить проверку if в aspx)   -  person Israr Khan    schedule 23.11.2008


Ответы (4)


Когда DataList привязан к данным, AutoPostBack еще не обработан, т. е. значения в событии ItemCreated по-прежнему являются исходными значениями.

Вам нужно обработать событие SelectedIndexChange раскрывающегося списка.

person devio    schedule 23.11.2008

Относительно вашего 2-го вопроса:

Я предлагаю вам удалить AutoPostBack из раскрывающегося списка, добавить кнопку «Обновить» и обновить данные в событии нажатия кнопки.

Кнопка может содержать значения Command и CommandArgument, поэтому ее легко связать с записью в базе данных.

person devio    schedule 23.11.2008
comment
Но тогда вам придется вручную нажимать кнопку, чтобы заполнить раскрывающийся список, поскольку на самом деле у меня есть два раскрывающихся списка, которые зависят друг от друга, поэтому мне сначала нужно заполнить один, и на основе первого мне нужно заполнить второй. - person Israr Khan; 24.11.2008


Спасибо за ваше решение

 protected void ddlOnSelectedIndexChanged(object sender, EventArgs e) {
     try {
         ModalPopupExtender1.Show();
         if (ViewState["Colors"] != null) {
             FillColors(ViewState["Colors"].ToString());
         }

         DropDownList dropDownListColor = (DropDownList)sender;
         DataListItem dataListItem = (DataListItem)dropDownListColor.Parent;

         Image image = (Image)dataListItem.FindControl("mdlImage");
         Label ProductCode = (Label)dataListItem.FindControl("lblprdCode");
         Label ProductName = (Label)dataListItem.FindControl("lblProdName");
         DropDownList ddlQuantity = (DropDownList)dataListItem.FindControl("ddlQuantity");
         Label ProductPrice = (Label)dataListItem.FindControl("lblProdPrice");
         Label TotalPrice = (Label)dataListItem.FindControl("lblTotPrice");
         //Label ProductPrice = (Label)dataListItem.FindControl("lblProdPrice");
     } catch (Exception ex) {

     }
 }
person user4132142    schedule 11.10.2014