【问题标题】:Listview ItemSelectionChanged, How to cancel / undoListview ItemSelectionChanged,如何取消/撤消
【发布时间】:2023-03-24 01:09:01
【问题描述】:

如果您查看下面的代码。 Listview ItemSelectionChanged 事件触发两次,因此我获得了两次 UserClosedSession 对话框。有没有办法抑制第二个对话框?

基本上,当用户单击 Listview 中的项目时,我会尝试进行一些验证。更改所选项目时,他们会被问到一个问题,如果是,则继续选择新项目,如果不是,则“撤消”选择。下面的代码只是现实世界问题的一个简单示例。忽略 UserClosedSession 的内容,这里只是用来模拟需要发生的事情。

我已经尝试了各种方法。尝试了鼠标单击/鼠标按下事件。但是,如果用户使用键盘更改选择,这些都不好。我也尝试过取消连线,然后从 withing 自身重新连线 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);
    }

【问题讨论】:

  • 为什么将其设置为已选择。不会选择它会选择它。
  • Blam,我没有将其设置为选择新选择的项目,如果用户对对话框回答“否”,我将其设置为选择先前选择的项目。
  • 这是由于 Win32 的 ListView 有一个私有计时器 - 与编辑项目相关 - 在鼠标选择后触发。它过去曾多次影响我,但我从未成功解决过它。

标签: c# .net winforms listview


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2021-06-01
    • 2014-04-12
    • 2017-01-09
    • 1970-01-01
    • 1970-01-01
    • 2019-12-11
    • 2014-11-06
    • 1970-01-01
    • 2018-10-25
    相关资源
    最近更新 更多