115 votes

Quel événement CheckedListBox se déclenche après la vérification d'un élément?

J'ai un CheckedListBox dans lequel je veux un événement après la vérification d'un élément afin de pouvoir utiliser CheckedItems avec le nouvel état.

Etant donné que ItemChecked est déclenché avant la mise à jour de CheckedItems, cela ne fonctionnera pas immédiatement.

Quel type de méthode ou d'événement puis-je utiliser pour être averti lorsque les CheckedItems sont mis à jour?

101voto

Branimir Points 1971

Vous pouvez utiliser l'événement ItemCheck si vous vérifiez également le nouvel état de l'élément sur lequel vous cliquez. Ceci est disponible dans les arguments de l'événement, sous forme de e.NewValue . Si NewValue est coché, incluez l'élément actuel avec la collection proprement dite dans votre logique:

     private void checkedListBox1_ItemCheck(object sender, ItemCheckEventArgs e)
    {                     
        List<string> checkedItems = new List<string>();
        foreach (var item in checkedListBox1.CheckedItems)
            checkedItems.Add(item.ToString());

        if (e.NewValue == CheckState.Checked)
            checkedItems.Add(checkedListBox1.Items[e.Index].ToString());

        foreach (string item in checkedItems)
        {
            ...
        }
    }
 

Autre exemple, pour déterminer si la collection sera vide après que cet élément soit (dés) vérifié:

 private void ListProjects_ItemCheck(object sender, ItemCheckEventArgs args)
{
    if (ListProjects.CheckedItems.Count == 1 && args.NewValue == CheckState.Unchecked)
        // The collection is about to be emptied: there's just one item checked, and it's being unchecked at this moment
        ...
    else
        // The collection will not be empty once this click is handled
        ...
}
 

47voto

Dunc Points 4360

Il y a beaucoup de connexes StackOverflow de posts sur ce... ainsi Que Branimir de la solution, ici, sont deux des plus simples:

Retards dans l'exécution sur ItemCheck (également ici):

    void checkedListBox1_ItemCheck(object sender, ItemCheckEventArgs e)
    {
        this.BeginInvoke((MethodInvoker) (
            () => Console.WriteLine(checkedListBox1.SelectedItems.Count)));
    }

À l'aide de l'événement MouseUp:

    void checkedListBox1_MouseUp(object sender, MouseEventArgs e)
    {
        Console.WriteLine(checkedListBox1.SelectedItems.Count);
    }

Je préfère la première option, la seconde de faux positifs (c'est à dire tirer trop souvent).

27voto

softburger Points 41

Je l'ai essayé et ça marche:

 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();        
}
 

11voto

diimdeep Points 165

Dériver de CheckedListBox et mettre en œuvre

 /// <summary>
/// Raises the <see cref="E:System.Windows.Forms.CheckedListBox.ItemCheck"/> event.
/// </summary>
/// <param name="ice">An <see cref="T:System.Windows.Forms.ItemCheckEventArgs"/> that contains the event data.
///                 </param>
protected override void OnItemCheck(ItemCheckEventArgs e)
{           
    base.OnItemCheck(e);

    EventHandler handler = AfterItemCheck;
    if (handler != null)
    {
        Delegate[] invocationList = AfterItemCheck.GetInvocationList();
        foreach (var receiver in invocationList)
        {
            AfterItemCheck -= (EventHandler) receiver;
        }

        SetItemCheckState(e.Index, e.NewValue);

        foreach (var receiver in invocationList)
        {
            AfterItemCheck += (EventHandler) receiver;
        }
    }
    OnAfterItemCheck(EventArgs.Empty);
}

public event EventHandler AfterItemCheck;

public void OnAfterItemCheck(EventArgs e)
{
    EventHandler handler = AfterItemCheck;
    if (handler != null)
        handler(this, e);
}
 

5voto

w69rdy Points 5658

Bien que n'étant pas idéal, vous pouvez calculer le CheckedItems en utilisant les arguments qui sont passés à l' ItemCheck événement. Si vous regardez cette exemple sur MSDN, vous pouvez déterminer si la nouvelle rubrique a été cochée ou décochée, qui vous laisse dans une position appropriée pour travailler avec les éléments.

Vous pourriez même créer un nouvel événement qui se déclenche après un élément est activé, ce qui vous donne exactement ce que tu voulais, si tu le souhaitais.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X