1

コンボに DataSource を設定するときに少し問題があります。

コンボとデフォルト項目で渡すヘルパー メソッドがあります。

このメソッド内で、SelectionChanged イベントを発生させるコンボの DataSource が設定されます。その後、Selectionchanged イベントはこのヘルパー メソッドを再度呼び出して、最初のコンボから選択された ID に基づいて別のコンボの DataSource を設定できるようにします。このプロセスは、さらに 6 つのコンボに対して繰り返され、新しいデータを取得するためにデータベースへの呼び出しが行われるたびに行われます。

このメソッド内で DataSource を設定した後、defaultItem で渡されたコンボの SelectedValue を設定します。これにより、チェーンが再び開始され、もちろんすべてのデータベース呼び出しが開始されます。

これを回避する最善の方法は何ですか?

SelectionChangeCommitted イベントを使用してみましたが、これはチェーンを開始しません。

前もって感謝します。

私はC#.Net 4.0を使用しています

4

4 に答える 4

1

次のコードを使用して、コンボボックスのSelectionChangedイベントの原因を、データ(DataSource = ...)と実際の選択の変更をロードすることで区別しました。

    private void comboBoxSomeList_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {

        // Ignore changes that are made during initialization
        if (e.AddedItems.Count != e.RemovedItems.Count)
            return;
        ...

これが特定のケースで機能するかどうかは100%確信できませんが、確認は非常に簡単です。

于 2012-05-31T11:21:51.273 に答える
0

私が Microsoft から見た例では、データの読み込みが完了した後にのみ、selection changed イベントをフックすることでこれを処理しています。そのため、デザイナーを使用してイベントをフックする代わりに、自分で処理します。

于 2012-08-10T19:36:29.893 に答える
0

それは最もきれいではありませんが、私は通常、クラスで何らかの種類の manualSelectionChangeInProgress メンバー フィールドを設定することでこれに対処しているので、SelectedValue を設定する前に true に設定し、後で false に設定し、開始する前にフィールド値をチェックします。回避しようとしているデータソース プロセス全体。

于 2012-05-30T13:17:09.950 に答える
0

渡された defaultItem を使用してコンボの SelectedValue を設定する前に、イベント ハンドラーのフックを解除してから、再度フックしてみてください。綺麗じゃないけど…

編集:

以下のコメントから、6つのコンボに同じヘルパーメソッドを使用しているため、毎回どのコンボを扱っているかがわからないため、イベントをフック/アンフックできないことがわかります。そうですよね、最初は気付きませんよね。

私はあなたの質問を読み直しましたが、「SelectionChangeCommited を使用してもチェーンが開始されない」という最初に見逃したことに気付きました。そうです、SelecttionChangeCommited は、ユーザーがコンボの選択を変更したときにのみ発生します。

要約すると、コンボ dataSource が変更されたとき (ただし、デフォルト値が設定されているときではない)、およびユーザーがコンボの選択された値の 1 つを変更したとき (チェーンが開始されるとき) に、ヘルパー メソッド内から変更を開始する必要があります。そのコンボ以降)。ヘルパー メソッドを保持し、OnDataSourceChanged (dataSource が変更されたときにヘルパー メソッド内からチェーンをトリガーするため) と OnSelectionChangeCommitted (ユーザーが選択を変更したときにチェーンをトリガーするため) の組み合わせを使用できると思います。コンボごとに 2 つのハンドルを記述する必要さえありません。これは、両方のイベントが同じシグネチャを持っているため、同じメソッドにフックできるからです。つまり、各コンボの SelectionChanged に現在フックされているメソッドは、SelectionChangeCommited と DataSourceChanged の両方にフックされる可能性があります。お役に立てれば。

于 2012-05-30T13:46:01.157 に答える