首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >单击相同选择时通过MouseClick切换MouseClick项的检查状态时的奇怪行为

单击相同选择时通过MouseClick切换MouseClick项的检查状态时的奇怪行为
EN

Stack Overflow用户
提问于 2010-11-03 02:07:55
回答 1查看 9.3K关注 0票数 24

当使用鼠标单击时,WinForms CheckedListBox控件有2种默认行为:

  1. 为了检查/取消选中一个项目,您需要单击一项两次。第一次单击选择项目,第二次切换检查状态。
  2. 此外,随后单击同一项将切换该项的选中状态。

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

我的解决办法是,如果用户重复选择相同的项,则调用两次切换逻辑。关于我的问题:

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

奇怪的是,调试代码显示,检查状态已经改变,但在调用两次之前,它不会出现在UI端。我认为这可能与线程有关,但可能需要使用BeginInvoke才能触发重入事件。

这是我的密码:

代码语言:javascript
复制
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. 选择当前项后,再次单击它-状态不会更改。预期:未检查的。点击它几次,它终于切换了。

感谢您的阅读!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-11-03 03:22:52

作为一个方便的特性,我需要允许用户在一次单击中切换所选内容。

我不确定代码发生了什么变化,但是将CheckOnClick设置为true可以做到这一点:

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

票数 49
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4083703

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档