Это может помочь вам или, по крайней мере, дать вам основную идею:
Private Function ExcelToDataTable(ByVal fileExcel As String, _
Optional ByVal columnToExtract As String = "*", _
) As System.Data.DataTable
Dim dt As New System.Data.DataTable
Try
Dim MyConnection As System.Data.OleDb.OleDbConnection
Dim MyCommand As OleDbDataAdapter
Dim fileExcelType As String
'Chose the right provider
If IO.Path.GetExtension(fileExcel.ToUpper) = ".XLS" Then
fileExcelType = "Excel 8.0"
MyConnection = _
New System.Data.OleDb.OleDbConnection _
("provider=Microsoft.Jet.OLEDB.4.0;Data Source='" & fileExcel & "';Extended Properties=" & fileExcelType & ";")
Else
fileExcelType = "Excel 12.0"
MyConnection = _
New System.Data.OleDb.OleDbConnection _
("provider=Microsoft.ACE.OLEDB.12.0;Data Source='" & fileExcel & "';Extended Properties=" & fileExcelType & ";")
End If
'Open excel connection
MyConnection.Open()
'Populate DataTable
Dim myTableName = MyConnection.GetSchema("Tables").Rows(0)("TABLE_NAME")
MyCommand = New OleDbDataAdapter(String.Format("SELECT " & columnToExtract & " FROM [{0}] ", myTableName), MyConnection)
MyCommand.TableMappings.Add("Table", columnToExtract)
MyCommand.Fill(dt)
MyConnection.Close()
Catch ex As Exception
Err.Clear()
End Try
Return dt
End Function
Как вы можете видеть, у нас есть необязательный параметр myWhereStatement.
Что это значит? Вы можете указать его значение при вызове функции, в противном случае его значение будет равно empty string
Послечто мы можем вызвать ExcelToDataTable
внутри нашего Sub, чтобы заполнить ComboBox
, как показано ниже:
Private Sub Combobox_Populate()
Dim filePath As String = "your_file_path"
ComboBox1.DataSource = ExcelToDataTable(filePath, "MasterRecord")
End Sub
Теперь ваш ComboBox1 заполнен данными, но ComboBox2 по-прежнему пуст.
Мы собираемся обработать событие ComboBox1_SelectedValueChanged
, что означает, что каждый раз, когда вы выбираете элемент из ComboBox1
, он будет программным образом заполнять ComboBox2
проппер элементами, как показано ниже.
Private Sub ComboBox1_SelectedValueChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles ComboBox1.SelectedValueChanged
Dim slaveRecords As System.Data.DataTable = ExcelToDataTable(filePath)
Dim dt As New DataTable
dt.Columns.Add("SlaveRecords")
For i As Integer = 0 To slaveRecords.Rows.Count
If ComboBox1.SelectedItem Is slaveRecords.Rows(i).Item(0) Then
dt.Rows.Add(slaveRecords.Rows(i).Item(1))
End If
Next
ComboBox2.DataSource = dt
End Sub
Примечания
Как видно, первый вызов ExcelToDataTable
имеет только 2 параметра, а второй - 3 параметра.Это необязательный параметр функция!
NB
Как вы можете видеть, я использую много _
из-за лучшего форматирования кода.Это означает, что один оператор будет продолжаться в несколько строк
Если что-то не ясно на 100%, или у вас есть какие-либо сомнения, не стесняйтесь спрашивать в комментариях ниже.