Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在我的vb.net应用程序中,类似控制器的代码应该在哪里编写?_Vb.net - Fatal编程技术网

在我的vb.net应用程序中,类似控制器的代码应该在哪里编写?

在我的vb.net应用程序中,类似控制器的代码应该在哪里编写?,vb.net,Vb.net,我正在重构一个大文件的现有项目。所有表单控件都存在于单个表单中,所有事件处理程序都存在于表单的代码中 我正在将UI的一部分重构为一个用户控件。此UI的一部分是“添加合同”按钮。这将转到我的数据层,向DataTable添加一行,表单其他部分中的各种网格将用新行更新 我的问题是,我应该将用户控件中按钮单击的事件处理程序放在哪里 我可以将事件处理程序代码保留在父窗体中,并在用户控件中使用AddHandler引用父窗体的子窗体 我可以在用户控件中编写所有事件处理程序代码。在这种情况下,我需要访问父窗体以

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

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

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

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

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


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

    您的用户控件应该引发托管用户控件的窗体将处理的事件。如果用户控件具有对表单的引用,则该用户控件在任何其他上下文中都不可重用;换句话说,用户控件与一个表单紧密耦合,如果表单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
    
    现在,在form类中,需要为用户控件引发的事件添加一个处理程序,如下所示:

    AddHandler userControl1.UC_Button1Click, AddressOf Button1_Click
    
    Public Sub Button1_Click(ByVal sender As Object, ByVal args As EventArgs)
        ' Do something here
    End Sub
    
    最后,您将创建
    AddressOf
    语法中引用的方法,如下所示:

    AddHandler userControl1.UC_Button1Click, AddressOf Button1_Click
    
    Public Sub Button1_Click(ByVal sender As Object, ByVal args As EventArgs)
        ' Do something here
    End Sub
    

    这是有道理的。我将相关的UI控件移动到用户控件的想法是隔离一些UI逻辑&控件的命名。现在有几十个控件都是主窗体。如果不是通过用户控件的话,我还能做什么来整理呢?@SamSelikoff-对不起,我有点苛刻,我的意思是在表单中不能重复使用紧密耦合的用户控件。请参阅更新的答案。感谢您让我意识到我需要澄清这一点。:-)完全有道理。现在了解如何从我的用户控件引发事件!不过,我很高兴这是一种模式。这是我在Ember.js中所熟悉的。@SamSelikoff-我用一些代码更新了答案,以帮助您处理用户控件中的事件和表单类中引发的事件,希望对您有所帮助。:-)非常感谢你的帮助!如果有时间的话,我还有一个简短的问题:能否使用设计器将绑定源从主窗体共享到用户控件?