温弗斯
CheckedListBox
控件在用鼠标单击时有两个默认行为:
-
-
此外,单击一次
将切换该项的选中状态。
为了方便起见,我需要允许用户在一次单击中切换选择。我已经实现了这一点,所以现在只需单击一次就可以实现上面的默认行为1。问题是,当单击同一个(即当前选定的)项时,行为2不再正确工作。它可以很好地在项目之间跳转,这是需要的,但它需要在同一个项目上最多4次单击。
两次
如果用户重复选择同一项。我的问题是:
-
这行得通,但为什么?真正的根本问题是什么?
-
有没有更好的方法来实现这一点,这样我就可以让它像默认行为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));
}
}
}
-
单击索引2处的项-状态更改为
选中的
.
-
. 点击几次,它终于切换了。
谢谢你的阅读!