Почему я предложил использовать это назначение для установки текущего элемента ComboBox:
cmbNames.SelectedItem = new KeyValuePair<int, string>(Names.ID, dataSouceCantieri[Names.ID]);
, а также для определения DisplayMember
и ValueMember
свойств, подобных этому:
cmbNames.DisplayMember = "Value";
cmbNames.ValueMember = "Key";
cmbNames.DataSource = new BindingSource(dataSouceCantieri, null);
Это связано с тем, что происходит, когда вы устанавливаете [ComboBox].DataSource = [Dictionary<TKey, TValue>];
.
Ну, на самом деле вы не можете этого сделать.Словарь - это сложный объект, который напрямую не управляется свойством DataSource
элемента управления;он принимает только сложный объект, который реализует IList или IListSource .Словарь не.
Конечно, вы можете преобразовать словарь в список, теперь он будет принят:
[ComboBox].DataSource = [Dictionary<TKey, TValue>].ToList();
Мы предоставляем List<KeyValuePair<TKey, TValue>>
, который реализует IList<T>
.
Кроме того, каждый элемент списка имеет вид KeyValuePair<TKey, TValue>
.
Этот объект обладает двумя свойствами: Key
иValue
, который позволяет получить доступ к внутренним значениям объекта.
Словарь предоставляет только коллекцию Keys и свойства Values .Другие сложные объекты.
Когда вы устанавливаете BindingSource.DataSource
в словарь, этот класс выполняет ту же операцию: он проверяет, реализует ли объект, который мы назначаем, реализациюIList
или IListSource
;в противном случае он создает новый BindingList и использует метод IEnumerable.GetEnumerator () для извлечения элементов из коллекции.
Dictionary.GetEnumerator () возвращает каждый элемент коллекции как KeyValuePair<TKey, TValue>
, так же, как и вызов [Dictionary].ToList()
.
См. Это поведение в справочном источнике .Net:
Основной конструктор BindingSource
Список IList = [BindingSource] .GetListFromEnumerable ()
приватный статический IList CreateBindingList (Type type)
Итак, когда мы присваиваем это:
cmbNames.DataSource = new BindingSource(dataSourceNames, null);
, мы фактически устанавливаем источник данных элемента управления равным IList<KeyValuePair<TKey, TValue>>
.
Как следствие, каждый ComboBox.Item
является KeyValuePair<TKey, TValue>
.
A KeyValuePair<int, string>
, здесь.
Вот почему мы можем установить:
[ComboBox].DisplayMember = "Value";
[ComboBox].ValueMember = "Key";
это имена свойств, предоставляемых классом KeyValuePair<TKey, TValue>
.
Поскольку каждый элемент ComboBox представляет собой KeyValuePair<int, string>
, чтобы выбрать элемент, сделав его текущим, мы можем установить для него определенный KeyValuePair<int, string>
.
В вашем случае ключпредоставлено свойством Names.ID
:
cmbNames.SelectedItem = new KeyValuePair<int, string>(Names.ID, dataSouceCantieri[Names.ID]);
Я использовал эту форму: new KeyValuePair<int, string>(Names.ID, dataSouceCantieri[Names.ID])
, потому что таким образом мы можем получить доступ к Словарю, dataSouceCantieri
, напрямую через Key, так что это операция O(1)
.
Лучше, чем писать:
cmbNames.SelectedItem = dataSouceCantieri.FirstOrDefault(dict => dict.Key == Names.ID);
или подобное.Этот метод подразумевает повторение коллекции до тех пор, пока не будет найден нужный элемент или его нет.