Affichage position lors ajout + enregistrement dans base de données
loic20h28
Messages postés207Date d'inscriptionmardi 19 juin 2007StatutMembreDernière intervention22 février 2016
-
10 avril 2009 à 21:37
loic20h28
Messages postés207Date d'inscriptionmardi 19 juin 2007StatutMembreDernière intervention22 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.)
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_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!!
A voir également:
Affichage position lors ajout + enregistrement dans base de données
loic20h28
Messages postés207Date d'inscriptionmardi 19 juin 2007StatutMembreDernière intervention22 février 20162 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);
}
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é??