从其他 类 更新 GUI 中的列表框
update listbox in GUI from other classes
我的主 vb.net 表单上有一个列表框,我用它来显示来自服务器程序的状态消息,我是 运行。我的实际程序由许多不同的 classes(在单独的文件中)组成,我希望能够从每个 frm.UpdateList("With Info in Here") 调用 Sub frm.UpdateList("With Info in Here") =30=]es 写入列表框。
如果我从 frm class 调用 frm.UpdateList 或 UpdateList,它会很好地写入列表框,但如果我从任何其他 class 调用它,则没有任何反应(我不也出错了)。
我尝试过共享和不共享(并将 frm 更改给我),但都没有达到我希望的效果。
谁能帮我理解为什么这不起作用,我已经调用了该项目,它确实被添加到但不是来自单独的 class(这是我需要的做)。
非常感谢!
Private Delegate Sub UpdateListDelegate(ByVal itemName As String)
Public Shared Sub UpdateList(ByVal itemName As String)
If frm.InvokeRequired Then
frm.Invoke(New UpdateListDelegate(AddressOf UpdateList), itemName)
Else
frm.ListBox1.Items.Insert(0, DateTime.Now.ToString & ": " & itemName)
End If
End Sub
编辑:尝试 2,感谢 Idle_Mind 在 frm class 上工作(frm 是主窗体,也是唯一的窗体),但调用时它仍然不写入列表框来自其他 classes(并且没有发生错误):
Public Shared Sub UpdateList(ByVal itemName As String)
Dim frm As Form = My.Application.ApplicationContext.MainForm
If Not IsNothing(frm) Then
Dim matches() As Control = frm.Controls.Find("ListBox1", True)
If matches.Length > 0 AndAlso TypeOf matches(0) Is ListBox Then
Dim LB As ListBox = DirectCast(matches(0), ListBox)
LB.Invoke(New MethodInvoker(Sub() LB.Items.Insert(0, DateTime.Now.ToString & ": " & itemName)))
End If
End If
End Sub
I have a listbox on my main vb.net form
这只适用于启动窗体,并不是一个好的设计。还要考虑其他方法:
Public Class Form1
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Dim soc As New SomeOtherClass
soc.Foo()
End Sub
End Class
Public Class SomeOtherClass
Public Sub Foo()
Dim msg As String = "Hello?!"
Helper.UpdateList(msg) ' <-- You can do this from any class...
End Sub
End Class
Public Class Helper
Public Shared Sub UpdateList(ByVal itemName As String)
Dim frm As Form = My.Application.ApplicationContext.MainForm
If Not IsNothing(frm) Then
Dim matches() As Control = frm.Controls.Find("ListBox1", True)
If matches.Length > 0 AndAlso TypeOf matches(0) Is ListBox Then
Dim LB As ListBox = DirectCast(matches(0), ListBox)
LB.Invoke(New MethodInvoker(Sub() LB.Items.Insert(0, DateTime.Now.ToString & ": " & itemName)))
End If
End If
End Sub
End Class
其他需要您做更多工作的正确方法可能包括:
(1) 在创建主窗体时将对主窗体的引用传递给另一个 类。然后那些 类 可以直接启动 ListBox,也可以按照 Plutonix 的建议调用其中的方法。这是一个实际的例子:
Public Class Form1
Public Sub UpdateList(ByVal itemName As String)
ListBox1.Invoke(New MethodInvoker(Sub() ListBox1.Items.Insert(0, DateTime.Now.ToString & ": " & itemName)))
End Sub
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Dim soc As New SomeOtherClass(Me)
soc.Foo()
End Sub
End Class
Public Class SomeOtherClass
Private _Main As Form1
Private Sub New()
End Sub
Public Sub New(ByVal MainForm As Form1)
_Main = MainForm
End Sub
Public Sub Foo()
If Not IsNothing(_Main) Then
_Main.UpdateList("Hello?!")
End If
End Sub
End Class
您必须以类似的方式修改所有其他 类,以便他们可以接收您的表单实例。
(2) 让另一个 类 在创建 类 时引发主窗体订阅的自定义事件。
我的主 vb.net 表单上有一个列表框,我用它来显示来自服务器程序的状态消息,我是 运行。我的实际程序由许多不同的 classes(在单独的文件中)组成,我希望能够从每个 frm.UpdateList("With Info in Here") 调用 Sub frm.UpdateList("With Info in Here") =30=]es 写入列表框。
如果我从 frm class 调用 frm.UpdateList 或 UpdateList,它会很好地写入列表框,但如果我从任何其他 class 调用它,则没有任何反应(我不也出错了)。
我尝试过共享和不共享(并将 frm 更改给我),但都没有达到我希望的效果。
谁能帮我理解为什么这不起作用,我已经调用了该项目,它确实被添加到但不是来自单独的 class(这是我需要的做)。
非常感谢!
Private Delegate Sub UpdateListDelegate(ByVal itemName As String)
Public Shared Sub UpdateList(ByVal itemName As String)
If frm.InvokeRequired Then
frm.Invoke(New UpdateListDelegate(AddressOf UpdateList), itemName)
Else
frm.ListBox1.Items.Insert(0, DateTime.Now.ToString & ": " & itemName)
End If
End Sub
编辑:尝试 2,感谢 Idle_Mind 在 frm class 上工作(frm 是主窗体,也是唯一的窗体),但调用时它仍然不写入列表框来自其他 classes(并且没有发生错误):
Public Shared Sub UpdateList(ByVal itemName As String)
Dim frm As Form = My.Application.ApplicationContext.MainForm
If Not IsNothing(frm) Then
Dim matches() As Control = frm.Controls.Find("ListBox1", True)
If matches.Length > 0 AndAlso TypeOf matches(0) Is ListBox Then
Dim LB As ListBox = DirectCast(matches(0), ListBox)
LB.Invoke(New MethodInvoker(Sub() LB.Items.Insert(0, DateTime.Now.ToString & ": " & itemName)))
End If
End If
End Sub
I have a listbox on my main vb.net form
这只适用于启动窗体,并不是一个好的设计。还要考虑其他方法:
Public Class Form1
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Dim soc As New SomeOtherClass
soc.Foo()
End Sub
End Class
Public Class SomeOtherClass
Public Sub Foo()
Dim msg As String = "Hello?!"
Helper.UpdateList(msg) ' <-- You can do this from any class...
End Sub
End Class
Public Class Helper
Public Shared Sub UpdateList(ByVal itemName As String)
Dim frm As Form = My.Application.ApplicationContext.MainForm
If Not IsNothing(frm) Then
Dim matches() As Control = frm.Controls.Find("ListBox1", True)
If matches.Length > 0 AndAlso TypeOf matches(0) Is ListBox Then
Dim LB As ListBox = DirectCast(matches(0), ListBox)
LB.Invoke(New MethodInvoker(Sub() LB.Items.Insert(0, DateTime.Now.ToString & ": " & itemName)))
End If
End If
End Sub
End Class
其他需要您做更多工作的正确方法可能包括:
(1) 在创建主窗体时将对主窗体的引用传递给另一个 类。然后那些 类 可以直接启动 ListBox,也可以按照 Plutonix 的建议调用其中的方法。这是一个实际的例子:
Public Class Form1
Public Sub UpdateList(ByVal itemName As String)
ListBox1.Invoke(New MethodInvoker(Sub() ListBox1.Items.Insert(0, DateTime.Now.ToString & ": " & itemName)))
End Sub
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Dim soc As New SomeOtherClass(Me)
soc.Foo()
End Sub
End Class
Public Class SomeOtherClass
Private _Main As Form1
Private Sub New()
End Sub
Public Sub New(ByVal MainForm As Form1)
_Main = MainForm
End Sub
Public Sub Foo()
If Not IsNothing(_Main) Then
_Main.UpdateList("Hello?!")
End If
End Sub
End Class
您必须以类似的方式修改所有其他 类,以便他们可以接收您的表单实例。
(2) 让另一个 类 在创建 类 时引发主窗体订阅的自定义事件。