2008-11-23 26 views
5

(baje hasta la parte inferior del poste para encontrar la solución.)DropdownList.selectedIndex siempre 0 (sí, lo tengo! IsPostBack)

Tienes una página asp.net que contiene una de Datalist. Dentro de este datalist, hay es una plantilla que contiene una lista desplegable y cada vez que el datalist se llena con un elemento, se llama a ItemCreatedCommand. El elemento CreatedCommand es responsable del enlace de datos de la lista desplegable.

creo que el problema radica aquí, que estoy usando ItemCreatedCommand a poblarlo - pero las cosas extrañas es que si elijo el color "verde", la página se AutoPostBack y voy a ver que el desplegable está todavía en el green color, pero cuando se trata de utilizar es SelectedIndex, siempre me ... 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* 

he reducido un poco su código para de visión, pero todavía puede ver lo que intento hacer :) La razón de por qué estoy haciendo esto, y no declarar el origen de datos para los colores directamente i aspx-page, es que necesito ejecutar una prueba si (mostrarColores), pero no lo hago quiero para llenar la página html con el código que creo que debería estar en el código detrás del archivo.

EDIT: Después de tratar de alterar SelectedIndexChange - Estoy teniendo una confusión "lógica" en mi cabeza ahora - cómo voy a alterar elementos dentro de la lista de datos ? Dado que, hasta donde yo sé, I no tengo ninguna manera de comprobar cuál de los elementos en el datalist esta lista desplegable particular pertenece a ... O? Voy a probar algunas formas y ver lo que termino con;) Pero hacer favor publicar sus pensamientos en esta pregunta :)

SOLUCIÓN:

De cualquier burbuja que el evento ItemCommand, o controlar el evento, obtener el padre remitentes (que es un datalistItem y manipular elementos en allí.

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; 
     } 
+0

Puede aclarar más en la razón de no agregar ing a la página? No estoy seguro de entenderlo correctamente. ¿Dice que no quiere saturar el ASPX/HTML, pero no veo ninguna razón por la que vincular el DropDown un poco diferente lo haría? –

+0

Bueno, para ser honesto, creo que voy a renunciar al archivo "no desordenar el html", ya que he estado buscando durante horas, y parece que no hay una implementación fácil de lo que necesito. Pero la razón era mantener una estricta conversación de código y diseño. (Ahora debo agregar un if-check en el aspx) –

Respuesta

8

Cuando el DataList es enlazado a datos, la AutoPostBack no ha sido manejado todavía, es decir, los valores de la El evento de ItemCreated es stil l los valores originales.

Debe controlar el evento SelectedIndexChange del control desplegable.

+0

Ah - gracias;) Lo intentaré :) –

0

En cuanto a su segunda pregunta: ¿

que sugieren quitar la AutoPostBack en el menú desplegable, agregue un botón de "Actualizar", y actualizar los datos en el evento de clic de botón.

El botón puede contener valores de Command y CommandArgument, por lo que es fácil asociarlo con un registro de base de datos.

+0

Pero luego tendría que presionar manualmente el botón para que la lista desplegable se llenara, ya que en realidad tengo dos desplegables que son dependientes el uno del otro, así que primero necesito llenar uno, y basado en el primero, necesito llenar el segundo. –

0

Gracias por su solución

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

    } 
}