我正在重构一个大文件的现有项目。所有表单控件都以单一形式存在,所有事件处理程序都以后面的代码形式存在。
我正在将一部分UI重构为用户控件。此用户界面的一部分是“添加合同”'按钮。这将转到我的数据层,向DataTable添加一行,并使用新行更新表单其他部分中的各种网格。
我的问题是,我应该在用户控件中将按钮单击的事件处理程序放在哪里?
我可以将事件处理程序代码留在父表单中,并使用用户控件中的AddHandler
来引用父表单的子
我可以在用户控件中编写所有事件处理程序代码。在这种情况下,我需要访问父表单以获取对数据层的引用。
我来自网络背景,我已经习惯了'控制器'处理这类事情。我想我的父母形式正在变成一种控制者 - 但这是一个好习惯吗?我是否应该有一个单独的类来协调用户与模型层的交互,或者,一旦我将所有UI分离到单独的用户控件中,主窗体是否会成为这类事物的好地方?
答案 0 :(得分: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