Vb.net 单击按钮时在datagridview中显示不同的工作表数据时出现问题
我在表单记录表单上有一个datagridview控件。在第一个表单开始表单上,我有一个按钮查看记录按钮,当单击该按钮时,该按钮包括我将在下面列出的所有代码,这些代码将发送给我在开始表单上的名为bw的backgroundworker。当用户单击“查看记录”按钮时,按钮旁边会出现一个进度条,显示正在加载的datagridview的进度。我通过一个从excel文件中获取所有值的循环加载datagridview。我的工作很好,但现在我希望能够使用相同的循环重新加载datagridview,但是当用户按下记录表单上的“上一年”按钮时,可以从excel工作簿中的不同工作表中获取数据。下面我已经包括了开始表单和记录表单的图像,以及它们各自的代码 更新代码Vb.net 单击按钮时在datagridview中显示不同的工作表数据时出现问题,vb.net,forms,excel,datagridview,backgroundworker,Vb.net,Forms,Excel,Datagridview,Backgroundworker,我在表单记录表单上有一个datagridview控件。在第一个表单开始表单上,我有一个按钮查看记录按钮,当单击该按钮时,该按钮包括我将在下面列出的所有代码,这些代码将发送给我在开始表单上的名为bw的backgroundworker。当用户单击“查看记录”按钮时,按钮旁边会出现一个进度条,显示正在加载的datagridview的进度。我通过一个从excel文件中获取所有值的循环加载datagridview。我的工作很好,但现在我希望能够使用相同的循环重新加载datagridview,但是当用户按下
Public Class Records
Dim excel_app As Excel.Application
Dim workbook As Excel.Workbook
Dim sheet_name As String
Dim sheet As Excel.Worksheet
Dim ColumnCount, RowCount, TotalCellCount As Long
Dim yearstamp As String = _
DateTime.Now.ToString("yyyy")
Dim exeDir As New IO.FileInfo(Reflection.Assembly.GetExecutingAssembly.FullName)
Dim xlPath = IO.Path.Combine(exeDir.DirectoryName, "Records.xlsx")
Public Function QueryExcel(ByVal sheet As String) As DataTable
'use this connection string for .xlsx files
Dim cs2007 As String = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=xlPath;Extended Properties=""Excel 12.0 Xml;HDR=YES;IMEX=1"";"
Dim sql As String = String.Format("SELECT * FROM [{0}$]", sheet)
'get contents of xls file
Using cnn As New OleDb.OleDbConnection(cs2007.Replace("@FILENAME", "YOUR EXCEL FILE"))
Using cmd As New OleDb.OleDbCommand(sql, cnn)
Dim t As New System.Data.DataTable
Try
cnn.Open()
t.Load(cmd.ExecuteReader)
Catch ex As Exception
'handle exception. in this case i'm just returning an empty table
End Try
Return t
End Using
End Using
End Function
Private Sub Records_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Dim t2013 = QueryExcel("2013")
DataGridView1.DataSource = t2013
End Sub
有很多不同的方法可以查询excel并将数据存储在变量中。我过去使用的一种方法是OleDb 此函数可用于查询excel并返回数据表中的内容
Public Function QueryExcel(sheet As String) As DataTable
'use this connection string for .xlsx files
Dim cs2007 As String = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=@FILENAME;Extended Properties=""Excel 12.0 Xml;HDR=YES;IMEX=1"";"
'use this connection string for .xls files
Dim cs2003 As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=@FILENAME;Extended Properties=""Excel 8.0;HDR=Yes;IMEX=1"";"
Dim sql As String = String.Format("SELECT * FROM [{0}$]", sheet)
dim cs = cs2007.Replace("@FILENAME", IO.Path.Combine(exeDir.DirectoryName, "Records.xlsx"))
'get contents of xls file
Using cnn As New OleDb.OleDbConnection(cs)
Using cmd As New OleDb.OleDbCommand(sql, cnn)
Dim t As New DataTable
Try
cnn.Open()
t.Load(cmd.ExecuteReader)
Catch ex As Exception
'handle exception. in this case i'm just returning an empty table
End Try
Return t
End Using
End Using
End Function
所以现在你可以使用
Dim t2013 = QueryExcel("2013")
并将其分配给DataGridView,如下所示
DataGridView.DataSource = t2013
当您在方法上放置断点并单步执行时会发生什么情况?当我单击上一年按钮Records.DataGridView1.Rows.ItemrIndex.HeaderCell.Value=sheet.RangeA1.OffsetIndex+1,cIndex.Value时,它停止在这里。但是,我决定将所有循环移回Records.load事件,消除后台工作进程,和开始窗体上的进度条。如果我尝试在工作表之间切换并更新datagridview,这会使事情变得更容易吗?excel文件中有多少工作表?为什么不一次把它们全部装上呢?这样你就可以将它们的内容存储在一个变量中,并将其分配给DataGridView.DataSource属性。目前为止,我有两个,第二个用于测试它是否完成了任务,并且能够在创建工作表后导入工作表。我很想将内容存储在一个变量中,如果这样做会使事情变得更简单的话,但我不知道如何做到这一点。你能给我提供代码和如何实现它的解释吗?你使用Excel.Interop而不是OleDb来收集数据有什么原因吗?不,点击按钮后后台工作人员运行良好。是在datagridview最初填充后单击上一年按钮的时候。但是,这不再相关,因为我刚刚将填充网格的所有循环都移动到了记录表单load EVENT中。好吧,我将成为一个完整的noob,然后问,我应该把什么放在它显示@FILENAME的位置,你的EXCEL文件?我的xlsx文件是我项目中的一个资源,它的定义如下:Dim exeDir为New IO.FileInfoReflection.Assembly.GetExecutingAssembly.FullName Dim xlPath=IO.Path.CombineexeDir.DirectoryName,Records.xlsx和我得到一个错误,您将Dim t作为新数据表,它告诉我“New”不能用于interface@FILENAME是文件完整路径的占位符。你的文件名只是让你知道把它改成你的名字好的,我有那部分。现在,唯一的问题是Dim t作为新数据表的错误,它告诉我“New”不能在接口上使用
Dim t2013 = QueryExcel("2013")
DataGridView.DataSource = t2013