Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Manage CheckedListBox ItemCheck event to run after an item checked not before

I am using CheckedListBox in C# Window Forms Application.

I want to do something after one item checked or unchecked but ItemCheck event runs before the item checked/unchecked . How can I do that?

like image 629
mosyflasher Avatar asked Aug 29 '15 22:08

mosyflasher


2 Answers

CheckedListBox.ItemCheck Event

The check state is not updated until after the ItemCheck event occurs.

To run some codes after the item checked, you should use a workaround.

Best Option

You can use this option (Thanks to Hans Passant for this post):

private void checkedListBox1_ItemCheck(object sender, ItemCheckEventArgs e)
{
    this.BeginInvoke(new Action(() =>
    {
        //Do the after check tasks here
    }));
}

Another option

  • If in middle of ItemCheck Event, you need to know state of item, you should use e.NewValue instead of using checkedListBox1.GetItemChecked(i)

  • If you need to pass a list of checked indices to a method do this:

Using the code:

var checkedIndices = this.checkedListBox1.CheckedIndices.Cast<int>().ToList();
if (e.NewValue == CheckState.Checked)
    checkedIndices.Add(e.Index);
else
    if(checkedIndices.Contains(e.Index))
        checkedIndices.Remove(e.Index);

 //now you can do what you need to checkedIndices
 //Here if after check but you should use the local variable checkedIndices 
 //to find checked indices

Another Option

In middle of ItemCheck event, remove handler of ItemCheck, SetItemCheckState and then add handler egain.

private void checkedListBox1_ItemCheck(object sender, ItemCheckEventArgs e)
{
    var control = (CheckedListBox)sender;
    // Remove handler
    control.ItemCheck -= checkedListBox_ItemCheck;

    control.SetItemCheckState(e.Index, e.NewValue);

    // Add handler again
    control.ItemCheck += checkedListBox_ItemCheck;

    //Here is After Check, do additional stuff here      
}
like image 104
Reza Aghaei Avatar answered Nov 15 '22 00:11

Reza Aghaei


Try searching more for answers, cause here it is

    private void clbOrg_ItemCheck(object sender, ItemCheckEventArgs e)
{
    CheckedListBox clb = (CheckedListBox)sender;
    // Switch off event handler
    clb.ItemCheck -= clbOrg_ItemCheck;
    clb.SetItemCheckState(e.Index, e.NewValue);
    // Switch on event handler
    clb.ItemCheck += clbOrg_ItemCheck;

    // Now you can go further
    CallExternalRoutine();        
}

And the link: Which CheckedListBox event triggers after a item is checked?

like image 27
Darko Avatar answered Nov 15 '22 00:11

Darko