2008-09-25 5 views
10

У меня есть этот ASPX-код: (образец)Добавление ListItems к DropDownList из общего списка

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

С этим коде:

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

Результат выглядит следующим образом:

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

Мой вопрос: Почему мои значения (числа) исчезли, а текст использовался как значение И текст? Я знаю, что он работает, если я использую метод ddList1.Items.Add(New ListItem("text", "value")), но мне нужно использовать общий список в качестве источника данных по другим причинам.

ответ

10

Поскольку метод DataBind связывает значения, только если установлено свойство DataValueField. Если вы установите для свойства DataValueField значение «Значение» перед вызовом DataBind, ваши значения появятся в разметке.

UPDATE: вам также необходимо установить свойство DataTextField в «Text». Это связано с тем, что привязка данных и добавление элементов вручную не работают одинаково. Связывание с данными не знает существования типа ListItem и создает разметку путем оценки элементов в источнике данных.

+0

Почему я _need_, чтобы установить это поле? Как я уже сказал, это работает, когда ListItem добавляется непосредственно в коллекцию DropDownList.Items. Я попробовал ваше предложение, и это не помогло. См. Мой обновленный вопрос. – Espo

+0

Я вижу. Я обновил ответ и добавил информацию, чтобы исправить это. –

+0

Это работает, спасибо! – Espo

3

И вот метод, который выполняет привязку данных. Вы можете точно узнать, что происходит:

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

Спасибо. Я думаю, что наличие «Текст» и «Значение» в качестве свойств по умолчанию - хорошая идея. – Espo

3

Если вы строите ListItems, у вас нет необходимости использовать DataBind() в первую очередь.

Просто добавьте их в 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() полезна, если у вас уже есть коллекция/DataObject (обычно DataTable или DataView), которые могут быть использованы в качестве источника данных, установив DataTextField и DataValueField (как пишет buyutec).

+0

Спасибо за ваш комментарий, даже если он не ответил в соответствии с его последним предложением. Я не понимал, что это все, что мне нужно. – Bryan

1

«Если вы создаете ListItems, вам не нужно использовать DataBind() в первую очередь».

Добавление непосредственно в раскрывающийся список - это простой способ (и приведён пример кода справа), но позволяет сказать, что у вас есть неупорядоченный источник данных, и вы хотите отсортировать отсортированные элементы списка.

Одним из способов достижения этого было бы создать общий список ListItem, а затем использовать унаследованный метод сортировки перед привязкой данных к списку.

Есть много wys для кошки ...