代码之家  ›  专栏  ›  技术社区  ›  Ahmad Mageed

通过鼠标单击同一选定内容切换选中列表框项的选中状态时的奇怪行为

  •  24
  • Ahmad Mageed  · 技术社区  · 14 年前

    温弗斯 CheckedListBox 控件在用鼠标单击时有两个默认行为:

    1. 此外,单击一次 将切换该项的选中状态。

    为了方便起见,我需要允许用户在一次单击中切换选择。我已经实现了这一点,所以现在只需单击一次就可以实现上面的默认行为1。问题是,当单击同一个(即当前选定的)项时,行为2不再正确工作。它可以很好地在项目之间跳转,这是需要的,但它需要在同一个项目上最多4次单击。

    两次 如果用户重复选择同一项。我的问题是:

    1. 这行得通,但为什么?真正的根本问题是什么?
    2. 有没有更好的方法来实现这一点,这样我就可以让它像默认行为2一样工作,而不必调用方法两次并跟踪我最后的选择?

    BeginInvoke 用法。

    这是我的代码:

    using System.Linq;
    using System.Windows.Forms;
    
    namespace ToggleCheckedListBoxSelection
    {
        public partial class Form1 : Form
        {
            // default value of -1 since first item index is always 0
            private int lastIndex = -1;
    
            public Form1()
            {
                InitializeComponent();
                CheckedListBox clb = new CheckedListBox();
                clb.Items.AddRange(Enumerable.Range(1, 10).Cast<object>().ToArray());
                clb.MouseClick += clb_MouseClick;
                this.Controls.Add(clb);
            }
    
            private void clb_MouseClick(object sender, MouseEventArgs e)
            {
                var clb = (CheckedListBox)sender;
                Toggle(clb);
    
                // call toggle method again if user is trying to toggle the same item they were last on
                // this solves the issue where calling it once leaves it unchecked
                // comment these 2 lines out to reproduce issue (use a single click, not a double click)
                if (lastIndex == clb.SelectedIndex)
                    Toggle(clb);
    
                lastIndex = clb.SelectedIndex;
            }
    
            private void Toggle(CheckedListBox clb)
            {
                clb.SetItemChecked(clb.SelectedIndex, !clb.GetItemChecked(clb.SelectedIndex));
            }
        }
    }
    

    1. 单击索引2处的项-状态更改为 选中的 .
    2. . 点击几次,它终于切换了。

    谢谢你的阅读!

    1 回复  |  直到 14 年前
        1
  •  49
  •   Jeff Ogata    14 年前

    为了方便起见,我需要允许用户在一次单击中切换选择。

    我不知道代码是怎么回事,但是设置 CheckOnClick true

    CheckOnClick指示每当选择一个项目时是否应切换该复选框。默认行为是在第一次单击时更改选择,然后让用户再次单击以应用复选标记。但是,在某些情况下,您可能希望在单击项目时立即对其进行检查。