如果您查看下面的代码。 Listview ItemSelectionChanged事件触发两次,因此我得到两次UserClosedSession对话框。有没有办法抑制第二个对话框?
基本上,当用户点击Listview中的项目时,我正在尝试进行一些验证。当更改所选项目时,会询问他们一个问题,如果是,则继续选择新项目,如果否,则“撤消”选择。下面的代码只是现实世界问题的简单示例。忽略UserClosedSession的内容,它只是用来模仿需要发生的事情。
我尝试了各种各样的方法。尝试鼠标单击/鼠标按下事件。但是如果用户使用键盘更改选择,这些都不好。我也尝试了取消布线,然后重新连接ItemSelectionChangedevent并使其自身(参见注释掉的代码) - 不起作用。
private void lv_ItemSelectionChanged(object sender, ListViewItemSelectionChangedEventArgs e)
{
if (e.IsSelected)
{
Debug.WriteLine("Index: " + lv.SelectedIndices[0].ToString());
if (lv.Tag != null)
{
if ((int)lv.Tag != lv.SelectedIndices[0])
{
if (!UserClosedSession())
{
//lv.ItemSelectionChanged -= new ListViewItemSelectionChangedEventHandler(lv_ItemSelectionChanged);
//lv.ItemSelectionChanged -= lv_ItemSelectionChanged;
lv.Items[(int)lv.Tag].Selected = true;
//lv.ItemSelectionChanged +=new ListViewItemSelectionChangedEventHandler(lv_ItemSelectionChanged);
return;
}
}
}
else
lv.Tag = lv.SelectedIndices[0];
}
}
private bool UserClosedSession()
{
return
(MessageBox.Show("Close Session?", "", MessageBoxButtons.YesNo) == DialogResult.Yes);
}
答案 0 :(得分:0)
我之前使用过这样的东西并且它有效,也许在这种情况下你也会这样。我所做的只是设置一个布尔字段来保存是否有一个值,表明是否已经处理了这个事件。如果尚未处理,则该方法将运行并将handle字段设置为true。下一次,它将看到已经处理过,而不是通过整个方法运行并将处理字段设置为false。仅当事件连续两次触发并且您只想处理第一个事件触发时才会这样。如果你想要第二次活动,我可以帮助你。如果这个事件连续发射两次以上,请告诉我,我也可以找到解决该问题的方法。
bool eventHandled = false;
private void lv_ItemSelectionChanged(object sender, ListViewItemSelectionChangedEventArgs e)
{
if (!eventHandled)
{
eventHandled = true;
if (e.IsSelected)
{
Debug.WriteLine("Index: " + lv.SelectedIndices[0].ToString());
if (lv.Tag != null)
{
if ((int)lv.Tag != lv.SelectedIndices[0])
{
if (!UserClosedSession())
{
//lv.ItemSelectionChanged -= new ListViewItemSelectionChangedEventHandler(lv_ItemSelectionChanged);
//lv.ItemSelectionChanged -= lv_ItemSelectionChanged;
lv.Items[(int)lv.Tag].Selected = true;
//lv.ItemSelectionChanged +=new ListViewItemSelectionChangedEventHandler(lv_ItemSelectionChanged);
return;
}
}
}
else
lv.Tag = lv.SelectedIndices[0];
}
}
else
eventHandled = false;
}