【问题标题】:In a VB.NET Windows Forms application: How to preserve MVC when handling Events?在 VB.NET Windows 窗体应用程序中:如何在处理事件时保留 MVC?
【发布时间】:2014-10-06 07:45:37
【问题描述】:

我对 Windows 窗体开发相对较新,我的第一个实际应用程序已经到了在我的主窗体文件中开始构建大量代码的地步,因此我决定使用 MVC 模式重组我的项目。

我遇到的一个主要问题是处理表单的不同控件事件。我有几个按钮、文本字段、组合框和一个 tabcontroll 元素,它再次包含不同的输入元素,到目前为止,处理点击、更新和其他更改的每个过程都在我的主类中定义。 例如:

Private Sub btnOk_Click(sender As Object, e As EventArgs) Handles btnOk.Click
    some code...
End Sub

所以我的问题是:在我的主窗体之外处理这些事件的最佳方法是什么?我更熟悉在 Java 中构建 GUI,您可以在其中使用 ActionListeners 来实现这一点,但我在使用 Windows 窗体时没有发现任何类似的东西。

【问题讨论】:

    标签: vb.net winforms events model-view-controller event-handling


    【解决方案1】:

    要订阅主窗体类之外的控件事件,请将控件设为公开,以便您可以从其他类访问)。这可以在设计时使用 Modifier 属性来完成。然后,使用AddHandler 关键字以编程方式订阅任何事件。

    【讨论】:

    • 我尝试了您的方法,它似乎工作正常,但我发现没有必要公开控制元素,如果我将其保留为默认设置(朋友),它也可以工作。跨度>
    【解决方案2】:

    在进行了更多研究后,我发现这个问题可能没有正确的答案,但我发现了 2 种方法,它们以我正在寻找的方式提供了解决方案。在这两种情况下,我都使用了一个控制器类,它负责处理来自我的主窗体的任何用户交互。

    第一种方法利用了 DmitryBabich 的建议,将处理程序添加到对象并将其引用到我的控制器类的方法:

    在表格 1 中:

    Dim ctrl as new Controller(Me)
    AddHandler Button1.Click, AddressOf ctrl.doSomething
    

    控制器类:

    Public Class Controller
    
        Private myForm As Form1
    
        Public Sub New(ByVal f As Form1)
            myForm = f
        End Sub
    
        Public Sub doSomething(sender As Object, e As EventArgs)
            MsgBox("Button clicked.")
        End Sub
    End Class
    

    对于一个如此简单的示例,不需要将 Form1 的实例传递给控制器​​,但如果我也想访问其他控件元素的值,我可以使用这个实例来解决它们表格 1。 例如:

    Public Sub doSomething(sender As Object, e As EventArgs)
        MsgBox("You clicked the button, by the way: The value of TextField1 is " & myForm.TextField1.text)
    End Sub
    

    另一种方法几乎相同,只是控制器知道表单的所有相关用户控件对象并可以直接处理它们的事件,这意味着在主表单中我只需创建控制器的实例.然而,在控制器中,我必须在加载主窗体后立即将要访问的每个用户控件分配给它自己的变量:

    在表格 1 中:

    Dim ctrl as new Controller(Me)
    

    控制器类:

    Public Class Controller
        WithEvents myForm As Form1
        WithEvents button1 As Button
        WithEvents button2 As Button
    
        Public Sub New(ByVal f As Form1)
            myForm = f
        End Sub
    
        Public Sub formLoad() Handles myForm.Load
            button1 = myForm.Button1
            button2 = myForm.Button2
        End Sub
    
        Private Sub b1Click() Handles button1.Click
            MsgBox("You clicked button1!")
        End Sub
    
        Private Sub b2Click() Handles button2.Click
            MsgBox("Button #2 was clicked!")
        End Sub
    End Class
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-09-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-23
      • 1970-01-01
      相关资源
      最近更新 更多