WinForms - изменение источника привязки / источника данных элемента управления во время выполнения? - PullRequest
0 голосов
/ 18 августа 2011

У меня есть приложение Winforms с компонентом BindingSource, и его DataSource настроен на DataSource, который я создал для пользовательского объекта данных. Также на форме есть несколько элементов управления, которые связаны с различными свойствами объекта, предоставляемого через BindingSource. Многие из этих элементов управления являются комбинированными списками и будут отображать значения с вспомогательным перечислением, поэтому я устанавливаю источник данных для этих элементов управления следующим образом:

        comboBox1.DataSource = new BindingSource(Utility.ToList(typeof(DataObject.EnumValues)), null);
        comboBox1.DisplayMember = "Value";
        comboBox1.ValueMember = "Key";

Это все работает достаточно хорошо, но у меня есть два комбинированных списка, которые мне нужно изменить во время выполнения, чтобы отобразить другие значения (с другим обратным перечислением). В этих двух случаях я создаю исходные привязки и источник данных в коде так:

        comboBox2.DataBindings.Add(new Binding("SelectedValue", this.bindingSource, "PropertyName1", true));
        comboBox2.DataSource = new BindingSource(Utility.ToList(typeof(DataObject.FirstSetOfEnumValues)), null);
        comboBox2.DisplayMember = "Value";
        comboBox2.ValueMember = "Key";

... и затем, когда мне нужно comboBox2 для привязки и отображения различных значений, я делаю это:

        comboBox2.DataBindings.Clear();
        comboBox2.DataBindings.Add(new Binding("SelectedValue", this.bindingSource, "PropertyName2", true));
        comboBox2.DataSource = null;
        comboBox2.DataSource = new BindingSource(Utility.ToList(typeof(DataObject.SecondSetOfEnumValues)), null);
        comboBox2.DisplayMember = "Value";
        comboBox2.ValueMember = "Key";

Насколько я могу судить, это работает должным образом, но это ужасно, и есть got , чтобы быть намного лучшим способом сделать это, верно? Если вы знаете, что это, я хотел бы услышать это! Большое спасибо!

Ответы [ 2 ]

1 голос
/ 18 августа 2011

Если бы это была веб-форма, я мог бы предложить использовать ComboBox2 как два отдельных ComboBox и скрыть / показать тот, который вам нужен. Хотя я понимаю, что это не так просто для проекта WinForm, если вы не используете плавный макет?

Вы можете добавить функцию для возврата источника данных, основываясь на вашем типе перечисления ... Я не думаю, что вам нужно заново устанавливать свойства DisplayMember и ValueMember после вызова Clear () (но я могу ошибаться) .

Кроме этого, я не думаю, что вы можете упростить это намного больше. Хотя я был бы рад услышать, если у кого-то есть лучшее решение:)

0 голосов
/ 18 августа 2011

Вам не нужно связывать ComboBox с новым экземпляром BindingSource.

Свяжите ваши ComboBox с их соответствующими BindingSource.Это можно сделать либо через конструктор Windows Forms, либо вручную в своем собственном коде.Обязательно сохраните ссылку на BindingSources, если вы делаете это в своем коде.Если вы используете конструктор, то для вас добавляется элемент в ваш класс Form.

Затем, когда вы хотите отобразить другой набор значений, все, что вам нужно сделать, это изменить источник данных в BindingSources иComboBox будет обновляться соответственно.

Приветствия

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