假设我有三个包含多个对象的列表。让我们假设它们每个都包含相同数量的项目。例如
Dim mylist1 as List(Of Integer)
Dim myList2 as List(Of Integer)
Dim myList3 as List(Of Integer)
...
... <lists are populated here with say 10 items each
...
现在说我有一个我定义为有三列的dataGridView。有没有办法将每个列表的内容分配给三列中的每一列(例如,列1 = myList1,列2 = myList2等)而不迭代每个列表?我知道我可以定义一个dataTable,创建列,并遍历每个列表......然后将dataTable与dataGridView的dataSource相关联。但是,我不想遍历列表,因为在我的实际应用程序中,这些列表很大,迭代时间太长。我只是想知道如何将这些列表批量分配到dataTable中的列。有没有办法做到这一点?
答案 0 :(得分:1)
使用VirtualMode。
Public Class Form1
Private mlst1 As New List(Of Integer)
Private mlst2 As New List(Of Integer)
Private mlst3 As New List(Of Integer)
Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
mlst1.Add(1)
mlst1.Add(2)
mlst1.Add(3)
mlst2.Add(4)
mlst2.Add(5)
mlst2.Add(6)
mlst3.Add(7)
mlst3.Add(8)
mlst3.Add(9)
DataGridView1.VirtualMode = True
DataGridView1.Columns.Add("A", "A")
DataGridView1.Columns.Add("B", "B")
DataGridView1.Columns.Add("C", "C")
DataGridView1.Rows.Add()
DataGridView1.Rows.Add()
DataGridView1.Rows.Add()
End Sub
Private Sub DataGridView1_CellValueNeeded(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellValueEventArgs) Handles DataGridView1.CellValueNeeded
Select Case e.ColumnIndex
Case 0
e.Value = mlst1(e.RowIndex)
Case 1
e.Value = mlst2(e.RowIndex)
Case 2
e.Value = mlst3(e.RowIndex)
Case Else
e.Value = ""
End Select
End Sub
End Class
答案 1 :(得分:0)
如果您使用的是.NET 4.0,则可以使用.Zip
上的IEnumerable<T>
扩展名方法将三个列表关联在一起。
C#
var output
= list1.Zip(list2, (a, b) => new { a, b })
.Zip(list3, (x, c) => new { First = x.a, Second = x.b, Third = c });
VB
Dim output
= list1.Zip(list2, function (a, b) new With { .a = a, .b = b }) _
.Zip(list3, function (x, c) new with { .First = x.a, .Second = x.b, .Third = c })
这将产生一系列具有属性First, Second, Third
的匿名类型对象。列表的迭代将推迟到需要时,这将是您将数据绑定到控件的时间点。