从其他 类 更新 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) 让另一个 类 在创建 类 时引发主窗体订阅的自定义事件。