ListView.ItemCheck

Signaler
Messages postés
3
Date d'inscription
dimanche 27 septembre 2009
Statut
Membre
Dernière intervention
13 octobre 2009
-
Messages postés
3
Date d'inscription
dimanche 27 septembre 2009
Statut
Membre
Dernière intervention
13 octobre 2009
-
Bonjour. J'essaie d'utiliser itemCheck pour effectuer des actions quand on coche/décoche un élément d'un listview. Mais la méthode est déclenchée avant que l'élément ne soit coché, et si je parcours les éléments cochés, le nouveau n'est pas pris en compte, car son état n'a pas encore changé.
Y a t-il un moyen de déclencher le comportement par défaut avant de faire mon traitement ? J'ai essayé application.doevents mais apparemment ça n'a rien à voir.
Merci
PS j'utilise compact framework mais ça ne devrait pas faire de différence, je pense.
A voir également:

4 réponses

Messages postés
2375
Date d'inscription
jeudi 12 juillet 2001
Statut
Modérateur
Dernière intervention
15 décembre 2018
22
Bonsoir,
Je ne vois pas ce qui peux bloquer j'ai du mal à te saisir. Tu peux connaitre le nouvel état de ton élément.

        private void listView1_ItemCheck(object sender, ItemCheckEventArgs e)
        {
            if (e.NewValue == CheckState.Checked)
            {
                //Action à faire si cocher.
            }
            else if (e.NewValue == CheckState.Unchecked)
            {
                //Action à faire si décocher.
            }
        }


++
Messages postés
3
Date d'inscription
dimanche 27 septembre 2009
Statut
Membre
Dernière intervention
13 octobre 2009

J'ai pu contourner le problème par une pirouette. J'ai ajouté une variable newCheckedItem, que listView1_ItemCheck met à 1 ou 61 (selon le nouvel état de la coche) pendant la durée d'exécution d'updateStatus. Cette dernière compte les cases cochées, et ajoute ou retranche 1 selon le cas. Je ne sais pas s'il y a un moyen plus orthodoxe ?

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace simbackup
{
    public partial class contactsForm : Form

    {
        int totalItems = 0;
        int newCheckedItem = 0;
        bool looping = false;

        public contactsForm()
        {
            InitializeComponent();
        }

        private void updateStatus()
        {
            statusBar1.Text = "Selected/used/total : " + (selectedItems() + newCheckedItem).ToString() 
                + "/" + usedItems().ToString() + "/" + totalItems.ToString();
        }

        private int usedItems()
        {
            return listView1.Items.Count;
        }

        private int selectedItems()
        {
            int selectedItems = 0;
            foreach (ListViewItem item in listView1.Items)
                if (item.Checked) selectedItems++;
            return selectedItems;
        }

        private void listView1_ItemCheck(object sender, ItemCheckEventArgs e)
        {
            if (!looping)
            {
            newCheckedItem = (e.NewValue==CheckState.Checked ? 1 : -1);
            updateStatus();
            newCheckedItem = 0;
            }
        }
    }
}
Messages postés
2375
Date d'inscription
jeudi 12 juillet 2001
Statut
Modérateur
Dernière intervention
15 décembre 2018
22
Non pas dans ce cas la. Je trouve que ta pirouette est pas mal
Tite question qu'est-ce que cette variable looping ?
Messages postés
3
Date d'inscription
dimanche 27 septembre 2009
Statut
Membre
Dernière intervention
13 octobre 2009

Dans mon post précédent, il fallait lire -1 et pas 61, bien sur...

Pour looping : le fenêtre a des menus "select all", "unselect all" et "invert selection" qui bouclent sur le listview en cochant/décochant les cases. Pendant ces boucles, inutile d'updater le status à chaque itération. Looping permet de désactiver le recalcul, et on update une fois à la fin de la boucle. Ca l'a accéléré d'un facteur x15.