如何将对象集合绑定到Winforms中的DataGridView

时间:2014-10-21 16:46:18

标签: c# winforms mvp architectural-patterns

如果我有两个对象,即Fruit' and Color`,它们的定义如下:

public class Fruit  
{  
  public int FruitId { get; set; }  
  public string Name { get; set; }  
  public Color Color { get; set; }  
}  

public class Color  
{  
  public int ColorId { get; set; }  
  public string Name { get; set; }  
}  

如何将Fruit (e.g. List<Fruit>) 的集合绑定到DataGridView?结果输出将类似于以下内容:

+-----+--------+----------+  
| Id  | Name   | Color    |  
+-----+--------+----------+  
| 10  | Apple  | Red      |  
| 20  | Orange | Orange   |  
| 30  | Grapes | Violet   |  
+-----+--------+----------+  

并且不像下面的输出:(注意:N.Color中的N表示对象颜色的命名空间)

+-----+--------+------------+  
| Id  | Name   | Color      |  
+-----+--------+------------+  
| 10  | Apple  | N.Color    |  
| 20  | Orange | N.Color    |  
| 30  | Grapes | N.Color    |  
+-----+--------+------------+  

更新#1:
我在SO上发现了一篇类似的帖子here,并在该帖子上尝试了一些建议,但它没有用...

3 个答案:

答案 0 :(得分:3)

您有多种选择。

您可以在ToString课程中覆盖Color方法,以便返回Name,如:

public class Color
{
    public int ColorId { get; set; }
    public string Name { get; set; }
    public override string ToString()
    {
        return Name;
    }
}  

或者,不是将List<Fruit>指定为DataSource,您可以选择匿名对象列表,并在结果中选择Name Color,如:

var result = yourListOfFruit
                .Select(r => new
                        {
                            FruitID = r.FruitId, 
                            Name = r.Name, 
                            Color = r.Color.Name,
                        }).ToList();

dataGridView1.DataSource = result;

答案 1 :(得分:3)

好的,经过几天弄清楚如何使我的应用程序工作,我设法找到一些帮助我解决问题的文章。我以为我会在这里分享给你们,所以让我们开始吧:

首先,假设我们已经有一个存储在变量水果中的水果列表,并假设我们已经从方法中获得了它的值:

List<Fruit> fruits = method();  

现在,我的问题是......如果我使用以下命令将该列表绑定到datagridview:

datagridview.DataSource = fruits;  

它会给我一个类似于以下的结果:

+-----+--------+------------+  
| Id  | Name   | Color      |  
+-----+--------+------------+  
| 10  | Apple  | N.Color    |  
| 20  | Orange | N.Color    |  
| 30  | Grapes | N.Color    |  
+-----+--------+------------+   

这不是我想要的。所以我想如果我以某种方式手动将每列放到datagridview,我可以指定我的水果列表中的哪些属性来显示。所以我做了这样的事情:

DataGridViewColumn col3 = new DataGridViewTextBoxColumn();  
col3.DataPropertyName = "Color.Name";  
col3.HeaderText = "Color Name";  
dataGridView1.Columns.Add(col3);  

但是,在DataGridView列的DataPropertyName上指定类似此Color.Name的内容不起作用,并且只会导致一个空白列,而DataGridView上没有显示任何数据。为了使它工作,DataGridView应该有一个单元格格式化函数,以在该给定列中正确显示它的值。有关如何进行格式化的完整教程,您可以从 Antonio Bello的博客中查看here

就是这样,希望它也能帮到你 ^ _ ^

答案 2 :(得分:1)

您可以查看此属性DataGridView.DataSource Property

        // Automatically generate the DataGridView columns.
        dataGridView1.AutoGenerateColumns = true;

        // Set up the data source.
        bindingSource1.DataSource = GetData("Select * From Products");