2015-03-14 3 views
2

Я заметил, что, когда два combobox имеют один и тот же источник данных (например, DataTable), они будут использовать один и тот же выбранный индекс.механик ниже combobox с тем же источником данных

Я хотел бы знать, как это выполняется.

Похоже, что у DataTable есть огонь, когда произошла переменная «текущая строка» или «активная строка», а привязки к ней привязаны к событию и приводят к соответствующим изменениям. Тем не менее, я видел это событие, когда вы используете источник данных, например List, он тоже работает.

На самом деле я хотел бы, чтобы RadioButton обновлялся синхронно с двумя выпадающими списками, как мне это реализовать?

Вопросы, которые я видел в Интернете, в основном иметь дело с тем, как рассинхронизировать выпадающий с таким же источником данных, как этот Multiple Combo Boxes With The Same Data Source (C#), и это Binding two combo boxes to the same data source,that each combo will have individual behaviour, Share ComboBox DataSource.

+0

Глядя на [это сообщение] (http://stackoverflow.com/questions/23886653/comboboxes-are-linked-for-some-reason) Я предполагаю, что вы также использовали бы общий BindingSource (если это действительно может быть связано to RadioButton ?!) – TaW

+0

@TaW Я знаю, как отделить общую проблему источника данных. Здесь я просто хочу знать, как произошло сочетание двух comboboxs, поэтому я мог воспользоваться маханикой. Нет, bindingsource не может привязываться к радиообъекту. –

+0

Я знаю, что вы знали, я просто хочу указать, как сцепление выполняется в Comboboxes. Если вы не можете сделать это одинаково для RadioButton, я думаю, вам придется найти какой-то метод, управляемый событиями. ['Bindingsource'] (https://msdn.microsoft.com/de-de/library/system .windows.forms.bindingsource% 28v = vs.110% 29.aspx? f = 255 & MSPPError = -2147217396) имеет событие 'PositionChanged'. – TaW

ответ

1

Это поведение реализуется BindingContext Class. Важнейшая часть:

Для каждого источника данных в форме Windows существует отдельный диспетчер валют или PropertyManager.

Если вы установили ComboBox 'с (или ListControl iS) источник данных, он регистрирует себя вмещающего Control «ы BindingContext поэтому он будет общаться с CurrencyManager. Когда два регистра ListControl с одним и тем же источником данных, они получают то же самое CurrencyManager.

Вы можете просто проверить это

this.comboBox1.BindingContext[lst].CurrentChanged += Form1_CurrentChanged; 
this.comboBox2.BindingContext[lst].CurrentChanged += Form1_CurrentChanged; 
this.BindingContext[lst].CurrentChanged += Form1_CurrentChanged; 

void Form1_CurrentChanged(object sender, EventArgs e) 
{ 
    Debug.WriteLine(((CurrencyManager)sender).GetHashCode()); 
} 

Это покажет три одинаковых hashcodes в окне вывода, если изменить выбранный элемент один со списком.

Это также показывает, почему нет «ярлыка» для значения RadioButton, поскольку оно не связывается с CurrencyManager (это не ListControl).Вам нужно будет написать код, чтобы синхронизировать его значение с текущим значением поля со списком.

+0

Фантастический и понятный ~ –

0

Вот способ сделать это:

  • Создать BindingSource, который можно использовать в качестве общегоDataSource для какComboBoxes. Таким образом, они по-прежнему связаны между собой, но к нормальному BindingSource, а не скрыты по умолчанию один: myBS = new BindingSource(myDT, myDT.Columns[myColumn].ColumnName);

  • Добавить событие изменения в Position: Код myBS .PositionChanged += myBS_PositionChanged;

  • Пут в случае контроля значений RadioButton .....

Логика в коде события зависит от вас; вот пример:

void myBS_PositionChanged(object sender, EventArgs e) 
{ 
    radioButton1.Checked = myBS.Current.ToString() == "2"; 
} 
Смежные вопросы