这里有几篇关于DataGridViews的文章使用BindingSource和一些DataGridViewComboBoxColumns,a.o:
然而,这些文章在问题之外有很多细节,比如SQL、DataSets、自动更新问题等等。
我需要一个简单的解释,说明如何将DataGridView连接到一个BindingSource,其中一个(或多个)列是一个由可用值填充的ComboBox。最好使用Visual设计器。
例如,我有产品和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;}
}我有一组可用的产品,还有一个带有OrderLines集合的订单。如何设计它所显示的带有产品描述的DataGridView,而不是ProductId?
那么,如何使用设计人员来完成这个任务呢?
发布于 2016-12-21 10:00:08
因此,我们有两个收藏:产品和订单线:
IEnumerable<Product> products = ...
IEnumerable<OrderLine> orderLines = ...我们必须创建一个DataGridView来显示所有的orderLines,但是它必须显示相应产品的描述,而不是显示每个orderLine的ProductId。
创建表单后,使用设计器添加一个DataGridView和两个BindingSources:
使用“属性”窗口为它们指定正确的名称。还更改以下属性:
表单中的dataGridView将自动为OrderLines的属性添加列。我们将把ProductId看作一个文本值,而不是产品描述。这必须更改为ComboBox,它将显示所选产品的描述。在水下它将有正确的ProductId。
为此,请转到DataGridView的属性并在组Misc中查找属性列。如果打开它,您将看到添加的列的集合。
在左边,选择带有ProductId的列。在右边更改以下属性。
这意味着该列应该有一个标题产品描述。列包含组合框。
还更改组合框列的下列属性。尽可能使用下拉菜单。
这意味着组合框应该在bindingSourceProducts中显示表中的值(这些值的类型是Product)。从本表中的每条记录中显示属性描述的值。因此,如果您打开Combo的下拉列表,您将看到所有产品的所有描述。
此外,如果选择产品描述,则使用Product.Id (如ValueMember中所述)作为OrderLine.ProductId中选定的值(如DataPropertyName中所述)。
或者反过来:显示的ProductId值不是OrderLine,而是带有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;
}从dataSource of DataGridView (bindingSourceOrderLines)中的每个元素中,取ProductId的值。
然后使用此值在属性Id (在bindingSourceProducts中选择)中的bindingSourceProducts数据源的表中搜索。如果找到匹配的记录,则取
这些项目将是名称dataGridViewOrderLines,bindingSourceOrderLines
https://stackoverflow.com/questions/41259974
复制相似问题