none
Listview avec checkBox : Comment récupérer la colonne cochée? RRS feed

  • Question

  • Bonjour,

    j'utilise une ListView pour différentes éléments, chacun dans une colonne différente.

    Cette ListView comporte plusieurs lignes.

    Dans l'une des colonnes (la première) j'ai une checkBox. Je souhaite identifier la ligne sélectionné par la checkbox.

    Je n'arrive pas à tester quelle checkbox de quelles ligne est cochée.

    Quelqu'un aurait-il une idée?

    Merci

    jeudi 6 février 2014 21:23

Réponses

  • On doit traiter ce cas dans le code.

    J'ai modifié le  ItemCheck dans l’UserControle comme ci-dessous :

            private void ListView_ItemCheck(object sender, ItemCheckEventArgs e)
            {
                  if (e.NewValue == CheckState.Checked)
                      for (int ix = 0; ix < ((System.Windows.Forms.ListView)sender).Items.Count; ++ix)
                          if (e.Index != ix) ((System.Windows.Forms.ListView)sender).Items[ix].Checked = false ;
           
    
                OnChanged(e.Index ,  e.NewValue );
     
            }
    Cordialement,

    Aurel BERA, MSFT
    MSDN Community Support. LE CONTENU EST FOURNI "TEL QUEL" SANS GARANTIE D'AUCUNE SORTE, EXPLICITE OU IMPLICITE.
    S'il vous plaît n'oubliez pas de "Marquer comme réponse" les réponses qui ont résolu votre problème. C'est une voie commune pour reconnaître ceux qui vous ont aidé, et rend plus facile pour les autres visiteurs de trouver plus tard la résolution.

    • Marqué comme réponse Aurel Bera lundi 17 février 2014 07:40
    vendredi 14 février 2014 08:03

Toutes les réponses

  • Bonjour

    Comment vous avez remplis votre liste?
    Vous utilisez du DataBinding ?
    Merci !

    Cordialement,


    Aurel BERA, MSFT
    MSDN Community Support. LE CONTENU EST FOURNI "TEL QUEL" SANS GARANTIE D'AUCUNE SORTE, EXPLICITE OU IMPLICITE.
    S'il vous plaît n'oubliez pas de "Marquer comme réponse" les réponses qui ont résolu votre problème. C'est une voie commune pour reconnaître ceux qui vous ont aidé, et rend plus facile pour les autres visiteurs de trouver plus tard la résolution.

    vendredi 7 février 2014 12:57
  • Bonjour,

    oui j'utilise une liste pour remplir ma ListView.

    Comme ceci : 

     public ListView LoadTicket(CommandeDTO Order, ListView TicketCaisse)
            {
                ProductDTO product;
                currentTable.NomTable = Order.table;
                TicketCaisse.Enabled = true;
                TicketCaisse.BeginUpdate();
                TicketCaisse.Items.Clear();
                totalOrder = 0;
                lvi.Font = new System.Drawing.Font("Futura", 10);
                TicketCaisse.Width = 392;
                lvi.SubItems.Add("Item 1.SubItem 1");
                lvi.SubItems[0].ForeColor = Color.Red;
                lvi.UseItemStyleForSubItems = false;
                lvi.SubItems[0].Font = new Font(lvi.SubItems[0].Font, lvi.SubItems[0].Font.Style | FontStyle.Bold);
                lvi.SubItems[1].Font = new Font(lvi.SubItems[1].Font, lvi.SubItems[1].Font.Style | FontStyle.Bold);
                TicketCaisse.GridLines = true;
                foreach (ProductDTO p in Order.listProduit)
                {
                    product = ProductModel.get(p.IDProduit);
    
                    lvi = new ListViewItem(new string[] { "X", product.LibelleProduit, Convert.ToString(p.Quantity), String.Format("{0:0.00}", product.PrixVente) + "€" });
                    TicketCaisse.Items.Add(lvi);
                    TicketCaisse.Items[0].SubItems.Add(p.LibelleProduit);
                    totalOrder += p.Quantity * product.PrixVente;
                }
                TicketCaisse.EndUpdate();
                return TicketCaisse;
            }

    J'ai essayé en utilisant l'événement click sur ma ListView mais il ne détecte pas immédiatement le click:

     private void GeneralTicket_Click(object sender, EventArgs e)
            {
                int lviRows = GeneralTicket.TicketCaisse.Items.Count;
                int selectedRow;
                for (int i = 0; i < lviRows; i++)
                {
                    if (GeneralTicket.TicketCaisse.Items[i].Checked)
                    {
                        selectedRow = i;
                        MessageBox.Show("Row : {0}", Convert.ToString(i));
                        
                    }
                }
    
            }

    Merci pour votre aide.

    vendredi 7 février 2014 17:44
  • Re Bonjour

    Avez-vous essaye de utiliser l'evenement SelectedIndexChanged?

    Cordialement,


    Aurel BERA, MSFT
    MSDN Community Support. LE CONTENU EST FOURNI "TEL QUEL" SANS GARANTIE D'AUCUNE SORTE, EXPLICITE OU IMPLICITE.
    S'il vous plaît n'oubliez pas de "Marquer comme réponse" les réponses qui ont résolu votre problème. C'est une voie commune pour reconnaître ceux qui vous ont aidé, et rend plus facile pour les autres visiteurs de trouver plus tard la résolution.

    lundi 10 février 2014 09:42
  • J'ai déjà utilisé plusieurs solutions.

    Par exemple MaListView.SelectedItems[0].Index qui me permet de retrouver l'index de la checkBox cochée. Je trouve bien l'index de la row sélectionné.

    En testant en mode Debug je me rends compte que lorsque je fais MaListView.SelectedItems[0].Index je sors de ma méthode alors qu'elle contient encore des instructions et je retrourne à mon application. 

    Tout ce qui se trouve à la suite de MaListView.SelectedItems[0].Index dans ma méthode n'est jamais exécuté.

    Oui j'ai aussi essayé avec  l'evenement SelectedIndexChanged mais c'est pareil.

     

    En utilisant 

    MaListView.CheckedIndices

    la checkBox coché n'est détecté qu'après.

    En gros : je coche ma checkBox, je rentre dans ma procédure SelectedIndexChanged je fais un

    MaListView.CheckedIndices

     il ne trouve rien. Je décohe ma case

    MaListView.CheckedIndices

    il me trouve enfin ma case cochée.


    • Modifié paintbox00 lundi 10 février 2014 21:14
    lundi 10 février 2014 20:20
  • Bonjour

    Pouvez-vous nous faire un petit projet de test et le partager avec nous sur SkyDrive?
    Sera plus facile de debugger.
    Merci!

    Cordialement,
     


    Aurel BERA, MSFT
    MSDN Community Support. LE CONTENU EST FOURNI "TEL QUEL" SANS GARANTIE D'AUCUNE SORTE, EXPLICITE OU IMPLICITE.
    S'il vous plaît n'oubliez pas de "Marquer comme réponse" les réponses qui ont résolu votre problème. C'est une voie commune pour reconnaître ceux qui vous ont aidé, et rend plus facile pour les autres visiteurs de trouver plus tard la résolution.

    mardi 11 février 2014 09:34
  • Bonjour,

    j'ai fait un petit projet illustrant ce que je souhaites faire. Ma ListView est un controle utilisateur.

    Je souhaites récupérer le numéro de ligne sélectionné via la case à cocher.

    Voici le lien : https://skydrive.live.com/redir?resid=9A54D2D04C49D005!169&authkey=!AHz3HKYrDrGCL78&ithint=folder%2c

    Merci pour votre aide

    mercredi 12 février 2014 21:06
  • Bonjour

    Le lien ne donne rien.
    Vous l'avez déjà supprime?

    Cordialement,


    Aurel BERA, MSFT
    MSDN Community Support. LE CONTENU EST FOURNI "TEL QUEL" SANS GARANTIE D'AUCUNE SORTE, EXPLICITE OU IMPLICITE.
    S'il vous plaît n'oubliez pas de "Marquer comme réponse" les réponses qui ont résolu votre problème. C'est une voie commune pour reconnaître ceux qui vous ont aidé, et rend plus facile pour les autres visiteurs de trouver plus tard la résolution.

    jeudi 13 février 2014 07:49
  • J'ai recréé le lien

    https://skydrive.live.com/redir?resid=9A54D2D04C49D005!168&authkey=!ACra1GMJbX7molI&ithint=file%2c.zip

    jeudi 13 février 2014 08:22
  • Si j'ai bien compris, vous devez utiliser e.Index dans l'evenement ListView_ItemCheck.
            private void ListView_ItemCheck(object sender, ItemCheckEventArgs e)
            {
                MessageBox.Show(String.Format("ItemCheck{0}", e.Index));
            }

    Cordialement,


    Aurel BERA, MSFT
    MSDN Community Support. LE CONTENU EST FOURNI "TEL QUEL" SANS GARANTIE D'AUCUNE SORTE, EXPLICITE OU IMPLICITE.
    S'il vous plaît n'oubliez pas de "Marquer comme réponse" les réponses qui ont résolu votre problème. C'est une voie commune pour reconnaître ceux qui vous ont aidé, et rend plus facile pour les autres visiteurs de trouver plus tard la résolution.


    • Modifié Aurel Bera jeudi 13 février 2014 08:50
    jeudi 13 février 2014 08:49
  • Si vous voulez récupérer le numéro de la ligne et l'état du Checkbox (on peut le crocher ou décrocher), on doit utiliser des évènements. Je vous propose de modifier l’UC comme ça :

    namespace ListView.ComponentUC
    {
        public delegate void CheckBoxChanged(object sender, Int32 RowNum, CheckState Checked);
    
        public partial class ListViewUC : UserControl
        {
    
            public event CheckBoxChanged CheckedChanged;
    
    
            protected virtual void OnChanged(Int32 RowNum, CheckState  Checked)
            {
                if (CheckedChanged != null)
                    CheckedChanged(this,  RowNum,   Checked);
            }
    
            ListViewItem lvi = new ListViewItem();
    .........................................................
      private void ListView_ItemCheck(object sender, ItemCheckEventArgs e)
            {
                OnChanged(e.Index ,  e.NewValue );
    
             }
    }

    et dans la forme principale :

         public Form1()
            {
                InitializeComponent();
                tbSelectedProduct.Text = lvi.selectedRow;
                listViewUC1.CheckedChanged += listViewUC1_CheckedChanged;
                
            }
    
            void listViewUC1_CheckedChanged(object sender, int RowNum, CheckState Checked)
            {
                MessageBox.Show("checked at " + RowNum.ToString() + Checked.ToString ()); 
            }

    Cordialement,


    Aurel BERA, MSFT
    MSDN Community Support. LE CONTENU EST FOURNI "TEL QUEL" SANS GARANTIE D'AUCUNE SORTE, EXPLICITE OU IMPLICITE.
    S'il vous plaît n'oubliez pas de "Marquer comme réponse" les réponses qui ont résolu votre problème. C'est une voie commune pour reconnaître ceux qui vous ont aidé, et rend plus facile pour les autres visiteurs de trouver plus tard la résolution.

    jeudi 13 février 2014 14:29
  • Bonjour,

    cela correspond à ce que je voulais faire.

    Par contre je n'arrive pas à faire en sorte qu'une seule case soit cochée à la fois. J'ai pourtant mis ma lis en  ListView.MultiSelect = false; mais malgré tout je peux sélectionner plusieurs case en même temps.

    Auriez-vous une idée?

    Merci pour votre aide, votre code m'a bien aidé.

    jeudi 13 février 2014 21:24
  • On doit traiter ce cas dans le code.

    J'ai modifié le  ItemCheck dans l’UserControle comme ci-dessous :

            private void ListView_ItemCheck(object sender, ItemCheckEventArgs e)
            {
                  if (e.NewValue == CheckState.Checked)
                      for (int ix = 0; ix < ((System.Windows.Forms.ListView)sender).Items.Count; ++ix)
                          if (e.Index != ix) ((System.Windows.Forms.ListView)sender).Items[ix].Checked = false ;
           
    
                OnChanged(e.Index ,  e.NewValue );
     
            }
    Cordialement,

    Aurel BERA, MSFT
    MSDN Community Support. LE CONTENU EST FOURNI "TEL QUEL" SANS GARANTIE D'AUCUNE SORTE, EXPLICITE OU IMPLICITE.
    S'il vous plaît n'oubliez pas de "Marquer comme réponse" les réponses qui ont résolu votre problème. C'est une voie commune pour reconnaître ceux qui vous ont aidé, et rend plus facile pour les autres visiteurs de trouver plus tard la résolution.

    • Marqué comme réponse Aurel Bera lundi 17 février 2014 07:40
    vendredi 14 février 2014 08:03
  • Bonjour,

    cela fonctionne et correspond parfaitement à ce que je souhaitais.

    Merci pour votre aide !

    dimanche 16 février 2014 17:46