1

以下のようにListView、さまざまなアイテムとItemCheckハンドラーを備えています。

private void ListView1_ItemCheck(object sender, ItemCheckEventArgs e)
    {
       if (e.NewValue == System.Windows.Forms.CheckState.Checked)
        {
            if (e.Index == 0)
            {
                ListView1.Items[1].Checked = false;
                ListView1.Items[2].Checked = false;
                ListView1.Items[3].Checked = false;
                ListView1.Items[4].Checked = false;
                ListView1.Items[5].Checked = false;
                ListView1.Items[6].Checked = false;
                ListView1.Items[7].Checked = false;
            }
            else
            {
                ListView1.Items[0].Checked = false;
            }
        }
    }

基本的に最初の項目は「なし」なので、それをチェックすると、他のすべての項目がチェックされなくなります (逆も同様です)。時折、プログラムがコード内の項目をチェックしますが、これが問題を引き起こしていると思います。私は、呼び出しがユーザーからではなくプログラムから来ている場合と等しいTreeViewEventArgsというフィールドがあることを知っています。ActionTreeViewAction.Unkown

ListViewItemコードによってチェックされるのではなく、ユーザーによってチェックされているかどうかを確認する方法はありますか?

4

1 に答える 1

2

イベント引数から判断する方法がないため、自分でコードを作成します。次のようなものです。

        private bool raisedFromCode;

    private void button2_Click(object sender, EventArgs e)
    {
        raisedFromCode = true;
        listView1.Items[1].Checked = !listView1.Items[1].Checked;
        raisedFromCode = false;
    }

    private void listView1_ItemCheck(object sender, ItemCheckEventArgs args)
    {

        if (!raisedFromCode)
            MessageBox.Show("User checked");

    }

または、コードを使用してチェック状態を変更したときにロジックを起動させたくない場合は、イベント ハンドラーからサブスクライブを解除できます。

        listView1.ItemCheck -= new ItemCheckEventHandler(this.listView1_ItemCheck);
        listView1.Items[1].Checked = false;
        listView1.ItemCheck += new ItemCheckEventHandler(this.listView1_ItemCheck);
于 2013-04-26T11:42:15.980 に答える