4

C# Windows フォームでcheckbox、ユーザーによるクリックによる切り替えと、別のイベントからの更新を区別することは可能ですか?

値と、リストボックス内の項目に関する yes/no 情報を含むlistboxパネルがあります。リストボックス内のアイテムが選択されたら、その情報でcheckboxes更新したい。の 1 つが一意のステータスを表し、 のアイテムの 1 つだけが持つことが許可されているcheckboxes場合に、複雑さが生じます。ユーザーがチェックされていない状態でそれをクリックすると、現在選択されているアイテムのフィールドをtrueに設定し、以前にtrueを保持していたアイテムのフィールドをfalseに設定します。checkboxeslistboxcheckbox

私が理解しているように、CheckedChangedイベントはlistbox選択の変更(checkboxその項目の値の設定)とユーザーのクリックの両方で発生します。それらを分割する方法が必要です。

それ、どうやったら出来るの?

4

2 に答える 2

1

チェックボックスでのクリックイベントの実行順序を示す簡単な例を次に示します。

Private Sub CheckBox1_MouseDown(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CheckBox1.MouseDown
    Dim a As Integer = 1
End Sub

Private Sub CheckBox1_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CheckBox1.CheckedChanged
    Dim a As Integer = 2
End Sub

Private Sub CheckBox1_Clicked(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CheckBox1.Click
    Dim a As Integer = 3
End Sub

Private Sub CheckBox1_MouseClick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CheckBox1.MouseClick
    Dim a As Integer = 4
End Sub

Private Sub CheckBox1_MouseUp(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CheckBox1.MouseUp
    Dim a As Integer = 5
End Sub

各宣言にブレークポイントを設定すると、CheckChanged の前に MouseDown イベントだけが発生することがわかります。つまり、ユーザーがチェックボックスをクリックしたかどうかを確認するには、CheckBox.MouseDown サブでイベントを発生させる必要があります。ユーザーがこのチェックボックスをクリックすると、このイベントが発生することに注意してください。マウスを押したままマウスをドラッグしても、check changed イベントは更新されません。これは、MouseUp サブでフォローアップ イベントを発生させてフラグをクリアする必要があることを意味します。

それを処理する 1 つの方法は次のようになります。

Private blIsUserClick As Boolean

Private Sub CheckBox1_MouseDown(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CheckBox1.MouseDown
    blIsUserClick = True
End Sub

Private Sub CheckBox1_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CheckBox1.CheckedChanged
    If blIsUserClick Then
        'Is a user click event
    Else
        'Not a user click event
    End If
End Sub

Private Sub CheckBox1_MouseUp(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CheckBox1.MouseUp
    blIsUserClick  = False
End Sub
于 2013-09-11T20:04:03.287 に答える
0

私が理解しているように、CheckedChanged イベントは、リストボックスの選択の変更 (その項目のチェックボックスの値の設定) とユーザーのクリックの両方で発生します。それらを分割する方法が必要です。

はい、そうです、状態CheckedChangedを更新するとイベントが発生します(イベントまたはこのようなものが発生したときに行うと思います)。checkBoxListBox.SelectedIndexChanged

必要なのは、CheckBox状態を更新する前にハンドラーを無効にすることです。

private void myListBox_SelectedIndexChanged(object sender, System.EventArgs e)
{
    //disable checkbox event
    mycheckbox.CheckedChanged -= mycheckbox_CheckedChanged;

    //you can change the checkbox state here
    //...

    //Activate event
    mycheckbox.CheckedChanged += myListBox_SelectedIndexChanged;
}

private void mycheckbox_CheckedChanged(object sender, System.EventArgs e)
{
    //(...)
}

別の考えられるパターンは、コードで状態CheckedChangedを更新するときにイベントをリッスンしないようにフラグを使用することです。checkbox

private bool flagactivated = true;

private void myListBox_SelectedIndexChanged(object sender, System.EventArgs e)
{
    //disable checkbox event
    flagactivated = false;

    //Do stuff
    //(...)

    //Activate event
    flagactivated = true;
}

private void mycheckbox_CheckedChanged(object sender, System.EventArgs e)
{
    if (flagactivated) 
    {
        //do stuff
    }
}
于 2013-09-11T19:54:14.393 に答える