6

AddHandler イベントへのパラメーターの追加に関する現在の投稿をすべて読みましたが、それらを自分の状況に適用できませんでした。

VB.NET 2008 の MDI プログラムには、複数のモーダル データ エントリ フォームを呼び出して注文をテーブルに追加するモジュール QuickSaleModule があります。これが行われている間、テーブル内のすべての注文を表示するグリッド付きのフォームが開かれます。このフォーム グリッドは注文モジュールとは別に開かれているため、フォームとモジュールはソリューション内の同じプロジェクトの一部ですが、相互に依存していません。注文のグリッドは、SQL クエリから取得されます。

モジュールでは、単純なイベントを定義しました:

パブリック イベント RefreshGrid()

モジュールの特定の時点で、注文を入力して保存した後に発生させます。

RaiseEvent RefreshGrid()

注文グリッド フォームでは、load イベントに次のように表示されます。

AddHandler QuickSaleModule.RefreshGrid, AddressOf RefreshMyGrid

そして、 RefreshMyGrid() ハンドラーの場合、次のものがあります。

Public Sub RefreshMyGrid()
     DoReturnSetup() – a sub in the grid form
     removeHandler QuickSaleModule.RefreshGrid, AddressOf RefreshMyGrid
End Sub

これにより、SQL クエリが呼び出され、グリッドフォームが新しい順序で更新されます。終了する前に、quickSaleModule を介して多数の注文が追加される可能性があるため、新しい注文が入力されるたびにイベントを呼び出します。そのため、クローズされたフォームでハンドラーを削除する意味がありませんでした。ただし、これは私が作成した最初の AddHandler イベントです。

ここに私の質問があります:

  1. 最も重要な。モジュールにある orderID をパラメーターとしてグリッド フォームの RefreshMyGrid ハンドラーに渡すにはどうすればよいですか? グローバル変数を使用できると思いますが、もっと良いものを好むでしょう。イベントの初心者として、イベントを呼び出す他の方法を使用できるようには見えませんでした。グリッド フォームから呼び出されたデータ入力フォームを終了するときに、 with イベント (引数付き) を使用します。しかし、私が言ったように、この場合、関係はありません。

  2. 「removeHandler QuickSaleModule.RefreshGrid、AddressOf RefreshMyGrid」の場所は正しいですか? または、フォームのクローズドイベントにある必要があります。

  3. 最後に、RefreshMyGrid は公開する必要がありますか?

4

1 に答える 1

8

イベントに引数を渡すには、イベントに2 つのパラメーター (sender と event 引数) を渡すという.NETイベント標準に従う必要があります。

使用可能なデータを渡すには、EventArgs から継承する独自のクラスを作成し、これにプロパティを追加する必要があります。

たとえば、引数クラスを次のように定義します。

Public Class RefreshGridEventArgs
    Inherits EventArgs

    Public Property OrderId As Integer

    Public Sub New(wOrderId As Integer)
        MyBase.New()

        Me.OrderId = wOrderId
    End Sub
End Class

次に、イベントを再定義します。

Public Event RefreshGrid(sender As Object, e As RefreshGridEventArgs)

次に、このイベントの発生方法を再定義します。

    ' Replace 1 with the actual order id
    RaiseEvent RefreshGrid(Me, New RefreshGridEventArgs(1))

最後に、イベント ハンドラーでe.OrderId、適切なロジックを実行するために使用します。

追加の質問に答えるには:

2) イベント内のハンドラーを削除すると、イベントが 1 回だけ発生することになりますが、これは通常、必要ではありません (これが理にかなっている場合もありますが、そうではないようです)。フォーム内に含まれているため、フォームが閉じられたときにイベントハンドラーを削除する必要もありませんが、何らかの理由でフォームが実際に閉じられない場合 (何かがぶら下がっている場合) に備えて、削除しても害はありません。どこかへの参照)。

3) RefreshMyGrid は、外部の呼び出し元が呼び出すことが合法でない限り、公開する必要はありません。

于 2013-01-07T02:06:05.417 に答える