在我的WinForms程序中,我有元素 CheckedListBox 。
我有两个问题:
private static List<Set<Integer>> convert(List<int[]> list) {
return list
.stream()
.map(arr ->
IntStream.of(arr)
.mapToObj(Integer::valueOf)// same as .boxed()
.collect(toSet())
).collect(toList());
}
答案 0 :(得分:3)
如果我理解您的要求,您需要使用此代码处理ItemCheck事件
private void checkListBox_ItemCheck(object sender, ItemCheckEventArgs e)
{
CheckedListBox chk = sender as CheckedListBox;
if(e.NewValue == CheckState.Checked && chk.CheckedItems.Count > 2)
e.NewValue = CheckState.Unchecked;
}
通过这种方式,CheckListBox永远不会被禁用,您可以让用户随意检查和取消选中。但是当您收到ItemCheck事件时,您将验证检查了多少元素,如果已达到限制,只需将NewValue
的{{1}}属性设置为未选中状态。
答案 1 :(得分:1)
目前的答案很简单。这是另一种更为复杂的方法。选中第四个项目时,将取消选中最近最少检查的项目。
LinkedList<int> checkedItemQueue = new LinkedList<int>();
var clb = (CheckedListBox)sender;
if (e.CurrentValue != CheckState.Checked && e.NewValue == CheckState.Checked)
{
checkedItemQueue.AddFirst(e.Index);
while (checkedItemQueue.Count > 3)
{
clb.SetItemChecked(checkedItemQueue.Last.Value, false);
}
}
else if (e.CurrentValue == CheckState.Checked && e.NewValue != CheckState.Checked)
{
var node = checkedItemQueue.Find(e.Index);
if (node != null)
{
checkedItemQueue.Remove(node);
}
}
答案 2 :(得分:0)
您应该使用CheckedItems(https://msdn.microsoft.com/en-us/library/system.windows.forms.checkedlistbox.checkeditems(v=vs.110).aspx)而不是SelectedItems。后者是您选择的项目(彩色)并且与检查无关。
关于您的第二个问题,一个简单的解决方案可能是订阅CheckedListBox.ItemCheck事件(https://msdn.microsoft.com/en-us/library/system.windows.forms.checkedlistbox.itemcheck(v=vs.110).aspx)。您可以在此处使用一些用户友好的消息回滚用户检查。 如果禁用是您要执行的操作,请考虑两个带有“&lt;”的简单ListBox组件和“&gt;”他们之间的按钮。这种情况下,当有太多项目被放置到选定列表时,您可以禁用按钮。