2008-09-25 18 views
10

Mam to aspx-Code: (próbka)Dodawanie ListItems do DropDownList z ogólnej listy

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

Z tym kodzie:

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

Wyjście wygląda następująco:

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

Moje pytanie brzmi: Dlaczego moje wartości (liczby) zniknęły, a tekst został użyty jako wartość ORAZ w tekście? Wiem, że to działa, jeśli używam metody ddList1.Items.Add(New ListItem("text", "value")), ale potrzebuję użyć ogólnej listy jako źródła danych z innych powodów.

Odpowiedz

10

Ponieważ metoda DataBind wiąże wartości tylko wtedy, gdy ustawiona jest właściwość DataValueField. Jeśli ustawisz właściwość DataValueField na "Wartość" przed wywołaniem DataBind, twoje wartości pojawią się na znacznikach.

AKTUALIZACJA: Konieczne będzie również ustawienie właściwości DataTextField na "Tekst". Dzieje się tak, ponieważ powiązanie danych i ręczne dodawanie elementów nie działa w ten sam sposób. Databinding nie wie o istnieniu typu ListItem i generuje znaczniki przez ocenę pozycji w źródle danych.

+0

Dlaczego _eded_, aby ustawić to pole? Jak już powiedziałem, działa, gdy ListItem jest dodawany bezpośrednio do kolekcji DropDownList.Items. Wypróbowałem twoją sugestię i to nie pomogło. Zobacz moje zaktualizowane pytanie. – Espo

+0

Rozumiem. Zaktualizowałem odpowiedź i dodałem informację, aby to naprawić. –

+0

To działa, dziękuję! – Espo

3

A oto metoda, która wykonuje powiązanie danych. można dokładnie zobaczyć, co się dzieje:

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

Dziękuję. Myślę, że posiadanie "tekstu" i "wartości" jako domyślnych właściwości jest dobrym pomysłem. – Espo

3

Jeśli ListItems budowy, nie ma potrzeby korzystania z DataBind() w pierwszej kolejności.

Wystarczy dodać je do 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() jest przydatna, gdy masz już zbiór/DataObject (zwykle DataTable lub DataView), które mogą być używane jako źródła danych, poprzez ustawienie DataTextField i DataValueField (jak napisał buyutec).

+0

Dzięki za komentarz, nawet jeśli nie odpowiedział zgodnie z jego ostatnim zdaniem. Nie zdawałem sobie sprawy, że to wszystko, co muszę zrobić. – Bryan

1

"Jeśli budujesz ListItems, nie musisz używać DataBind() w pierwszej kolejności."

Dodanie bezpośrednio do listy rozwijanej jest prostą metodą (i podaniem kodu przykładowego), ale pozwala powiedzieć, że masz nieuporządkowane źródło danych i chcesz, aby pozycje listy były posortowane.

Jednym ze sposobów osiągnięcia tego byłoby utworzenie ogólnej listy ListItem, a następnie wykorzystanie odziedziczonej metody sortowania przed powiązaniem danych z listą.

Istnieje wiele wys do skóry kota ...

Powiązane problemy