begin process at 2010 02 09 22:14:20
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C#

 > 

Windows

 > 

Formulaire / Winforms / Controls

 > 

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


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

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

vendredi 10 avril 2009 à 21:37:23 | Affichage position lors ajout + enregistrement dans base de données

loic20h28

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!!
lundi 18 mai 2009 à 23:27:21 | Re : Affichage position lors ajout + enregistrement dans base de données

loic20h28

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!!
mardi 19 mai 2009 à 16:56:24 | Re : Affichage position lors ajout + enregistrement dans base de données

loic20h28

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


Cette discussion est classée dans : employe, tablename, bindingcontext, dbds, tp1


Répondre à ce message

Sujets en rapport avec ce message

C# Problème pour supression [ par dinier ] Bonjour à tous, Lorsque je veux supprimer un service et qu'il y a un employé, il ne supprime pas le bon employé, il supprime le premier employé qui es problème pour numéro automatique [ par dinier ] Bonjour à tous, J'ai un problème avec un numéro automatique, j'ai fait un dataset, et lorsque j'ai effacé par exemple les numéros 1, 2, 3 et qu'il ny DataBindings + rafraichissement des données d'un TextBox [ par gwenCPP ] Bonjour,j'ai déjà vu un problème similaire sur le net mais je n'arrive plus à mettre la main dessus.Voilà exactement ma situation :J'ai une fenêtre pr ajouter un enregistrement dans un dataset [ par mathmax ] Bonjour,Je cherche à ajouter un enregistrement dans un dataset. J'ai d'abord créer un objet :    CurrencyManager Cm = (CurrencyManager)BindingContext[ Probleme de Serialisation d'un usercontrol [ par tkd1984 ] Bonjour a tous le monde j'aimerais serialiser un usercontrol qui porte le nom "Table",voici les propriétés de la classe qui le représente: //nom pour ajouter tabpage [ par ansizak ] Bonjour,une question toute bête mais qui me donne pourtant bien du mal; comment ajouter une tabpage a un tabcontrol dèjà existant ?j'ai fait ceci:TabP REQUETE SUR SQL SERVER [ par gabs77 ] Bonjour,je travaille sur une appli en C# auquel je dois utiliser SQLSERVER.Le problème est le suivant : je n'ai pas de réelle insertion dans la base d Question sur le traitement d'une base de données dont les colonnes sont inconnues [ par Finality ] Bonjour (ou bonsoir) tout le monde,Alors voilà, je développe une application et je butte sur un certain point.  Mon application (client / serveur) est


Nos sponsors


Sondage...

Comparez les prix


HTC Hero

Entre 550€ et 550€

CalendriCode

Février 2010
LMMJVSD
1234567
891011121314
15161718192021
22232425262728

Consulter la suite du CalendriCode

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,421 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales