ListViewItem由用户检查,而不是由程序检查

时间:2013-04-25 20:14:18

标签: c# .net listview

我有一个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;
            }
        }
    }

基本上第一项是“none”,因此在检查时所有其他项目都将取消选中(反之亦然)。程序偶尔会检查代码中的项目,我认为这会导致问题。我知道TreeViewEventArgs有一个名为Action的字段,如果来自程序而不是来自用户,则该字段等于TreeViewAction.Unkown

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

1 个答案:

答案 0 :(得分: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);