IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Windows Forms Discussion :

DataGridViewComboBoxColumn et DataSource


Sujet :

Windows Forms

  1. #1
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 146
    Points : 7 388
    Points
    7 388
    Billets dans le blog
    1
    Par défaut DataGridViewComboBoxColumn et DataSource
    Bonjour,

    J'ai un besoin relativement simple, et je n'arrive pas à m'en sortir du tout.

    Pour faire simple, j'ai des élevages et des espèces :
    Code csharp : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
     
    public class Espece
        {
            public int Code { get; set; }
            public string Nom { get; set; }
     
            public Espece(int code, string nom)
            {
                Code = code;
                Nom = nom;
            }
        }
     
        public class Elevage
        {
            public int Code { get; set; }
            public string Nom { get; set; }
            public Espece? Espece { get; set; }
     
            public Elevage(int code, string nom, Espece? espece)
            {
                Code = code;
                Nom = nom;
                Espece = espece;
            }
        }

    Un élevage poste sur une espèce ou rien.

    Maintenant, je veux afficher dans une DataGridView ma liste d'élevages, et sur chaque ligne, dans la colonne "Espèce" je souhaite avoir la liste de toutes les espèces, avec l'espèce de l'élevage sélectionnée, bien entendu.

    Je souhaite aussi avoir les mécanismes de mise à jour de la liste des élevage avec possibilté :
    - De rajotuer une ligne dans le DGV ce qui ajoute un élevage dans la liste
    - De modifier une ligne dans le DGV ce qui a pour effet de modifier l'élevage correspondant
    - De supprimer une ligne dans le DGV ce qui apour effet de supprimer l'élevage de la liste
    => Logiquement avec les databindings ça devrait plus ou moins pouvoir se faire tout seul...

    Sauf que là, je plante dès le départ...
    1/ Le "Code" de mes élevages (mais aussi des espèces) est un int. Ca comment bien, le DVG n'en veut pas, et je ne trouve aucun contrôle natif qui accepte un int. Suis-je obligé de créer une propriété "CodeStr" qui converti mon Code en string et inversement ?
    2/ Dès que je tente de passer ma colonne "Espèce" en DataGridViewComboBoxColumn, dès que je lui met ma lisye d'espèces en datasource ça plante en disant que la cellule est du mauvais type...

    Et là je nage en plein délire...

    Voici mon code :
    Code csharp : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
     
        public partial class Form1 : Form
        {
            public List<Espece> Especes = new();
            public List<Elevage> Elevages = new();
     
            public BindingList<Espece> listEspeces;
            public BindingList<Elevage> listElevages;
     
            public Form1()
            {
                InitializeComponent();
     
                Especes.Add(new("1", "Cheval"));
                Especes.Add(new("2", "Poule"));
                Especes.Add(new("3", "Vache"));
     
                Elevages.Add(new("1", "Pré fleuri", Especes[0]));
                Elevages.Add(new("2", "Champ vert", Especes[2]));
                Elevages.Add(new("3", "Moulin doré", Especes[1]));
     
                listEspeces = new(Especes);
                listElevages = new(Elevages);
     
                dataGridView1.DataSource = listElevages;
                MessageBox.Show(dataGridView1.Columns.Count.ToString());
                DataGridViewComboBoxColumn esp = dataGridView1.Columns[2] as DataGridViewComboBoxColumn;
                esp.ValueType = typeof(Espece);
                esp.DataSource = listEspeces;
                esp.DisplayMember = "Nom";
                esp.ValueMember = "Code";
            }
        }

    Ca me dit que "La valeur DataGridViewComboBoxCell n'est pas valide" dans une popup à la con. Du coup j'ai même pas de point d'arrêt pour essayer de comprendre à quel endroit ça lui plait pas.
    Je suis invité à gérer l'événement "DataError", mais je trouve rien d'intéressant dans l'eventargs de ce événement.

    Je sèche...

    Edit : J'ai essayé depuis la GUI d'ajouter un datasource... Jamais compris comment lier à une liste de valeurs.
    Edit : J'ai trouvé sur un forum qu'il fallait utiliser BindingList<T> au lien d'un List<T> pour pouvoir gérer l'ajout et la suppression... mais j'en suis pas encore là...
    On ne jouit bien que de ce qu’on partage.

  2. #2
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 146
    Points : 7 388
    Points
    7 388
    Billets dans le blog
    1
    Par défaut
    Bon, ok, j'ai fini par réussir à faire ce que je voulais...

    En fait, merci au concepteur de Form de bousiller tout mon code à chaque modification...

    D'où (en partie) le pourquoi du comment que j'y comprenais plus rien... Forcément, dès que je faisais une modification pour résoudre un problème ça me faisait péter un autre bout du code.

    Morale : faut rien toucher dans le fichier *.Designer.cs ou alors il ne faut plus utiliser le concepteur de form... Ou alors il faut commit toutes les 3 secondes et faire un git compare dès que ça déconne pour comprendre ce que Visual Studio a fait sauter...

    Pour ceux que ça pourrait intéresser, voici un exemple fonctionnel de ce que je cherchais à faire (bon, ça gère pas encore l'ajout/suppression de ligne) :
    Code csharp : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
     
    using System.ComponentModel;
    using System.Data;
    using System.Windows.Forms;
     
    namespace TestDgv
    {
        public partial class Form1 : Form
        {
            public List<Espece> Especes = new();
            public List<Elevage> Elevages = new();
     
            public Form1()
            {
                InitializeComponent();
     
                Especes.Add(new(1, "Cheval"));
                Especes.Add(new(2, "Poule"));
                Especes.Add(new(3, "Vache"));
     
                Elevages.Add(new(1, "Pré fleuri", "2"));
                Elevages.Add(new(2, "Champ vert", "1"));
                Elevages.Add(new(3, "Moulin doré", "3"));
     
                dataGridView1.AutoGenerateColumns = false;
     
                DataGridViewTextBoxColumn colCode = new()
                {
                    DataPropertyName = "Code",
                    ValueType = typeof(int),
                };
                dataGridView1.Columns.Add(colCode);
     
                DataGridViewTextBoxColumn colNom = new()
                {
                    DataPropertyName = "Nom",
                    ValueType = typeof(string),
                };
                dataGridView1.Columns.Add(colNom);
     
                DataGridViewComboBoxColumn colEspece = new()
                {
                    DataPropertyName = "Espece",
                    ValueType = typeof(string),
                    DataSource = Especes,
                    DisplayMember = "Nom",
                    ValueMember = "StringCode",
                };
                dataGridView1.Columns.Add(colEspece);
     
                dataGridView1.DataSource = Elevages;
            }
        }
     
        public class Espece
        {
            public int Code { get; set; }
            public string StringCode {
                get
                {
                    return Code.ToString();
                }
            }
            public string Nom { get; set; }
     
            public Espece(int code, string nom)
            {
                Code = code;
                Nom = nom;
            }
        }
     
        public class Elevage
        {
            public int Code { get; set; }
            public string Nom { get; set; }
            public string Espece { get; set; }
     
            public Elevage(int code, string nom, string espece)
            {
                Code = code;
                Nom = nom;
                Espece = espece;
            }
        }
    }

    Code csharp : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
     
    namespace TestDgv
    {
        partial class Form1
        {
            /// <summary>
            ///  Required designer variable.
            /// </summary>
            private System.ComponentModel.IContainer components = null;
     
            /// <summary>
            ///  Clean up any resources being used.
            /// </summary>
            /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
            protected override void Dispose(bool disposing)
            {
                if (disposing && (components != null))
                {
                    components.Dispose();
                }
                base.Dispose(disposing);
            }
     
            #region Windows Form Designer generated code
     
            /// <summary>
            ///  Required method for Designer support - do not modify
            ///  the contents of this method with the code editor.
            /// </summary>
            private void InitializeComponent()
            {
                this.dataGridView1 = new System.Windows.Forms.DataGridView();
                ((System.ComponentModel.ISupportInitialize)(this.dataGridView1)).BeginInit();
                this.SuspendLayout();
                // 
                // dataGridView1
                // 
                this.dataGridView1.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize;
                this.dataGridView1.Location = new System.Drawing.Point(109, 103);
                this.dataGridView1.Name = "dataGridView1";
                this.dataGridView1.RowTemplate.Height = 25;
                this.dataGridView1.Size = new System.Drawing.Size(552, 150);
                this.dataGridView1.TabIndex = 0;
                // 
                // Form1
                // 
                this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 15F);
                this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
                this.ClientSize = new System.Drawing.Size(800, 450);
                this.Controls.Add(this.dataGridView1);
                this.Name = "Form1";
                this.Text = "Form1";
                ((System.ComponentModel.ISupportInitialize)(this.dataGridView1)).EndInit();
                this.ResumeLayout(false);
     
            }
     
            #endregion
     
            private DataGridView dataGridView1;
        }
    }
    On ne jouit bien que de ce qu’on partage.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Struts] [Oracle] Datasource et Servlet indispo
    Par babylone7 dans le forum Servlets/JSP
    Réponses: 14
    Dernier message: 01/01/2009, 21h16
  2. Contenu DataSource.xml avec base Mysql
    Par PrinceMaster77 dans le forum XMLRAD
    Réponses: 3
    Dernier message: 11/03/2004, 13h59
  3. [EJB]Précision de la datasource (Mysql)
    Par cameleon2002 dans le forum JBuilder
    Réponses: 2
    Dernier message: 11/09/2003, 18h55
  4. Datasource dynamique
    Par Lux interior dans le forum XMLRAD
    Réponses: 10
    Dernier message: 24/08/2003, 12h02
  5. [Tomcat]Connexion à une DataSource Oracle
    Par iceman dans le forum Tomcat et TomEE
    Réponses: 2
    Dernier message: 04/08/2003, 17h48

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo