所以我们有两个集合:产品和订单行:
IEnumerable<Product> products = ...
IEnumerable<OrderLine> orderLines = ...
我们必须创建一个显示所有 orderLines 的 DataGridView,但它必须显示相应产品的描述,而不是每个 orderLine 的 ProductId。
创建表单后,使用设计器添加一个 DataGridView 和两个 BindingSource:
- dataGridViewOrderLines 将显示订单行。
- bindingSourceOrderLines 将连接到 orderLines
- bindingSourceProducts 连接到产品
使用属性窗口为它们指定正确的名称。同时更改以下属性:
- 更改 bindingSourceProducts 的属性 DataSource:右键单击向下箭头,然后选择 Product 作为 DataSource。如果不存在,请选择“添加项目数据源...”
- 以类似的方式将 bindingSourceOrderLines 的 DataSource 更改为 OrderLine
- 将dataGridViewOrderLines 的DataSource 设置为bindingSourceOrderLines。
表单中的dataGridView会自动为OrderLines的属性添加列。我们将 ProductId 视为文本值,而不是产品描述。这必须更改为显示所选产品描述的组合框。在水下它将具有正确的 ProductId。
为此,请转到 DataGridView 的属性并在组 Misc 中找到属性 Columns。如果打开它,您会看到添加的列的集合。
在左侧,选择具有 ProductId 的列。在右侧更改以下属性。
- HeaderText:产品说明
- 列类型:DataGridViewComboBoxColumn
这意味着该列应该有一个标题产品描述。该列包含组合框。
同时更改组合框列的以下属性。尽可能使用下拉菜单。
- DataPropertyName:ProductId
- 数据源:bindingSourceProducts
- DisplayMember:说明
- ValueMember:ID
这表示,组合框应显示 bindingSourceProducts 中的表中的值(其类型为 Product)。从此表中的每条记录中显示属性描述的值。因此,如果您打开 Combo 的下拉菜单,您会看到所有产品的所有描述。
此外,如果您选择产品描述,请使用 Product.Id(如 ValueMember 中所述)作为 OrderLine.ProductId(如 DataPropertyName 中所述)中的选定值。
反之亦然:OrderLine 显示的 ProductId 值将不是 ProductId,而是带有 OrderLine.ProductId == Product.Id 的产品描述。
现在您所要做的就是在运行时将数据源连接到要显示的集合。这必须在显示 dataGridView 之前完成,因此可能在加载表单期间:
public void OnLoadForm(object sender, EventArgs e)
{
IEnumerable<Product> products = ...
IEnumerable<OrderLine> orderLines = ...
this.bindingSourceProducts.DataSource = products;
this.bindingSourceOrderLines.DataSource = orderlines;
}
即从DataGridView的dataSource(bindingSourceOrderLines)的每个元素中,取ProductId的值。
然后使用该值在属性Id(在ValueMember中选择)中的bindingSourceProducts的数据源的表中进行搜索。如果找到匹配的记录,取
的值
项目将是名称 dataGridViewOrderLines、bindingSourceOrderLines