序言
我没有使用WinForms很长一段时间也从未在VB中工作过,我试图将一个DataGridView
添加到用VB编写的应用程序中,该应用程序将显示来自DataTable
的数据网格。
我按照文档here,here和here进行操作,在一个简单的测试示例中,我有代码
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中,我在此处未显示。
答案 0 :(得分:1)
解决方案(至少在我的情况下)是DataGridView.AutoGenerateColumns
未在设计面板中显示,默认设置为False
。我只是添加了一行
DataGridView1.AutoGenerateColumns = True
到我的代码(在Form1_Load
中),它完美无缺。我在论坛上找到了解决方案,但现在找不到链接。如果我找到它,我会添加它。
答案 1 :(得分:0)
我不知道该说些什么。我完全使用了你的代码,并且没有例外。它工作得很好。我猜可能是问题是Timer1.Interval可能是一个值太低,与你运行代码的机器的速度有关。如果你增加间隔怎么办?
对于未显示的数据...向DataGridView添加两列,将每个DataGridView列的DataPropertyName属性设置为与表列的每个名称匹配(在Edit Colums ...对话框中)。然后你会显示你的数据。