2009-05-18 2 views
8

У меня есть список из нескольких элементов, который я привязываю к DataTable. DataTable содержит 2 описания и значения столбцов.Настройка выбранного элемента в ListBox без цикла

Вот ListBox заселение код:

DataTable copytable = null; 
       copytable = GlobalTable.Copy(); // GlobalTable is a DataTable 
       copytable.Rows[0][0] = "--ALL--"; 
       copytable.Rows[0][1] = "--ALL--"; 

       breakTypeList.DataSource = copytable; 
       this.breakTypeList.DisplayMember = copytable.Columns[0].ColumnName; // description 
       this.breakTypeList.ValueMember = copytable.Columns[1].ColumnName; // value 
       this.breakTypeList.SelectedIndex = -1; 

Я устанавливаю описание как DisplayMember и значение как ValueMember в ListBox. Теперь, в зависимости от того, какое значение передано, мне нужно установить выбранный элемент в ListBox.

Вот мой код:

ListBox lb = c as ListBox; 
lb.SelectedValue = valuePassedByUser; 

, который не работает. Поэтому я должен прибегнуть к коду ниже (где я перебрать все элементы в списке)

for (int i = 0; i < lb.Items.Count; i++) 
      { 
       DataRowView dr = lb.Items[i] as DataRowView; 
       if (dr["value"].ToString() == valuePassedByUser) 
       { 
        lb.SelectedIndices.Add(i); 
        break; 
       } 
      } 

Я хотел бы знать, что отсутствует/ошибочный в моем коде. Почему lb.SelectedValue = valuePassedByUser; выбор неправильных элементов?

+0

Можете ли вы дать дополнительную информацию о том, что именно вам нужно сделать или более полный пример кода? Является ли объект считывать поле из базы данных и устанавливать выбранный индекс/значение в соответствующее значение в списке? – ryanulit

+0

В поле списка заполняется DataTable, который, в свою очередь, имеет данные, полученные из базы данных. Я беспокоюсь, если я установил ValueMember при заполнении списка, почему это lb.SelectedValue = valuePassedByUser; не работает? –

ответ

7

Хорошо ... здесь идет труднодоступный ответ, который я понял только вчера. Это моя ошибка, хотя я не упомянул об одной важной вещи в моем вопросе, потому что я чувствовал, что это не имеет отношения к проблеме:

Данные в таблице данных не были отсортированы. Следовательно, I установил свойство Сортировка списка в значение true. Позже я понял, что при сортированном свойстве listbox или даже combo box значение true, то элемент значения не устанавливается правильно. Так что, если я пишу:

lb.SelectedValue = valuePassedByUser;

он устанавливает какой-либо другой элемент, как выбран, а не settting тот, чье значение valuePassedByUser. Короче говоря, это связано с индексами.

См., Например, если мои начальные данные:

Index ValueMember DisplayMember 
1   A   Apple 
2   M   Mango 
3   O   Orange 
4   B   Banana 

И я установил sorted = true. Тогда элементы ListBox являются:

Index ValueMember DisplayMember 
1   A   Apple 
2   B   Banana 
3   M   Mango 
4   O   Orange 

Теперь, если я хочу установить банан, как выбран, я бегу STMT:

lb.SelectedValue = "B";

Но вместо того, чтобы банан, как выбран, он устанавливает Оранжевый, как выбран. Зачем? Поскольку список не был отсортирован, индекс банана будет равен 4. Поэтому, хотя после сортировки индекса Banana равно 2, он устанавливает индекс 4 как выбранный, тем самым делая оранжевым выбранным вместо банана.

Поэтому для отсортированного списка, я использую следующий код для установки выбранных элементов:

private void SetSelectedBreakType(ListBox lb, string value) 
{ 
    for (int i = 0; i < lb.Items.Count; i++) 
    { 
     DataRowView dr = lb.Items[i] as DataRowView; 
     if (dr["value"].ToString() == value) 
     { 
      lb.SelectedIndices.Add(i); 
      break; 
     } 
    } 
} 
0

Попробуйте это: -

var listBox = c as ListBox; 
    var item = listBox.Items.FindByValue(fieldValue); 
    if (item != null) 
    listBox.SelectedValue = fieldValue; 
+2

Нет коллекции FindByValue в коллекции Items. – norlando

1

Я думаю, что единственный способ, которым Вы будете иметь возможность выбрать несколько элементов является использование цикла Еогеасп. Свойство SelectedValue возвращает только 1 элемент. Если вы хотите выбрать более 1 пункт вы должны будете использовать:

var tempListBox = c As ListBox; 
if (tempListBox != null) 
    (tempListBox.SelectedItems.Add(tempListBox.Items[tempListBox.FindStringExact(fieldValue)]); 

Также FindStringExact не выполняет поиск по полям Value она выглядит только через отображаемый текст. Кроме того, для сокращения кода может потребоваться добавить новую переменную в виде списка, чтобы вы не оставляли листинг C в качестве списка.

0

Вы можете использовать "FindByValue", как это:

ListBox.SelectedIndex = ListBox.Items.IndexOf(ListBox.Items.FindByValue(fieldValue)) 
0
this.Character.SetSelected(this.Character.Items.IndexOf(this.textBox1.Text),true); 
0

Вот как я решил он, используя winforms, DotNet 4.6

listBox1.SelectedIndex = listBox1.FindString(stringInList); 
0

Если вы не хотите циклически выбирать выбранные элементы, извлеките выбранное значение списка из события listBox_SelectedIndexChanged и добавьте это значение в глобальный массив. Затем, получив доступ к этому массиву, вы получите желаемые выбранные значения значений itemlist без каких-либо циклов.

Смежные вопросы