Datagridview c# checkbox last

Résolu
CodeUtah - 5 nov. 2020 à 23:09
 CodeUtah - 8 nov. 2020 à 00:57
Bonsoir tout le monde,

Je cherche une solution a mon problème .

J'ai une datagrid avec 3 colonnes

1ere colonne : checkbox que l'on peut cocher (checkJeu)
2eme colonne : un nom de jeu (nameJeu)
3eme colonne : un état (stateJeu) que je change suivant la selection via un bouton

Je coche la dernière ligne de la colonne checkJeu J'appuie sur le bouton pour mettre la colonne(StateJeu) a true si le checkbox est coché. Mais cela ne fonctionne pas. Je suis obligé de changer de ligne à la souris pour que cela fonctionne, c'est embêtant

4 réponses

Whismeril Messages postés 19026 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 20 avril 2024 656
6 nov. 2020 à 07:20
Bonjour

Si j’ai bien compris, la colonne StateJeu reprend la valeur du checkbox?

Si c’est bien le cas, la façon de faire que je préconise est d'écrire une classe, qui implémente Inotifypropertychanged et de binder une collection sur le datagridview.
https://codes-sources.commentcamarche.net/faq/1291-utilisation-du-binding-au-travers-de-l-objet-databindingsource


Ps et il n’y aura pas besoin de bouton
Ps2 c’est probablement plus facile à faire en wpf
1
Whismeril Messages postés 19026 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 20 avril 2024 656
7 nov. 2020 à 10:03
Bonjour


Karamel a rendu ton code lisible, effort que tu n'as pas fait...... tu peux donc le remercier.
Sans ça on n'aurait pas pu avancer.

Un datatable est une collection d'enregistrements. Un enregistrement contenu dans un datatable ne peut pas avoir de comportement propre.
Un objet a un comportement propre, on peut faire en sorte que quand une propriéte "IsChecked" change, cet objet signale qu'une autre propriété "State", issue d'un calcul change aussi

Par exemple
D'abord la classe, lit bien les commentaires et notamment les remarques
using System.ComponentModel;

namespace test
{
    class JeuxCodeUtah : INotifyPropertyChanged
    {
        private bool isChecked;
        /// <summary>
        /// Retourne ou définit si le jeu est coché
        /// </summary>
        /// <remarks>Cette propriété influe sur le calcul de la propriétét State, donc on signle que State aussi a changé</remarks>
        public bool IsChecked
        {
            get { return isChecked; }
            set
            {
                if (isChecked != value)
                {
                    isChecked = value;
                    GenerePropertyChanged("IsChecked", "State");
                }
            }
        }

        private string name;
        /// <summary>
        /// Retourne ou définit le nom du jeu
        /// </summary>
        public string Name
        {
            get { return name; }
            set
            {
                if (name != value)
                {
                    name = value;
                    GenerePropertyChanged("Name");
                }
            }
        }

        private bool favorite;
        /// <summary>
        /// Retourne ou définit si les jeu est favori
        /// </summary>
        public bool Favorite
        {
            get { return favorite; }
            set
            {
                if (favorite != value)
                {
                    favorite = value;
                    GenerePropertyChanged("Favorite");
                }
            }
        }

        /// <summary>
        /// Retourne l'état du jeu
        /// </summary>
        /// <remarks>je ne suis pas sûr d'avoir compris ce que tu veux faire, alors j'ai fait simple, à toi de gérer</remarks>
        public string State
        {
            get { return isChecked ? "delete" : "hide"; }
        }

        #region INotifyPropertyChanged
        public event PropertyChangedEventHandler PropertyChanged;
        /// <summary>
        /// Génère l'évènement PropertyChanged
        /// </summary>
        /// <param name="Proprietes"></param>
        private void GenerePropertyChanged(params string[] Proprietes)
        {
            foreach(string p in Proprietes)
                PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(p));
        }

        #endregion
    }
}


Dans le formulaire j'ai associé un bindingSource à un datagridview comme dans le premier tuto

et dans le code behind du formulaire
using System.ComponentModel;

namespace test
{
    class JeuxCodeUtah : INotifyPropertyChanged
    {
        private bool isChecked;
        /// <summary>
        /// Retourne ou définit si le jeu est coché
        /// </summary>
        /// <remarks>Cette propriété influe sur le calcul de la propriétét State, donc on signle que State aussi a changé</remarks>
        public bool IsChecked
        {
            get { return isChecked; }
            set
            {
                if (isChecked != value)
                {
                    isChecked = value;
                    GenerePropertyChanged("IsChecked", "State");
                }
            }
        }

        private string name;
        /// <summary>
        /// Retourne ou définit le nom du jeu
        /// </summary>
        public string Name
        {
            get { return name; }
            set
            {
                if (name != value)
                {
                    name = value;
                    GenerePropertyChanged("Name");
                }
            }
        }

        private bool favorite;
        /// <summary>
        /// Retourne ou définit si les jeu est favori
        /// </summary>
        public bool Favorite
        {
            get { return favorite; }
            set
            {
                if (favorite != value)
                {
                    favorite = value;
                    GenerePropertyChanged("Favorite");
                }
            }
        }

        /// <summary>
        /// Retourne l'état du jeu
        /// </summary>
        /// <remarks>je ne suis pas sûr d'avoir compris ce que tu veux faire, alors j'ai fait simple, à toi de gérer</remarks>
        public string State
        {
            get { return isChecked ? "delete" : "hide"; }
        }

        #region INotifyPropertyChanged
        public event PropertyChangedEventHandler PropertyChanged;
        /// <summary>
        /// Génère l'évènement PropertyChanged
        /// </summary>
        /// <param name="Proprietes"></param>
        private void GenerePropertyChanged(params string[] Proprietes)
        {
            foreach(string p in Proprietes)
                PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(p));
        }

        #endregion
    }
}

1
Bonjour Whismeril,

Merci pour ta réponse.

Oui c'est bien cela, je fais un databinding entre ma datagrid et un datatable. Peut etre que je devrais construire un dataset autour de mon datatable

Je vais regarder la solution que tu me proposes

Voici une partie de mon code :

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Data.SqlClient;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace import_svg
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        private DataTable tableJeu = new DataTable("Jeu");

        private BindingSource source = new BindingSource();


        private string requeteSQL = "";
        private void Form1_Load(object sender, EventArgs e)
        {

            // Table Jeu

            tableJeu.Columns.Add("checkJeu", typeof(bool));
            tableJeu.Columns.Add("nameJeu", typeof(string));

            tableJeu.Columns.Add("favoriteJeu", typeof(bool)); // favori          
            tableJeu.Columns.Add("stateJeu", typeof(string)); // supprimer ou cacher

            DataSet setJeu = new DataSet("datasetJeu");

            source.DataSource = tableJeu;
            dataGridListe.DataSource = source;


            tableJeu.Rows.Add(false, "Aladin", false, "");
            tableJeu.Rows.Add(false, "Mario", false, "");
            tableJeu.Rows.Add(false, "Maupiti", false, "");
            tableJeu.Rows.Add(false, "Tarantino", false, "");
            tableJeu.Rows.Add(false, "Spielberg", false, "");
            tableJeu.Rows.Add(false, "Ashley", false, "");
        }

        private void checkBox1_CheckedChanged(object sender, EventArgs e)
        {

            checkHide.Checked = false;
            checkDelete.Checked = false;


            filtreRecherche();
        }

        private void filtreRecherche()
        {
            if (checkKeep.Checked == true)
            {

                requeteSQL = "stateJeu = 'keep' or stateJeu = 'hide' or favoriteJeu = true";
            }
            else
            {
                if (checkHide.Checked == true)
                {
                    requeteSQL = "stateJeu = 'hide'";
                }
                else
                {
                    if (checkDelete.Checked == true)
                    {
                        requeteSQL = "stateJeu = 'delete'";
                    }
                    else
                    {
                        requeteSQL = "";
                    }
                }

            }

            tableJeu.DefaultView.RowFilter = requeteSQL;
        }


        private void checkHide_CheckedChanged(object sender, EventArgs e)
        {
            checkKeep.Checked = false;
            checkDelete.Checked = false;

            filtreRecherche();
        }

        private void checkDelete_CheckedChanged(object sender, EventArgs e)
        {
            checkHide.Checked = false;
            checkKeep.Checked = false;
            filtreRecherche();
        }

        private void menuSelectionMasquerOui_Click(object sender, EventArgs e)
        {          
            for (int i = 0; i < dataGridListe.Rows.Count; i++) //cacher
            {
                if ((bool)dataGridListe.Rows[i].Cells["checkJeu"].Value == true)
                {
                    dataGridListe.Rows[i].Cells["stateJeu"].Value = "hide";
                }
            }

        }

        private void menuSelectionSupprimerOui_Click(object sender, EventArgs e)
        {
            for (int i = 0; i < dataGridListe.Rows.Count; i++) //cacher
            {
                if (dataGridListe.Rows[i].Cells["checkJeu"].Value.ToString() == "True")
                {
                    dataGridListe.Rows[i].Cells["stateJeu"].Value = "delete";
                }
            }
        }


        private void menuSelectionGarderOui_Click(object sender, EventArgs e)
        {
            for (int i = 0; i < dataGridListe.Rows.Count; i++) //cacher
            {
                if (dataGridListe.Rows[i].Cells["checkJeu"].Value.ToString() == "True")
                {
                    dataGridListe.Rows[i].Cells["stateJeu"].Value = "keep";
               }
            }
        }

        private void button1_Click(object sender, EventArgs e)
        {
            radioButton1.Checked = false;
        }

    }
}
0
Whismeril Messages postés 19026 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 20 avril 2024 656
6 nov. 2020 à 12:28
0
vb95 Messages postés 3472 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 13 avril 2024 169
6 nov. 2020 à 12:29
bonjour
Pour poster un code prière de suivre ce tuto : https://codes-sources.commentcamarche.net/faq/11288-les-balises-de-code
Merci
0
Bonjour à tous,

Merci pour toutes vos informations cela me sera bien utile.

Je viens rarement sur le site et je dois dire que vous avez été réactif : Merci !

Et aussi un grand merci pour avoir su rendre visible mon code ;)
0
Rejoignez-nous