Image dans DataGridView

Résolu
Le grand Jisay Messages postés 100 Date d'inscription mardi 8 mai 2007 Statut Membre Dernière intervention 18 février 2011 - 28 déc. 2007 à 13:18
Le grand Jisay Messages postés 100 Date d'inscription mardi 8 mai 2007 Statut Membre Dernière intervention 18 février 2011 - 28 déc. 2007 à 14:24
Bonjour tout le monde,


Voici mon problème, j'ai une application qui gère un stock de CD. J'ai
un datagridview qui contient les colonnes avec le nom de l'artiste, le
nom de l'album et la quantité restante en stock.

J'ai ajouté une colonne de type DataGridViewImageColumn pour pouvoir
afficher une image. Cette image doit être différente si le stock est
supérieur à 0 ou si il est égal à 0. Donc si la valuer dans la colonne
"En Stock" est de 0 alors je mets une petite image avec une croix.


J'ai trouvé un petit quelque chose sur la MSDN : http://msdn2.microsoft.com/fr-fr/library/2ab8kd75(VS.80).aspx

Mais cette source m'affiche la même image partout dans la colonne et j'ai besoin d'images différentes.


J'ai aussi trouvé sur le forum une piste : http://www.csharpfr.com/infomsg_DATAGRIDVIEW-PICTUREBOX_990638.aspx

Mais alors si je fais comme cela, j'ai une erreur assez impressionnante
qui s'affiche. J'ai une erreur pour chaque ligne ou je mets une image
et l'image s'affiche sur la dernière ligne du DataGridView (où il n'y a
pas d'enregistrements).


Je vous donne le code que j'ai pour le moment :


        //je remplis mon DataGridView quand je sélectionne un nom d'artiste dans une combobox


        private void toolStripComboBox1_SelectedIndexChanged(object sender, EventArgs e)

        {

            this.cdsDataSet1.Clear();

            this.sqlDataAdapter1.SelectCommand.Parameters["@nom_artiste"].Value = this.toolStripComboBox1.Text;

            this.sqlDataAdapter1.Fill(cdsDataSet1);

            this.dataGridView1.Visible = true;


            // Ceci c'est le code présent sur la MSDN


            /*Icon treeIcon = new Icon(@".\1364.ico");

            DataGridViewImageColumn iconColumn = new DataGridViewImageColumn();

            iconColumn.Image = treeIcon.ToBitmap();

            iconColumn.Name = "Tree";

            iconColumn.HeaderText = "Nice tree";

            dataGridView1.Columns.Insert(3, iconColumn);*/


            icone();

        }


        // fonction pour le remplissage


        public void icone()

        {


            // Code que j'ai trouvé sur le forum (génère une grosse erreur)

            foreach (DataGridViewRow line in this.dataGridView1.Rows)

            {

                //le try ne sert a rien => toujours une erreur et je ne gère pas le fait que le stock soit plus grand que 0

                // ou bien égal à 0...

                try

                {

                    line.Cells[3].Value = Bitmap.FromFile(@".\croix.jpg");

                }

                catch (System.Exception ex)

                {

                    MessageBox.Show(ex.Message);

                }

            }

        }


Voila, je me permet de vous demander votre aide, je suis resté bloqué sur ce petit problème pendant 2heures


Merci d'avance,


Le Grand Jisay

4 réponses

Le grand Jisay Messages postés 100 Date d'inscription mardi 8 mai 2007 Statut Membre Dernière intervention 18 février 2011 2
28 déc. 2007 à 14:24
J'ai trouvé le problème.
Et non, ce n'était pas ca le problème, j'avais bien placé ma colonne en DataGridViewImageColumn en manuel. En manuel (en cliquant sur la flèche en haut du datagridview en mode design et dans Modifier la colonne) j'avais cette erreur. J'ai alors donc supprimé carrément la colonne et je l'ai recréé par programmation. Comme ceci :
            DataGridViewImageColumn iconColumn = new DataGridViewImageColumn();
            dataGridView1.Columns.Insert(3,iconColumn);

Et la le code que j'ai placé fonctionne impec.

Je donne le code pour ceux que ca pourrait interressé...

//je remplis mon DataGridView quand je sélectionne un nom d'artiste dans une combobox

        private void toolStripComboBox1_SelectedIndexChanged(object sender, EventArgs e)
        {
            this.cdsDataSet1.Clear();
            this.sqlDataAdapter1.SelectCommand.Parameters["@nom_artiste"].Value = this.toolStripComboBox1.Text;
            this.sqlDataAdapter1.Fill(cdsDataSet1);
            this.dataGridView1.Visible = true;
            icone();
        }

        // fonction pour le remplissage de la colonne

        public void icone()
        {
            DataGridViewImageColumn iconColumn = new DataGridViewImageColumn();
            dataGridView1.Columns.Insert(3,iconColumn);
           
            for(int i = 0 ; i<this.dataGridView1.Rows.Count-1;i++)
            {
                if (this.dataGridView1.Rows[i].Cells[2].Value.ToString() == "0")
                {
                    this.dataGridView1.Rows[i].Cells[3].Value = (Image)Bitmap.FromFile(@".\croix.bmp");
                }
                else
                {
                    this.dataGridView1.Rows[i].Cells[3].Value = (Image)Bitmap.FromFile(@".\ok.bmp");
                }
            }
        }

Et voila, je ne sais toujours pas pourquoi l'erreur s'est produite quand j'ai modifié la colonne DataGridViewTextBoxColumn en DataGridViewImageColumn en manuel, mais le code que j'ai placé fonctionne. Ne me reste plus qu'a accepter la réponse et à te remercier coq pour avoir chercher à élucider mon problème.

A+,

Le Grand Jisay
3
cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
28 déc. 2007 à 13:32
Salut,

Et quelle est l'erreur ?

/*
coq
MVP Visual C#
CoqBlog
*/
0
Le grand Jisay Messages postés 100 Date d'inscription mardi 8 mai 2007 Statut Membre Dernière intervention 18 février 2011 2
28 déc. 2007 à 13:44
Salut,

J'ai une grande boite de dialogue dans laquelle il est écrit un pas mal de lignes.

L'erreur est du type System.FormatException: Cast non valide de 'System.String' en 'System.Drawing.Image'. --->System.InvalidCastExcept en 'System.Drawing.Image'.

Après il y a pas mal de texte mais je ne sais pas comment copier coller.

Et à la fin il est aussi écrit :

Pour remplacer cette boîte de dialogue par défaut, traitez l'événement DataError.

J'ai bien compris qu'il n'était pas possible de convertir une chaine de caractère en image mais je ne vois pas comment corriger ma faute...

Meri de ton aide coq,

Le Grand Jisay
0
cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
28 déc. 2007 à 14:07
Ben tu essaies de placer un type Image dans une colonne destinée à recevoir un type String, donc forcément il n'apprécie pas.
Je te conseille de jeter un oeil à ceci : Comment : personnaliser la mise en forme des données dans le contrôle DataGridView Windows Forms

/*
coq
MVP Visual C#
CoqBlog
*/
0
Rejoignez-nous