Проблема с SelectedValue, когда Sorted true (ComboBox) - PullRequest
2 голосов
/ 25 июня 2019

При установке ComboBox.Sorted на true, ComboBox.SelectedValue возвращает значения, отличные от видимого выбранного значения.

Загрузка предметов и показ:

using (ModelContext model = new ModelContext())
{
    cbWorker.ValueMember = "IdWorker";
    cbWorker.DisplayMember = "FullName";

    bindingWorker.DataSource = model.Workers.Select(x => new ItemWorker{
            IdWorker = x.Id,
            FullName = x.FullName
        })
        .ToList();

    cbWorker.DataSource = bindingWorker;
}

private void CbWorker_SelectedValueChanged(object sender, EventArgs e)
{
    object x = cbWorker.SelectedValue;
    if (x!= null) label.Text = x.ToString();
}

Если ComboBox.Sorted = false, SelectedValue в порядке:

enter image description here

Но если ComboBox.Sorted = true, SelectedValue не в порядке:

enter image description here

можно это исправить? Аналогичная проблема, например, с CheckedListBox.

1 Ответ

1 голос
/ 25 июня 2019

Установите ComboBox.Sorted на false и сортируйте bindingWorker.DataSource по свойству IdWorker:

cbWorker.Sorted = false;

...

bindingWorker.DataSource = model.Workers.Select(x => new ItemWorker{
            IdWorker = x.Id,
            FullName = x.FullName
        })
        .OrderBy(x => x.IdWorker)
        .ToList();

cbWorker.DataSource = bindingWorker;

cbWorker.ValueMember = "IdWorker";
cbWorker.DisplayMember = "FullName";

Пояснение:

В вашем примере есть две проблемы:

  1. Установка ComboBox. Сортируется в true для привязанного к данным ComboBox
  2. Числовая сортировка элементов ComboBox с использованием ComboBox.Sorted

Установка ComboBox.Sorted в true для привязанного к данным ComboBox

С ComboBox.Sorted Property Документация:

Попытка установить свойство Sorted для элемента управления с привязкой к данным вызывает ArgumentException. Вы должны отсортировать данные, используя базовые данные модель.

Вероятно, не стоит устанавливать ComboBox.Sorted на true для данных ComboBox. Даже если оно не вызывает исключение, оно может вызвать неожиданное поведение.

Числовая сортировка элементов ComboBox с использованием ComboBox.Sorted

Простой тест может показать, что если ComboBox.Sorted = true:

  • Элементы отсортированы по ComboBox.DisplayMember
  • Элементы сортируются как строки (что-то вроде item.ToString())

Это означает, что даже если ComboBox.DisplayMember был числовым типом, он будет отсортирован после вызова ToString() для каждого номера, поэтому элементы будут отсортированы в алфавитном порядке , а не в виде чисел.

Например, если числа 10, 1, 3 будут отсортированы непосредственно в виде числовых значений, они будут отсортированы в 1, 3, 10, но если числа сначала будут преобразованы в строки ("10", "1", "3"), а затем отсортированы, они будут сортироваться по алфавиту по "1", "10", "3"

Заключение

Если вы хотите:

  • Сортировка привязанных данных ComboBox
  • Сортировать ComboBox элементы не по алфавиту
  • Сортировать по члену, отличному от DisplayMember

Вы должны отсортировать элементы перед установкой элементов как ComboBox.DataSource и установить ComboBox.Sorted на false

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...