【问题标题】:Forms: how to make DataGridView with BindingSource and DataGridViewComboBoxColumn?表单:如何使用 BindingSource 和 DataGridViewComboBoxColumn 制作 DataGridView?
【发布时间】:2016-12-21 10:00:08
【问题描述】:

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

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

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

例如,我有 Product 和 OrderLine 类:

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;}
}

我有一组可用产品,以及一个包含一组 OrderLine 的订单。如何设计 DataGridView 以显示带有产品描述而不是 ProductId 的 ComboBox?

那么如何使用设计器做到这一点?

【问题讨论】:

    标签: winforms datagridview combobox


    【解决方案1】:

    所以我们有两个集合:产品和订单行:

    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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-11-04
      • 2018-05-13
      • 1970-01-01
      • 1970-01-01
      • 2014-01-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多