有没有办法从多个列表中填充dataGridView而不迭代列表?

时间:2011-06-30 04:18:23

标签: .net vb.net

假设我有三个包含多个对象的列表。让我们假设它们每个都包含相同数量的项目。例如

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中的列。有没有办法做到这一点?

2 个答案:

答案 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的匿名类型对象。列表的迭代将推迟到需要时,这将是您将数据绑定到控件的时间点。