逐行填充 DataGridView 只会填充最后一行
Filling DataGridView row by row only populates last row
我正在尝试使用循环用一列整数填充数据网格视图。我很确定我的循环和 excel 引用是正确的,因为我在其他项目中使用过它,但它不会正确显示。这是代码:
Dim da As OleDbDataAdapter
Dim ds As DataSet
xlWorkbook2 = xlApp.Workbooks.Open(FormFile)
xlWsheet2 = xlWorkbook2.Sheets(sheetname)
'open connection to nit spreadsheet'
Dim cn As New OleDb.OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=""" & FormFile & """;Extended Properties=""Excel 12.0;HDR=YES;""")
'Fill dataviewgrid1 with element symbols, string'
da = New OleDbDataAdapter("select * from [" & sheetname & "$A13:A" & lrow & "]", cn)
ds = New System.Data.DataSet
da.Fill(ds)
DataGridView1.DataSource = ds.Tables(0)
'Fill dataviewgrid2 with compositions, integers'
With xlWsheet2
For xrow As Integer = 13 To lrow
DataGridView2.ColumnCount = 1
DataGridView2.Rows.Add()
DataGridView2.Item(0, xrow - 12).Value = xlWsheet2.Cells(xrow, 2).Value
Console.WriteLine(xlWsheet2.Cells(xrow, 2).Value)
Next
End With
所以 dgv1 填得很好,没问题。 Dgv2 没有填充,或者我得到了正确的行数,但只填充了最后一个单元格。因为我在那里有 console.writeline 命令,所以我看到代码正在成功读取 excel 电子表格,所以这一定是一个显示的东西?我已经检查了大部分简单的显示选项,但似乎什么都没有改变?有人有什么想法吗?
我很确定您的 datagridview 已将 AllowUserToAddRows
属性 设置为 True
。如果是这样,每次使用 DataGridView2.Rows.Add()
时,该行都会添加到最后一行之前;那是因为最后一行是用户用来手动向网格中添加一行的行。但是在你的循环中你总是在编辑这一行。
如果您的 datagridview 将允许用户手动添加行,您必须将 previous 的值设置为 last 行。更简洁的方法是这样的:
Dim index as Integer
With xlWsheet2
DataGridView2.ColumnCount = 1
For xrow As Integer = 13 To lrow
index = DataGridView2.Rows.Add()
DataGridView2.Item(0, index).Value = xlWsheet2.Cells(xrow, 2).Value
Console.WriteLine(xlWsheet2.Cells(xrow, 2).Value)
Next
End With
或者干脆
With xlWsheet2
DataGridView2.ColumnCount = 1
For xrow As Integer = 13 To lrow
DataGridView2.Rows.Add(xlWsheet2.Cells(xrow, 2).Value)
Console.WriteLine(xlWsheet2.Cells(xrow, 2).Value)
Next
End With
(顺便说一句,没有必要在每个循环中执行 DataGridView2.ColumnCount = 1
)
如果您决定将 AllowUserToAddRows
更改为 False
,这两种方式仍然有效。
我正在尝试使用循环用一列整数填充数据网格视图。我很确定我的循环和 excel 引用是正确的,因为我在其他项目中使用过它,但它不会正确显示。这是代码:
Dim da As OleDbDataAdapter
Dim ds As DataSet
xlWorkbook2 = xlApp.Workbooks.Open(FormFile)
xlWsheet2 = xlWorkbook2.Sheets(sheetname)
'open connection to nit spreadsheet'
Dim cn As New OleDb.OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=""" & FormFile & """;Extended Properties=""Excel 12.0;HDR=YES;""")
'Fill dataviewgrid1 with element symbols, string'
da = New OleDbDataAdapter("select * from [" & sheetname & "$A13:A" & lrow & "]", cn)
ds = New System.Data.DataSet
da.Fill(ds)
DataGridView1.DataSource = ds.Tables(0)
'Fill dataviewgrid2 with compositions, integers'
With xlWsheet2
For xrow As Integer = 13 To lrow
DataGridView2.ColumnCount = 1
DataGridView2.Rows.Add()
DataGridView2.Item(0, xrow - 12).Value = xlWsheet2.Cells(xrow, 2).Value
Console.WriteLine(xlWsheet2.Cells(xrow, 2).Value)
Next
End With
所以 dgv1 填得很好,没问题。 Dgv2 没有填充,或者我得到了正确的行数,但只填充了最后一个单元格。因为我在那里有 console.writeline 命令,所以我看到代码正在成功读取 excel 电子表格,所以这一定是一个显示的东西?我已经检查了大部分简单的显示选项,但似乎什么都没有改变?有人有什么想法吗?
我很确定您的 datagridview 已将 AllowUserToAddRows
属性 设置为 True
。如果是这样,每次使用 DataGridView2.Rows.Add()
时,该行都会添加到最后一行之前;那是因为最后一行是用户用来手动向网格中添加一行的行。但是在你的循环中你总是在编辑这一行。
如果您的 datagridview 将允许用户手动添加行,您必须将 previous 的值设置为 last 行。更简洁的方法是这样的:
Dim index as Integer
With xlWsheet2
DataGridView2.ColumnCount = 1
For xrow As Integer = 13 To lrow
index = DataGridView2.Rows.Add()
DataGridView2.Item(0, index).Value = xlWsheet2.Cells(xrow, 2).Value
Console.WriteLine(xlWsheet2.Cells(xrow, 2).Value)
Next
End With
或者干脆
With xlWsheet2
DataGridView2.ColumnCount = 1
For xrow As Integer = 13 To lrow
DataGridView2.Rows.Add(xlWsheet2.Cells(xrow, 2).Value)
Console.WriteLine(xlWsheet2.Cells(xrow, 2).Value)
Next
End With
(顺便说一句,没有必要在每个循环中执行 DataGridView2.ColumnCount = 1
)
如果您决定将 AllowUserToAddRows
更改为 False
,这两种方式仍然有效。