Listview的ItemSelectionChanged事件,如何取消/撤销。

4
如果您查看下面的代码。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);
    }

2
为什么你要将它设置为"已选中"?选择它不是已经选中了吗? - paparazzo
我没有设置它选择新选择的项目,如果用户回答“否”则设置它选择先前选择的项目。 - Kieran
这是由于Win32的ListView具有一个私有计时器 - 与编辑项目相关 - 在鼠标选择后触发。 这在过去多次影响了我,我从未成功地解决过它。 - John Arlen
1个回答

0

我以前用过类似的方法,它有效,也许在这种情况下对你有用。我所做的就是设置一个布尔字段来保存一个值,指示此事件是否已处理。如果它没有被处理,该方法将运行并将handled字段设置为true。下一次运行时,它将看到已经处理过了,不会再运行整个方法,并将handled字段设置回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;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接