【问题标题】:WinForms programmatic binding of master-detail主从WinForms编程绑定
【发布时间】:2016-12-14 13:06:26
【问题描述】:

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

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

【问题讨论】:

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


    【解决方案1】:

    我缺少的是为子树创建一个 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 链接。设置 DataBindings 就足够了。

    将两个单独的数据集保持一致,然后只需要这样的方法:

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

    【讨论】:

      猜你喜欢
      • 2015-08-29
      • 1970-01-01
      • 2011-02-15
      • 2018-07-04
      • 1970-01-01
      • 2014-02-20
      • 2012-11-02
      • 2011-03-30
      • 2012-06-15
      相关资源
      最近更新 更多