首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >表格:如何用BindingSource和DataGridViewComboBoxColumn制作BindingSource?

表格:如何用BindingSource和DataGridViewComboBoxColumn制作BindingSource?
EN

Stack Overflow用户
提问于 2016-12-21 10:00:08
回答 1查看 90关注 0票数 0

这里有几篇关于DataGridViews的文章使用BindingSource和一些DataGridViewComboBoxColumns,a.o:

然而,这些文章在问题之外有很多细节,比如SQL、DataSets、自动更新问题等等。

我需要一个简单的解释,说明如何将DataGridView连接到一个BindingSource,其中一个(或多个)列是一个由可用值填充的ComboBox。最好使用Visual设计器。

例如,我有产品和OrderLine类:

代码语言:javascript
复制
class Product
{
    public int Id {get; set;}
    public string Description {get; set;}
    public decimal Price {get; set;}
}

public OrderLine
{
    public int Id {get; set;}
    public int ProductId {get; set;}
    public int Qty {get; set;}
}

我有一组可用的产品,还有一个带有OrderLines集合的订单。如何设计它所显示的带有产品描述的DataGridView,而不是ProductId?

那么,如何使用设计人员来完成这个任务呢?

EN

回答 1

Stack Overflow用户

发布于 2016-12-21 10:00:08

因此,我们有两个收藏:产品和订单线:

代码语言:javascript
复制
IEnumerable<Product> products = ...
IEnumerable<OrderLine> orderLines = ...

我们必须创建一个DataGridView来显示所有的orderLines,但是它必须显示相应产品的描述,而不是显示每个orderLine的ProductId。

创建表单后,使用设计器添加一个DataGridView和两个BindingSources:

  • dataGridViewOrderLines将显示订单行。
  • bindingSourceOrderLines将连接到orderLines
  • bindingSourceProducts与产品连接

使用“属性”窗口为它们指定正确的名称。还更改以下属性:

  • 更改属性DataSource of bindingSourceProducts:右键单击向下箭头,然后选择Product。如果不存在,请选择“添加项目数据源.”
  • 以类似的方式将DataSource of bindingSourceOrderLines更改为OrderLine
  • 将DataSource of dataGridViewOrderLines设置为bindingSourceOrderLines。

表单中的dataGridView将自动为OrderLines的属性添加列。我们将把ProductId看作一个文本值,而不是产品描述。这必须更改为ComboBox,它将显示所选产品的描述。在水下它将有正确的ProductId。

为此,请转到DataGridView的属性并在组Misc中查找属性列。如果打开它,您将看到添加的列的集合。

在左边,选择带有ProductId的列。在右边更改以下属性。

  • HeaderText:产品描述
  • ColumnType: DataGridViewComboBoxColumn

这意味着该列应该有一个标题产品描述。列包含组合框。

还更改组合框列的下列属性。尽可能使用下拉菜单。

  • DataPropertyName: ProductId
  • DataSource: bindingSourceProducts
  • DisplayMember:描述
  • ValueMember: Id

这意味着组合框应该在bindingSourceProducts中显示表中的值(这些值的类型是Product)。从本表中的每条记录中显示属性描述的值。因此,如果您打开Combo的下拉列表,您将看到所有产品的所有描述。

此外,如果选择产品描述,则使用Product.Id (如ValueMember中所述)作为OrderLine.ProductId中选定的值(如DataPropertyName中所述)。

或者反过来:显示的ProductId值不是OrderLine,而是带有OrderLine.ProductId == Product.Id的产品描述。

现在,您所要做的就是在运行时连接到数据源到要显示的集合。这必须在显示dataGridView之前完成,因此很可能是在加载表单期间:

代码语言:javascript
复制
public void OnLoadForm(object sender, EventArgs e)
{
    IEnumerable<Product> products = ...
    IEnumerable<OrderLine> orderLines = ...

    this.bindingSourceProducts.DataSource = products;
    this.bindingSourceOrderLines.DataSource = orderlines;
}

从dataSource of DataGridView (bindingSourceOrderLines)中的每个元素中,取ProductId的值。

然后使用此值在属性Id (在bindingSourceProducts中选择)中的bindingSourceProducts数据源的表中搜索。如果找到匹配的记录,则取

这些项目将是名称dataGridViewOrderLines,bindingSourceOrderLines

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41259974

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档