VB.NET (Excel, два столбца> Условные списки) - PullRequest
0 голосов
/ 17 сентября 2018

Я ищу почти два часа, чтобы найти решение по следующим вопросам.В Excel у меня есть два столбца (один столбец для основных записей и один столбец для ведомых записей).По сути, в Combobox1 я хочу заполнить все основные записи.Если выбор сделан для MasterRecord A, я хочу, чтобы Combobox2 показывал мне только SlaveRecords, принадлежащие A, а не другие записи, принадлежащие другим Master Records.

enter image description here

У меня добавлена ​​Interop Assembly и открыт Excel (соединение уже установлено).Ваша помощь очень ценится!

Private Sub Combobox2_Populate()
    'Start Excel Script to populate ComboBox2
    Dim excel As Application = New Application
    Dim w As Workbook = excel.Workbooks.Open(Filename:=databasestatus, [ReadOnly]:=True)
    Dim sheet As Worksheet = w.Sheets("AIR_NL_1")
    Dim StartRow As Integer
    Dim TotalRows As Integer
    ComboBox2.Items.Clear()
    sheet.UsedRange.AutoFilter(Field:=9, Criteria1:=ComboBox1.SelectedItem, Operator:=XlAutoFilterOperator.xlFilterValues)
    TotalRows = sheet.Range("A1").CurrentRegion.Rows.Count
    For StartRow = 3 To TotalRows
        If XlCellType.xlCellTypeVisible = True Then
            ComboBox2.Items.Add(sheet.Range("H:H").Cells(StartRow, 1).Text)
        End If
    Next
    w.Close(SaveChanges:=False)
End Sub    

1 Ответ

0 голосов
/ 17 сентября 2018

Это может помочь вам или, по крайней мере, дать вам основную идею:

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%, или у вас есть какие-либо сомнения, не стесняйтесь спрашивать в комментариях ниже.

...