Как связать коллекцию объектов с DataGridView в Winforms

Если у меня есть два объекта, а именно 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 в N.Color указывает на пространство имен объекта Color)

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

Обновление № 1:
Я нашел похожий пост здесь на SO и попробовал некоторые предложения на этом посту, но он не работает...

3 ответа

Решение

Хорошо, через пару дней, выясняя, как заставить работать мое приложение, мне удалось найти статью, которая очень помогла мне в решении моей проблемы. Я думал, что поделюсь этим здесь на SO для вас, ребята, так что давайте начнем:

Во-первых, давайте предположим, что у нас уже есть список фруктов, хранящихся в переменной fruits, и давайте предположим, что мы уже получили его значение от метода:

List<Fruit> fruits = method();  

Теперь моя проблема была... Если я свяжу этот список с сеткой данных, используя следующую команду:

datagridview.DataSource = fruits;  

Это даст мне результат, подобный следующему:

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

Что не то, что я хочу. Поэтому я подумал, может быть, если бы я как-то вручную поместил каждый столбец в сетку данных, я мог бы указать, какие свойства из моего списка фруктов отображать. Итак, я сделал что-то вроде этого:

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

Но затем, указав что-то вроде этого Color.Name для DataPropertyName столбца DataGridView не работает и приведет только к пустому столбцу без данных, отображаемых в DataGridView. Чтобы это работало, DataGridView должен иметь функцию форматирования ячейки, чтобы правильно отображать ее значение в данном столбце. Полное руководство по форматированию вы можете найти здесь, в блоге Антонио Белло.

И это все, надеюсь, вам это тоже поможет ^_^

У вас есть несколько вариантов.

Вы можете переопределить 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;

Вы можете проверить это свойство DataGridView.DataSource Свойство

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

        // Set up the data source.
        bindingSource1.DataSource = GetData("Select * From Products");
Другие вопросы по тегам