0

winforms にコンボボックスがあり、選択した内容に応じて、他のコンボボックスに入力される内容が決まります。データビューを使用して最初のコンボボックスを埋めました:

combobox_process.DataSource = dataview
combobox_process.DisplayMember = "UserDefine1"
combobox_process.SelectedIndex = -1

これらの行のすべてが SelectedIndexChanged イベントをスローすることを除いて、これは正常に機能します。次のコンボボックスに入力する関数はそのイベントをリッスンするため、3 回実行されます。同僚に尋ねたところ、データをループしてすべて手動で文字列として追加することを提案されましたが、できればデータバインディングに固執したいと思います。特に、将来、データバインディングでしかできないことをする必要がある場合。

何かご意見は?おそらく、このコードの一部でそのイベントを無効にする方法はありますか?

4

2 に答える 2

3

望ましくないときにイベントが発生することは、Windows フォームでよくある問題です。SelectedIndexChanged は典型的な例です。私がよく使用する 1 つの方法は、コードの一部を実行するときに設定されるフラグを宣言することです。このフラグは、リッスンする必要がないときにイベントを発生させることがわかっています。

例:

Public Class Form1
    Private m_IsSettingDataSource As Boolean = False

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        Try
            Me.m_IsSettingDataSource = True
            combobox_process.DataSource = DataView
            combobox_process.DisplayMember = "UserDefine1"
            combobox_process.SelectedIndex = -1
        Catch
            Throw
        Finally
            Me.m_IsSettingDataSource = False
        End Try
    End Sub

    Private Sub combobox_process_SelectedIndexChanged(sender As Object, e As EventArgs) Handles combobox_process.SelectedIndexChanged
        If Not Me.m_IsSettingDataSource Then
            ' Do what you want to do when not setting data source
        End If
    End Sub
End Class

これを行うか、ジョンが言ったように、イベント ハンドラーをオフにしてからオンにすることができます。2 つ以上のイベント ハンドラーが影響を受けることがわかっている場合は、フラグ アプローチの方が適している場合があります。

于 2012-06-14T22:02:35.123 に答える
1

呼び出しを行う前にイベント ハンドラーのバインドを解除し、呼び出しが完了したときに再度バインドすることができます。

于 2012-06-14T16:29:51.053 に答える