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

dev*_*101 3 c# mvp architectural-patterns winforms

如果我有两个对象,即Fruit' andColor`及其定义如下:

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; }  
}  
Run Code Online (Sandbox Code Playgroud)

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

+-----+--------+----------+  
| Id  | Name   | Color    |  
+-----+--------+----------+  
| 10  | Apple  | Red      |  
| 20  | Orange | Orange   |  
| 30  | Grapes | Violet   |  
+-----+--------+----------+  
Run Code Online (Sandbox Code Playgroud)

并且不像下面的以下输出:(注意:N in N.Color表示对象Color的名称空间)

+-----+--------+------------+  
| Id  | Name   | Color      |  
+-----+--------+------------+  
| 10  | Apple  | N.Color    |  
| 20  | Orange | N.Color    |  
| 30  | Grapes | N.Color    |  
+-----+--------+------------+  
Run Code Online (Sandbox Code Playgroud)

更新1:
我发现了一个类似的帖子在这里的SO和尝试了一些关于该职位的建议,但它不工作...

Hab*_*bib 5

您有多种选择。

您可以重写类中的ToString方法Color以返回Name

public class Color
{
    public int ColorId { get; set; }
    public string Name { get; set; }
    public override string ToString()
    {
        return Name;
    }
}  
Run Code Online (Sandbox Code Playgroud)

或代替分配List<Fruit>作为DataSource您可以选择匿名对象的列表,选择NameColor在你的结果,如:

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

dataGridView1.DataSource = result;
Run Code Online (Sandbox Code Playgroud)


dev*_*101 5

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

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

List<Fruit> fruits = method();  
Run Code Online (Sandbox Code Playgroud)

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

datagridview.DataSource = fruits;  
Run Code Online (Sandbox Code Playgroud)

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

+-----+--------+------------+  
| Id  | Name   | Color      |  
+-----+--------+------------+  
| 10  | Apple  | N.Color    |  
| 20  | Orange | N.Color    |  
| 30  | Grapes | N.Color    |  
+-----+--------+------------+   
Run Code Online (Sandbox Code Playgroud)

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

DataGridViewColumn col3 = new DataGridViewTextBoxColumn();  
col3.DataPropertyName = "Color.Name";  
col3.HeaderText = "Color Name";  
dataGridView1.Columns.Add(col3);  
Run Code Online (Sandbox Code Playgroud)

但是,Color.Name在 DataGridView 列的 DataPropertyName 上指定类似的内容不起作用,只会导致在 DataGridView 上不显示任何数据的空白列。为了让它工作,DataGridView 应该有一个单元格格式功能来正确显示它在给定列中的值。有关如何做格式化的完整的教程,你可以检查出来这里安东尼奥·贝洛的博客。

就是这样,希望对你也有帮助^_^