4

我的 Windows 窗体应用程序上有一个 CheckedListBox 控件,它提供了可供选择的项目列表。我想在用户仍在检查它们时计算并仅显示已选中(未选中)的项目。我的意思是当你检查它们时计数。

我曾尝试使用 ItemCheck 事件和 CheckedListBox.CheckedItems.Count 但问题是即使该项目未选中,它也会每隔一次点击计数。当我检查某些东西时,它很重要,如果我再次取消选中它,它也很重要。

我认为这与 MSDN 上给出的评论“直到 ItemCheck 事件发生后检查状态才会更新”有关。我不完全理解这里的问题。

谢谢你。

4

6 回答 6

9

ItemCheckEventArgs 参数具有属性 (NewValue),它告诉您更改是选中、取消选中还是两者都不是。

如果 CheckedItems.Count 直到事件触发后才更新(这是我从该评论中理解的) - 那么您可以添加该计数,并查看 ItemCheckedItems.Count 是选中(+1)还是取消选中(-1 ) 并且您可以获得正确的总数。

(除非我错误地理解了这句话,否则它非常模糊)。

于 2012-10-25T14:48:17.333 回答
7

Haedrian 正确回答了这个问题,但我认为原始代码也有很长的路要走。所以这里是 C# 代码:

private void CheckedListBox_ItemCheck(Object sender, ItemCheckEventArgs e)
{
    int sCount = checkedListBox.CheckedItems.Count;
    if (e.NewValue == CheckState.Checked  ) { ++sCount; }
    if (e.NewValue == CheckState.Unchecked) { --sCount; }
    // now sCount is count of selected items in checkedListBox.
}

我有同样的问题,这个问题和答案给了我解决方案。感谢您的问题和已经存在的答案!

于 2013-11-04T20:23:37.763 回答
3

添加事件处理程序SelectedIndexChanged并从中获取计数CheckedItems.Count

ItemCheck您没有实际值,而是处理最后一次更改之前的值,您需要根据 Haedrian 建议的 EventArgs 调整计数。

于 2012-10-25T14:47:01.703 回答
1

由于我们不会立即在 CheckedItems.Count 中获取更新的值,因此我们使用e.NewValue获取更新的值来获取状态是否为 Checked。

声明一个全局变量来获取计数

int chkListCount = 0;

ItemCheck事件中给出以下代码

private void chkList_ItemCheck(object sender, ItemCheckEventArgs e)
{
     if (e.NewValue == CheckState.Checked)
     {
         chkListCount++;
     }
     else if(e.NewValue == CheckState.Unchecked)
     {
         chkListCount--;
     }
}

它是获取所选项目计数的简单逻辑

于 2014-11-13T09:35:10.790 回答
0

作为初学者,这并不是一件真正明智和聪明的工作,但最终解决了我的问题。

private void CheckedListBox_ItemCheck(Object sender, ItemCheckEventArgs e)
    {
        int count = 0;
        if (e.NewValue.ToString() == "Checked")
        {
            // first get all the checked items
            foreach (object checkeditem in CheckedListBox.CheckedItems)
            {
                string checkItem = CheckedListBox.GetItemCheckState(CheckedListBox.Items.IndexOf(checkeditem)).ToString();
                if (checkItem == "Checked")
                {
                    count = count + 1;
                }
            }
            // Now, below is the most important part considering the remark on MSDN
            // "The check state is not updated until after the ItemCheck event occurs."
            count = count + 1; // Plus 1 as the NewValue was Checked
            labelCount.Text = "You have selected " + count + "Items.";
        }
        else if (e.NewValue.ToString() == "Unchecked")
        {
            // first get all the checked items
            foreach (object checkeditem in CheckedListBox.CheckedItems)
            {
                string checkItem = CheckedListBox.GetItemCheckState(CheckedListBox.Items.IndexOf(checkeditem)).ToString();
                if (checkItem == "Checked")
                {
                    count = count + 1;
                }
            }
            // Now, below is the most important part considering the remark on MSDN
            // "The check state is not updated until after the ItemCheck event occurs."
            count = count - 1; // minus 1 as the NewValue was Unchecked,
            labelCount.Text = "You have Selected " + count + "Items.";
        }
    }  

我非常感谢对此代码的评论。

于 2012-10-25T16:34:00.510 回答
0

我知道很久以前就已经回答了这个问题,但我发现只处理 MouseUp 和 KeyUp 事件更容易。当这些事件被触发时,CheckedItems.Count 属性是准确的。因为他们都做同样的事情,我创建了一个方法来工作,并从两个事件处理程序中调用该方法。

    private void clbFolders_KeyUp(object sender, KeyEventArgs e) { Update(); }
    private void clbFolders_MouseUp(object sender, MouseEventArgs e) { Update(); }

    private void Update()
    {
        btnDelete.Enabled = clbFolders.CheckedItems.Count > 0;
    }
于 2017-02-04T02:06:38.030 回答