这个问题的标题有点难以言喻,但我会在这里更清楚地解释。
我有一份订单表格和3种不同的佣金率表格,每个表格都有一个用于打开客户搜索表单,供应商搜索表单和产品搜索表单的按钮。
我们使用从订单表单(frmCustomerSearch
)打开的客户搜索表单(frmOrder
)作为示例。
我创建了一个表单,用于加载所有客户的列表,用户可以在列表中找到客户,也可以按类别搜索他们的姓名,代码或搜索。
结果显示在UltraWinGrid
套件的Infragistics
中。
双击行以选择该客户时,frmCustomerSearch
关闭,并调用frmOrder.addCustomerFromSearch
,其中所选客户代码将传递到子例程,然后将填充frmOrder
使用该代码的客户信息。
这没有问题,但是,我需要从3个佣金率屏幕打开相同的frmCustomerSearch
窗口,以便用户再次选择他们添加到佣金率的客户。 / p>
我不想为每个窗口创建新的客户,供应商和产品搜索表单,但我很难弄清楚如何为每个窗口使用相同的表单。
目前我的课程顶部有Dim fOrder As frmOrder
,其次是:
Public Sub New(ByVal conn As OleDb.OleDbConnection, ByVal orderform As frmOrder)
Try
fOrder = orderform
con = conn
InitializeComponent()
Catch ex As Exception
errorLog(ex)
End Try
End Sub
因此,frmOrder
作为orderform
参数传入,这意味着我可以使用以下代码在双击客户时填写订单表单中的客户详细信息。
If fOrder.IsHandleCreated = True Then
fOrder.addCustomerFromSearch(cCode)
Else
MsgBox("Order screen is no longer open, unable to add customer.", MsgBoxStyle.OkOnly, "Error")
End If
如何更改此代码以使我能够以不同的形式传递参数,然后调用该表单上的子例程来填充客户?
我尝试将其更改为Dim f As Form
,然后再次使用ByVal frm As Form
中的Public Sub New
,但之后无法调用该表单的子例程,因为它不知道哪个表单到寻找f.addCustomerFromSearch
in。
这甚至可能吗?希望它有意义,但解释时有点令人困惑,所以道歉。
答案 0 :(得分:1)
您可以使用Reflection:
Reflection提供了描述程序集,模块和类型的对象(类型为Type)。您可以使用反射来动态创建类型的实例,将类型绑定到现有对象,或从现有对象获取类型并调用其方法或访问其字段和属性。如果您在代码中使用属性,则可以使用反射来访问它们。有关详细信息,请参阅Attributes。
我要做的是在顶部声明Private _form As Form
。然后,我会为New
方法创建Overloads,如下所示:
Public Sub New(ByVal conn As OleDb.OleDbConnection, ByVal orderform As frmOrder)
Try
_form = orderform
con = conn
InitializeComponent()
Catch ex As Exception
errorLog(ex)
End Try
End Sub
Public Sub New(ByVal conn As OleDb.OleDbConnection, ByVal customersearchform As frmCustomerSearch)
Try
_form = customersearchform
con = conn
InitializeComponent()
Catch ex As Exception
errorLog(ex)
End Try
End Sub
现在我们有了_form
,我们可以看一下反思:
Dim dynMethod As Reflection.MethodInfo = _form.[GetType]().GetMethod("addCustomerFromSearch")
If dynMethod IsNot Nothing Then
Dim parameters() As Object = {cCode}
dynMethod.Invoke(_form, parameters)
End If
这假设您的addCustomerFromSearch
方法如下所示:
Public Sub addCustomerFromSearch(ByVal code As String)
End Sub