我有一个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
而不是代码检查?
答案 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);