【问题标题】:Where should controller-like code be written in my vb.net app?在我的 vb.net 应用程序中应该在哪里编写类似控制器的代码?
【发布时间】:2013-11-19 15:08:39
【问题描述】:

我正在重构一个现有项目,它是一个大文件。所有表单控件都存在于一个表单中,所有事件处理程序都存在于表单的代码中。

我正在将一部分 UI 重构为用户控件。此 UI 的一部分是“添加合同”按钮。这将转到我的数据层,向 DataTable 添加一行,并且表单其他部分中的各种网格都使用新行进行更新。

我的问题是,我应该将按钮单击的事件处理程序放在用户控件中的哪个位置?

  1. 我可以将事件处理程序代码留在父窗体中,并在用户控件中使用AddHandler 来引用父窗体的子窗体

  2. 我可以在用户控件中编写所有事件处理程序代码。在这种情况下,我需要访问父表单以获取对数据层的引用。

我来自网络背景,我习惯于“控制器”处理这类事情。我想我的父表单正在变成一种控制器 - 但这是一个好习惯吗?我是否应该有一个单独的类来协调用户与我的模型层的交互,或者,一旦我将所有 UI 分离到单独的用户控件中,主窗体是否适合这种事情?

【问题讨论】:

    标签: vb.net


    【解决方案1】:

    您的用户控件应该引发承载该用户控件的表单将处理的事件。如果用户控件具有对表单的引用,则用户控件在任何其他上下文中都不可重用;换句话说,用户控件与那个表单紧密耦合,如果表单 X 尝试使用用户控件,它就会中断。

    注意:如果您的表单是唯一会使用用户控件的东西,那么将其作为用户控件根本没有太多的可重用性价值。如果接口只有一个实现,那么创建接口并没有多大用处。也就是说,从组织的角度来看,用户控件可用于清理拥挤的表单。它还具有允许在用户控件中动态加载内容的好处。

    您的父表单成为控制器没有任何问题。


    这是一个简单的示例(在本例中是单击用户控件中的按钮),说明如何从用户控件引发事件并订阅表单中的事件:

    Public Class UserControlClass
        ' Define event that will be raised by user control to anyone interested in handling the event
        Public Event UC_Button1Click()
    
        ' Mechanism to allow event to be raised by user control
        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            RaiseEvent UC_Button1Click()
        End Sub
    End Class
    

    现在在您的表单类中,您需要为用户控件引发的事件添加一个处理程序,如下所示:

    AddHandler userControl1.UC_Button1Click, AddressOf Button1_Click
    

    最后,您将创建AddressOf 语法中引用的方法,如下所示:

    Public Sub Button1_Click(ByVal sender As Object, ByVal args As EventArgs)
        ' Do something here
    End Sub
    

    【讨论】:

    • 这是有道理的。我将相关的 UI 控件移动到用户控件的想法是隔离一些 UI 逻辑和控件的命名。现在主窗体中有几十个控件。如果不通过用户控件,我还能如何进行整理?
    • @SamSelikoff - 对不起,我有点苛刻,我的意思是没有可重用性使用紧密耦合的用户控件到表单。请参阅更新的答案。感谢您让我意识到我需要澄清这一点。 :-)
    • 完全有道理。现在来了解如何从我的用户控件中引发事件!不过,我很高兴这是模式。这是我在 Ember.js 中所熟悉的。
    • @SamSelikoff - 我用一些代码更新了答案,让您处理用户控件中的事件并处理表单类中引发的事件,希望对您有所帮助。 :-)
    • 非常感谢您的帮助!如果您有时间,我还有一个快速的问题:您可以使用设计器将 BindingSources 从主窗体共享到用户控件吗?
    猜你喜欢
    • 2017-02-13
    • 2017-10-13
    • 2010-09-22
    • 2019-02-27
    • 1970-01-01
    • 2016-11-13
    • 2011-10-08
    • 1970-01-01
    • 2015-11-03
    相关资源
    最近更新 更多