如何跟踪checkedListBox C#中的检查?

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

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

但计数增加,即使我取消选中项目:(我会很感激任何帮助!


只需添加一个或减去一个取决于e.NewValue==CheckState.Checked


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方法内部SetItemCheckState 。 此方法在调用事件( OnItemCheck )后更改该项目的检查状态。 还调用SetItemCheck是传递给应用程序的消息队列的Windows消息的结果。 我们希望在处理此消息后触发消息,因此我们必须将新消息发布到队列中,以便在消息之后处理消息。 BeginInvoke方法实际上是将消息发布到消息队列中,但只有在从另一个线程调用时才会这样。 这就是为什么我以新的线程形式调用BeginInvoke线程池的原因。

对此的另一个解决方案可能是注册一条消息并将其手动发布到消息队列中,但那会是更多的代码!


而是做以下事情:

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

进一步参考看看这里。

链接地址: http://www.djcxy.com/p/69911.html

上一篇: How to track checks in checkedListBox C#?

下一篇: Resolve Substitutions in RestructuredText