WinForms程序化绑定master-detail

时间:2016-08-08 16:48:02

标签: c# winforms data-binding master-detail

我有一个WinForms应用程序,左侧是Explorer风格的TreeView。选择不同的节点将显示由各种其他标准控件组成的不同UserControl。各种UserControl中的所有控件都绑定到单个DataSet。我在树的范围之上有一个ComboBox(在测试和实时设置之间进行更改)绑定了一个主表,并且因为我在表之间设置了主 - 详细关系,所以更改ComboBox会更改所有子表的当前行。到目前为止,非常好。

我现在添加了可插入的子树(从单独的DLL中拾取),每个子树使用它自己的DataSet。我遇到问题的部分是如何使子树链接到主表。我已经在子树的DataSet中复制了主表(因为关系在DataSet之间不起作用),但由于子树没有自己的ComboBox,我不确定如何使绑定工作。我想我需要为每个子树使用CurrencyManager,并以某种方式将它们链接到ComboBox的更改事件,但是如何将子树的UserControls与CurrencyManager相关联?

1 个答案:

答案 0 :(得分: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");
    }
}

我不明白CurrencyManager不需要显式创建来与DataSet链接。设置DataBinding就足够了。

保持两个单独的DataSet步骤,然后只需要这样的方法:

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;
        }
    }
}