Как связать коллекцию объектов с 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");