Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/284.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# WinForms数据绑定和外键关系_C#_.net_Winforms - Fatal编程技术网

C# WinForms数据绑定和外键关系

C# WinForms数据绑定和外键关系,c#,.net,winforms,C#,.net,Winforms,我正在开发一个WinForms应用程序(.Net 3.5,无WPF),希望能够在databound DataGridView中显示外键查找 这种关系的一个例子是,我有一个订单行表。订单行与产品具有外键关系,而产品又与ProductType具有外键关系 我想要一个数据绑定的DataGridView,其中每一行表示一个订单行,显示该行的产品和产品类型 用户可以直接向网格添加或编辑订单行,并从comboBoxColumn中为订单行选择产品-然后应更新producttype列,在同一行中显示所选产品的p

我正在开发一个WinForms应用程序(.Net 3.5,无WPF),希望能够在databound DataGridView中显示外键查找

这种关系的一个例子是,我有一个订单行表。订单行与产品具有外键关系,而产品又与ProductType具有外键关系

我想要一个数据绑定的DataGridView,其中每一行表示一个订单行,显示该行的产品和产品类型

用户可以直接向网格添加或编辑订单行,并从comboBoxColumn中为订单行选择产品-然后应更新producttype列,在同一行中显示所选产品的producttype

到目前为止,我发现最合适的方法是引入一个表示orderline的域对象,然后将DataGridView绑定到这些orderline的集合。然后,我向orderline对象添加属性,以公开产品和producttype,并引发相关的notifypropertychanged事件以使所有内容保持最新。在我的orderline存储库中,我可以连接这个orderline对象和数据库中的三个表之间的映射

这适用于数据绑定方面的工作,但必须手工编写所有代码或在存储库中映射似乎很糟糕。我原以为nHibernate可以帮助进行这种连接,但我正在努力通过所有外键进行映射-它们似乎工作正常(订单行产品的外键查找根据外键创建正确的产品对象),直到我尝试进行数据绑定,我无法获取数据绑定id列以更新我的产品或producttype对象

我的总体方针是否正确?如果是,映射问题的好解决方案是什么

或者,对于包括外键查找在内的数据绑定行,有没有更好的解决方案,我甚至没有考虑过?

欢迎使用StackOverflow:)

通常,您要做的是将下拉列表中的信息基于两个值

ValueMember是实际控制值的来源(这将是订单行中的关键值),display member是显示给用户的值,而不是值(这将是FK值)

没有什么特别的原因不能返回所有需要的数据并设置这些属性吗?

下面是一个演示数据绑定的“我该怎么做”视频:


我原来的问题显然不清楚,很抱歉

一般来说,问题不在于数据绑定到DataGridView,也不在于DataGridViewComboxColumn的实现——正如回答正确的人所说,这在web上有很好的文档记录

我一直试图解决的问题是刷新正在深入关系的属性

在我的orders示例中,当我更改“Product”列的值时,“Product Type”列不会被更新,即使在代码中我正在设置属性并触发NotifyPropertyChanged事件。(在调试中,我会去所有正确的地方)

经过一番摸索,我意识到,当我直接设置datasource的“Product Type”属性时,这甚至不起作用,而不是在“Product”setter中设置它

我相信另一件事让我回到了正确的轨道上,那就是当我提供一个以主窗体创建的模拟数据访问层时,一切都很好

此外,当我将nHibernate制作的IList复制到IBindingList中时,一切看起来都很好

因此我认为问题在于,在使用某些数据源时,线程和NotifyPropertyChanged事件会以某些方式丢失(但愿我能更明确!)

我将继续研究更好的解决方法,而不是将IList复制到IBindingList——也许我需要学习线程编组

编辑

我现在开发了一个解决方案,解决了这个问题,我想我明白是什么让我困惑了-似乎除了基本属性数据绑定之外的任何东西都不能很好地用于不是从BindingList派生的列表-只要我尝试将数据绑定到触发链接NotifyPropertyChanged事件的属性,事情变得乱七八糟,我的活动也失去了方向


我现在的数据访问解决方案是使用Rob Conry模式的一种变体,返回要绑定的集合作为我创建的自定义类,一个从BindingList派生的SortableBindingLazyList,实现排序核心方法,并将其内部列表存储为查询,从而延迟列表的具体化,我不知道DataGridView是否支持它,但是当您执行常规WinForms数据绑定(例如,到常规文本框)时,您可以使用属性路径来浏览对象关系

大概是这样的:

myTextBox.DataBindings.Add("Text", anOrderLine, "OrderedPart.PartNumber");

在您的情况下,这是否也有效值得一看。

我认为您遇到的问题是,当您绑定到网格时,仅支持INotifyPropertyChanged是不够的,但您必须在实现中触发ListChanged事件,并确保覆盖该属性并返回true。如果不为此返回true,网格将不会查找它以了解数据是否已更改

在.NET2.0+中,您可以使用类创建一个泛型集合,这将解决大多数问题(只是不要忘记覆盖SupportsChangeNotification属性并返回true)

如果用于数据绑定的类具有集合属性(如IBindingList或BindingList),则可以直接将外键网格绑定到该属性。在Forms designer中配置绑定时,只需选择collection属性作为网格的数据源。应该是"居"