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_Forms_Parameters - Fatal编程技术网

Vb.net 多次使用表单,其中调用另一个表单子例程

Vb.net 多次使用表单,其中调用另一个表单子例程,vb.net,forms,parameters,Vb.net,Forms,Parameters,这个问题的标题有点难以表达,但我会在这里更清楚地解释 我有一个订单表单和3个不同的佣金率表单,每个表单都有一个按钮,用于打开客户搜索表单、供应商搜索表单和产品搜索表单 我们以从订单(frmOrder)打开的客户搜索表单(frmCustomerSearch)为例 我创建了一个表单,用于加载所有客户的列表,用户可以在列表中找到客户,或者搜索他们的姓名、代码或按类别搜索 结果显示在Infragistics套件的UltraWinGrid中 双击一行选择该客户时,frmCustomerSearch关闭,并

这个问题的标题有点难以表达,但我会在这里更清楚地解释

我有一个订单表单和3个不同的佣金率表单,每个表单都有一个按钮,用于打开客户搜索表单、供应商搜索表单和产品搜索表单

我们以从订单(
frmOrder
)打开的客户搜索表单(
frmCustomerSearch
)为例

我创建了一个表单,用于加载所有客户的列表,用户可以在列表中找到客户,或者搜索他们的姓名、代码或按类别搜索

结果显示在
Infragistics
套件的
UltraWinGrid

双击一行选择该客户时,
frmCustomerSearch
关闭,并调用
frmOrder.addCustomerFromSearch
,将所选客户代码传递到子例程中,然后
frmOrder
将使用该代码填充客户信息

这没有问题,但是,我需要从3个佣金率屏幕打开相同的
frmCustomerSearch
窗口,以便用户再次选择要添加到佣金率中的客户

我不想为每个窗口创建一个新的客户、供应商和产品搜索表单,但我正在努力解决如何为每个窗口使用相同的表单

目前,我已将Dim fOrder作为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
,然后在
Public Sub New
中再次使用
ByVal frm As Form
,但无法调用该表单的子例程,因为它不知道在中查找
f.addCustomerFromSearch
的表单

这可能吗?希望这是有道理的,不过解释起来有点混乱,所以道歉。

您可以使用:

反射提供描述程序集、模块和类型的对象(类型)。可以使用反射动态创建类型实例、将类型绑定到现有对象、从现有对象获取类型并调用其方法或访问其字段和属性。如果您在代码中使用属性,反射使您能够访问它们。有关详细信息,请参阅

我要做的是将
Private\u表单声明为顶部的表单
。然后,我将为
新的
方法创建如下内容:

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
现在我们有了
\u表单
,我们可以看看反射:

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