DropdownList.selectedIndex sempre 0 (sim, eu tenho! IsPostBack)

votos
5

(Role para baixo até o fundo do post para encontrar solução.)

Tenho uma página asp.net que contém um Datalist. Dentro deste datalist, há um modelo que contenha um dropdownlist e cada vez que o datalist é preenchido com um item, um ItemCreatedCommand é chamado. O itemCreatedCommand é responsável pela ligação de dados do dropdownlist.

Eu acho que o problema está aqui, que eu estou usando ItemCreatedCommand para preenchê-lo - mas as coisas estranhas é que se eu escolher a cor verde, a página será autopostback, e eu vai ver que a lista suspensa ainda está na cor verde , mas ao tentar usar é SelectedIndex, eu sempre chegar 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* 

Eu já reduzimos o código um pouco para visualização, mas ainda assim você pode ver o que eu estou tentando fazer :) A razão por que eu estou fazendo isso, e não declarar a fonte de dados para as cores diretamente i aspx páginas, é que eu preciso para executar um teste if (showColors), mas eu não quero bagunçar o html-página com o código que eu sinto deve ser no behind-arquivo de código.

EDIT: Depois de tentar alterar SelectedIndexChange - Estou tendo uma confusão lógico na minha cabeça agora - como é que vou alterar elementos dentro do datalist? Uma vez que, tanto quanto eu sei - eu não tenho nenhuma maneira de verificar qual dos itens na datalist este dropdownlist em particular pertence ... Ou? Eu estou indo para experimentar algumas maneiras e ver o que eu acabar com;) Mas por favor, postar seus pensamentos sobre esta questão :)

SOLUÇÃO:

De qualquer bolha que o evento ItemCommand, ou Manipular o evento, obter o pai remetentes (que é um DataListItem e manipular elementos lá.

 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; 
        }
Publicado 23/11/2008 em 18:21
fonte usuário
Em outras línguas...                            


4 respostas

votos
8

Quando o DataList é ligado a dados, o AutoPostBack ainda não foi tratado, ou seja, os valores em caso ItemCreated ainda são os valores originais.

Você precisa manipular o evento SelectedIndexChange do controle suspenso.

Respondeu 23/11/2008 em 18:28
fonte usuário

votos
0

Obrigado por sua solução

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

     }
 }
Respondeu 11/10/2014 em 12:04
fonte usuário


votos
0

Quanto à sua segunda pergunta:

Eu sugiro que você remova o AutoPostBack no menu suspenso, adicionar um botão "Update", e atualizar os dados no evento de clique de botão.

O botão pode conter valores de comando e CommandArgument, por isso é fácil de se associar com um registro de banco de dados.

Respondeu 23/11/2008 em 20:10
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more