none
datagridview + row changed RRS feed

  • Question

  • Bonjour,

     

    Une fois que nous aurons pu réglé l'autre soucis d'id = 0, il me faudrait que la Quantité puissent être changé, mais je ne trouve pas les bonnes valeurs:

     

    if (kryptonDataGridView1.Columns["qt"].changed == true)

    {

    bool myUpdate = mydatabase.updateAll("UPDATE qt FROM xdb_recetteComposant WHERE qt=" + kryptonDataGridView1.columns["qt"].value +" AND recette= " + _idRecette +";");

    if (myUpdate)

    {

    MessageBox.Show("La mise à jour a été effectuée", "Mise à jour des quantités", MessageBoxButtons.OK, MessageBoxIcon.Information);

    }

    else

    {

    MessageBox.Show("La mise à jour n'a pas pu être effectuée", "Mise à jour des quantités", MessageBoxButtons.OK, MessageBoxIcon.Warning);

    }

    dataBaseReload();

    }

     

    Les valeurs de la conddition n'existe pas dans l'intellisens, et dans la requete non plus. Sinon il me semble qu'elle n'est pas si fausse?

     

    Pouvez-vous m'aider a corriger?

     

    Meilleures salutation

    mercredi 7 mai 2008 05:55

Toutes les réponses

  • Bonjour,

    Vu que vous utilisez un composant tiers, KryptonDataGridView, pour vous aider il faudrait avoir accès à la documentation de ce composant. Savez-vous si elle est disponible en ligne ?

    mercredi 7 mai 2008 08:39
  • Bonjour,

     

    Je ne sais pas, mais il contient les meme propriété que le dataGridView basique

     

    mercredi 7 mai 2008 09:59
  • Bonjour,

    Je vais essayé de vous préparer en exemple avec le DataGridView de MS. Le principe est que vous fournisser en DataSource une DataTable et c'est sur cette DataTable que vous chercher les lignes mises à jour et non sur le DataGridView (le binding fait que toute modification sur la grille mets à jour la source de données).

    Une autre remarque, votre requête SQL n'est pas correcte, il faut :

     

    Code Snippet

    UPDATE xdb_recettecomposant SET qt = 1 WHERE recette = 12

     

     

    mercredi 7 mai 2008 10:29
  • Ouep jvais modifier, merci bien Wink

     

    Merci en tout cas

     

    mercredi 7 mai 2008 10:39
  • La session se ferme tout le temps, et je pars dans 30minutes. Dites moi si tout d'un coup vous passez, je surveille ce poste jusqu a 16h59

    mercredi 7 mai 2008 12:13
  • Oups je me "réveille" seulement ! Tant pis on verra ça .... Heu Mardi prochain  

     

    Bon à tous passez un super week end!!!

     

    mercredi 7 mai 2008 14:55
  • Le logiciel doit être finis ce soir :/

    jeudi 8 mai 2008 05:49
  • Bonjour,

    Voila un exemple avec un DataGridView classique :

     

         

    Code Snippet

    public Form1()
          {
                InitializeComponent();

     

                // bind des données

                DataTable dt = new DataTable();
                dt.Columns.Add("RecetteId", typeof(int));
                dt.Columns.Add("Composant", typeof(string));
                dt.Columns.Add("Quantity", typeof(int));

                dt.Rows.Add(1, "Comp1", 2);
                dt.Rows.Add(1, "Comp2", 1);
                dt.Rows.Add(1, "Comp3", 5);

                dt.AcceptChanges();

     

                this.dataGridView1.DataSource = dt;
            }

     

            private void button1_Click(object sender, EventArgs e)
            {

                // on récupère la DataTable source et on prends uniquement les lignes mises à jour
                DataTable dt = this.dataGridView1.DataSource as DataTable;
                DataTable updatedData = dt.GetChanges(DataRowState.Modified);

     

                // pour chaque ligne mise à jour on fait un UPDATE

                bool successAll = true;
                foreach (DataRow dr in updatedData.Rows)
                {

                    bool updated = mydatabase.updateAll("UPDATE xdb_recetteComposant SET qt=" + dr["Quantity"].ToString() + " WHERE recette= " + dr["RecetteId"].ToString() + ";");

                    if (updated)

                    {

                        // l'update à réussi, on met à jour le statut de la ligne

                        dr.AcceptChanges();

                    }


                    successAll = successAll && updated;
                }

     

                // message utilisateur en fonction de si toutes les mises à jour ont réussi ou non

                if (successAll)
                {
                    MessageBox.Show("La mise à jour a été effectuée", "Mise à jour des quantités", MessageBoxButtons.OK, MessageBoxIcon.Information);
                }
                else
                {
                    MessageBox.Show("La mise à jour n'a pas pu être effectuée", "Mise à jour des quantités", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                }
            }

     

     

    Comme vous pouvez le voir, le DataGridView mets à jour sa DataSource automatiquement. Pour connaitre les nouvelles valeurs et quelles lignes ont changées, on utilise les fonctionnalitées fournit par la DataTable.

    jeudi 8 mai 2008 06:27
  • Salut,

     

    Merci beaucoup pour ton code!

     

    Voici donc ma form frmEditRecette:

    using System;

    using System.Collections.Generic;

    using System.ComponentModel;

    using System.Data;

    using System.Drawing;

    using System.Text;

    using System.Windows.Forms;

    using ComponentFactory.Krypton.Toolkit;

    namespace TheProject

    {

    public partial class frmEditRecette : ComponentFactory.Krypton.Toolkit.KryptonForm

    {

    private int _idRecette;

    public int IdRecette

    {

    get { return _idRecette; }

    set { _idRecette = value; }

    }

    private int _idProduct;

    public int IdProduct

    {

    get { return _idProduct; }

    set { _idProduct = value; }

    }

    private void dataBaseReload()

    {

    dataBase mydatabase = new dataBase("localhost", "theproject", "root");

    bool connectionStatus = mydatabase.SelectRecette("SELECT xdb_element.id, xdb_element.name, xdb_element.price, xdb_category.name category, xdb_recette.name recette, xdb_recettecomposant.qt, xdb_recettecomposant.id idrecettecomposant FROM xdb_element INNER JOIN xdb_recettecomposant ON xdb_element.id = xdb_recettecomposant.element INNER JOIN xdb_recette ON xdb_recettecomposant.recette = xdb_recette.id INNER JOIN xdb_category ON xdb_element.category = xdb_category.id WHERE recette=" + _idRecette + ";");

    DataTable dt = this.kryptonDataGridView1.DataSource as DataTable;

    DataTable updatedData = dt.GetChanges(DataRowState.Modified);

    kryptonDataGridView1.DataSource = mydatabase.myDataTable;

    //kryptonDataGridView1.Columns["id"].Visible = false;

    kryptonDataGridView1.Columns["name"].HeaderText = "Nom";

    kryptonDataGridView1.Columns["category"].HeaderText = "Catégorie";

    kryptonDataGridView1.Columns["price"].HeaderText = "Prix/Kg";

    kryptonDataGridView1.Columns["qt"].HeaderText = "Quantité";

    kryptonDataGridView1.Columns["id"].Visible = true;

    kryptonDataGridView1.Columns["idrecettecomposant"].Visible = false;

    //kryptonDataGridView1.Columns["recette"].Visible = false;

    // pour chaque ligne mise à jour on fait un UPDATE

    bool successAll = true;

    foreach (DataRow dr in updatedData.Rows)

    {

    bool updated = mydatabase.updateAll("UPDATE xdb_recetteComposant SET qt=" + dr["Quantity"].ToString() + " WHERE recette= " + dr["RecetteId"].ToString() + ";");

    if (updated)

    {

    // l'update à réussi, on met à jour le statut de la ligne

    dr.AcceptChanges();

    }

    successAll = successAll && updated;

    }

    // message utilisateur en fonction de si toutes les mises à jour ont réussi ou non

    if (successAll)

    {

    MessageBox.Show("La mise à jour a été effectuée", "Mise à jour des quantités", MessageBoxButtons.OK, MessageBoxIcon.Information);

    }

    else

    {

    MessageBox.Show("La mise à jour n'a pas pu être effectuée", "Mise à jour des quantités", MessageBoxButtons.OK, MessageBoxIcon.Warning);

    }

    kryptonDataGridView1.AutoGenerateColumns = true;

    kryptonDataGridView1.Refresh();

    DataTable table = (DataTable)kryptonDataGridView1.DataSource;

    double totalPrice = 0;

    foreach (DataRow row in table.Rows)

    {

    totalPrice += Double.Parse(row["price"].ToString());

    totalPrice += Double.Parse(row["qt"].ToString());

    }

    toolStripStatusLabel1.Text = "Prix total: " + totalPrice.ToString() + "CHF";

    bool insertPrice = mydatabase.updateAll("UPDATE xdb_recette SET price='" + totalPrice.ToString() + "' WHERE id=" + IdRecette + "");

    }

    public frmEditRecette()

    {

    InitializeComponent();

    // bind des données

    DataTable dt = new DataTable();

    dt.Columns.Add("RecetteId", typeof(int));

    dt.Columns.Add("Composant", typeof(string));

    dt.Columns.Add("Quantity", typeof(int));

    dt.Rows.Add(1, "Comp1", 2);

    dt.Rows.Add(1, "Comp2", 1);

    dt.Rows.Add(1, "Comp3", 5);

    dt.AcceptChanges();

    this.kryptonDataGridView1.DataSource = dt;

    }

    private void toolStripButton1_Click(object sender, EventArgs e)

    {

    frmAddTheToRecette _frmAddTheToRecette = new frmAddTheToRecette();

    _frmAddTheToRecette.IdRecette = this.IdRecette;

    _frmAddTheToRecette.ShowDialog();

    dataBaseReload();

    }

    private void toolStripButton2_Click(object sender, EventArgs e)

    {

    frmAddAromToRecette _frmAddAromToRecette = new frmAddAromToRecette();

    _frmAddAromToRecette.IdRecette = this.IdRecette;

    _frmAddAromToRecette.ShowDialog();

    dataBaseReload();

    }

    private void toolStripButton3_Click(object sender, EventArgs e)

    {

    frmAddDecoToRecette _frmAddDecoToRecette = new frmAddDecoToRecette();

    _frmAddDecoToRecette.IdRecette = this.IdRecette;

    _frmAddDecoToRecette.ShowDialog();

    dataBaseReload();

    }

    private void frmEditRecette_Load(object sender, EventArgs e)

    {

    dataBaseReload();

    }

    private void toolStripButton4_Click(object sender, EventArgs e)

    {

    dataBase mydatabase = new dataBase("localhost", "theproject", "root");

    bool insertArome = mydatabase.updateAll("DELETE FROM xdb_recetteComposant WHERE id=" + kryptonDataGridView1.CurrentRow.Cells["idrecettecomposant"].Value.ToString() + "");

    if (insertArome)

    {

    MessageBox.Show("Suppression des données effectuées avec succès", "suppression", MessageBoxButtons.OK, MessageBoxIcon.Information);

    dataBaseReload();

    }

    else

    {

    MessageBox.Show("Suppression des données non effectuées", "suppression", MessageBoxButtons.OK, MessageBoxIcon.Warning);

    }

    }

    }

    }

     

     

    Quand j'exécute, il ne détecte pas d'erreur, mais dès que je vais dans la frmEdit, j'ai:

    La référence d'objet n'est pas définie à une instance d'un objet.

     

    sur:

    foreach (DataRow dr in updatedData.Rows)

     et plus précisément sur updatedData.Rows

     

    MeilleuresSalutation

    jeudi 8 mai 2008 06:38
  • Bonjour,

    J'ai effectivement oublié un test, la méthode GetChanges peut renvoyer null s'il n'y a pas de lignes modifiées.

    Par contre votre code ne marchera pas car vous rechargé vos données avant de regarder ce qui à changé. Il faut d'abord prendre les modification pour les enregistrer puis recharger le tout si vous voulez.

    Je suis un peu pressé. J'essayerai de vous remettre ça en ordre plus tard si vous n'avez pas pu.

     

    jeudi 8 mai 2008 07:57
  • Plopagation !

     

    Merci bien, ouep, j'aurais besoin d'aide car je ne comprends pas toutes les lignes :}

    jeudi 8 mai 2008 08:02
  • help  :/

     

    Il me dit la valeur est null :/

    jeudi 8 mai 2008 12:47
  • Voila ce que j'ai:

            private void toolStripButton5_Click(object sender, EventArgs e)
            {
                dataBase mydatabase = new dataBase("localhost", "theproject", "root");
                // on récupère la DataTable source et on prends uniquement les lignes mises à jour
                DataTable dt = this.kryptonDataGridView1.DataSource as DataTable;
                DataTable updatedData = dt.GetChanges(DataRowState.Modified);
     
                // pour chaque ligne mise à jour on fait un UPDATE
                bool successAll = true;
                foreach (DataRow dr in updatedData.Rows)
                {
     
                    bool updated = mydatabase.updateAll("UPDATE xdb_recetteComposant SET qt=" + dr["qt"].ToString() + " WHERE recette= " + dr["" + IdRecette + ""].ToString() + ";");
     
                    if (updated)
                    {
                        // l'update à réussi, on met à jour le statut de la ligne
                        dr.AcceptChanges();
                    }
     
                    successAll = successAll && updated;
                }
     
                // message utilisateur en fonction de si toutes les mises à jour ont réussi ou non
                if (successAll)
                {
                    MessageBox.Show("La mise à jour a été effectuée", "Mise à jour des quantités", MessageBoxButtons.OK, MessageBoxIcon.Information);
                }
                else
                {
                    MessageBox.Show("La mise à jour n'a pas pu être effectuée", "Mise à jour des quantités", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                }
     
                dataBaseReload();
            }

     

    Si je modifie pas la première ligne, il continu de me dire l'instance d'objet, alors que je l ai maintenant instancié.

     

    Et si je modifie la première ligne:

     

    "La colonne '2' n'appartient pas à la table MonDataTable."
    sur la ligne:

    bool updated = mydatabase.updateAll("UPDATE xdb_recetteComposant SET qt=" + dr["qt"].ToString() + " WHERE recette= " + dr["" + IdRecette + ""].ToString() + ";");

    ici: dr["qt"].ToString()

    jeudi 8 mai 2008 13:37
  • Bonjour,

    Voila une version qui devrait marcher :

     

           

    Code Snippet

    private void toolStripButton5_Click(object sender, EventArgs e)
            {
                dataBase mydatabase = new dataBase("localhost", "theproject", "root");
                // on récupère la DataTable source et on prends uniquement les lignes mises à jour
                DataTable dt = this.kryptonDataGridView1.DataSource as DataTable;
                DataTable updatedData = dt.GetChanges(DataRowState.Modified);

     

                if (null == updatedData)

      {

           // aucune ligne modifié

           return;

                }
     
                // pour chaque ligne mise à jour on fait un UPDATE
                bool successAll = true;
                foreach (DataRow dr in updatedData.Rows)
                {
     
                    bool updated = mydatabase.updateAll("UPDATE xdb_recetteComposant SET qt=" + dr["qt"].ToString() + " WHERE recette= " + _idRecette.ToString() + ";");
     
                    if (updated)
                    {
                        // l'update à réussi, on met à jour le statut de la ligne
                        dr.AcceptChanges();
                    }
     
                    successAll = successAll && updated;
                }
     
                // message utilisateur en fonction de si toutes les mises à jour ont réussi ou non
                if (successAll)
                {
                    MessageBox.Show("La mise à jour a été effectuée", "Mise à jour des quantités", MessageBoxButtons.OK, MessageBoxIcon.Information);
                }
                else
                {
                    MessageBox.Show("La mise à jour n'a pas pu être effectuée", "Mise à jour des quantités", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                }
     
                dataBaseReload();
            }

     

     

     

    J'ai mis en gras les modification : vérification qu'il y a des changement et utilisation de votre champ privé pour l'id recette.

    jeudi 8 mai 2008 13:56
  • Salut,

     

    J'ai juste modifier ton if:

    if (null == updatedData)

    {

    // aucune ligne modifié

    MessageBox.Show("Il y a une erreur");

    return;

    }

     

     

    et il m'affiche en effet cette messageBox :/

     

    Salut,

     

    Enfait il arrive pas a récupéré juste les valeurs changé, si je change qu'une ligne il est pas content. Et il ne fait pas la mise à jour dans le dataGridView de la nouvelle quantité.

     

    Edit:

     

    Il n'arrive pas a changé toutes les valeurs. Voila ce que j'ai remarqué:

     

    Si je change qu'une ligne -> il ne fait rien.

     

    Si je change les 2 lignes présente -> il attribu la premiere valeurs que je rentre au 2 lignes

    jeudi 8 mai 2008 14:08
  • Bonjour,

     

    J'ai essayé de modifié le code mais j'ai du me résoudre à revenir au votre. Les erreurs du code précédents sont donc toujours présentes:

     

     

    Si je change qu'une ligne -> il ne fait rien.

     

    Si je change les 2 lignes présente -> il attribu la premiere valeurs que je rentre au 2 lignes

     

     

    Si je change qu'une ligne -> il ne fait rien.

     

    Si je change les 2 lignes présente -> il attribu la premiere valeurs que je rentre au 2 lignes

    vendredi 9 mai 2008 06:42
  • J'ai mis à jour:

    using System;

    using System.Collections.Generic;

    using System.ComponentModel;

    using System.Data;

    using System.Drawing;

    using System.Text;

    using System.Windows.Forms;

    using ComponentFactory.Krypton.Toolkit;

    namespace TheProject

    {

    public partial class frmEditRecette : ComponentFactory.Krypton.Toolkit.KryptonForm

    {

    private int _idRecette;

    public int IdRecette

    {

    get { return _idRecette; }

    set { _idRecette = value; }

    }

    private int _idProduct;

    public int IdProduct

    {

    get { return _idProduct; }

    set { _idProduct = value; }

    }

    public frmEditRecette()

    {

    InitializeComponent();

    // bind des données

    DataTable dt = new DataTable();

    DataTable updatedData = new DataTable();

    dt.Columns.Add("RecetteId", typeof(int));

    dt.Columns.Add("Composant", typeof(string));

    dt.Columns.Add("Quantity", typeof(int));

    dt.Rows.Add(1, "Comp1", 2);

    dt.Rows.Add(1, "Comp2", 1);

    dt.Rows.Add(1, "Comp3", 5);

    dt.AcceptChanges();

    this.kryptonDataGridView1.DataSource = dt;

    }

    private void dataBaseReload()

    {

    dataBase mydatabase = new dataBase("localhost", "theproject", "root");

    bool connectionStatus = mydatabase.SelectRecette("SELECT xdb_element.id, xdb_element.name, xdb_element.price, xdb_category.name category, xdb_recette.name recette, xdb_recettecomposant.qt, xdb_recettecomposant.id idrecettecomposant FROM xdb_element INNER JOIN xdb_recettecomposant ON xdb_element.id = xdb_recettecomposant.element INNER JOIN xdb_recette ON xdb_recettecomposant.recette = xdb_recette.id INNER JOIN xdb_category ON xdb_element.category = xdb_category.id WHERE recette=" + _idRecette + ";");

    kryptonDataGridView1.DataSource = mydatabase.myDataTable;

    //kryptonDataGridView1.Columns["id"].Visible = false;

    kryptonDataGridView1.Columns["name"].HeaderText = "Nom";

    kryptonDataGridView1.Columns["category"].HeaderText = "Catégorie";

    kryptonDataGridView1.Columns["price"].HeaderText = "Prix/Kg";

    kryptonDataGridView1.Columns["qt"].HeaderText = "Quantité";

    kryptonDataGridView1.Columns["id"].Visible = true;

    kryptonDataGridView1.Columns["idrecettecomposant"].Visible = false;

    kryptonDataGridView1.AutoGenerateColumns = true;

    kryptonDataGridView1.Refresh();

    DataTable table = (DataTable)kryptonDataGridView1.DataSource;

    double totalPrice = 0;

    foreach (DataRow row in table.Rows)

    {

    totalPrice += Double.Parse(row["price"].ToString()) * Double.Parse(row["qt"].ToString());

    // totalPrice += Double.Parse(row["qt"].ToString());

    }

    toolStripStatusLabel1.Text = "Prix total: " + totalPrice.ToString() + "CHF";

    bool insertPrice = mydatabase.updateAll("UPDATE xdb_recette SET price='" + totalPrice.ToString() + "' WHERE id=" + IdRecette + "");

    }

    private void toolStripButton1_Click(object sender, EventArgs e)

    {

    frmAddTheToRecette _frmAddTheToRecette = new frmAddTheToRecette();

    _frmAddTheToRecette.IdRecette = this.IdRecette;

    _frmAddTheToRecette.ShowDialog();

    dataBaseReload();

    }

    private void toolStripButton2_Click(object sender, EventArgs e)

    {

    frmAddAromToRecette _frmAddAromToRecette = new frmAddAromToRecette();

    _frmAddAromToRecette.IdRecette = this.IdRecette;

    _frmAddAromToRecette.ShowDialog();

    dataBaseReload();

    }

    private void toolStripButton3_Click(object sender, EventArgs e)

    {

    frmAddDecoToRecette _frmAddDecoToRecette = new frmAddDecoToRecette();

    _frmAddDecoToRecette.IdRecette = this.IdRecette;

    _frmAddDecoToRecette.ShowDialog();

    dataBaseReload();

    }

    private void frmEditRecette_Load(object sender, EventArgs e)

    {

    dataBaseReload();

    }

    private void toolStripButton4_Click(object sender, EventArgs e)

    {

    dataBase mydatabase = new dataBase("localhost", "theproject", "root");

    bool insertArome = mydatabase.updateAll("DELETE FROM xdb_recetteComposant WHERE id=" + kryptonDataGridView1.CurrentRow.Cells["idrecettecomposant"].Value.ToString() + "");

    if (insertArome)

    {

    MessageBox.Show("Suppression des données effectuées avec succès", "suppression", MessageBoxButtons.OK, MessageBoxIcon.Information);

    dataBaseReload();

    }

    else

    {

    MessageBox.Show("Suppression des données non effectuées", "suppression", MessageBoxButtons.OK, MessageBoxIcon.Warning);

    }

    }

    private void toolStripButton5_Click(object sender, EventArgs e)

    {

    dataBase mydatabase = new dataBase("localhost", "theproject", "root");

    // on récupère la DataTable source et on prends uniquement les lignes mises à jour

    DataTable dt = this.kryptonDataGridView1.DataSource as DataTable;

    DataTable updatedData = dt.GetChanges(DataRowState.Modified);

     

     

    if (null == updatedData)

    {

    return;

    }

    // pour chaque ligne mise à jour on fait un UPDATE

    bool successAll = true;

    foreach (DataRow dr in updatedData.Rows)

    {

    bool updated = mydatabase.updateAll("UPDATE xdb_recetteComposant SET qt=" + dr["qt"].ToString() + " WHERE element=" + dr["id"].ToString() + " AND recette="+ _idRecette.ToString() +";");

    if (updated)

    {

    // l'update à réussi, on met à jour le statut de la ligne

    dr.AcceptChanges();

    }

    successAll = successAll && updated;

    }

    // message utilisateur en fonction de si toutes les mises à jour ont réussi ou non

    if (successAll)

    {

    MessageBox.Show("La mise à jour a été effectuée", "Mise à jour des quantités", MessageBoxButtons.OK, MessageBoxIcon.Information);

    }

    else

    {

    MessageBox.Show("La mise à jour n'a pas pu être effectuée", "Mise à jour des quantités", MessageBoxButtons.OK, MessageBoxIcon.Warning);

    }

    dataBaseReload();

    }

    }

    }

     

     

    Mais toujours les mêmes erreurs :/

    vendredi 9 mai 2008 10:38