BindingSource与VB中的DataTable

时间:2011-09-05 09:38:55

标签: vb.net winforms visual-studio-2010

序言 我没有使用WinForms很长一段时间也从未在VB中工作过,我试图将一个DataGridView添加到用VB编写的应用程序中,该应用程序将显示来自DataTable的数据网格。

我按照文档hereherehere进行操作,在一个简单的测试示例中,我有代码

Public Class Form1

    Private count As Integer

    Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
        count = count + 1

        Dim table As DataTable = BindingSource2.DataSource

        Dim row As DataRow
        row = table.NewRow()
        row("Col1") = "foo" + count.ToString()
        row("Col2") = "bar" + count.ToString()

        table.Rows.Add(row) 'throws System.InvalidOperationException here

    End Sub

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        'BindingSource2.DataSource = New DataTable()
        'Dim table As DataTable = BindingSource2.DataSource
        Dim table As New DataTable

        Dim column1 As DataColumn = New DataColumn()
        column1.ColumnName = "Col1"
        column1.Caption = column1.ColumnName
        column1.DataType = System.Type.GetType("System.String")
        table.Columns.Add(column1)

        Dim column2 As DataColumn = New DataColumn()
        column2.ColumnName = "Col2"
        column2.Caption = column2.ColumnName
        column2.DataType = System.Type.GetType("System.String")
        table.Columns.Add(column2)

        'Dim keys(0) As DataColumn
        'keys(0) = column1
        'table.PrimaryKey = keys

        ' first row
        Dim row As DataRow = table.NewRow()
        row("Col1") = "beep"
        row("Col2") = "boop"

        table.Rows.Add(row)

        BindingSource2.DataSource = table
    End Sub
End Class

代码通过Form1_Load,但是添加的条目未显示在DataGridView中。然后,当调用Timer1_Tick时,它会在上面指定的行处抛出System.InvalidOperationException个异常。根据文档中给出的示例,我无法看出我做错了什么。

问题:任何人都可以帮忙,(a)为什么DataGridView不能反映Form1_Load末尾添加的数据,以及(b)为什么要添加引起异常的一行?

P.s。我已经检查了调试,并且table.Rows.Add(row) table包含了与row一样的正确信息。

编辑:BindingSource已添加并使用设计器连接到DataGridView,因此其代码显示在From1.Designer.vb中,我在此处未显示。

2 个答案:

答案 0 :(得分:1)

解决方案(至少在我的情况下)是DataGridView.AutoGenerateColumns未在设计面板中显示,默认设置为False。我只是添加了一行

DataGridView1.AutoGenerateColumns = True

到我的代码(在Form1_Load中),它完美无缺。我在论坛上找到了解决方案,但现在找不到链接。如果我找到它,我会添加它。

答案 1 :(得分:0)

我不知道该说些什么。我完全使用了你的代码,并且没有例外。它工作得很好。我猜可能是问题是Timer1.Interval可能是一个值太低,与你运行代码的机器的速度有关。如果你增加间隔怎么办?

对于未显示的数据...向DataGridView添加两列,将每个DataGridView列的DataPropertyName属性设置为与表列的每个名称匹配(在Edit Colums ...对话框中)。然后你会显示你的数据。