Pregunta

Tengo un código aspx: (muestra)

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

Con este código:

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 se ve así:

<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 para otras razones.

¿Fue útil?

Solución

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

ACTUALIZACIÓN: también deberá configurar la propiedad DataTextField en " Texto " ;. Se debe a que el enlace de datos y la adición manual de elementos no funcionan de la misma manera. El enlace de datos no conoce la existencia del tipo ListItem y genera un marcado al evaluar los elementos en la fuente de datos.

Otros consejos

Y aquí está el método que realiza el enlace de datos. Puedes 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;
    }
}

Si está creando ListItems, no necesita utilizar DataBind () en primer lugar.

Solo agrégalos a tu 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 tienes una colección / objeto de datos (generalmente un DataTable o DataView) que se puede usar como DataSource, configurando el DataTextField y el DataValueField (como escribió buyutec).

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

Agregar directamente a la lista desplegable es una forma fácil (y dado el código de ejemplo, el correcto), pero digamos que tiene una fuente de datos desordenada 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 clasificación heredado antes de vincular el enlace de datos a la lista.

Hay muchos wys para pelar a un gato ...

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top