在我的vb.net应用程序中,类似控制器的代码应该在哪里编写?
我正在重构一个大文件的现有项目。所有表单控件都存在于单个表单中,所有事件处理程序都存在于表单的代码中 我正在将UI的一部分重构为一个用户控件。此UI的一部分是“添加合同”按钮。这将转到我的数据层,向DataTable添加一行,表单其他部分中的各种网格将用新行更新 我的问题是,我应该将用户控件中按钮单击的事件处理程序放在哪里在我的vb.net应用程序中,类似控制器的代码应该在哪里编写?,vb.net,Vb.net,我正在重构一个大文件的现有项目。所有表单控件都存在于单个表单中,所有事件处理程序都存在于表单的代码中 我正在将UI的一部分重构为一个用户控件。此UI的一部分是“添加合同”按钮。这将转到我的数据层,向DataTable添加一行,表单其他部分中的各种网格将用新行更新 我的问题是,我应该将用户控件中按钮单击的事件处理程序放在哪里 我可以将事件处理程序代码保留在父窗体中,并在用户控件中使用AddHandler引用父窗体的子窗体 我可以在用户控件中编写所有事件处理程序代码。在这种情况下,我需要访问父窗体以
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-我用一些代码更新了答案,以帮助您处理用户控件中的事件和表单类中引发的事件,希望对您有所帮助。:-)非常感谢你的帮助!如果有时间的话,我还有一个简短的问题:能否使用设计器将绑定源从主窗体共享到用户控件?