【问题标题】:Cancelling ListBox SelectedIndexChange Event取消 ListBox SelectedIndexChange 事件
【发布时间】:2010-03-31 20:26:09
【问题描述】:

是否可以取消 Winforms 应用程序上列表框的 SelectedIndexChange 事件?这似乎是一件合乎逻辑的事情,以至于我必须忽略一些简单的功能。基本上,我一直在弹出一个消息框,询问用户是否真的想要移动到另一个项目,因为这会改变 UI,我不希望他们的更改丢失。如果用户没有保存他们正在处理的内容,我希望能够取消该事件。有更好的方法吗?

【问题讨论】:

标签: c# winforms events listbox


【解决方案1】:

你不能取消它。

几天前我所做的是使用最新选择的索引创建一个变量。然后当事件触发时,您询问用户是否要保存,这是在事件处理程序中完成的。如果用户选择“取消”,您将再次更改 id。

问题是这会使事件再次触发。所以我使用的是一个布尔值,只是说“抑制”。在事件处理程序的顶部,我有:

if(Inhibit)
   return;

然后在你问问题的地方下面你做这样的事情:

DialogResult result = MessageBox.Show("yadadadad", yadada cancel etc);
if(result == DialogResult.Cancel){
   Inhibit = true; //Make sure that the event does not fire again
   list.SelectedIndex = LastSelectedIndex; //your variable
   Inhibit = false; //Enable the event again
}
LastSelectedIndex = list.SelectedIndex; // Save latest index.

【讨论】:

  • 对此略有不同,我在阅读此答案后发现 - 您可以删除事件处理程序而不是使用 Inhibit 标志:list.SelectedIndexChanged -= list_SelectedIndexChanged; list.SelectedIndex = LastSelectedIndex; list.SelectedIndexChanged += list_SelectedIndexChanged; 可能有一些原因表明这是一种劣质方法,但是非常适合我的目的。
  • @J Jones 如果你做了两次负数会发生什么?不确定这是否会引发异常?
  • @OskarKjellin 你不会做两次,因为这是在函数内部。该函数永远不会被再次调用,直到您稍后将其添加回来。
【解决方案2】:

这正是@Oskar Kjellin 的方法,但有一点不同。也就是说,减少一个变量,并且具有一个选定的索引更改事件,它的行为实际上就像一个选定的索引更改事件。我经常想知道为什么即使我单击完全相同的选定项目也会触发选定索引更改事件。这里没有。是的,这是一个偏差,所以要加倍确定你是否希望它在那里。

    int _selIndex = -1;
    private void listBox1_SelectedIndexChanged(object sender, EventArgs e)
    {
        if (listBox1.SelectedIndex == _selIndex)
            return;

        if (MessageBox.Show("") == DialogResult.Cancel)
        {
            listBox1.SelectedIndex = _selIndex;
            return;
        }

        _selIndex = listBox1.SelectedIndex;
        // and the remaining part of the code, what needs to happen when selected index changed happens
    }

【讨论】:

    【解决方案3】:

    我刚刚遇到了这个确切的问题。我所做的是当用户进行更改时,我设置 ListBox.Enabled = false;这不允许他们选择不同的索引。一旦他们保存或放弃他们的更改,我设置 ListBox.Enabled = true;可能不如提示那么流畅,但它可以完成工作。

    【讨论】:

    • 这太棒了。每当我开始担心跟踪当前索引或跟踪某些 Inhibit 布尔值的私有成员变量时,我开始思考:如何避免添加这个额外的逻辑层?禁用 ListBox 可以解决这个问题。
    【解决方案4】:

    更优雅,使用 Tag 属性:

            if ((int)comboBox.Tag == comboBox.SelectedIndex)
            {
                // Do Nothing
            }
            else
            {
                if (MessageBox.Show("") == DialogResult.Cancel)
                {
                    comboBox.SelectedIndex = (int)comboBox.Tag;
                }
                else
                {
                    // Reset the Tag
                    comboBox.Tag = comboBox.SelectedIndex;
    
                    // Do what you have to
                }
            }
    

    【讨论】:

    • 太棒了。简单、直接且无错误。
    【解决方案5】:

    SelectedIndexChanged 无法取消。所以你只有一个真正的选择:

    private int? currentIndex;
    public void ListBox_SelectedIndexChanged(sender, EventArgs args) {
        if (currentIndex.HasValue && currentIndex.Value != listBox1.SelectedIndex) {
            var res = MessageBox.Show("Do you want to cancel edits?", "Cancel Edits", MessageBoxButtons.YesNo);
            if (res == DialogResult.Yes) {
                currentIndex = (listBox1.SelectedIndex == -1 ? null : (int?) listBox1.SelectedIndex);
            } else {
                listBox1.SelectedIndex = currentIndex.Value;
            }
        }
    }
    

    【讨论】:

      【解决方案6】:

      这是我为 ComboBox 取消 SelectionChange 的方法。我认为它也适合 ListBox。

      private bool comboBox_CancelSelection = false;
      private int comboBox_LastSelectedIndex = -1;
      
      private void comboBox_SelectedIndexChanged(object sender, EventArgs e) {
          if (comboBox_CancelSelection) {
              comboBox_CancelSelection = false;
              return ;
          }
      
          // Handle Event
      
          if (!comoBox_CancelSelection) {
              comboBox_LastSelectedIndex = comboBox.SelectedIndex; 
          } else {
              comboBox.SelectedIndex = comboBox_LastSelectedIndex;
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-11-27
        • 1970-01-01
        • 1970-01-01
        • 2012-11-16
        • 1970-01-01
        • 2010-10-23
        相关资源
        最近更新 更多