Обновление привязки данных ComboBox в C # и .NET 4.0 - PullRequest
3 голосов
/ 16 сентября 2010

У меня есть ComboBox (Windows Forms), который привязан к списку.Он создан во время разработки.Когда содержимое списка изменяется, мой код вызывает функцию для обновления привязки данных. Это прекрасно работает для .NET 3.5 :

BindingData.SuspendBinding();
DataSource = null;
DataSource = BindingData;
BindingData.ResumeBinding();

Я перешел на .NET 4.0 и он перестал работать .В частности, после выполнения этого кода отладчик VS показывает, что BindingData.DataSource ссылается на список из 127 элементов, но свойство ComboBox Items содержит ноль элементов.

См. Этот вопрос SO по аналогичной теме: ComboBox ItemsСчетчик не соответствует источнику данных .

Я перепробовал все, что мог придумать.В настоящее время мой код выглядит следующим образом и все еще не работает:

BindingData.SuspendBinding();
DataSource = null;
DataSource = BindingData;
BindingData.ResumeBinding();
BindingContext Dummy = this.BindingContext;
Invalidate();
PerformLayout();

Я попытался переключиться с List на BindingList, но это не помогло.Мне пришлось переключиться с .NET 3.5 на .NET 4.0 против моей воли, так что это довольно сложно.Я уверен, что есть определенная последовательность, которая работает.Есть идеи?

Вот как я подключаю источник данных к ComboBox:

private BindingSource BindingData = new BindingSource();

BindingData.DataSource = Nodes;
DataSource = BindingData;

спасибо, Энди

Ответы [ 3 ]

1 голос
/ 16 сентября 2010

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

Я снова добавил обновление привязки данных в событие ComboBox.HandleCreated, и оно работает.

спасибо, Энди

0 голосов
/ 10 декабря 2017

В соответствии с Как: привязать ComboBox Windows Forms или элемент управления ListBox к данным , вы можете использовать свойство DisplayMember ComboBox:

//Sample for C++ .NET:
List<String^>^ options = gcnew List<String^>();
options->Add("Option 1");
options->Add("Option 2");

comboBox.DataSource = options;  
comboBox.DisplayMember = "Length";//this causes an DataSource update but the ComboBox would
                                  //show an item's length instead of the item itself
comboBox.DisplayMember = "";      //reset -> the ComboBox calls each List item's ToString
                                  //member

«Длина» относится к публичной собственности класса String. Лучше было бы свойство, которое ссылается непосредственно на символы строки. Единственное оставшееся публичное свойство String - это Chars, но я не мог заставить его работать. Поэтому мы сбрасываем DisplayMember на comboBox.DisplayMember = "", в результате чего ComboBox вызывает каждый элемент списка (a String) ToString method => проблема решена.

Другие записи списка, кроме строк, могут обрабатываться свойствами ComboBox DisplayMember и ValueMember (они также применяются к другим элементам управления): DisplayMember & ValueMember

0 голосов
/ 18 октября 2010

Почему вы приостанавливаете и возобновляете BindingSource? Если вы просто измените свой DataSource, производительности не будет.

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