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

C# Discussion :

remplir un DataGridView à partir d'un SqlDataReader


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2019
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2019
    Messages : 24
    Par défaut remplir un DataGridView à partir d'un SqlDataReader
    Bonjour,

    Je débute en C# et je rencontre une difficulté en essayant de remplir une table (DataGridView) à partir des résultats d'une requête (SqlDataReader), sans utiliser de DataSource :

    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
    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
     
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Windows.Forms;
    using System.Data.SqlClient;
     
    namespace TestAffichageDonneesDivalto
    {
        public partial class COMMANDE_LISTE : Form
        {
            public COMMANDE_LISTE()
            {
                InitializeComponent();
            }
     
     
     
            private void COMMANDE_LISTE_Load(object sender, EventArgs e)
            {
                // Déclaration des variables
                string          strConnexion;
                string          strRequete;
                SqlConnection   oConnection;
                SqlCommand      oCommand;
                SqlDataReader   oReader;
                DataGridViewRow LigneInseree;
     
                // Création des colonnes de la table
                TableCommandesClient.Columns.Add("PIDT", "Date");
                TableCommandesClient.Columns.Add("PINO", "Pièce no");
                TableCommandesClient.Columns.Add("CE4", "Etat");
     
                // Chaîne de connection à la base de données
                strConnexion = "Data Source=SRVDIVALTO2;Integrated Security=True;Connect Timeout=30;Encrypt=False;TrustServerCertificate=False;ApplicationIntent=ReadWrite;MultiSubnetFailover=False; database=ERPASPTEST";
                // Requête de sélection des commandes clients
                strRequete = "SELECT ENT.PIDT AS Date, ENT.PINO As 'Pièce no', ENT.CE4 AS 'Etat' from ENT where ENT.TICOD='C' AND ENT.PICOD=2";
     
                try
                {
                    // Initialisation de la connexion à la base de données
                    oConnection = new SqlConnection(strConnexion);
                    // Création de l'objet commande qui permettra d'exécuter la requête
                    oCommand = new SqlCommand(strRequete, oConnection);
                    // Ouverture de la connexion à la base de données
                    oConnection.Open();
                    // Exécution de la requête de sélection des commandes client
                    oReader = oCommand.ExecuteReader();
                    do
                    {
                        while (oReader.Read())
                        {
                            // ajout de la commande client dans la table
                            LigneInseree = new DataGridViewRow();//(DataGridViewRow)TableCommandesClient.RowTemplate.Clone();
                            LigneInseree.Cells[0].Value = oReader[1];
                            LigneInseree.Cells[1].Value = oReader[2];
                            LigneInseree.Cells[2].Value = oReader[3];
                            TableCommandesClient.Rows.Add(LigneInseree);
                        }
                    }
                    while (oReader.NextResult());
                    // Fermeture du DataReader
                    oReader.Close();
                    // Fermeture de la connexion
                    oConnection.Close();
     
                }
                catch (Exception MonException)
                {
                    Console.WriteLine("L'erreur suivante a été rencontrée :" + MonException.Message);
                }       
     
            }
        }
    }
    La table n'est pas remplie, et j'ai l'exception "L'index était hors limites.Il ne doit pas être négatif et doit être inférieur à la taille de la collection.". Il y a des milliers de résultats normalement.

    Pouvez-vous m'aider à comprendre cette erreur s'il vous plaît?

    Alexandre

  2. #2
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2019
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2019
    Messages : 24
    Par défaut
    J'ai l'impression qu'il faudrait que j'indique quelque part le nombre de colonnes lors de la création de la ligne, mais je ne sais pas comment.

    Précisions :
    La première colonne est une date sans heure
    La deuxième colonne est un entier
    La troisième colonne est un caractère
    Le DataGridView présent dans le concepteur est vide, les colonnes sont ajoutées par programmation (pourquoi çà? Juste pour apprendre à manipuler le contrôle par programmation)

  3. #3
    Membre expérimenté
    Profil pro
    Inscrit en
    Février 2009
    Messages
    155
    Détails du profil
    Informations personnelles :
    Localisation : France, Indre et Loire (Centre)

    Informations forums :
    Inscription : Février 2009
    Messages : 155
    Par défaut
    Crée des colonnes avec la propriété DataGridView.ColumnCount.

  4. #4
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2019
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2019
    Messages : 24
    Par défaut
    Merci Krantz.

    Entre temps j'ai aussi trouvé cette solution :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    LigneInseree.CreateCells(TableCommandesClient);
    Juste après LigneInseree = new DataGridViewRow();.

    Je ne sais pas quelle méthode est la meilleure, mais çà fonctionne

  5. #5
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2019
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2019
    Messages : 24
    Par défaut
    Finalement j'ai essayé d'améliorer le résultat pour que le nom de rubriques ne soit pas figé :

    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
    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
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
     
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Windows.Forms;
    using System.Data.SqlClient;
     
    namespace TestAffichageDonneesDivalto
    {
        public partial class COMMANDE_LISTE : Form
        {
            public COMMANDE_LISTE()
            {
                InitializeComponent();
            }
     
     
     
            private void COMMANDE_LISTE_Load(object sender, EventArgs e)
            {
     
                // Déclaration des variables
                string strConnexion;
                string strRequete;
                SqlConnection oConnection;
                SqlCommand oCommand;
                SqlDataReader oReader;
                DataGridViewColumn ColonneInseree;
                DataGridViewRow LigneInseree;
                DataTable schemaTable;
     
                // Chaîne de connection à la base de données
                strConnexion = "Data Source=SRVDIVALTO2;Initial Catalog=ERPASPTEST;Integrated Security=True;Connect Timeout=30;Encrypt=False;TrustServerCertificate=False;ApplicationIntent=ReadWrite;MultiSubnetFailover=False; database=ERPASPTEST";
                // Requête de sélection des commandes clients
                strRequete = "SELECT ENT.PIDT As 'Date', ENT.PINO As 'Pièce no', ENT.CE4 AS 'Etat' from ENT where ENT.TICOD='C' AND ENT.PICOD=2";
     
                try
                {
                    // Initialisation de la connexion à la base de données
                    oConnection = new SqlConnection(strConnexion);
                    // Création de l'objet commande qui permettra d'exécuter la requête
                    oCommand = new SqlCommand(strRequete, oConnection);
                    // Ouverture de la connexion à la base de données
                    oConnection.Open();
                    // Exécution de la requête de sélection des commandes client
                    oReader = oCommand.ExecuteReader();
     
                    // On récupère les informations sur le schéma de la colonne dans la base
                    schemaTable = oReader.GetSchemaTable();
     
                    // Pour chaque rubrique de la requête
                    foreach (DataRow myField in schemaTable.Rows)
                    {
                        // On crée la colonne correspondante
                        ColonneInseree = new DataGridViewColumn();
                        ColonneInseree.Name = myField[schemaTable.Columns[0]].ToString();
                        ColonneInseree.HeaderText = myField[schemaTable.Columns[0]].ToString();
                        ColonneInseree.CellTemplate = new DataGridViewTextBoxCell();
                        ColonneInseree.ValueType = myField[schemaTable.Columns[12]].GetType();
                        TableCommandesClient.Columns.Add(ColonneInseree);
                    }
     
                    do
                    {
                        while (oReader.Read())
                        {
                            // ajout de la commande client dans la table
                            LigneInseree = new DataGridViewRow();//(DataGridViewRow)TableCommandesClient.RowTemplate.Clone();
                            LigneInseree.CreateCells(TableCommandesClient);
                            for (int i = 0; i < TableCommandesClient.ColumnCount ; i++)
                            {
                                LigneInseree.Cells[i].Value = oReader[i];
                            }
                            TableCommandesClient.Rows.Add(LigneInseree);
                        }
                    }
                    while (oReader.NextResult());
                    // Fermeture du DataReader
                    oReader.Close();
                    // Fermeture de la connexion
                    oConnection.Close();
     
                }
                catch (Exception MonException)
                {
                    Console.WriteLine("L'erreur suivante a été rencontrée :" + MonException.Message);
                }
     
            }
     
     
        }
    }
    Par contre, en plus des alias des rubriques (destiné à leur affichage dans les en-têtes de colonnes), j'aimerais obtenir le nom de la rubrique dans la base, est-ce possible ???

    Est-ce qu'un remplissage similaire avec un DataSource serait plus performant? Je ne sais pas mesurer çà

  6. #6
    Membre Expert

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2010
    Messages
    2 067
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2010
    Messages : 2 067
    Par défaut
    Bonjour,

    en faite le mieux dans ce cas n'est pas de remplir le datagrid met de creer une liste d'objet que vous remplirez avec le résultat de votre requete et ensuite c'est cette liste qui sera la datasource de votre datagridview
    tu as un exemple ici https://www.codeproject.com/Articles...-from-SqlDataR
    ou un autre ici https://www.aspforums.net/Threads/16...g-C-in-ASPNet/

Discussions similaires

  1. Réponses: 5
    Dernier message: 15/05/2024, 15h56
  2. Remplir un datagridview a partir d'un formulaire enfant
    Par siro1 dans le forum Windows Forms
    Réponses: 8
    Dernier message: 10/03/2015, 08h23
  3. Réponses: 4
    Dernier message: 06/09/2010, 20h08
  4. Réponses: 3
    Dernier message: 12/06/2009, 12h49
  5. remplir dataGridView à partir de mon dataset
    Par toutou2000 dans le forum C#
    Réponses: 5
    Dernier message: 27/11/2008, 15h04

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