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 :

Remplir certaines colonnes datagridview via requete


Sujet :

Windows Forms

  1. #1
    Membre du Club
    Inscrit en
    Octobre 2007
    Messages
    58
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 58
    Points : 57
    Points
    57
    Par défaut Remplir certaines colonnes datagridview via requete
    Bonjour à tous,

    J'ai dérivé un datagridview pour créer dynamiquement mon propre objet _dgv_Pays , je recherche comment remplir mes colonnes. Je passe par un bindingsource et un datatable:

    Code : 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
    public frm_Pays()
            {
                InitializeComponent();
     
                // Création d'un DATATABLE
                // --------------------------
                DataTable _dt = new DataTable("dtTableNom");
                _dt.Columns.Add("Identifiant",typeof(Int32));
                _dt.Columns.Add("Désignation du pays", typeof(string));
                _dt.Columns[0].Caption = _dt.Columns[0].ColumnName;
                _dt.Columns[1].Caption = "Désignation pays";
     
                // Chargement de la table par retour d'une requete SQL (format de retour id, Libellé pays) 
                _dt = Pays.PaysListe();
     
                // Création du bindingSource
                BindingSource _bs = new BindingSource();
                _bs.DataSource = _dt;
     
                // Affectation propriètes du datagridview _dgv_Pays instancié précédement
                // ---------------------------------------------------------------------------
                _dgv_Pays.Top = this.Top + 30;
                _dgv_Pays.Left = this.Left + 5;
                _dgv_Pays.Visible = true;
                _dgv_Pays.AutoGenerateColumns = false;                // Je génére mes propres colonnes
                _dgv_Pays.ColumnHeadersVisible = true;
                _dgv_Pays.Columns.Add(new DataGridViewTextBoxColumn());  // 1er colonne crée
                _dgv_Pays.Columns.Add("toto", "Titre");                  //2ème colonne crée
     
                _dgv_Pays.DataSource = _bs;                             // Affecte le data source
     
                Controls.Add(_dgv_Pays);
                //_dgv_Pays.Columns[1].HeaderText = _dt.Columns[1].Caption;
                //_dgv_Pays.Columns[].HeaderText=_dt.Columns[].Caption;
                //_dgv_Pays.Columns[0].Visible=false;
                //_dgv_Pays.Columns[1].Visible=true;
            }
    Et maintenant comment faire pour que ma colonne 1 contient le champ de retour 1 de ma requete et la colonne 2 le champ de retour 2 de ma requete.... Je veux le faire dynamiquement, car parfois, j'aurais 5 champs en retour et par forcement dans le bonne ordre de visualisation (ex: je récupère les champs 1,2,3,4 et 5, et je devrais afficher le champs 3, 1 et 5 avec le champ 2 non visible mais utilisable et le champ 4 non visible et sans interet)...

    Des idées pour m'aider dans cette aventure ?

  2. #2
    Responsable .NET

    Avatar de Hinault Romaric
    Homme Profil pro
    Consultant
    Inscrit en
    Janvier 2007
    Messages
    4 570
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 4 570
    Points : 252 372
    Points
    252 372
    Billets dans le blog
    121
    Par défaut
    La solution serais de ne pas utiliser le Binding. a la place du DataTable tu utilise un DataReader et la tu remplie ton DGV a la main en affichant les colonnes a ta guise.

    @++
    Vous souhaitez participer aux rubriques .NET ? Contactez-moi

    Si déboguer est l’art de corriger les bugs, alors programmer est l’art d’en faire
    Mon blog, Mes articles, Me suivre sur Twitter
    En posant correctement votre problème, on trouve la moitié de la solution

  3. #3
    Membre du Club
    Inscrit en
    Octobre 2007
    Messages
    58
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 58
    Points : 57
    Points
    57
    Par défaut
    Citation Envoyé par lilroma Voir le message
    La solution serais de ne pas utiliser le Binding. a la place du DataTable tu utilise un DataReader et la tu remplie ton DGV a la main en affichant les colonnes a ta guise.

    @++
    Le problème s'est que la requete retourne un datatable, et j'ai pas les moyens d'en changer.... Il s'agit d'une application avec liaison sous ADO.NET pour atteindre la BDD.

    HELP !!! D'autres solutions ?

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2005
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 23
    Points : 26
    Points
    26
    Par défaut Une solution fonctionnelle :
    Ci-dessous un exemple de code pour personnaliser des colonnes définies auparavant dans un DataGridView

    Code : 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
     
           public void FillDataGridResult()
            {
                dgvResult.DataSource = DataSetContenantDataTable;
                dgvResult.DataMember = "NomDataTable";
     
                DataGridViewTextBoxColumn dgvtbc = (DataGridViewTextBoxColumn)dgvResult.Columns["Description"]; 
                dgvtbc.Name = dgvtbc.DataPropertyName;
                dgvtbc.HeaderText = "Description";
                dgvtbc.Width = 400;
                dgvtbc.DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleLeft;
                dgvtbc.DefaultCellStyle.WrapMode = DataGridViewTriState.False;
                dgvtbc.DefaultCellStyle.NullValue = string.Empty;
     
                dgvtbc = (DataGridViewTextBoxColumn)dgvResult.Columns["Nombre"]; 
                dgvtbc.Name = dgvtbc.DataPropertyName;
                dgvtbc.HeaderText = "Nombre";
                dgvtbc.Width = 100;
                dgvtbc.DefaultCellStyle.Format = "#####0";
                dgvtbc.DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleRight;
                dgvtbc.DefaultCellStyle.WrapMode = DataGridViewTriState.False;
                dgvtbc.DefaultCellStyle.NullValue = string.Empty;
     
                dgvtbc = (DataGridViewTextBoxColumn)dgvResult.Columns["Index"];
                dgvtbc.Name = dgvtbc.DataPropertyName;
                dgvtbc.HeaderText = "Id";
                dgvtbc.Width = 0;
                dgvtbc.Visible = false;
            }
    Pour l'ordre des colonnes, tu peux par exemple faire un DataGridView.Columns.Clear() et ensuite les redéfinir dans l'ordre de ton choix en utilisant un code similaire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
     
                dgvtbc = new DataGridViewTextBoxColumn();
                dgvtbc.DataPropertyName = "Description";
                dgvtbc.Name = dgvtbc.DataPropertyName;
                dgvtbc.HeaderText = "Description";
                dgvtbc.Width = 400;
                dgvResult.Columns.Add(dgvtbc);
    Une autre méthode serait d'utiliser les fonctions Columns.RemoveAt() et Columns.Insert(), mais je n'ai jamais testé personnellement.

  5. #5
    Membre du Club
    Inscrit en
    Octobre 2007
    Messages
    58
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 58
    Points : 57
    Points
    57
    Par défaut
    Un grand merci à toi Sthect

    Je me suis inspiré de ton code et je vous fourni pour ceux qui sont intéressés par la démarche mon propre code ( à améliorer par la suite... ) avec ici l'ajout d'un bindingnavigator (événements à gérer bien entendu)..

    Code : 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
    private DataGridView _dgv_Pays;
    private BindingNavigator _bn_Pays;
     
            public frm_Pays()
            {
                InitializeComponent();            
     
                DataTable _dt = new DataTable("TablePays");
                _dt = Pays.PaysListe();
     
                // Création d'un bindingsource pour gérer le navigateur
                BindingSource _bs = new BindingSource();
                _bs.DataSource = _dt;
     
                // Paramétrage du datagridview pour présenter les données Pays
                _dgv_Pays = new DataGridView();
                _dgv_Pays.DataSource = _bs;
                _dgv_Pays.Location = new Point(this.Left + 5, this.Top + 40);
                _dgv_Pays.Visible = true;
                _dgv_Pays.AutoGenerateColumns = false;            
                _dgv_Pays.ColumnHeadersVisible = true;
     
                // Création de la colonne 1 de _dgv_Pays: Identifiant
                DataGridViewTextBoxColumn dgvtbc = new DataGridViewTextBoxColumn();
                dgvtbc.DataPropertyName = "IdPays";
                dgvtbc.Name = dgvtbc.DataPropertyName;
                dgvtbc.HeaderText = "Identifiant";
                dgvtbc.Width = 50;
                _dgv_Pays.Columns.Add(dgvtbc);
     
                dgvtbc = new DataGridViewTextBoxColumn();
                dgvtbc.DataPropertyName = "sLibellePays";
                dgvtbc.Name = dgvtbc.DataPropertyName;
                dgvtbc.HeaderText = "Désignation";
                dgvtbc.Width = 150;
                _dgv_Pays.Columns.Add(dgvtbc);
     
                // Gestion des droits s'accès sur les colonnes du _dgv_Pays
                _dgv_Pays.Columns[0].ReadOnly = true;
                _dgv_Pays.Columns[1].ReadOnly = false;
                // Rendre la colonne 0 non visible
                _dgv_Pays.Columns[0].Visible = false;
     
                // Mise en place du BindingNavigator
                _bn_Pays = new BindingNavigator(_bs);
                _bn_Pays.Dock = DockStyle.Top;
                _bn_Pays.Visible = true;
     
                // On ajoute toutes les créations à notre formulaire...
                Controls.Add(_dgv_Pays);
                Controls.Add(_bn_Pays);
            }

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

Discussions similaires

  1. [Débutant] Saisie numérique uniquement dans certaines colonnes Datagridview
    Par jeremyvb11 dans le forum VB.NET
    Réponses: 9
    Dernier message: 31/07/2015, 10h32
  2. Comment annuler la selection de certain colonne d' datagridview
    Par matrixdine dans le forum Windows Forms
    Réponses: 2
    Dernier message: 02/05/2008, 09h21
  3. remplir une table vierge via une requete
    Par sunwind dans le forum VBA Access
    Réponses: 1
    Dernier message: 14/11/2007, 16h31
  4. [VBA] Somme de certaines valeurs d'une colonne dans une requete
    Par petitelalou dans le forum VBA Access
    Réponses: 7
    Dernier message: 01/08/2007, 00h18
  5. [vb 2005]Datagridview : comment afficher certaines colonnes
    Par estelledany dans le forum Windows Forms
    Réponses: 5
    Dernier message: 27/05/2006, 02h41

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