确定CheckedListBox,WinForms的已检查项目数

时间:2015-05-17 18:43:38

标签: c# winforms

在我的WinForms程序中,我有元素 CheckedListBox

我有两个问题:

  1. 如果已经标记为3,则必须禁用标记新字段的功能;
  2. 它不应该像我一样完全禁用元素。如果您检查3个项目,然后取消选中其中一个项目,那么再次,应该可以再一个项目。我完全禁用了CheckedListBox。我不知道怎么做。
  3. enter image description here

    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());
    }
    

3 个答案:

答案 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;”他们之间的按钮。这种情况下,当有太多项目被放置到选定列表时,您可以禁用按钮。