我有一个BackgroundWorker,用于在显示表单时进行耗时的过程。表单和BackgroundWorker位于不同的类中,当BackgroundWorker完成它必须执行的操作时,我需要在表单上执行一些基本操作。
但是,以下内容不起作用并产生警告Reference to non-shared member requires an object reference
。
Private Sub bw_RunWorkerCompleted(ByVal sender As Object, ByVal e As RunWorkerCompletedEventArgs)
mainForm.btnCancel.Enabled = False
mainForm.btnFinish.Enabled = True
End Sub
我研究了这个警告,它建议我必须确保声明了对象mainForm
,这对于这个场景来说似乎很奇怪。无论如何,我将我的代码更改为此,警告消失了,但是如果怀疑,它不起作用。似乎会引用表单的新实例,这不是我需要的。
Private Sub bw_RunWorkerCompleted(ByVal sender As Object, ByVal e As RunWorkerCompletedEventArgs)
Dim objForm As New mainForm
objForm.btnCancel.Enabled = False
objForm.btnFinish.Enabled = True
End Sub
有人可以告诉我如何与BackgroundWorker中的表单进行交互吗?感谢。
答案 0 :(得分:1)
问题不在于您需要声明新的 mainForm
对象。问题是您需要引用正确的 mainForm
对象。由于可以创建任意数量的mainForm
对象,因此需要引用要修改的特定mainForm
对象。请记住,mainForm
是类(一种对象)。它本身并不是一个对象。
解决这个问题的最简单方法是向正在执行工作的类提供mainForm
对象的引用,如下所示:
Public Class MyBusiness
Public Property TheMainForm As mainForm
' ...
Private Sub bw_RunWorkerCompleted(ByVal sender As Object, ByVal e As RunWorkerCompletedEventArgs)
TheMainForm.btnCancel.Enabled = False
TheMainForm.btnFinish.Enabled = True
End Sub
End Class
然后,在开始工作之前,您需要确保设置TheMainForm
属性。例如,像这样:
Dim business As New MyBusiness
business.TheMainForm = Me
business.DoWork()