【问题标题】:VB.net BackgroundWorker UIVB.net BackgroundWorker 用户界面
【发布时间】:2019-06-04 12:37:48
【问题描述】:

我正在尝试创建一个基于用户输入生成 Excel 文档的应用程序。文档可能会变得非常广泛(多张),所以我想将文档的创建放在 BackgroundWorker 上并将进度传递给 ProgressBar。

我在创建文档时访问 UI 控件时遇到问题。 如何从 BackgroundWorker 访问多个 UI 控件?

这是我想在 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

我完全没有经验,在研究了这个主题之后,我仍然无法与 Delegate/Invoke 相处。任何帮助都是极好的。提前致谢。

【问题讨论】:

  • OpenWorkbookCloseWorkBook 发生了什么
  • 您需要DoWork 中的控件值,而不是控件本身。 BackgroundWorker.RunWorkerAsync 重载允许您传递一个对象,该对象成为DoWorkEventArgsArguments。您可以使用此对象将所需的所有值传递给DoWork 方法。

标签: vb.net backgroundworker


【解决方案1】:

正如 Heinzi 所指出的,您不能只将控件的引用传递给 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 事件中处理而不是在他们自己独立的例程。

【讨论】:

  • 这是正确的方法,但有一些细节错误:您应该传递对 UI 控件的引用(这将导致与 OP 遇到的问题相同的问题),而是传递那些控件中包含的 (即,BgwArgs 应该包含 TxtBx1Text,而不是 TxtBx1)。
  • 它的工作!我将不得不重新安排我的大部分代码,但这不是问题。我想我应该在时间允许的时候拿一本 vb.net 书……非常感谢。
猜你喜欢
  • 1970-01-01
  • 2013-01-02
  • 1970-01-01
  • 1970-01-01
  • 2023-03-22
  • 2011-04-04
  • 2011-09-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多