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有一个名为的字段,如果呼叫来自程序而不是来自用户,则该字段Action等于。TreeViewAction.Unkown

有没有办法检查ListViewItem用户是否正在检查 a 而不是由代码检查?

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 回答