0

我被困在一个通常我什至不会面对的问题上,但在这种情况下,这似乎很重要。

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

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

除其他字段外,此数据网格还具有“IdEquipment”和“IdConfiguration”。两列都是 DataGridViewComboBoxEditingControl 类型。IdEquipment 由 BindingSource 控件填充,即“设备”:

 _context.Equipments.Local.ToBindingList();

“配置”表作为外键“IdEquipment”和组合框必须如何在数据网格的每一行中作为该表的子集。为此,经过一些不成功的测试并在 SO 和其他地方进行搜索后,我找到了这个解决方案,特别关注dataGridView1_EditingControlShowingdataGridView1_CellValueChanged

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

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

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

有什么帮助吗?

4

1 回答 1

1

在挣扎了几个小时之后,我最终找到了最适合我需求的解决方案:虽然我不知道这是否是解决方案。

  • 摆脱了组合框使用的所有 BindingSource 控件。
  • 在 DataGrid DataBindingComplete 事件中:使用非过滤列表配置两个组合的数据源并设置 DisplayMember 和 DisplayValue 属性(两个列表都有第一个“null”元素)。
  • 在 DataGrid EditingControlShowing 事件中:使用基于 IdEquipement 的当前值(如果有)的过滤列表更改第二个组合的数据源并保留第一个空元素。
  • 在 DataGrid CellValueChanged 事件中:如果更改了列 id IdEquipement,则将包含 IdConfiguration 的列的值设为 null

到目前为止,这很有效。我希望以更简单的方式达到相同的结果,但据我所知,没有选择。

于 2013-03-07T13:23:23.597 回答