2008-09-25 14 views
10

Tengo un presente aspx-código: (muestra)Adición ListItems a un DropDownList de una lista genérica

<asp:DropDownList runat="server" ID="ddList1"></asp:DropDownList> 

Con este código subyacente:

List<System.Web.UI.WebControls.ListItem> colors = new List<System.Web.UI.WebControls.ListItem>(); 
colors.Add(new ListItem("Select Value", "0")); 
colors.Add(new ListItem("Red", "1")); 
colors.Add(new ListItem("Green", "2")); 
colors.Add(new ListItem("Blue", "3")); 
ddList1.DataSource = colors; 
ddList1.DataBind(); 

La salida tiene el siguiente aspecto:

<select name="ddList1" id="ddList1"> 
    <option value="Select Value">Select Value</option> 
    <option value="Red">Red</option> 
    <option value="Green">Green</option> 
    <option value="Blue">Blue</option> 
</select> 

Mi pregunta es: ¿Por qué desaparecieron mis valores (números) y el texto utilizado como el valor Y el texto? Sé que funciona si uso el método ddList1.Items.Add(New ListItem("text", "value")), pero necesito usar una lista genérica como fuente de datos por otros motivos.

Respuesta

10

Porque el método DataBind vincula valores solo si se establece la propiedad DataValueField. Si establece la propiedad DataValueField en "Valor" antes de llamar a DataBind, sus valores aparecerán en el marcado.

ACTUALIZACIÓN: también deberá establecer la propiedad DataTextField en "Texto". Es porque el enlace de datos y la adición de elementos manualmente no funcionan de la misma manera. El enlace de datos no conoce la existencia del tipo ListItem y genera marcado al evaluar los elementos en el origen de datos.

+0

¿Por qué _necesita_ establecer ese campo? Como dije, funciona cuando ListItem se agrega directamente a DropDownList.Items-collection. Probé tu sugerencia y no sirvió. Ver mi pregunta actualizada – Espo

+0

Ya veo. Actualicé la respuesta y agregué la información para arreglar eso. –

+0

Eso funciona, ¡gracias! – Espo

3

Y aquí está el método que realiza el enlace de datos. Se puede ver exactamente lo que está pasando:

protected internal override void PerformDataBinding(IEnumerable dataSource) 
{ 
    base.PerformDataBinding(dataSource); 
    if (dataSource != null) 
    { 
     bool flag = false; 
     bool flag2 = false; 
     string dataTextField = this.DataTextField; 
     string dataValueField = this.DataValueField; 
     string dataTextFormatString = this.DataTextFormatString; 
     if (!this.AppendDataBoundItems) 
     { 
      this.Items.Clear(); 
     } 
     ICollection is2 = dataSource as ICollection; 
     if (is2 != null) 
     { 
      this.Items.Capacity = is2.Count + this.Items.Count; 
     } 
     if ((dataTextField.Length != 0) || (dataValueField.Length != 0)) 
     { 
      flag = true; 
     } 
     if (dataTextFormatString.Length != 0) 
     { 
      flag2 = true; 
     } 
     foreach (object obj2 in dataSource) 
     { 
      ListItem item = new ListItem(); 
      if (flag) 
      { 
       if (dataTextField.Length > 0) 
       { 
        item.Text = DataBinder.GetPropertyValue(obj2, dataTextField, dataTextFormatString); 
       } 
       if (dataValueField.Length > 0) 
       { 
        item.Value = DataBinder.GetPropertyValue(obj2, dataValueField, null); 
       } 
      } 
      else 
      { 
       if (flag2) 
       { 
        item.Text = string.Format(CultureInfo.CurrentCulture, dataTextFormatString, new object[] { obj2 }); 
       } 
       else 
       { 
        item.Text = obj2.ToString(); 
       } 
       item.Value = obj2.ToString(); 
      } 
      this.Items.Add(item); 
     } 
    } 
    if (this.cachedSelectedValue != null) 
    { 
     int num = -1; 
     num = this.Items.FindByValueInternal(this.cachedSelectedValue, true); 
     if (-1 == num) 
     { 
      throw new ArgumentOutOfRangeException("value", SR.GetString("ListControl_SelectionOutOfRange", new object[] { this.ID, "SelectedValue" })); 
     } 
     if ((this.cachedSelectedIndex != -1) && (this.cachedSelectedIndex != num)) 
     { 
      throw new ArgumentException(SR.GetString("Attributes_mutually_exclusive", new object[] { "SelectedIndex", "SelectedValue" })); 
     } 
     this.SelectedIndex = num; 
     this.cachedSelectedValue = null; 
     this.cachedSelectedIndex = -1; 
    } 
    else if (this.cachedSelectedIndex != -1) 
    { 
     this.SelectedIndex = this.cachedSelectedIndex; 
     this.cachedSelectedIndex = -1; 
    } 
} 
+0

Gracias. Creo que tener "Texto" y "Valor" como propiedades predeterminadas es una buena idea. – Espo

3

Si usted está construyendo ListItems, usted no tiene ninguna necesidad de utilizar DataBind() en el primer lugar.

Sólo tiene que añadir a su DropDownList:



ddList1.Items.Add(new ListItem("Select Value", "0")); 
ddList1.Items.Add(new ListItem("Red", "1")); 
ddList1.Items.Add(new ListItem("Green", "2")); 
ddList1.Items.Add(new ListItem("Blue", "3")); 

DataBind() es útil cuando ya tiene una colección/DataObject (por lo general un DataTable o DataView) que puede ser utilizado como una fuente de datos, mediante el establecimiento de la DataTextField y DataValueField (como escribió buyutec).

+0

Gracias por su comentario, incluso si no respondió de acuerdo con su última frase. No me di cuenta que eso es todo lo que necesitaba hacer. – Bryan

1

"Si está compilando ListItems, no necesita usar DataBind() en primer lugar."

Agregar de forma directa a la lista desplegable es la manera fácil (y dado que el código de ejemplo es el correcto) pero digamos que tiene un origen de datos no ordenado y desea ordenar los elementos de la lista.

Una forma de lograr esto sería crear una lista genérica de ListItem y luego usar el método de ordenación heredado antes de enlazar datos a la lista.

Hay muchos wys para desollar un gato ...

Cuestiones relacionadas