nirmalVaishnav Ответов: 1

Очистите и добавьте элементы combobox, если его источником данных является dictionary<int, string>


<pre lang="c#">
cmbSourceTag1. DataSource = new BindingSource(objSource, null);
cmbSourceTag1. DisplayMember = " значение";
cmbSourceTag1. ValueMember = " ключ";


как удалить и добавить новые элементы в combobox ?
где находится objSource
Dictionary<int, string>


Что я уже пробовал:

cmbSourceTag2.Items.RemoveAt(((KeyValuePair<int, string>)cmbSourceTag2.Items[2]).Key);

он будет бросать ошибка
у кого-нибудь есть идея удалить и добавить элемент из combobox?

Спасибо

Richard MacCutchan

Вы должны удалить / добавить элементы в источнике данных, а не в комбо.

nirmalVaishnav

но я хочу удалить его из combobox..
есть какие-нибудь идеи по этому поводу?

Richard MacCutchan

Да, делай, что я сказал.

1 Ответов

Рейтинг:
0

Alan N

В выпадающем списке можно использовать любой коллекция элементов или источник данных. Они являются взаимоисключающими, и коллекция элементов не может быть изменена при использовании источника данных.

Как сказал Ричард, вы должны добавлять и удалять элементы из источника данных.

Выбрав словарь в качестве исходного источника данных, вы сделали эту задачу довольно сложной. Словарь не будет напрямую привязываться к combobox, так как он не реализует необходимый интерфейс IList. BindingSource фактически создает промежуточную систему.ComponentModel.BindingList (заполняется KeyValuePairs из словаря), а затем присваивает его ComboBox.Источник данных. В действительности словарь-это не обязательно компонент ComboBox на всех.

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

private void RemoveFromDictionary_Click(Object sender, EventArgs e) {
  if (cbx.SelectedIndex != -1) {
    KeyValuePair<int, string> item = (KeyValuePair<int, string>)cbx.SelectedItem;
    // Remove from dictionary
    dic.Remove(item.Key);
    // Force the BindingSource to recreate the intermediate BindingList
    // and refresh the combobox
    cbxBindingSource.DataSource = null;
    cbxBindingSource.DataSource = dic;
  }
}

Если вы сможете перепроектировать свою программу, чтобы использовать BindingList непосредственно вместо словаря, код станет намного проще.
 private void RemoveFromList_Click(Object sender, EventArgs e) {
  if (cbx.SelectedIndex != -1) {
    bindlist.RemoveAt(cbx.SelectedIndex);
  }
}

Алан.