Трудно представить, что вы описываете.Итак, я буду упрощен и сосредоточусь на примере Person
.
Использование List<T>
в качестве DataSource
к DataGridView
будет работать.Однако он будет отображать только «открытые» открытые «Свойства», которые НЕ являются КОЛЛЕКЦИЯМИ.
В примере класса Person
в сетке будет отображаться только столбец «имя».И это имеет смысл ... сетка не будет знать, как сделать одно значение «Ячейки» равным совокупности значений.
Поэтому, если вы хотите отобразить каждый элемент в списке как «столбец» в сетке….Тогда вам нужно будет сделать это.Я не уверен, поможет ли привязка или какой-либо другой механизм, однако я уверен, что не составит труда создать метод, который с учетом List<T>
вернет DataTable
, настроенный так, как вы описываете.
Учитывая, что есть ДВА (2) списка для каждого Person
(я предполагаю, что 15 в исходном примере), это означает, что для каждого Person.
будет две строки. Если это правильно, то о единственномвам нужно беспокоиться о том ... СКОЛЬКО КОЛОНН вам понадобится, предоставив список Person
, чтобы каждый человек мог иметь разное количество предметов (цветов, продуктов) в одном из списков.
Кажется очевидным, что количество столбцов, которое вам понадобится, будет количеством элементов из самого большого (Цвета, Продукты) Списка ВСЕХ Person
в списке people
.Я предполагаю, что в исходном случае это всегда будет 52, однако было бы разумно проверить это, так как иначе гарантирован сбой.
Чтобы помочь, нужен метод, чтобы получить количество столбцов для DataTable
.Этот метод GetMaxColumns
принимает значение List<Person>
и возвращает счет из самых больших списков «Цвет» и «Еда».Это гарантирует, что мы останемся в пределах досягаемости независимо от размера любого цвета или списка продуктов.Это может выглядеть следующим образом…
Private Function GetMaxColumns(people As List(Of Person)) As Int32
Dim max = 0
For Each person In people
If (person.FavoriteColors.Count > max) Then
max = person.FavoriteColors.Count
End If
If (person.FavoriteFoods.Count > max) Then
max = person.FavoriteFoods.Count
End If
Next
Return max
End Function
Далее метод GetDataTable
принимает List<Person>
и возвращает DataTable
с правильным количеством столбцов для данного List<Person>
.Именно здесь наименование столбцов может быть удобным.
Private Function GetDataTable(people As List(Of Person)) As DataTable
Dim dt = New DataTable()
Dim maxColumns = GetMaxColumns(people)
For index = 0 To maxColumns
dt.Columns.Add()
Next
Return dt
End Function
Метод FillDataTable
принимает List<Person>
, а DataTable
затем заполняет DataTable
из List<Person>
, как описано выше.Для каждого человека будет две строки, однако вторая строка под столбцом имени будет пустой, поскольку она будет иметь то же имя, что и предыдущая строка.
В приведенном ниже коде цикл начинается с каждой Person
в списке.Имя добавляется в строку, а затем проходит по списку «Цвет» для добавления каждого значения цвета.Затем добавляется вторая строка, которая содержит значения в списке «Еда».Имя не добавляется во второй ряд.
Private Sub FillDataTable(people As List(Of Person), dt As DataTable)
Dim dr As DataRow
Dim curCol = 0
For Each person In people
dr = dt.NewRow()
curCol = 0
dr(curCol) = person.Name.ToString()
curCol += 1
For Each favColor In person.FavoriteColors
dr(curCol) = favColor
curCol += 1
Next
dt.Rows.Add(dr)
dr = dt.NewRow()
curCol = 1
For Each favFood In person.FavoriteFoods
dr(curCol) = favFood
curCol += 1
Next
dt.Rows.Add(dr)
Next
End Sub
Наконец, все это может выглядеть примерно так, как показано ниже ...
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
Dim people = New List(Of Person)
Dim person = New Person
person.Name = "Jim"
person.FavoriteColors = New List(Of String)(New String() {"Red", "Green", "Blue"})
person.FavoriteFoods = New List(Of String)(New String() {"Pizza", "Salad", "Burger"})
people.Add(person)
person = New Person
person.Name = "Bob"
person.FavoriteColors = New List(Of String)(New String() {"Yellow", "Black", "Pink"})
person.FavoriteFoods = New List(Of String)(New String() {"Hotdog", "French Fries", "Steak"})
people.Add(person)
person = New Person
person.Name = "John"
person.FavoriteColors = New List(Of String)(New String() {"Purple", "Olive Grey", "Polka Dot"})
person.FavoriteFoods = New List(Of String)(New String() {"Ice Cream", "Fish", "Crutons"})
people.Add(person)
Dim GridTable = GetDataTable(people)
FillDataTable(people, GridTable)
DataGridView1.DataSource = GridTable
End Sub
Надеюсь, это поможет.