DropdownList.selectedIndex всегда 0 (да, у меня есть! IsPostBack) - PullRequest
5 голосов
/ 23 ноября 2008

(Прокрутите вниз до нижней части сообщения, чтобы найти решение.)

Получил страницу asp.net, которая содержит DataList. Внутри этого datalist, есть шаблон, содержащий выпадающий список и каждый раз Datalist заполнен элементом, 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-страницу, что мне нужно запустить проверить если (showColors), но я не хочу загромождать html-страницу кодом что я чувствую, должно быть в коде за-файла.

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

РЕШЕНИЕ:

Либо отправьте событие в 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; 
        }

Ответы [ 4 ]

8 голосов
/ 23 ноября 2008

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

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

0 голосов
/ 11 октября 2014

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

 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) {

     }
 }
0 голосов
/ 24 ноября 2008
0 голосов
/ 23 ноября 2008

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

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

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

...