Это может помочь вам или, по крайней мере, дать вам общее представление:
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 параметра. Это необязательный параметр особенность!
Примечание
Как видите, я использую много _
из-за лучшего форматирования кода. Это означает, что будет продолжаться один оператор в нескольких строках
Если что-то не на 100% ясно, не стесняйтесь спрашивать в комментариях ниже.
person
Simo
schedule
17.09.2018
DataTable
запросом, который возвращает все основные записи. Заполните второйDataTable
запросом, который возвращаетSlaveRecords
, принадлежащий MasterRecords. ЗаполнитеComboBox1
первыми таблицами данных иComboBox2
второй таблицей данных. @YassinKulk ты понял? - person Simo   schedule 17.09.2018