Установка выбранного элемента в ListBox без зацикливания - PullRequest
8 голосов
/ 18 мая 2009

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

Вот список, заполняющий код:

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; выбираете неправильные предметы?

Ответы [ 7 ]

7 голосов
/ 14 июля 2009

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

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

lb.SelectedValue = valuePassedByUser;

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

Например, если мои исходные данные:

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

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

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

Теперь, если я хочу установить Banana как выбранное, я запускаю команду stmt:

lb.SelectedValue = "B";

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

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

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;
        }
    }
}
1 голос
/ 18 мая 2009

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

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

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

0 голосов
/ 17 августа 2016

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

0 голосов
/ 17 августа 2016

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

listBox1.SelectedIndex = listBox1.FindString(stringInList);
0 голосов
/ 23 марта 2016
this.Character.SetSelected(this.Character.Items.IndexOf(this.textBox1.Text),true);
0 голосов
/ 02 августа 2010

Вы можете использовать «FindByValue» следующим образом:

ListBox.SelectedIndex = ListBox.Items.IndexOf(ListBox.Items.FindByValue(fieldValue))
0 голосов
/ 18 мая 2009

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

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