I have a CheckedListBox where I want an event after an item is checked so that I can use CheckedItems with the new state.
Since ItemChecked is fired before CheckedItems is updated it won't work out of the box.
What kind of method or event can I use to be notified when the CheckedItems is updated?
I use a Timer to solve this problem. Enable the timer via the ItemCheck event. Take action in the Timer's Tick event.
This works whether the item is checked via a mouse click or by pressing the Space-Bar. We'll take advantage of the fact that the item just checked (or un-checked) is always the Selected Item.
The Timer's Interval can be as low as 1. By the time the Tick event is raised, the new Checked status will be set.
This VB.NET code shows the concept. There are many variations you can employ. You may want to increase the Timer's Interval to allow the user to change the check status on several items before taking action. Then in the Tick event, make a sequential pass of all the Items in the List or use its CheckedItems collection to take appropriate action.
That's why we first disable the Timer in the ItemCheck event. Disable then Enable causes the Interval period to re-start.
Derive from
CheckedListBox
and implementYou can use the
ItemCheck
event, if you also check the new state of the item which is being clicked. This is available in the event args, ase.NewValue
. IfNewValue
is checked, include the current item along with the collection proper in your logic:As another example, to determine if the collection will be empty after this item is (un-)checked:
There are lots of related StackOverflow posts on this... As well as Branimir's solution, here are two more simple ones:
Delayed execution on ItemCheck (also here):
Using the MouseUp event:
I prefer the first option, as the second would result in false positives (i.e. firing too often).
In normal behaviour, when we check one item, the item's check state will change before the event handler is raised. But a CheckListBox has a different behaviour: The event handler is raised before the check state of the item changes and that makes it difficult to correct our jobs.
In my opinion, to solve this problem, we should defer the event handler.
After some tests, I could see that the event SelectedIndexChanged is triggered after the event ItemCheck. Keep the property CheckOnClick True
Best coding