我整天都在撞墙,试图弄清楚这个问题。
我正在完成一个程序,可以简单地删除特定临时文件夹中的文件。我已经读到,有时最好为方法和变量创建单独的类。因此,我为几个方法创建了一个单独的类,以删除指定目录中的文件和文件夹。我使用的是后台工作在我的Form1中类和我打电话给我deleteFiles()从我的方法WebFixProcesses在类DoWork的事件Form1的类。我正在使用后台工作程序,以便可以轻松地将进度报告回主窗体上的进度栏。
文件被删除没有问题,但是我只是无法在主表单上得到标签来反映当前正在删除的文件。标签没有任何变化。我知道公式是正确的,因为如果该方法在Form1类中,则可以正常工作。而我只是使用:
Invoke(Sub()
lblStatus.Text = File.ToString
lblStatus.Refresh()
End Sub)
这是我从WebFixProcesses类调用的方法:
Public Shared Sub deleteFiles(ByVal fileLocation As String)
For Each file As String In Directory.GetFiles(fileLocation)
Try
fileDisplay.Add(file)
For i = 1 To fileDisplay.Count
file = fileDisplay(i)
Form1.BackgroundWorker1.ReportProgress(CInt(i / fileDisplay.Count) * 100)
Next
IO.File.Delete(file)
Form1.labelText(file)
Form1.labelRefresh()
Catch ex As Exception
MessageBox.Show(ex.Message)
End Try
Next
End Sub
labelText()和labelRefresh()是我主要形式中的方法,它们使用委托来尝试将信息传递给控件:
Public Sub labelText(ByVal file As String)
If lblStatus.InvokeRequired Then
Dim del As New txtBoxDelegate(AddressOf labelText)
Me.Invoke(del, file)
Else
lblStatus.Text = file.ToString()
End If
End Sub
Public Sub labelRefresh()
If lblStatus.InvokeRequired Then
Dim del As New txtBoxRefDelegate(AddressOf labelRefresh)
Me.Invoke(del)
Else
lblStatus.Refresh()
End If
End Sub
如果有人可以帮助我告知我可能做错了什么,将不胜感激,因为我的头为此感到非常痛苦。也许我犯错了,只是固执地将我的方法放在自己的类中。但是任何帮助都会很棒。谢谢你们!
汉斯在问题注释上写的是正确的:Form1
是一个类型,而不是实例,但是为了使程序更容易(来自VB6),M $进行了“混合”操作,使您可以使用表单名称作为实例在主线程中的形式。
但是,仅当您在该线程上时,此方法才有效。
如果您Form1
从另一个线程引用,Form1
则会创建一个新实例。
要解决此问题,请将以下代码添加到表单中:
Private Shared _instance As Form1
Public ReadOnly Property Instance As Form1
Get
Return _instance
End Get
End Property
我们将使用此属性存储表单的当前实例。为此,请将以下行添加到Load
事件中:
Private Sub Form1_Load(sender As Object, e As System.EventArgs) Handles Me.Load
_instance = Me
'other code here
End Sub
现在,从每个类的任何线程中,如果您使用
Form1.Instance
...您会得到实际的表格。现在,您Invoke
甚至可以使用相同的形式:
Me.instance.Invoke(Sub()
Me.lblStatus.Text = "Hello World"
End Sub)
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句