2016-08-08 4 views
0

У меня есть приложение WinForms с стилем TreeView Explorer слева. При выборе разных узлов будут отображаться различные UserControls, состоящие из различных других стандартных элементов управления. Все элементы управления в различных UserControls привязаны к одному набору данных. У меня есть ComboBox над областью дерева (для изменения между тестовыми и живыми настройками), связанный с главной таблицей, и поскольку у меня есть настройка отношений между деталями между таблицами, изменение ComboBox изменяет текущую строку для всех дочерних таблиц. Все идет нормально.WinForms программная привязка master-detail

Теперь я добавил подключаемые поддеревья (взятые из отдельных DLL), и каждое поддерево использует собственный DataSet. Часть, с которой у меня возникли проблемы, заключается в том, как привязать подделки к главной таблице. Я реплицировал главную таблицу в DataSets поддеревьев (потому что отношения не будут работать между DataSets), но поскольку у поддеревьев нет собственного ComboBox, я не уверен, как сделать работу привязки , Я думаю, мне нужен CurrencyManager для каждого поддерева, и каким-то образом связать их с событием изменения ComboBox, но как мне связать UserControls в дереве с CurrencyManager?

ответ

0

Кусок я пропускал создавал BindingContext для поддерева ...

bindingContext = new BindingContext(); 

... и затем установить его на UserControls суб-дерева:

public partial class MyUserControl : UserControl 
{ 
    public MyUserControl(BindingContext bindingContext, DataSet dataSet) 
    { 
     this.BindingContext = bindingContext; 
     InitializeComponent(); 
     myTextBox.DataBindings.Add("Text", dataSet, "Master.Master_Detail.DetailField"); 
    } 
} 

I не понимал, что CurrencyManager не нужно явно создавать для связи с DataSet. Установка DataBindings достаточно.

Имея два отдельных DataSets на этапе затем просто необходим метод, как это:

public void MasterChanged(long masterID) 
{ 
    var currencyManager = bindingContext[dataModel.DataSet, "Master"]; 
    var masterRows = masterTable.Rows; 
    for (int position = 0; position < masterRows.Count; position++) 
    { 
     if (((long)masterRows[position]["ID"]) == masterID) 
     { 
      currencyManager.Position = position; 
      break; 
     } 
    } 
} 
Смежные вопросы