2008-09-25 19 views
10

ich dieses aspx-Code haben: (Probe)Hinzufügen von Listitems zu einem Dropdownlist aus einer generischen Liste

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

Mit diesem Code-Behind:

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 wie folgt 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")) Methode verwende, aber ich muss eine allgemeine Liste als die Datenquelle aus anderen Gründen verwenden.

Antwort

10

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

UPDATE: Sie müssen auch DataTextField-Eigenschaft auf "Text" festlegen. Dies liegt daran, dass die Datenbindung und das manuelle Hinzufügen von Elementen nicht auf die gleiche Weise funktionieren. Databinding kennt die Existenz des ListItem-Typs nicht und generiert Markup durch Auswertung der Elemente in der Datenquelle.

+0

Warum _need_ ich das Feld zu setzen? Wie gesagt, es funktioniert, wenn das ListItem direkt zur DropDownList.Items-Auflistung hinzugefügt wird. Ich habe deinen Vorschlag ausprobiert und es hat nicht geholfen. Siehe meine aktualisierte Frage. – Espo

+0

Ich sehe. Ich habe die Antwort aktualisiert und die Informationen hinzugefügt, um das zu beheben. –

+0

Das funktioniert, danke! – Espo

3

Und hier ist die Methode, die die Datenbindung durchführt. Sie können genau sehen, was los ist:

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

Danke. Ich denke, dass "Text" und "Value" als Standardeigenschaften eine gute Idee sind. – Espo

3

Wenn Sie Listitem bauen, haben Sie keine Notwendigkeit haben DataBind() an erster Stelle zu verwenden.

Fügen Sie sie einfach auf Ihre 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() ist nützlich, wenn man schon eine Sammlung/Datenobjekts (in der Regel ein Datatable oder Dataview), die als Datasource verwendet werden kann, indem die Datatexteinstellung und DataValueField (wie buyutec schrieb).

+0

Danke für deinen Kommentar, auch wenn er nicht nach seinem letzten Satz geantwortet hat. Ich wusste nicht, dass das alles war, was ich tun musste. – Bryan

1

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

Das Hinzufügen direkt zur Dropdownliste ist der einfache Weg (und gegeben das Beispiel Code der richtige) aber sagen wir, Sie haben eine ungeordnete Datenquelle und Sie wollen die Listenelemente sortiert.

Eine Möglichkeit, dies zu erreichen, wäre, eine generische Liste von ListItem zu erstellen und dann die vererbte Sortiermethode vor der Datenbindung an die Liste zu verwenden.

Es gibt viele wys sind die Haut eine Katze ...

Verwandte Themen