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 un dataGrid avec un dataTable


Sujet :

Windows Forms

  1. #1
    Membre éprouvé
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    1 571
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 1 571
    Par défaut Remplir un dataGrid avec un dataTable
    Bonjour tout le monde,

    Je travail sous Visual studio 2003 donc j'utilise un dataGrid qui peut contenir des données rentré auparavent dans la base de données SqlServer2000.

    Mon dataGrid peut soit afficher des données d'une base(jusque la aucun problème) mais on peut également remplir le dataGrid via une comboBox et une textBox.

    Voici le code d'insertion des données de la base dans le dataGrid :
    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
    private void NumInter_TextChanged(object sender, System.EventArgs e)
    		{
    string PieceDetachee = ("SELECT PD_DESIGNART as Désignation, PC_QTECONSO as quantité, CONVERT(varchar(10), PC_PU1MOMEN, 0) as Prix_HT, CONVERT(varchar(10), PC_PU2MOMEN, 0) as Prix_TTC, PC_REMISE as Remise FROM PIECE_DETACHEE, PIECE_CONSOMMEE WHERE PIECE_DETACHEE.PD_CODART = PIECE_CONSOMMEE.PC_CODART AND PC_NUMINTER = '" + NumIntervention.Text + "'");
    			connection.Open();
    			try
    			{
    				SqlDataAdapter dataAdapter2 = new SqlDataAdapter(PieceDetachee, connection);
    				dataAdapter2.Fill(dt2);
    				dataGrid3.DataMember = "PieceDetachee";
    				dataGrid3.DataSource = dt2;
    				liste.Add(DesArt.Text);
     
    				DataGridTableStyle ts = new DataGridTableStyle(); 
    				this.dataGrid3.TableStyles.Add(ts);
    				ts.MappingName=dt2.TableName;
    				this.dataGrid3.DataSource=dt2;
     
    				this.dataGrid3.TableStyles[0].GridColumnStyles[0].Width = 120;
    				this.dataGrid3.TableStyles[0].GridColumnStyles[1].Width = 52;
     
    			}
    			catch(Exception ex)
    			{
    				MessageBox.Show(ex.ToString());
    			}
    			finally
    			{
    				connection.Close();
    			}  
    		}

    Voici le code qui me permet de remplir le même dataGrid via ma comboBox et ma textBox :
    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
    	private void Qte_TextChanged_1(object sender, System.EventArgs e)
    		{
    connection.Open();
    					SqlParameter paramPU1 = new SqlParameter("@PU1", SqlDbType.Money);
    					decimal d = Convert.ToDecimal(label17.Text, System.Globalization.CultureInfo.InvariantCulture);
    					paramPU1.Value = d;
    					SqlParameter paramPU2 = new SqlParameter("@PU2", SqlDbType.Money);
    					decimal d1 = Convert.ToDecimal(label18.Text, System.Globalization.CultureInfo.InvariantCulture);
    					paramPU2.Value = d1;
    					string strSql1 = string.Format("INSERT INTO PIECE_CONSOMMEE(PC_CODART, PC_NUMINTER, PC_QTECONSO, PC_PU1MOMEN, PC_PU2MOMEN) VALUES('"+CodArt.Text+"', '"+NumIntervention.Text+"','"+Qte.Text+"', {0}, {1})", paramPU1.ParameterName, paramPU2.ParameterName);
    					SqlCommand cmd = new SqlCommand(strSql1, connection);
    					cmd.Parameters.Add(paramPU1);
    					cmd.Parameters.Add(paramPU2);
    					cmd.ExecuteNonQuery();
     
    					string PieceDetachee = ("SELECT PD_DESIGNART as Désignation, PC_QTECONSO as quantité, CONVERT(varchar(10), PC_PU1MOMEN, 0) as Prix_HT, CONVERT(varchar(10), PC_PU2MOMEN, 0) as Prix_TTC, PC_REMISE as Remise FROM PIECE_DETACHEE, PIECE_CONSOMMEE WHERE PIECE_DETACHEE.PD_CODART = PIECE_CONSOMMEE.PC_CODART AND PC_NUMINTER = '" + NumIntervention.Text + "'");
    					try
    					{
    						SqlDataAdapter dataAdapter3 = new SqlDataAdapter(PieceDetachee, connection);
    						dataAdapter3.Fill(dt2);
    						dataGrid3.DataSource = dt2;
    						dataGrid3.DataMember = "PieceDetachee";
    						liste.Add(DesArt.Text);
    }
    					catch(Exception ex)
    					{
    						MessageBox.Show(ex.ToString());
    					}
    					finally
    					{
    						connection.Close();
    					} 
    				}
    			}
    			catch(Exception)
    			{
    				MessageBox.Show("erreur--> article déja existant");
    			}
    			finally
    			{
    				connection.Close();
    			} 
    		}
    Lorsque je souhaite inséré un nouveau article via ma comboBox, voici le message d'erreur que j'obtient :
    System.ArgumentException: Impossible de créer une liste enfant pour le champ PieceDetachee.

    at System.Windows.Forms.BindingContext.EnsureListManager(Object dataSource, String dataMember)

    at System.Windows.Forms.BindingContext.get_Item(Object dataSource, String dataMember)

    at System.Windows.Forms.DataGrid.Set_ListManager(Object newDataSource, String newDataMember, Boolean force, Boolean forceColumnCreation)

    at System.Windows.Forms.DataGrid.Set_ListManager(Object newDataSource, String newDataMember, Boolean force)

    at System.Windows.Forms.DataGrid.set_DataMember(String value)

    at SuiviClient_DistribInfo.SuiviIntervention.Qte_TextChanged_1(Object sender, EventArgs e) in c:\documents and settings\fils\mes documents\visual studio projects\suiviclient_distribinfo\suiviintervention.cs:line 1369
    La ligne 1369 correspond à :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    dataGrid3.DataMember = "PieceDetachee";
    de la deuxième partie du code(code insérant donnée via comboBox et textBox).
    Je vois pas ce que je peux faire pour régler mon problème??

    Aidez moi s'il vous plais!!

    Cordialement!!

  2. #2
    Membre Expert Avatar de Guulh
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    2 160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2007
    Messages : 2 160
    Par défaut
    Il est tard et je suis fatigue, mais quelques conseils en vrac, qui ne resoudront pas ton probleme mais rendront la localisation des erreurs potentielles plus aisee :
    Evite de melanger le code SQL et le code des forms. Plutot que de creer des Sqltrucmuche dans les fonctions abonnes aux events des controles, tu as tout a gagner a faire des fonctions specialisees dans la communication avec la base.
    Par exemple, dans ton cas, tu pourrais faire ca :

    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
    public DataTable GetMachinTruc(decimal pu1, decimal pu2, ...)
    {
    connection.Open();
    SqlParameter paramPU1 = new SqlParameter("@PU1", SqlDbType.Money);
    paramPU1.Value = pu11;
    SqlParameter paramPU2 = new SqlParameter("@PU2", SqlDbType.Money);
    paramPU2.Value = pu2;
    //...
    SqlCommand cmd = new SqlCommand(strSql1, connection);
    cmd.Parameters.Add(paramPU1);
    cmd.Parameters.Add(paramPU2);
    cmd.ExecuteNonQuery();
     
    // ...
    try
    {
    	SqlDataAdapter dataAdapter3 = new SqlDataAdapter(PieceDetachee, connection);
    	dataAdapter3.Fill(dt2);
    }
    return dt2;
    }
    avec dans la fonction GetMachinTruc aucune reference a un controle de ta form (bon l'ideal serait de le mettre dans une autre classe)
    Et dans le event handler, tu aurais juste :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    decimal d1 = Convert.ToDecimal(label17.Text, System.Globalization.CultureInfo.InvariantCulture);
    decimal d2 = ... ;
    tagrid.DataSource = GetMachinTruc(d1, d2, ...);
    Tu vois l'idee ? D'abord extraire toutes les infos necessaires a l'execution de ta requete, les passer en parametre de la fonction qui va bien et qui va lancer ta requete, et recuperer la datatable (ou dataset ou n'importe quel objet metier) que tu refiles en DataSource a ta grille.

    Parce que la, a chaque fois, tu dis "ca marche pas", mais decouper comme je te dis te permettrait de reperer assez vite si le probleme vient de la partie UI (le code qui est dans les fonctions abonnees) ou un probleme de communication avec la BDD.

    Autre chose : essaie de donner a tes variables des noms plus explicites. Pour les controles par exemple, il vaut mieux prefixer par le typr, par exemple textboxPieceDetachee (ou tbPieceDetachee si tu trouves ca trop long), parce que la, tu te retrouves avec des tas de variables impossibles a dechiffrer. Pareil pour tes noms de requetes : tu devrais pas appeler ta requete "PieceDetachee" mais "reqInsertPieceDetachee" par exemple.

    Tu nous parle de combobox et de textbox, mais je les vois pas dans le code que tu presentes. Ca aide pas a t'aider.

    Apres, pour ce qui est du probleme que tu decris dans ton post, j'en sais rien, jamais utilse de datagrid. Mais un meilleur decoupage de ton code te permettrait de resoudre tout seul la majorite de tes soucis.

    Bon le temps d'ecrire ce post j'ai trouve ce qui foirait dans ton code, mais ca attendra demain :p

  3. #3
    Membre éprouvé
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    1 571
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 1 571
    Par défaut réponse à Guulh
    Merci pour tes conseils, je vais essayé de les mettres en applications.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Bon le temps d'ecrire ce post j'ai trouve ce qui foirait dans ton code, mais ca attendra demain :p
    C'est quoi d'aprés toi qui foire dans mon code alors??

    Cordialement!!

  4. #4
    Membre Expert Avatar de Guulh
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    2 160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2007
    Messages : 2 160
    Par défaut
    C'est ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    dataGrid3.DataSource = dt2;
    dataGrid3.DataMember = "PieceDetachee";
    La propriété DataMember permet juste au binding de savoir à quelle propriété de la source il faut se brancher.
    Si tu avais un dataset contenant une table nommée "PieceDetachee", tu aurais pu faire comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    dataGrid3.DataSource = tondataSet;
    dataGrid3.DataMember = "PieceDetachee";
    Mais là, tu donnes directement la datatable comme source à ta grille ; elle n'a pas de propriété nommée PieceDetachee, elle EST PieceDetachee. Il est donc inutile de spécifier un DataMember.

  5. #5
    Membre éprouvé
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    1 571
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 1 571
    Par défaut réponse à Guulh
    Merci pour ta réponse.

    Voici que cela me donne a présent (je l'ai fais sur l'ancien modèle mais t'inquiète j'essaye de faire ce que tu ma conseillé).

    Voici le code d'insertion des données de la base dans le dataGrid :
    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
    private void NumInter_TextChanged(object sender, System.EventArgs e)
    		{
    string PieceDetachee = ("SELECT PD_DESIGNART as Désignation, PC_QTECONSO as quantité, CONVERT(varchar(10), PC_PU1MOMEN, 0) as Prix_HT, CONVERT(varchar(10), PC_PU2MOMEN, 0) as Prix_TTC, PC_REMISE as Remise FROM PIECE_DETACHEE, PIECE_CONSOMMEE WHERE PIECE_DETACHEE.PD_CODART = PIECE_CONSOMMEE.PC_CODART AND PC_NUMINTER = '" + NumIntervention.Text + "'");
    			connection.Open();
    			try
    			{
    				SqlDataAdapter dataAdapter2 = new SqlDataAdapter(PieceDetachee, connection);
    				dataAdapter2.Fill(dt2);
    				dataGrid3.DataSource = dt2;
    				liste.Add(DesArt.Text);
     
    				DataGridTableStyle ts = new DataGridTableStyle(); 
    				this.dataGrid3.TableStyles.Add(ts);
    				ts.MappingName=dt2.TableName;
    				this.dataGrid3.DataSource=dt2;
     
    				this.dataGrid3.TableStyles[0].GridColumnStyles[0].Width = 120;
    				this.dataGrid3.TableStyles[0].GridColumnStyles[1].Width = 52;
     
    			}
    			catch(Exception ex)
    			{
    				MessageBox.Show(ex.ToString());
    			}
    			finally
    			{
    				connection.Close();
    			}  
    		}

    Voici le code qui me permet de remplir le même dataGrid via ma comboBox et ma textBox :
    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
    private void Qte_TextChanged_1(object sender, System.EventArgs e)
    		{
    connection.Open();
    					SqlParameter paramPU1 = new SqlParameter("@PU1", SqlDbType.Money);
    					decimal d = Convert.ToDecimal(label17.Text, System.Globalization.CultureInfo.InvariantCulture);
    					paramPU1.Value = d;
    					SqlParameter paramPU2 = new SqlParameter("@PU2", SqlDbType.Money);
    					decimal d1 = Convert.ToDecimal(label18.Text, System.Globalization.CultureInfo.InvariantCulture);
    					paramPU2.Value = d1;
    					string strSql1 = string.Format("INSERT INTO PIECE_CONSOMMEE(PC_CODART, PC_NUMINTER, PC_QTECONSO, PC_PU1MOMEN, PC_PU2MOMEN) VALUES('"+CodArt.Text+"', '"+NumIntervention.Text+"','"+Qte.Text+"', {0}, {1})", paramPU1.ParameterName, paramPU2.ParameterName);
    					SqlCommand cmd = new SqlCommand(strSql1, connection);
    					cmd.Parameters.Add(paramPU1);
    					cmd.Parameters.Add(paramPU2);
    					cmd.ExecuteNonQuery();
     
    					string PieceDetachee = ("SELECT PD_DESIGNART as Désignation, PC_QTECONSO as quantité, CONVERT(varchar(10), PC_PU1MOMEN, 0) as Prix_HT, CONVERT(varchar(10), PC_PU2MOMEN, 0) as Prix_TTC, PC_REMISE as Remise FROM PIECE_DETACHEE, PIECE_CONSOMMEE WHERE PIECE_DETACHEE.PD_CODART = PIECE_CONSOMMEE.PC_CODART AND PC_NUMINTER = '" + NumIntervention.Text + "'");
    					try
    					{
    						SqlDataAdapter dataAdapter3 = new SqlDataAdapter(PieceDetachee, connection);
    						dataAdapter3.Fill(dt2);
    						dataGrid3.DataSource = dt2;
    						liste.Add(DesArt.Text);
    }
    					catch(Exception ex)
    					{
    						MessageBox.Show(ex.ToString());
    					}
    					finally
    					{
    						connection.Close();
    					} 
    				}
    			}
    			catch(Exception)
    			{
    				MessageBox.Show("erreur--> article déja existant");
    			}
    			finally
    			{
    				connection.Close();
    			} 
    		}
    Maintenant, lorsque j'ajoute un premier article --> aucun problème
    Mais, si je rajoute un deuxième article --> il m'affiche deux fois le premier et une fois le deuxième.

    Comment cela se fait-il d'apré toi??

    Corialement!!

  6. #6
    Membre éprouvé
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    1 571
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 1 571
    Par défaut
    J'ai téte une idée d'ou provient le problème : c'est téte parce que je redemande d'afficher le dataSource nouvelle du dataGrid mais il garde en mémoire ce qui a été affiché en premier.

    Donc comment je peux faire pour faire en sorte de mettre a vide le dataGrid, c'est à dire qu'il ne reprenne pas le premier article choisit??

    Qu'en pensez-vous??


    Cordialement.

  7. #7
    Membre éprouvé
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    1 571
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 1 571
    Par défaut aidez moi s'il vous plais
    A force de réfléchir j'ai ma tête qui va exploser!!

    En fet je sais pas trop d'ou provient le problème. J'ai fais du pas à pas, j'ai mis un messageBox qui me donne le nombre de ligne qui se situe dans l'array liste et pourtant il es bon.

    Comment faire pour effacer la ligne en trop?? Pourquoi elle apparait?? Ou est l'erreur dans mon code??

    J'ai vraiment besoin de votre aide s'il vous plais!!

    Merci d'avance!!

  8. #8
    Membre éprouvé
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    1 571
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 1 571
    Par défaut
    J'ai réussi a régler mon problème car il fallais que je mette à null ma dataSource de mon dataGrid et que j'utilise : dt2.Clear();

    Merci a tous pour tout

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

Discussions similaires

  1. [c#] Remplir un DataGridView avec plusieurs DataTable
    Par macfred dans le forum Windows Forms
    Réponses: 2
    Dernier message: 23/02/2010, 11h02
  2. Réponses: 5
    Dernier message: 05/07/2007, 09h01
  3. Réponses: 1
    Dernier message: 21/05/2007, 11h48
  4. Comment remplir un DataGrid avec mon Recorset?
    Par Ronaldinho dans le forum VB 6 et antérieur
    Réponses: 1
    Dernier message: 07/02/2007, 00h03

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