VB.net BackgroundWorker UI - PullRequest
       26

VB.net BackgroundWorker UI

0 голосов
/ 04 июня 2019

Я пытаюсь создать приложение, которое создает документ Excel на основе пользовательского ввода. Документ может стать довольно обширным (несколько листов), поэтому я хочу поместить создание документа в BackgroundWorker и передать ход выполнения в ProgressBar.

У меня проблемы с доступом к элементам управления пользовательского интерфейса при создании документа. Как получить доступ к нескольким элементам управления пользовательского интерфейса из BackgroundWorker?

Это очень простой пример двух из многих вещей, которые я хочу сделать в BackgroundWorker:

 Private Sub BackgroundWorker1_DoWork(sender As Object, e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork
    OpenWorkbook()

    Dim Combobox() As ComboBox = {ComboBox1, ComboBox2, ComboBox3, ComboBox4}

    With xlWorkBook.Sheets("Cover1")
        .Range("E5").Value = TextBox1.Text
        .Range("E6").Value = TextBox2.Text
        .Range("E7").Value = TextBox3.Text
        .Range("E8").Value = TextBox4.Text

        For i = 0 To Combobox.Count - 1
            .Range("A" & i + 1).Value = Combobox(i).Text
        Next
    End With

    CloseWorkBook()
End Sub

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    BackgroundWorker1.RunWorkerAsync()
End Sub

У меня совсем нет опыта, и после изучения этого вопроса я все еще не ладил с делегатом / вызовом. Любая помощь будет потрясающей. Заранее спасибо.

1 Ответ

0 голосов
/ 04 июня 2019

Как указал Хайнци, вы не можете просто передать ссылку на элемент управления в bgw.вместо этого вы передаете значения.

             Option Strict On
            Public Class FormControls
                WithEvents Bgw As New ComponentModel.BackgroundWorker With {.WorkerReportsProgress = True}

                Public Class BgwArgs
                    Public TxtBx1Txt As String = FormControls.TextBox1.Text
                    Public TxtBx2Txt As String = FormControls.TextBox2.Text
                    Public CmbBx1Txt As String = FormControls.ComboBox1.SelectedText
                End Class

                Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
                    Dim BgwArgs As New BgwArgs
                    Bgw.RunWorkerAsync(BgwArgs)
                End Sub

                Private Sub Bgw_DoWork(sender As Object, e As ComponentModel.DoWorkEventArgs) Handles Bgw.DoWork
                    Dim BgwArgs As BgwArgs = DirectCast(e.Argument, BgwArgs)

                    .Range("E5").Value = BgwArgs.TxtBx1Txt 'etc

                End Sub

            End Class

Я предполагаю, что OpenWorkbook - это подпрограмма, которая использует взаимодействие для создания xlWorkBook, где вы вместо этого захотите сделать это также внутри потока, то же самое с CloseWorkbookвсе это должно обрабатываться в событии DoWork, а не в их отдельных подпрограммах.

...