Hinzufügen von ListItems zu einer DropDownList aus einer generischen Liste

Ich habe einen diesen aspx-Code: (Beispiel)

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

Mit diesem CodeBehind:

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();

Die Ausgabe sieht so aus:

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

Meine Frage ist: Warum sind meine Werte (Zahlen) verschwunden und der Text als Wert UND der Text verwendet? Ich weiß, dass es funktioniert, wenn ich die ddList1.Items.Add(New ListItem("text", "value")) method, but I need to use a generic list as the datasource for other reasons. Methode verwende, aber ich muss eine generische Liste als Datenquelle aus anderen Gründen verwenden.

Antwort auf "Hinzufügen von ListItems zu einer DropDownList aus einer generischen Liste " 4 von antworten

Da die DataBind-Methode Werte nur bindet, wenn die DataValueField-Eigenschaft festgelegt ist. Wenn Sie die DataValueField-Eigenschaft vor dem Aufruf von DataBind auf "Value" festlegen, werden Ihre Werte im Markup angezeigt.

UPDATE: Sie müssen auch die DataTextField-Eigenschaft auf "Text" setzen. Dies liegt daran, dass das manuelle Binden und Hinzufügen von Elementen nicht auf die gleiche Weise funktioniert. Die Datenbindung kennt die Existenz des Typs ListItem nicht und generiert Markup, indem die Elemente in der Datenquelle ausgewertet werden.

Und hier ist die Methode, die die Datenbindung ausführt. Sie können genau sehen, was vor sich geht:

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

Wenn Sie ListItems erstellen, müssen Sie DataBind() überhaupt nicht verwenden.

Fügen Sie sie einfach zu Ihrer DropDownList hinzu:



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() ist nützlich, wenn Sie bereits über ein Sammlungs-/Datenobjekt (in der Regel dataTable oder DataView) verfügen, das als DataSource verwendet werden kann, indem Sie DataTextField und DataValueField (wie buyutec geschrieben hat) festlegen.

"Wenn Sie ListItems erstellen, müssen Sie DataBind() nicht verwenden."

Das direkte Hinzufügen zur Dropdownliste ist der einfache Weg (und angesichts des Beispielcodes die richtige), aber sagen wir, Dass Sie eine ungeordnete Datenquelle haben und die Listenelemente sortiert werden sollen.

Eine Möglichkeit, dies zu erreichen, wäre, eine generische Liste von ListItem zu erstellen und dann die geerbte Sortiermethode zu verwenden, bevor Daten in die Liste gebunden werden.

Es gibt viele wys, um eine Katze zu häuten...