Vb.net 单击按钮时在datagridview中显示不同的工作表数据时出现问题

Vb.net 单击按钮时在datagridview中显示不同的工作表数据时出现问题,vb.net,forms,excel,datagridview,backgroundworker,Vb.net,Forms,Excel,Datagridview,Backgroundworker,我在表单记录表单上有一个datagridview控件。在第一个表单开始表单上,我有一个按钮查看记录按钮,当单击该按钮时,该按钮包括我将在下面列出的所有代码,这些代码将发送给我在开始表单上的名为bw的backgroundworker。当用户单击“查看记录”按钮时,按钮旁边会出现一个进度条,显示正在加载的datagridview的进度。我通过一个从excel文件中获取所有值的循环加载datagridview。我的工作很好,但现在我希望能够使用相同的循环重新加载datagridview,但是当用户按下

我在表单记录表单上有一个datagridview控件。在第一个表单开始表单上,我有一个按钮查看记录按钮,当单击该按钮时,该按钮包括我将在下面列出的所有代码,这些代码将发送给我在开始表单上的名为bw的backgroundworker。当用户单击“查看记录”按钮时,按钮旁边会出现一个进度条,显示正在加载的datagridview的进度。我通过一个从excel文件中获取所有值的循环加载datagridview。我的工作很好,但现在我希望能够使用相同的循环重新加载datagridview,但是当用户按下记录表单上的“上一年”按钮时,可以从excel工作簿中的不同工作表中获取数据。下面我已经包括了开始表单和记录表单的图像,以及它们各自的代码

更新代码

    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