【问题标题】:How to track checks in checkedListBox C#?如何跟踪checkedListBox C#中的检查?
【发布时间】:2013-03-09 11:35:49
【问题描述】:

我尝试在checkedListBox中显示选中项的数量:checkedListBox1.CheckedIndices.Count 但是,如果我想在标签上显示它,我该如何更新我的计数?我尝试在 ItemCheck 事件中写入所有内容:

private void checkedListBox1_ItemCheck(object sender, ItemCheckEventArgs e)
    {            
        label1.Text= checkedListBox1.CheckedIndices.Count;
    }

但即使我取消选中该项目,计数也会增加:( 如有任何帮助,我将不胜感激!

【问题讨论】:

    标签: c# .net winforms checkedlistbox


    【解决方案1】:

    documentation for CheckedListBox.ItemCheck 事件表明:

    直到 ItemCheck 事件发生后才会更新检查状态。

    所以当事件被调用时,CheckedIndices.Count 还没有更新。为了克服这个问题,你必须继承CheckedListBox 类并在CheckedListBox.ItemCheck 事件之后触发一个新事件

    public class MyCheckedListBox : CheckedListBox
    {
        public event ItemCheckEventHandler ItemCheckedChanged;
        protected virtual void OnItemCheckedChanged(ItemCheckEventArgs ice)
        {
            var h = ItemCheckedChanged;
            if (h != null)
                h(this, ice);
        }
    
        protected override void OnItemCheck(ItemCheckEventArgs ice)
        {
            base.OnItemCheck(ice);
    
            ThreadPool.QueueUserWorkItem(new WaitCallback((state) =>
                {
                    this.BeginInvoke(new Action<ItemCheckEventArgs>(OnItemCheckedChanged), ice);
                }));
        }
    

    不,您有一个可以订阅的 ItemCheckedChanged 事件。

    其实没有必要子类化。这可以在表单本身中完成,但这样更简洁。

    它是如何工作的?

    ItemCheck 事件在SetItemCheckState 方法内调用。此方法在调用事件 (OnItemCheck) 之后 更改项目的检查状态。还调用SetItemCheck 是传递到应用程序消息队列的Windows 消息的结果。我们希望在处理完这条消息之后触发我们的消息,所以我们必须向队列中发布一条新消息,以便在这条消息之后处理我们的消息。 BeginInvoke 方法实际上将消息发布到消息队列中,但前提是从另一个线程调用。这就是为什么我在一个新的线程形式线程池中调用BeginInvoke

    另一种解决方案是注册一条消息并手动将其发布到消息队列中,但这将需要更多代码!

    【讨论】:

      【解决方案2】:

      根据e.NewValue==CheckState.Checked加一或减一

      【讨论】:

      • 它不会给出错误,但它也不起作用...与CheckedIndices 的行为相同。当我们检查计数时,计数没有更新..
      • 加一或减一取决于e.NewValue==CheckState.Checked
      • 谢谢,它有效! if (e.NewValue == CheckState.Checked) 检查++; else if (e.NewValue == CheckState.Unchecked) 检查--;
      • 太棒了!简单最好!但答案在 cmets,而不是答案本身!请编辑答案并提出正确的解决方案。
      • 修复答案本身,因为目前它根本不回答问题。
      【解决方案3】:

      不如做以下事情:

      int checkedcount = 0;
      foreach(var item in checkedListBox1.CheckedItems){
         if(checkedListBox1.GetItemCheckState(checkedListBox1.Items.IndexOf(item) == System.Windows.Forms.CheckState.Checked)
            checkedcount++;
      }
      

      更多参考请看here

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-10-21
        • 2011-04-06
        • 2019-07-16
        • 1970-01-01
        相关资源
        最近更新 更多