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 !