Ma DataTable ne se met pas à jour. [Résolu]

djmic 70 Messages postés mardi 25 mars 2008Date d'inscription 9 juillet 2010 Dernière intervention - 8 juil. 2010 à 12:33 - Dernière réponse : djmic 70 Messages postés mardi 25 mars 2008Date d'inscription 9 juillet 2010 Dernière intervention
- 9 juil. 2010 à 22:36
Bonjour à tous,

Voilà je suis sur un projet de gestion de bar + comptes.
Travaillant avec des mdi, à tout moments les mdiChildren doivent être rechargés si des modifs ont été faites dans la bdd.

voici la partie de code minimum

namespace PingStockBar
{
    public partial class Conso : Form
    {
        public Conso()
        {
            InitializeComponent();
            Program.MajEvent += new Program.MajEventDelegate(Program_MajEvent);
        }
        DataTable dt;
        bool ctrlEnfonce = false;
        string type_conso = "normale";

        private void essai_Load(object sender, EventArgs e)
        {
            this.KeyPreview = true;
            
            //on récupère tous les produits
            pingDataSet1.Clear();
            oleDbDataAdapter1.Fill(pingDataSet1, "Produits");
            dt = pingDataSet1.Tables["Produits"];

            //on remplit la combobox des comptes
            string strsql = "select * from Comptes ORDER BY nom_compte ASC";
            OleDbDataAdapter dtad = new OleDbDataAdapter(strsql, oleDbConnection1);
            dtad.Fill(pingDataSet1, "Comptes");
            cbComptes.DisplayMember = "nom_compte";
            cbComptes.ValueMember = "somme";
            cbComptes.DataSource = pingDataSet1.Tables["Comptes"];
            btBiere_Click(sender, e);//on simule le clic sur le bouton bière
        }

        //au clic sur le bouton bière
        private void btBiere_Click(object sender, EventArgs e)
        {
            flowLayoutPanel1.Controls.Clear();//on supprime tous les boutons du panel
            for (int i = 0; i < dt.Rows.Count; i++)
            {
                if ((dt.Rows[i]["type"]).ToString() == "bière")//pour chacune des boissons du type biere
                {
                    string nom = (dt.Rows[i]["nom_product"]).ToString();
                    string nom2 = nom.Replace(" ", "_");
                    Button a = new Button();
                    a.Height = 120;
                    a.Width = 120;
                    a.Margin = new Padding(0);                   
                    a.Tag = i;
                    a.BackgroundImage = System.Drawing.Image.FromFile(@"Images/" + nom2 + ".jpg");
                    a.Font = new Font(a.Font, FontStyle.Bold);
                    a.TextAlign = ContentAlignment.TopCenter;
                    if (Convert.ToInt32(dt.Rows[i]["stock"]) == 0)
                    {
                        a.Text = "Plus en Stock";
                    }
                    a.Click += new System.EventHandler(this.btProduit_Click);
                    flowLayoutPanel1.Controls.Add(a);
                }
            }
        }

        //au clic sur un des bouton produit
        private void btProduit_Click(object sender, System.EventArgs e)
        {        
            bool ok = false;
            Button bouton = (Button)sender;//on récupère le bouton qui a généré l'evenement
            int posProduit = Convert.ToInt32(bouton.Tag);
            string produit = dt.Rows[posProduit]["nom_product"].ToString();
            int enStock = Convert.ToInt32(dt.Rows[posProduit]["stock"]);
            int i;
            double prix = 0.00;


            //on récupère son prix
            prix = Convert.ToDouble(dt.Rows[posProduit]["prix"]);

            //on vérifie si le produit est déjà dans la liste
            for (i = 0; i < dataGridView1.Rows.Count; i++)
            {
                if (dataGridView1[0, i].Value.Equals(produit))
                {
                    ok = true;
                    break;
                }
            }
            if (!ctrlEnfonce)
            {
                if (!ok)
                {
                    if (enStock <= 0)//s'il n'est plus en stock
                    {
                        MessageBox.Show("Le produit n'est plus en stock");
                    }
                    else
                    {
                        dataGridView1.Rows.Add(produit, 1);
                        tbTotal.Text = (Convert.ToDouble(tbTotal.Text) + prix).ToString();
                        dt.Rows[posProduit]["stock"] = enStock - 1;
                        if (Convert.ToInt32(dt.Rows[posProduit]["stock"]) == 0) bouton.Text = "Plus en stock";
                        else bouton.Text = "";
                    }
                }
                else if (ok)
                {
                    if (enStock <= 0)
                    {
                        MessageBox.Show("Le produit n'est plus en stock");
                    }
                    else
                    {
                        dataGridView1[1, i].Value = Convert.ToInt32(dataGridView1[1, i].Value) + 1;
                        tbTotal.Text = (Convert.ToDouble(tbTotal.Text) + prix).ToString();
                        dt.Rows[posProduit]["stock"] = enStock - 1;//on déduit le 1 le stock restant du produit
                        if (Convert.ToInt32(dt.Rows[posProduit]["stock"]) == 0) bouton.Text = "Plus en stock";
                        else bouton.Text = "";
                    }
                }
            }
            else if (ctrlEnfonce)
            {
                if (ok)
                {
                    if (Convert.ToInt32(dataGridView1[1, i].Value) == 1)
                    {
                        dataGridView1.Rows.RemoveAt(i);//on le supprime de la liste
                        tbTotal.Text = (Convert.ToDouble(tbTotal.Text) - prix).ToString();
                    }
                    else if (Convert.ToInt32(dataGridView1[1, i].Value) > 1)
                    {
                        dataGridView1[1, i].Value = (Convert.ToInt32(dataGridView1[1, i].Value) - 1).ToString();
                        tbTotal.Text = (Convert.ToDouble(tbTotal.Text) - prix).ToString();
                    }
                    dt.Rows[posProduit]["stock"] = enStock + 1;
                    if (Convert.ToInt32(dt.Rows[posProduit]["stock"]) == 0) bouton.Text = "Plus en stock";
                    else bouton.Text = "";
                }
            }            
        }

        private void btValider_Click(object sender, EventArgs e)
        {
                //modifications sur la base de données
                oleDbDataAdapter1.Update(dt);
        }


        //Evenement généré lors d'une modification dans une autre form
        //============================================================
        void Program_MajEvent(Form sender)
        {
            //on fait identiquement la même chose qu'au chargement
            //====================================================
            pingDataSet1.Clear();
            oleDbDataAdapter1.Fill(pingDataSet1, "Produits");
            dt = pingDataSet1.Tables["Produits"];
            string strsql = "select * from Comptes ORDER BY nom_compte ASC";
            OleDbDataAdapter dtad = new OleDbDataAdapter(strsql, oleDbConnection1);
            dtad.Fill(pingDataSet1, "Comptes");
            cbComptes.DisplayMember = "nom_compte";
            cbComptes.ValueMember = "somme";
            cbComptes.DataSource = pingDataSet1.Tables["Comptes"];
            btBiere_Click(sender, null);//on simule le clic sur le bouton bière
        }


    }
}


Le problème est au niveau de l'évènement "void Program_MajEvent(Form sender)"
Il fait complètement la même qu'au chargement mais les modification faites auparavant par une autre forme ne sont pas répercutées.
Pourtant lorsque je ferme ma form est que je la réouvre, la modification est faites.

Quelqu'un pourrait me dire d'où pourrait provenir le problème?

Merci, bonne journée.
Afficher la suite 

Votre réponse

20 réponses

Meilleure réponse
nhervagault 6069 Messages postés dimanche 13 avril 2003Date d'inscription 15 juillet 2011 Dernière intervention - 9 juil. 2010 à 22:22
3
Merci
J'ai trouvé
Il faut fermé la connection pour valider l'insertion;-)

Bon dev

Merci nhervagault 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 96 internautes ce mois-ci

Commenter la réponse de nhervagault
Meilleure réponse
nhervagault 6069 Messages postés dimanche 13 avril 2003Date d'inscription 15 juillet 2011 Dernière intervention - 9 juil. 2010 à 22:28
3
Merci
Si pour les datatables
Mais dans le codes c'est un commande direct que tu utilises
OleDbCommand commande = new OleDbCommand();
...
commande.ExecuteNonQuery();
connect.Close();
Program.RaiseMajEvent(this);
.........
finally
{
if (connect.State == ConnectionState.Open)
connect.Close();
}

Donc il faut fermer la connection pour mettre a jour la base

Merci nhervagault 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 96 internautes ce mois-ci

Commenter la réponse de nhervagault
djmic 70 Messages postés mardi 25 mars 2008Date d'inscription 9 juillet 2010 Dernière intervention - 8 juil. 2010 à 12:39
0
Merci
l'évenement " private void btProduit_Click(object sender, System.EventArgs e)" peut être écarté, il n'intervient pas dans le problème.
Commenter la réponse de djmic
djmic 70 Messages postés mardi 25 mars 2008Date d'inscription 9 juillet 2010 Dernière intervention - 8 juil. 2010 à 12:42
0
Merci
pour résumer et pour être plus clair

namespace PingStockBar
{
    public partial class Conso : Form
    {
        public Conso()
        {
            InitializeComponent();
            Program.MajEvent += new Program.MajEventDelegate(Program_MajEvent);
        }
        DataTable dt;
        bool ctrlEnfonce = false;
        string type_conso = "normale";

        private void essai_Load(object sender, EventArgs e)
        {
            this.KeyPreview = true;
            
            //on récupère tous les produits
            pingDataSet1.Clear();
            oleDbDataAdapter1.Fill(pingDataSet1, "Produits");
            dt = pingDataSet1.Tables["Produits"];

            //on remplit la combobox des comptes
            string strsql = "select * from Comptes ORDER BY nom_compte ASC";
            OleDbDataAdapter dtad = new OleDbDataAdapter(strsql, oleDbConnection1);
            dtad.Fill(pingDataSet1, "Comptes");
            cbComptes.DisplayMember = "nom_compte";
            cbComptes.ValueMember = "somme";
            cbComptes.DataSource = pingDataSet1.Tables["Comptes"];
            btBiere_Click(sender, e);//on simule le clic sur le bouton bière
        }

        //au clic sur le bouton bière
        private void btBiere_Click(object sender, EventArgs e)
        {
            flowLayoutPanel1.Controls.Clear();//on supprime tous les boutons du panel
            for (int i = 0; i < dt.Rows.Count; i++)
            {
                if ((dt.Rows[i]["type"]).ToString() == "bière")//pour chacune des boissons du type biere
                {
                    string nom = (dt.Rows[i]["nom_product"]).ToString();
                    string nom2 = nom.Replace(" ", "_");
                    Button a = new Button();
                    a.Height = 120;
                    a.Width = 120;
                    a.Margin = new Padding(0);                   
                    a.Tag = i;
                    a.BackgroundImage = System.Drawing.Image.FromFile(@"Images/" + nom2 + ".jpg");
                    a.Font = new Font(a.Font, FontStyle.Bold);
                    a.TextAlign = ContentAlignment.TopCenter;
                    if (Convert.ToInt32(dt.Rows[i]["stock"]) == 0)
                    {
                        a.Text = "Plus en Stock";
                    }
                    a.Click += new System.EventHandler(this.btProduit_Click);
                    flowLayoutPanel1.Controls.Add(a);
                }
            }
        }

        //au clic sur un des bouton produit
        private void btProduit_Click(object sender, System.EventArgs e)
        {        
            ........
            ........
        }

        private void btValider_Click(object sender, EventArgs e)
        {
                //modifications sur la base de données
                .........
                .........
                //mise à jour de la bdd
                oleDbDataAdapter1.Update(dt);
        }


        //Evenement généré lors d'une modification dans une autre form
        //============================================================
        void Program_MajEvent(Form sender)
        {
            //on fait identiquement la même chose qu'au chargement
            //====================================================
            pingDataSet1.Clear();
            oleDbDataAdapter1.Fill(pingDataSet1, "Produits");
            dt = pingDataSet1.Tables["Produits"];
            string strsql = "select * from Comptes ORDER BY nom_compte ASC";
            OleDbDataAdapter dtad = new OleDbDataAdapter(strsql, oleDbConnection1);
            dtad.Fill(pingDataSet1, "Comptes");
            cbComptes.DisplayMember = "nom_compte";
            cbComptes.ValueMember = "somme";
            cbComptes.DataSource = pingDataSet1.Tables["Comptes"];
            btBiere_Click(sender, null);//on simule le clic sur le bouton bière
        }


    }
}

Commenter la réponse de djmic
nhervagault 6069 Messages postés dimanche 13 avril 2003Date d'inscription 15 juillet 2011 Dernière intervention - 8 juil. 2010 à 21:22
0
Merci
Salut,

Si c'est une base acces, il ne faut pas qu'elle ne soit pas dans le repertoire bin de l'application.

Essayes de la mettre ailleurs et retestes

Bon dev
Commenter la réponse de nhervagault
djmic 70 Messages postés mardi 25 mars 2008Date d'inscription 9 juillet 2010 Dernière intervention - 8 juil. 2010 à 22:51
0
Merci
non la base de données Access est dans un répertoire Datas à la même racine que le projet.
Maintenant si je dis pas de bêtises, en mode Debug, il travaille avec le répertoire bin dans lequel il y a une copie de tout le projet???
Commenter la réponse de djmic
nhervagault 6069 Messages postés dimanche 13 avril 2003Date d'inscription 15 juillet 2011 Dernière intervention - 9 juil. 2010 à 07:26
0
Merci
OK
As-tu une update commande sur ton dataadapter?
Apparament non, il faudrait inserer une updatecommande

http://msdn.microsoft.com/fr-fr/library/system.data.oledb.oledbdataadapter.updatecommand.aspx
Commenter la réponse de nhervagault
djmic 70 Messages postés mardi 25 mars 2008Date d'inscription 9 juillet 2010 Dernière intervention - 9 juil. 2010 à 10:48
0
Merci
Bonjour,

Si, le oleDbDataAdapter1 qui travaille au niveau des produits contient tous les types de requêtes
La preuve, je l'utilise ici

private void btValider_Click(object sender, EventArgs e)
{
      //modifications sur la base de données
      .........
      .........
      //mise à jour de la bdd
      oleDbDataAdapter1.Update(dt);
}


Maintenant je viens de remarquer que lors que je fais deux modifications consécutives, à la deuxième modif, au voit la premier modif, mais pas la seconde (celle que je viens de faire)

en espérant que tu m'as compris, j'ai l'impression que j'ai fait quelque chose dans le mauvais ordre...

Merci pour le temps que tu me consacres
Commenter la réponse de djmic
nhervagault 6069 Messages postés dimanche 13 avril 2003Date d'inscription 15 juillet 2011 Dernière intervention - 9 juil. 2010 à 19:08
0
Merci
Je ne vois pas
oleDbDataAdapter1.UpdateCommand dans ton code

Il est peut etre genéré dans la partie design

Pour rappel
Sur un adapter tu peux avoir
un selectcommand
un insertcommand
un updatecommand
un deletecommand

Apres le update mets a jour en fonction du datarowversion de la datarow
exemple
added --> insert
modified --> updated
deleted --> delete
unchanged --> rien
detached --> roien

si tu passes un acceptchanged --> tout devient vers unchanged sauf les detached

En espérant que tu as compris.

Bon dev
Commenter la réponse de nhervagault
djmic 70 Messages postés mardi 25 mars 2008Date d'inscription 9 juillet 2010 Dernière intervention - 9 juil. 2010 à 19:38
0
Merci
bonjour,

désolé je n'ai pas trop compris.
pour ce qui est des différentes commandes, je ne les ai pas définies dans le code behind.
J'ai utilisé le contrôle oleDbDataAdapter que j'ai déposé sur ma form et ai configuré la selectCommand et il a généré les autres requêtes.
Mais ma table se met bien à jour, puisque si je referme ma form et que je la relance, les changements se voient...

Merci
Commenter la réponse de djmic
nhervagault 6069 Messages postés dimanche 13 avril 2003Date d'inscription 15 juillet 2011 Dernière intervention - 9 juil. 2010 à 19:47
0
Merci
J'ai pas trop compris alors.

Peux-tu mettre le programme sur un site de partage. que je vois qu'il fait?
JE comprendrais mieux.

C'est un probleme de rechargement?
Un probleme de base de données ??

Alors qu'est-ce qu'il ne fonctionne pas.

Chargement --> OK
Modification --> OK
Rechargement --> KO mais OK en base??

J'ai un peu de mal à comprendre
Commenter la réponse de nhervagault
djmic 70 Messages postés mardi 25 mars 2008Date d'inscription 9 juillet 2010 Dernière intervention - 9 juil. 2010 à 20:04
0
Merci
Tu peux télécharger le projet à cette adresse ici.
Il y a tout le projet.
Pour la connexion --> login: admin mdp: password

Pour le programme, quand tu es connecté il y a une partie sur le menu, compte--> consommation, c'est le panneau avec les produits.
ensuite tu ouvres aussi via le menu produits--> ajouter (tu peux ajouter Aquarius orange et Aquarius citron, écrits de cette manière car il y a les images associés)

donc en ayant les deux formes ouvertes, en ajoute une des deux boissons, les panneaux de boutons devraient se remettre à jour, mais ce n'est pas le cas.
Sauf quand je fais deux modifs consécutives.
par exemple, j'ajoute l'aquarius citron, on voit que la form de consommation se "rafraichi" mais quand on va voir les boutons pour les softs, l'aquarius citron n'est pas rajouté.
maintenant sans fermer la form tu rajoutes l'aquarius orange et là il va de nouveau se rafraichir, et si tu vas voir les boutons pour les softs, là l'aquarius citron sera rajouté mais pas l'aquarius orange.

Je te remercie encore.
Commenter la réponse de djmic
djmic 70 Messages postés mardi 25 mars 2008Date d'inscription 9 juillet 2010 Dernière intervention - 9 juil. 2010 à 20:46
0
Merci
Ca va tu t'y retrouves?
Commenter la réponse de djmic
nhervagault 6069 Messages postés dimanche 13 avril 2003Date d'inscription 15 juillet 2011 Dernière intervention - 9 juil. 2010 à 21:11
0
Merci
Je pense
Comme tu ajoutes un soft et tu recharges les bieres c'est normal
Si tu charges un soft il faut rechercher les softs.

Il faut passer comme argument le type d'ajout.

La structure de ton application n'est pas tres top.
Il y a beaucoup de faute de conception mais c'est une autre histoire.

Bon dev.
Commenter la réponse de nhervagault
djmic 70 Messages postés mardi 25 mars 2008Date d'inscription 9 juillet 2010 Dernière intervention - 9 juil. 2010 à 21:31
0
Merci
Ce n'est pas là le problème puisqu'il suffit de rajouter une bière et c'est toujours le même problème.
Je vois vraiment pas d'où peut venir le problème.

Maintenant quand tu parles de ma structure d'application, que veux-tu dire quand tu dis qu'elle est pas top?

Merci
Commenter la réponse de djmic
nhervagault 6069 Messages postés dimanche 13 avril 2003Date d'inscription 15 juillet 2011 Dernière intervention - 9 juil. 2010 à 21:51
0
Merci
oui pour la structure

moi j'ai pas e pb pour l'ajout de biere j'ai pas modifé le code
Commenter la réponse de nhervagault
nhervagault 6069 Messages postés dimanche 13 avril 2003Date d'inscription 15 juillet 2011 Dernière intervention - 9 juil. 2010 à 21:57
0
Merci
pour ameiloré la structure
il faut faire des fonctions dans les events button biere par exemple
et c'est la fonction qui est appellé a la place du conentu de l'evt


exemple tres rapide


btn_biere....
mafonctionbiere
fin btn_biere

mafunctionbiere
load des biere
fin mafunctionbiere

eventload dansprgram
mafunctionbiere
fin eventload
Commenter la réponse de nhervagault
djmic 70 Messages postés mardi 25 mars 2008Date d'inscription 9 juillet 2010 Dernière intervention - 9 juil. 2010 à 22:03
0
Merci
Oui je comptais le faire à partir du moment où ca fonctionnait, en mettant dans une fonctionne ce qui est commun au chargement et au clic sur le bouton.

Pour moi ca ne fonctionne toujours pas.
est-ce que tu as fait une installe ou tu l'as lancé sous visual?
C'est bizarre, je vais faire une install, si ca fonctionne pas je vais devoir faire autrement.
Commenter la réponse de djmic
djmic 70 Messages postés mardi 25 mars 2008Date d'inscription 9 juillet 2010 Dernière intervention - 9 juil. 2010 à 22:23
0
Merci
Je dois la fermer où?
Le dataAdapter ne gère pas la connexion tout seul?
Commenter la réponse de djmic
djmic 70 Messages postés mardi 25 mars 2008Date d'inscription 9 juillet 2010 Dernière intervention - 9 juil. 2010 à 22:36
0
Merci
Effectivement c'est super sympa.
Quand on cherche pas au bon endroit, on ne peut pas trouver, en plus j'étais loin de là de savoir qu'une connexion restée ouverte aurait pu causer cela.

Vraiment un très grand merci
Commenter la réponse de djmic

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.