c# - Listview ItemSelectionChanged,如何取消/撤消

标签 c# .net winforms listview

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

最佳答案

我以前用过类似的东西并且很有效,也许在这种情况下它也适合你。我所做的只是设置一个 bool 字段来保存一个值是否指示此事件是否已被处理。如果还没有被处理,该方法将运行通过并将 handled 字段设置为 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;
}

关于c# - Listview ItemSelectionChanged,如何取消/撤消,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14610481/

相关文章:

c# - 使用数据注释限制 DateTime 值

c# - Asp.Net CheckBoxList ListItem CssClass 由 aspNetDisabled 覆盖

c# - 为什么此 Regex 在 .NET 中不起作用?

c# - 从子窗体 winform C# 修改父控件

c# - 如何更改winform中文本框的只读属性false?

c# - 在asp.net中提交后显示错误的正确方法是什么?

c# - 如何在Windows Azure中有效扩展?

c# - 取回匿名类型

.net - .NET 中的 WinHttp.WinHttpRequest

c# - 当 DataGridView 为空时显示文本