Affichage position lors ajout + enregistrement dans base de données

loic20h28 Messages postés 207 Date d'inscription mardi 19 juin 2007 Statut Membre Dernière intervention 22 février 2016 - 10 avril 2009 à 21:37
loic20h28 Messages postés 207 Date d'inscription mardi 19 juin 2007 Statut Membre Dernière intervention 22 février 2016 - 19 mai 2009 à 16:56
Bonjour,

Je réalise une application en WinForm avec le langage C#, avec une base de données dans le SGBD SqlServer 2000.


J'ai mon formulaire principal nommée "Fm_menu" et mon autre formulaire
nommé "Fm_Employe" (d'autre formulaire arriverons par la suite.)

Dans ma base de données j'ai 2 tables :

tp1_employe(numero, nom, prenom, cadre, sexe, sce#)

tp1_service(code, designation)

le champ sce de la table tp1_employe fais référence au champ code de la table tp1_service.

Au niveau du formulaire "Fm_Menu", j'ai :

* un dataAdapteur pour chaque table ("dbAd_employe" et dbAd_service")

* un dataSet regroupant le tout ("dbDs_emplsce")

* un SqlConnexion ("dbCo_gesper")

A l'intérieur de mon formulaire principal, pour le moment j'ai un bouton nommé "bt_employe".

voici le code associé à ce formulaire :
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace Fiche5
{
    public partial class Fm_Menu : Form
    {
        public Fm_Menu()
        {
            InitializeComponent();
            dbDs_empSce1.Clear();
            dbAd_employe.Fill(dbDs_empSce1, "tp1_employe");
            dbAd_service.Fill(dbDs_empSce1, "tp1_service");
        }

        private void bt_employe_Click(object sender, EventArgs e)
        {
            Fm_employe FE = new Fm_employe(dbDs_empSce1);        
            FE.Show();
        }
}

Ensuite dans ma "Fm_employe", j'ai:

* Une textBox pour numero, nom, prenom, salaire. ("tb_numero", "tb_nom", "tb_prenom", "tb_salaire")

* Une comboBox pour le service.

* Une checkBox pour le cadre(coché si c'est un cadre sinon pas coché)

* deux radio bouton dans un GroupBox pour chaque sexe("rb_masculin", "rb_feminin")


voici le code associé à ce formulaire :

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace Fiche5
{
    public partial class Fm_employe : Form
    {
        public dbDs_empSce dbDs;

        public Fm_employe()
        {
            InitializeComponent();
        }

        public Fm_employe(dbDs_empSce p_dbDs): this()
        {
            dbDs = p_dbDs;

            // Affichage des données correspondants aux textBox
            this.tb_numero.DataBindings.Add("Text", dbDs, "tp1_employe.numero");
            this.tb_nom.DataBindings.Add("Text", dbDs, "tp1_employe.nom");
            this.tb_prenom.DataBindings.Add("Text", dbDs, "tp1_employe.prenom");
            this.tb_salaire.DataBindings.Add("Text", dbDs, "tp1_employe.salaire");
          
            // Checked pas Text.
            this.cb_cadre.DataBindings.Add("Checked", dbDs, "tp1_employe.cadre");
          
            // Cas particulier de la liste des services
            this.cb_service.DataSource = dbDs.tp1_service;
            this.cb_service.DisplayMember = "designation";
            this.cb_service.ValueMember = "code";
            this.cb_service.DataBindings.Add("SelectedValue", dbDs, "tp1_employe.sce");
           
            // Affichage du sexe de l'employé
            DataRowView rowView = this.BindingContext[dbDs, dbDs.tp1_employe.TableName].Current as DataRowView;
            if ((bool)rowView.Row["sexe"] == true)
                this.rb_masculin.Checked = true;
            else
                this.rb_feminin.Checked = true;

            affichePosCpt();
        }

        private void affichePosCpt()
        {
            string total = (this.BindingContext[dbDs, dbDs.tp1_employe.TableName].Count).ToString();
            string num = ((this.BindingContext[dbDs, dbDs.tp1_employe.TableName].Position) + 1).ToString();
            tb_posCpt.Text = num + "/" + total;
        }

        private void bt_premier_Click(object sender, EventArgs e)
        {
            this.BindingContext[dbDs, dbDs.tp1_employe.TableName].CancelCurrentEdit();
            this.BindingContext[dbDs, dbDs.tp1_employe.TableName].Position = 0;
            DataRowView rowView = this.BindingContext[dbDs, dbDs.tp1_employe.TableName].Current as DataRowView;
            if ((bool)rowView.Row["sexe"] == true)
                this.rb_masculin.Checked = true;
            else
                this.rb_feminin.Checked = true;

            affichePosCpt();
        }

        private void bt_precedent_Click(object sender, EventArgs e)
        {
            this.BindingContext[dbDs, dbDs.tp1_employe.TableName].CancelCurrentEdit();
            this.BindingContext[dbDs, dbDs.tp1_employe.TableName].Position--;
            DataRowView rowView = this.BindingContext[dbDs, dbDs.tp1_employe.TableName].Current as DataRowView;
            if ((bool)rowView.Row["sexe"] == true)
                this.rb_masculin.Checked = true;
            else
                this.rb_feminin.Checked = true;

            affichePosCpt();

        }

        private void bt_suivant_Click(object sender, EventArgs e)
        {
            this.BindingContext[dbDs, dbDs.tp1_employe.TableName].CancelCurrentEdit();
            this.BindingContext[dbDs, dbDs.tp1_employe.TableName].Position++;
            DataRowView rowView = this.BindingContext[dbDs, dbDs.tp1_employe.TableName].Current as DataRowView;
            if ((bool)rowView.Row["sexe"] == true)
                this.rb_masculin.Checked = true;
            else
                this.rb_feminin.Checked = true;

            affichePosCpt();

        }

        private void bt_dernier_Click(object sender, EventArgs e)
        {
            this.BindingContext[dbDs, dbDs.tp1_employe.TableName].CancelCurrentEdit();
            this.BindingContext[dbDs, dbDs.tp1_employe.TableName].Position = this.BindingContext[dbDs, dbDs.tp1_employe.TableName].Count - 1;
            DataRowView rowView = this.BindingContext[dbDs, dbDs.tp1_employe.TableName].Current as DataRowView;
            if ((bool)rowView.Row["sexe"] == true)
                this.rb_masculin.Checked = true;
            else
                this.rb_feminin.Checked = true;

            affichePosCpt();

        }

        private void bt_ajouter_Click(object sender, EventArgs e)
        {
            this.BindingContext[dbDs, dbDs.tp1_employe.TableName].AddNew();
            affichePosCpt();
            tb_numero.Text = System.Guid.NewGuid().ToString();
            tb_nom.Text = "";
            tb_prenom.Text = "";
            tb_salaire.Text = "";
        }

        private void bt_suppression_Click(object sender, EventArgs e)
        {
            this.BindingContext[dbDs, dbDs.tp1_employe.TableName].RemoveAt(this.BindingContext[dbDs, dbDs.tp1_employe.TableName].Position);
            affichePosCpt();
        }

        private void bt_validation_Click(object sender, EventArgs e)
        {
            DialogResult dr = MessageBox.Show("Voulez-vous sauvegarder tout les changements?", "Sauvegarder et Quitter l'application", MessageBoxButtons.YesNo);
            if (dr == DialogResult.Yes)
            {
                DataRowView rowView = this.BindingContext[dbDs, dbDs.tp1_employe.TableName].Current as DataRowView;
                if (this.rb_masculin.Checked)
                    rowView["Sexe"] = true;
                else
                    rowView["Sexe"] = false;
            }

        }
    }
}

J'ai 2 problème :

1) Dans mon formulaire "Fm_Employe", lorsque j'ajoute un employé (que
je clique sur le bouton "bt_ajout"), j'ai la textBox "tb_posCpt" (qui
affiche la position de l'employé et le nombre total d'employé,
num/total)et si j'ai 2 employé dans la base, j'en rajoute un, j'en es
donc 3. Ben dans la textBox, il m'affiche 1/3 alors que je devrais
obtenir 3/3, comment puis je faire?? (voir ci-dessus la méthode
"affichePosCpt()" de la classe "Fm_Employe" et le code du bouton
"bt_ajouter")

2) Toujours dans le même formulaire, je vois pas trop comment faire
pour enregistrer les modifications et/ou ajout d'employé vu que mon dataAdapter est au niveau du formulaire "Fm_Menu", quelqu'un a t-il une idée??

Merci d'avance!!

2 réponses

loic20h28 Messages postés 207 Date d'inscription mardi 19 juin 2007 Statut Membre Dernière intervention 22 février 2016 2
18 mai 2009 à 23:27
Bonjour tout le monde,

Après avoir réfléchi, chercher, ..... mais problème ne sont plus les mêmes, les voici :
1) Enregistrer un nouveau employé plus précisément le numéro de l'employé => Lorsque j'ajoute et surtout que j'enregistre le nouveau employé dans mon formulaire, il s'enregistre mais le numéro prend comme valeur "auto" alors    qu'il devrait prendre comme valeur un numéro de type : B8319CB4-5CFA-4922-A9B8-8B64F9F29610. Pour cela, j'exécute une procédure stockée. Voici mon code
a)  Form_Employé => bouton ajouter()
        private void bt_ajout_Click(object sender, EventArgs e)
        {
            this.BindingContext[dbDs, dbDs.tp1_employe.TableName].AddNew();
            affichePosCpt();
            surAjout();
            Sexe();
        }

b) Form_Principal
 public Fm_principal()
        {
            InitializeComponent();
            dbDs_empSce1.Clear();
            dbAd_service.Fill(dbDs_empSce1, "tp1_service");
            dbAd_employe.Fill(dbDs_empSce1, "tp1_employe");
            dbDs_empSce1.tp1_employe.RowChanged += new DataRowChangeEventHandler(tp1_employe_RowChanged);
        }

        private void tp1_employe_RowChanged(object sender, DataRowChangeEventArgs e)
        {
            if (e.Action == DataRowAction.Add)
            {
                try
                {
                    dbCo_gesper.Open();
                    dbPs_idEmploye.ExecuteNonQuery();
                    dbCo_gesper.Close();
                    e.Row["numero"] = dbPs_idEmploye.Parameters["@myid"].Value.ToString();
                }
                catch (Exception pb)
                {
                    MessageBox.Show(pb.ToString());
                    e.Row.RejectChanges();
                }
            }
            if (e.Action == DataRowAction.Change)
            {
                try
                {
                    dbAd_employe.Update(new DataRow[] { e.Row });
                }
                catch (Exception pb)
                {
                    MessageBox.Show(pb.ToString());
                    e.Row.RejectChanges();
                }
            }
        }
c) la procédure stockée
CREATE PROCEDURE [dbo].[GETIDEMPLOYE] @myid char(36) OUTPUT
AS
SET @myid = NEWID()
GO
> Comment puis-je faire pour que la procédure stockée s'exécute correctement??

2) Supprimer service et employé => Dans un autre formulaire : FM_EmpSce, j'ai 2 partie : la première c'est les services et l'autre les employés. Lorsque je click sur le bouton 'supprimer' je souhaiterais que cela supprime les employé du service qui se supprime ensuite. Voici le code et le message d'erreur que j'obtiens :
a) Form_EmployeService => bouton supprimer()
private void bt_suppression_Sce_Click(object sender, EventArgs e)
        {
            MessageBox.Show("Il faut supprimer employé avant service");
            DialogResult dr = MessageBox.Show("Voulez-vous supprimer quand même?", "Supprimer et Quitter l'application", MessageBoxButtons.YesNo);
            if (dr == DialogResult.Yes)
            {
                this.BindingContext[dbDs, dbDs.tp1_employe.TableName].RemoveAt(this.BindingContext[dbDs, dbDs.tp1_employe.TableName].Position);
                this.BindingContext[dbDs, dbDs.tp1_service.TableName].RemoveAt(this.BindingContext[dbDs, dbDs.tp1_service.TableName].Position);
            }
        }
b) Form_Principal
 public Fm_Menu()
        {
            InitializeComponent();

            dbDs_EmpSce1.Clear();
            dbAd_employe.Fill(dbDs_EmpSce1, "tp1_employe");
            dbDs_EmpSce1.tp1_employe.RowDeleted += new DataRowChangeEventHandler(tp1_employe_RowDeleted);

            dbAd_service.Fill(dbDs_EmpSce1, "tp1_service");
            dbDs_EmpSce1.tp1_service.RowDeleted += new DataRowChangeEventHandler(tp1_service_RowDeleted);
        }

private void tp1_employe_RowDeleted(object sender, DataRowChangeEventArgs e)
        {
            if (e.Action == DataRowAction.Delete)
            {
                try
                {
                //    MessageBox.Show("erreur");
                    dbAd_employe.Update(new DataRow[] { e.Row });
                //    MessageBox.Show("erreur1");
                }
                catch (Exception pb)
                {
                    MessageBox.Show(pb.ToString());
                    e.Row.RejectChanges();
                }
            }
        }

        private void tp1_service_RowDeleted(object sender, DataRowChangeEventArgs e)
        {
            if (e.Action == DataRowAction.Delete)
            {
                try
                {
                  //  MessageBox.Show("erreur2");
                    dbAd_service.Update(new DataRow[] { e.Row });
                  //  MessageBox.Show("erreur3");
                }
                catch (Exception pb)
                {
                    MessageBox.Show(pb.ToString());
                    e.Row.RejectChanges();
                }
            }
        }

c) le message d'erreur :
System.Data.SqlClient.SqlException: Conflit entre l'instruction DELETE et la contrainte COLUMN REFERENCE 'FK__tp1_employe__sce__25869641'. Le conflit est survenu dans la base de données 'Gesper', table 'tp1_employe', column 'sce'.

L'instruction a été arrêtée.

   à System.Data.Common.DbDataAdapter.UpdatedRowStatusErrors(RowUpdatedEventArgs rowUpdatedEvent, BatchCommandInfo[] batchCommands, Int32 commandCount)

   à System.Data.Common.DbDataAdapter.UpdatedRowStatus(RowUpdatedEventArgs rowUpdatedEvent, BatchCommandInfo[] batchCommands, Int32 commandCount)

   à System.Data.Common.DbDataAdapter.Update(DataRow[] dataRows, DataTableMapping tableMapping)

   à System.Data.Common.DbDataAdapter.Update(DataRow[] dataRows)

   à Fiche5_B.Fm_Menu.tp1_service_RowDeleted(Object sender, DataRowChangeEventArgs e) dans C:\Documents and Settings\loic\Mes documents\Visual Studio 2005\Projects\Fiche5_B\Fiche5_B\Fm_Menu.cs:ligne 56

Je pense que ce problème est dut au faite que ça me supprime pas les employés du service mais un employé correspondant pas au service que je souhaite supprimer.
Comment je peux faire pour supprimer le(s) bon employé(s) du service que je souhaite supprimé??

Merci d'avance pour votre aide!!
0
loic20h28 Messages postés 207 Date d'inscription mardi 19 juin 2007 Statut Membre Dernière intervention 22 février 2016 2
19 mai 2009 à 16:56
Bonjour,

J'ai du nouveau pour mon deuxième problème.

Donc les méthodes 'tp1_service_RowDeleted' et 'tp1_employe_RowDeleted' et 'Fm_Menu()' sont identique.

Mais la méthode du bouton suppression du formulaire 'FM_EmpSce' est devenu celui là :

private void bt_suppression_Sce_Click(object sender, EventArgs e)
{
MessageBox.Show("Il faut supprimer employé avant service");
DialogResult dr = MessageBox.Show("Voulez-vous supprimer quand même?", "Supprimer et Quitter l'application", MessageBoxButtons.YesNo);
if (dr == DialogResult.Yes)
{
this.BindingContext[dbDs, dbDs.tp1_employe.TableName].RemoveAt(this.BindingContext[dbDs, "tp1_service.ServiceEmploye"].Position);
this.BindingContext[dbDs, dbDs.tp1_service.TableName].RemoveAt(this.BindingContext[dbDs, dbDs.tp1_service.TableName].Position);
posCpte();
}
}

La suppression fonctionne parfaitement si l'employé de ce service
est en première position dans la table "tp1_employe" de ma base de
données.

Donc en gros la suppression se réalise seulement sur le premier employé (première ligne) de la table correspondante.

Je pense que le problème vient du 'position' de la ligne suivante :

this.BindingContext[dbDs, dbDs.tp1_employe.TableName].RemoveAt(this.BindingContext[dbDs, "tp1_service.ServiceEmploye"].Position);

Que puis-je modifié pour que cela me supprime bien le bon employé
peu importe sa place dans la table tp1_employe de la base de données??

Merci d'avance
0
Rejoignez-nous