Windows窗体DataGridView中的级联组合框

时间:2013-03-07 08:41:13

标签: winforms entity-framework datagridview entity-framework-5 cascadingdropdown

我坚持一个通常我甚至都不会面对的问题,但在这种情况下,这似乎是一个大问题。

首先,为了避免混淆,即使我已经在标题中写了它,我们也谈论的是Windows Forms(不是WPF,也不是Web相关的应用程序)。

我有一个DataGridView,其数据源来自实体的导航属性(实体框架5,代码优先)。

此数据网格包括“IdEquipment”和“IdConfiguration”等字段。 两列都是DataGridViewComboBoxEditingControl类型。 IdEquipment由BindingSource控件填充,即“Equipment”:

 _context.Equipments.Local.ToBindingList();

“Configuration”表作为外键“IdEquipment”和组合框必须如何在datagrid的每一行中表示这个表的子集。 要做到这一点,经过一些不成功的测试并在SO和其他地方搜索,我发现this solution,特别关注dataGridView1_EditingControlShowingdataGridView1_CellValueChanged

这似乎是正确的方向,但问题是当我过滤IdEquipment组合框的数据源时(也是绑定到_context.Configurations.Local.ToBindingList();的另一个BindingSource控件。

我读过某个地方,因为我正在使用实体,我应该调用.ToList()而不是.ToBindingList(),但即使在这种情况下,也不会发生过滤(无论如何我认为BindingList仍然很好。

我可以使用的另一个选项是利用第一个组合框的选定值/实体,并获取Equipment.Configuration导航属性,但我不知道如何使用DataGridViewComboBoxEditingControl执行此操作。

任何帮助?

1 个答案:

答案 0 :(得分:1)

经过几个小时的努力,我最终找到了最适合我需求的解决方案:我不知道这是否是解决方案。

  • 删除了组合框使用的所有BindingSource控件。
  • On DataGrid DataBindingComplete事件:配置了两个组合的数据源和一个未过滤的List,并设置了DisplayMember和DisplayValue属性(两个列表都有第一个“null”元素。)
  • On DataGrid EditingControlShowing事件:根据IdEquipement的当前值(如果有)更改了第二个组合的数据源,并保留了第一个null元素。
  • On DataGrid CellValueChanged事件:如果更改的列id为IdEquipement,则为包含IdConfiguration的列的值为null
到目前为止,这是有效的。我希望以更简单的方式获得相同的结果,但据我所知,没有选择。