2017-03-21 19 views
1

この質問のタイトルは少し難解でしたが、ここでより明確に説明します。フォームを複数回使用して別のフォームサブルーチンを呼び出す場合

私は注文書と3種類の手数料表を用意しています。それぞれの表に顧客検索フォーム、サプライヤー検索フォーム、商品検索フォームを開くためのボタンがあります。

オーダーフォーム(frmOrder)を例として、顧客検索フォーム(frmCustomerSearch)を開いてみましょう。

私はすべての顧客のリストをロードするためのフォームを作成しました。これにより、ユーザーはリスト内の顧客を見つけたり、名前、コード、カテゴリ別に検索したりできます。

UltraWinGridInfragisticsスイートから結果が表示されます。

行をダブルクリックするとその顧客を選択するために、frmCustomerSearchが閉じ、選択した顧客コードをサブルーチンに渡される場合frmOrder.addCustomerFromSearchは、と呼ばれ、その後、frmOrderは、そのコードを使用して顧客情報を取り込みます。

これは問題なく動作しますが、私はコミッションレート画面に同じfrmCustomerSearchウィンドウを開く必要があります。これにより、ユーザは手数料率に追加する顧客を選択することができます。

私は新しい顧客、サプライヤ、製品検索フォームを各ウィンドウに作成したくありませんが、それぞれに同じフォームを使用する方法を考えるのは苦労しています。

現在、私は、クラスの最上部に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にそれを変更して、再度Public Sub NewByVal frm As Formを使用してみましたが、それはでf.addCustomerFromSearchを探すために形成わからなかったので、そのフォームのサブルーチンが呼び出さすることができませんでした。

はこれですでも可能ですか?うまくいけばそれは理にかなっていますが、説明するのはちょっと混乱します。

答えて

1

あなたはReflectionを使用することができます。

反射はアセンブリ、モジュール、および型を記述する(タイプTypeの)オブジェクトを提供します。リフレクションを使用して、タイプのインスタンスを動的に作成したり、既存のオブジェクトにタイプをバインドしたり、既存のオブジェクトからタイプを取得したり、メソッドを呼び出したり、フィールドやプロパティにアクセスしたりすることができます。コードで属性を使用している場合は、リフレクションによってアクセスできます。詳細については、Attributesを参照してください。

私が行うことは、先頭にPrivate _form As Formと宣言しています。今、私たちは反射を見ることができます_formを持っていることを

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 

:私はそのようにのようなNew方法のためOverloadsを作成します

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 
関連する問題