Mise à jour dataGridView

1 post / 0 new
kiwiCH
Mise à jour dataGridView

Bonjour,

J'ai dans une forme un dataGridView relié à une base de donnée. Dans ce datagrid, j'ai une colonne quantité qui doit pouvoir être changé et mis à jour avec la nouvelle valeur.

J'ai 2 problèmes:
- 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

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 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();
        }
    }
}

Si vous avez une solution je suis plus que prenneur !