【问题标题】:How to bind a Navigation Property (second level properties) in DataGridView using BindingSource?如何使用 BindingSource 在 DataGridView 中绑定导航属性(二级属性)?
【发布时间】:2016-04-07 07:50:41
【问题描述】:

我使用了两个实体类将值绑定到DataGridView。一是估计和公司。

  • Estimates 包含 “Id、Estimate Number、Estimate Amount、CompanyId”等列
  • Companies 具有 “Id, Company Name, Address” 等列

我创建了两个BindingSource,例如EstimateBindingSourceCompanyBindingSource

  1. CompanyBindingSourceDataSourceEstimateBindingSourceDataMemberEstimates
  2. EstimateBindingSource 具有 DataSource 作为 Estimates 实体类,并且没有定义 DataMember

我已使用网格DataSourceEstimateBindingSource 绑定到DataGridView

在这里,我需要在 DataGridView 中显示 Estimate number、Estimate Amount 和 Company Name。我无法做到这一点。

注意: 我没有在逻辑后面做任何代码来做到这一点。只需要使用设计来实现这一点。

【问题讨论】:

  • Company 和 Estimate 之间的关系似乎是 1-N,但您的绑定源设置不正确。
  • 那么,你有任何样本来实现这种场景吗?请提供一些例子来做到这一点..
  • 是的。我会为你发布答案:)
  • 谢谢。等着呢

标签: c# winforms entity-framework datagridview bindingsource


【解决方案1】:

在 DataGridView 中显示二级属性的选项

要显示导航属性的子属性,您可以使用以下任一选项:

  1. 使用DataGridViewComboBox 列并将其绑定到CompanyId,并将DataSource 设置为公司列表,将DisplayMember 属性设置为公司的Name 属性,将ValueMember 设置为Id公司财产。

  2. 覆盖Company 类的ToString() 方法并返回公司的Name。然后在网格中显示Company 导航属性。

  3. 为您的Estimate 创建一个CompanyName 属性,该属性返回其Company.Name 值并在网格中显示CompanyName

  4. 使用DataGridViewCellFormatting 事件并将e.Value 设置为要在单元格中显示的所需值(公司名称)。

  5. 使用Linq 查询或使用ViewModel 调整您的估算列表并将结果传递到数据网格视图。

  6. 为您的 Estimate 类型创建一个 TypeDescriptor 以解析二级属性。 . 要显示公司属性而不是公司 ID,您可以使用 DataGridViewComboBoxColumn

使用组合框列

由于您要求使用设计器而不编写代码的机制,因此我更多地描述了此选项。以下是您应该执行的设置:

  • EstimatesBindingSource 应该绑定到 Estimates 的列表
  • DataGridView 应该绑定到EstimatesBindingSource
  • CompanyBindingSource 仅用作组合框列的数据源,应使用Companies 的列表填充
  • 要在Estimates 列表中显示CompanyName,使用DataGridViewComboBoxColumn 并将其设置为DataSource 到公司列表并将DisplayMember 设置为CompanyName 并将其值成员设置为Id 就足够了.并将其绑定到EstimateCompanyId 字段。

另外,如果您的要求是不显示为ComboBox,只需将DataGridViewComboBoxColumnDisplayStyle 属性设置为Nothing。它删除了下拉样式。

您也可能会发现这篇文章很有帮助:

【讨论】:

  • datagridview文本框列中不能显示公司名称吗?
  • 要在TextBoxColumn 中显示它,您应该按照为您的Estimate 类型创建CompanyName 属性。或关注TypeDescriptor 解决方案。或关注CellFormatting 事件。
  • 另外,如果您的要求是不显示为ComboBox,只需将DataGridViewComboBoxColumnDisplayStyle 属性设置为Nothing。它删除了下拉样式。
  • 这样,这意味着你想将EstimateCompanyId字段显示为ComboBox,并且当组合框想显示该字段的名称时,它显示NameId 的公司等于估计的 CompanyId。这就是 ComboBox 的工作方式。
  • 然后您可以将它的DisplayStyle 设置为Nothing 以不显示下拉按钮,如果您不想让用户更改值,请设置列的ReadOnlytrue
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-17
  • 1970-01-01
  • 1970-01-01
  • 2012-10-15
相关资源
最近更新 更多