0

メソッドの 1 つのアドレスに多くのハンドラを設定しようとしています。たとえば、すべてのハンドラーが設定されると、次のコードを記述するのと同じになります。

Private Sub ModificationsMade(sender As Object, e As System.EventArgs) Handles Analyse_tbCurrentDescription.TextChanged, Analyse_tbNewDescription.TextChanged, Analyse_tbTimeTests.TextChanged, Analyse_tbTimeInstallation.TextChanged, Analyse_tbTimeMaintenance.TextChanged, Analyse_nupCurrentAmount.ValueChanged, Analyse_nupNewAmount.ValueChanged, Analyse_cbCurrentTime.SelectedIndexChanged, Analyse_cbCurrentOccurence.SelectedIndexChanged, Analyse_cbNewTime.SelectedIndexChanged, Analyse_cbProgrammer.SelectedIndexChanged, Analyse_dgvTasks.CellValueChanged
    Analyse_Saved = False
End Sub

私のAnalyse_Saved変数は、変更されたリストビュー項目で使用されています。それが本当なら、すでに保存されているので、何も保存する必要はありません。ただし、それが誤りである場合は、変更が行われたので、アイテムを変更する前にユーザーに情報を保存するように求める必要があります。

ご覧のとおり、変更の場合にそれぞれのイベントによって処理される多くのコントロールがあります。これにより、フォームでアイテムが変更された場合にユーザーに通知できます。

唯一の問題は、ユーザーがリストビューの項目を変更すると、テキスト ボックス、コンボ ボックスなどに情報が入力されるため、これらすべてのイベントがトリガーされることです。このため、それに応じてハンドラーを追加および削除します。

残念ながら、次のように各コントロールを処理するための行を追加したくありません。

AddHandler Analyse_tbCurrentDescription.TextChanged, AddressOf ModificationsMade

私の質問は、複数のハンドラーを 1 つのアドレス宛先に追加する最も簡単な方法は何ですか?

4

3 に答える 3

2

コントロールごとに次の行を追加する必要があります。

AddHandler Analyse_tbCurrentDescription.TextChanged, AddressOf ModificationsMade

または、コントロールをループし (共通の親など、コントロールをループにグループ化する基準が見つかった場合)、ループ内で同じ行を実行します。

ただし、代わりに行うべきことは、UI からビジネス ロジック レイヤーを分離することです。その後、この問題はありません。

編集:更新に関して、ビジネスロジックオブジェクトがDataRowの場合、バージョンがあるため、現在のバージョンと古いバージョンを比較できます。ユーザーが A -> B を変更し、次に B -> A を変更する場合、使用RowStateは適切でない場合があります。このような例では、実際には変更を登録しないでRowStateくださいModified。使用すると、アプローチAnalyse_Saved = Falseと同様に、常に変更が登録されます。RowState

于 2013-05-31T14:43:09.657 に答える
1

簡単な代替ソリューションは、2 つの関数を宣言することです。1 つの関数ですべてのコントロールにハンドラーを追加します (つまり、AddHandlers())。もう 1 つの関数は、すべてのコントロールからハンドラーを削除します (つまり、RemoveHandlers())。

そのため、RemoveHandlers() を呼び出し、必要な処理を行ってから AddHandlers() を実行するだけです。

于 2013-05-31T14:42:55.460 に答える
1

唯一の問題は、ユーザーがリストビューの項目を変更すると、テキスト ボックス、コンボ ボックスなどに情報が入力されるため、これらすべてのイベントがトリガーされることです。このため、それに応じてハンドラーを追加および削除します。

この問題、およびフォームの読み込みなどでイベントをトリガーするのを防ぐという関連する問題は、イベントに何かをさせたい場合にのみ true に設定される、たとえば EventsArmed というブール値によって一般的に処理されます。次に、そのブール値 (If EventsArmed then . . ) を「フォームが汚れている」コードの一部としてチェックします。

于 2013-05-31T15:47:53.820 に答える