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 !

