1

我有一个表单,我必须在其中填充 DataGrid。此 DataGrid 的源来自另一个类。

我需要通过在其中获取 Datatable 的类中的引发事件来填充 DataGrid。

Imports System.IO

Public Class ExcelReader

    Private WithEvents tmrRead As New Timer

    Dim fullpath As String = ""

    Public Sub ExcelReader()
        tmrRead.Interval = 2000
        tmrRead.Start()
    End Sub


    Public Sub TimerTick(ByVal sender As Object, ByVal e As System.EventArgs) Handles tmrRead.Tick
        Dim DT As New DataTable

        Dim path As String = Directory.GetParent(Directory.GetParent(Directory.GetCurrentDirectory).ToString).ToString + "\ExcelHotReader\"

    Dim file1 As String() = System.IO.Directory.GetFiles(path, "*.xls")
    Dim file2 As String() = System.IO.Directory.GetFiles(path, "*.xlsx")
    If file1.Count <> 0 Or file2.Count <> 0 Then
        tmrRead.Stop()
    End If

        If file1.Count <> 0 Then
            fullpath = file1(0).ToString
        End If

        If file2.Count <> 0 Then
            fullpath = file2(0).ToString
        End If

        Dim DT As New DataTable
        Dim cn As System.Data.OleDb.OleDbConnection
        Dim cmd As System.Data.OleDb.OleDbDataAdapter
        cn = New System.Data.OleDb.OleDbConnection("provider=Microsoft.Jet.OLEDB.4.0;" & "data source=" & fullpath & ";Extended Properties=Excel 8.0;")

        cmd = New System.Data.OleDb.OleDbDataAdapter("select * from [Sheet1$]", cn)
        cn.Open()
        cmd.Fill(DT)
        cn.Close()

    End Sub
End Class

在 cn.Close() 之后,应该使用 Datatable 引发事件。此事件需要由表单捕获以填充 DataGrid。

4

1 回答 1

2

在 ExcelReader 类中添加 Event 的声明,并在代码末尾使用 RaiseEvent 调用它

Public Class ExcelReader
    Public Event DataTableLoaded(ByVal dt As DataTable)
    .......

        Using cn = New System.Data.OleDb.OleDbConnection("provider=Microsoft.ACE.12.0;.......")
        Using cmd = New System.Data.OleDb.OleDbDataAdapter("select * from [Sheet1$]", cn)
            cn.Open()
            cmd.Fill(DT)
            RaiseEvent DataTableLoaded(DT)
        End Using
        End Using
    ....
End Class

然后调用代码使用关键字 WithEvents (全局)声明 ExcelReader 类的一个实例

Public Dim WithEvents readerTableFromExcel = New ExcelReader()

最后声明处理事件的方法(事件接收器)

Public Sub DataTableFromExcel(ByVal dt As System.Data.DataTable) _
           Handles readerTableFromExcel.DataTableLoaded
    MsgBox("Table loaded")
End Sub

最后一点,我将使用不同的方法来开始读取 Excel 文件(例如,BackgroundWorker类似乎比 TimerTick 事件更合适)

如果您需要加深对事件的了解,这篇文章似乎很好地总结了重要知识

于 2013-08-17T12:31:37.730 回答