Auteur de questions
Récupération d'id dans un datagridView

Question
-
Bonjour,
j'ai un datagridview et un bouton, ce dernier doit pouvoir récupéré l'id de la ligne du dataGridView sélectionné.
Voici le code:
private void btnEditClient_Click(object sender, EventArgs e){
string id = (dataGridView1.CurrentRow.Cells["ID"].Value as int?).GetValueOrDefault(+1).ToString(); //string id = dataGridView1.CurrentRow.Cells["ID"].Value.ToString(); //bool maRequete = cGestClient.delClient(id); frmViewClient _frm = new frmViewClient(id);_frm.ShowDialog();
cGestClient.viewClient();myDataView =
dataBase.myDataTable.DefaultView; this.dataGridView1.DataSource = myDataView;dataGridView1.Invalidate();
}
et la valeur retourné est à chaque fois: 1
-> string id = (dataGridView1.CurrentRow.Cells["ID"].Value as int?).GetValueOrDefault(+1).ToString();
Savez-vous où est l'erreur?
Meilleures salutations !
Toutes les réponses
-
Bonjour,
Certainement parceque Cells["ID"].Value doit renvoyer null.
Le plus simple et le mieux, c'est de récupérer l'identifiant au niveau de votre BindingSource.
Si votre BindingSource est attaché à un DataSet :
int id = (int) ((DataRowView)(monBindingSource.Current)).Row["ID"];
Cordialement
-
Salut,
merci de ta réponse.
chez moi c'est
myDataTable
juste? ^^
Pourquoi je peux alors pas faire:
private void btnEditClient_Click(object sender, EventArgs e){
//string id = (dataGridView1.CurrentRow.Cells["id"].Value as int?).GetValueOrDefault(+1).ToString(); //string id = dataGridView1.CurrentRow.Cells["id"].Value.ToString(); int id = (int)((DataRowView)(myDataTable.Current)).Row["ID"]; //bool maRequete = cGestClient.delClient(id); frmViewClient _frm = new frmViewClient();_frm.ShowDialog();
cGestClient.viewClient();myDataView =
dataBase.myDataTable.DefaultView; this.dataGridView1.DataSource = myDataView;dataGridView1.Invalidate();
}
Error 1 The name 'myDataTable' does not exist in the current context.
Meilleures salutations
-
-
Salut,
c'est géré par ma class dataBase.cs
using
System;using
System.Collections.Generic;using
System.Linq;using
System.Text;using
MySQLDriverCS;using
System.Data;namespace
WindowsFormsApplication2{
class dataBase{
#region
Membres public /// <summary> /// Acc‚s a la derniŠre table r‚cup par un select. /// </summary> /// <remarks>il faut avoir avant appell‚ le "selectQuery"!</remarks> public static DataTable myDataTable { get; set; }#endregion
#region
Propri‚t‚s priv‚es... //private DataTable _dataTable; private MySQLConnection _dBConn; //public static DataTable myDataTable //{ // get { return _dataTable; } // set { _dataTable = value; } //} private String _server; private String _login; private String _password;#endregion
#region
Gestion Singleton (et param‚tres de connexion) //l'id‚e ici c'est que ta classe soit charg‚ en m‚moire toute seule. //on appel ca un "singleton". c'est plus facile a utiliser et tu n'auras qu'une instance de l'object en m‚moire//donc : contructeur "private" et un membre static de l'instance private static dataBase _instance = new dataBase(); //dans l'id‚al il faudra que ces params viennent d'un fichier de config
//ta classe database se chargera seule de cette gestion : //ca ‚vitera les morceaux de codes un peu partout qui utilise la config de la base
private dataBase()
:
this("localhost", "immo", "root"){ }
private dataBase(String server, String login, String password){
//ici on est en "private" et pas en "static" donc on est dans "_instance"_server = server;
_login = login;
_password = password;
_dBConn =
new MySQLConnection(new MySQLConnectionString(_server, _login, _password, "").AsString);}
#endregion
#region
Fonctions public//les m‚thodes sont aussi "static", ca te permettra d'‚crire : dataBase.selectQuery(...)
plus besoin de new
public static bool selectQuery(String request)
{
MySQLCommand myCommand = new MySQLCommand(request, _instance._dBConn); MySQLDataAdapter dadVideoCollection = new MySQLDataAdapter(myCommand); //pour l'instant je laisse le fonctionnement qui me plait pas trop trop du myDataTablelol
myDataTable =
new DataTable("MonDataTable");dadVideoCollection.Fill(myDataTable);
//on ne fais pas "_instance.myDataTable" car myDataTable est static... a tester je croislol return true;
}
public static bool otherQuery(string request){
bool Result = false; try{
//alors petite explication : //la fonction est static, donc on peut faire "dataBase.otherQuery" //seulement du coup on est dans "aucune" instance de la classe //d'ou le _instance//un autre avantage : tu n'es pas oblig‚ de refaire la connexion a chaque fois! MySQLCommand myCommand = new MySQLCommand(request, _instance._dBConn);
myCommand.Connection.Open();
//‚quivalent a _instance._dbConn.Open()myCommand.ExecuteNonQuery();
Result =
true;}
catch (Exception ex){
//Si un jour tu veux tu peux envoyer l'exception dans un fichier log ou autreSystem.Diagnostics.
Debug.WriteLine("ex:" + ex.Message);}
finally{
_instance._dBConn.Close();
}
return Result;}
#endregion
}
}
et mon boutton edit est géré par ma class cGestClient:
#region
Fonction: Edit Client /// <summary> /// Permet d'updater un client. Code: CgestClient.UpdateClient(); /// </summary> internal static bool UpdateClient(string edit_id, string sCivilite, string sName, string sFirstName, string sStreet, string sNPA, string sCity, string sCompany, string sTel, string sTelProf, string sFax, string sEmail){
string SQL = "update xdb_contact set lastName ='" + sName + "', firstName='" + sFirstName + "', " + "street='" + sStreet + "', city='" + sCity + "', company='" + sCompany + "', tel='" + sTel + "', " + "tel_prof='" + sTelProf + "', fax='" + sFax + "', email='" + sEmail + "' " + "where id = " + edit_id + ""; if (dataBase.otherQuery(SQL)){
System.Data.
DataRow update = null; foreach (System.Data.DataRow row in dataBase.myDataTable.Rows){
if ((row["ID"] as int?).GetValueOrDefault(-1).ToString() == edit_id){
update = row;
break;}
}
if (update != null){
update[
"lastName"] = sName;update[
"firstName"] = sFirstName;update[
"zip"] = sNPA;update[
"street"] = sStreet;update[
"city"] = sCity;update[
"email"] = sEmail;update[
"civilite"] = sCivilite;update[
"tel"] = sTel;update[
"tel_prof"] = sTelProf;update[
"fax"] = sFax; return true;}
else return false;}
else{
return false;}
}
#endregion
Meilleures salutations !
-
-
mmm... Je suis peut être pas réveillé
Est-ce ceci que tu cherches?
{
cGestClient.viewClient();myDataView =
dataBase.myDataTable.DefaultView; this.dataGridView1.DataSource = myDataView;}
myDataView.Current n'existe pas
-
Bonjour,
2 choses:
-
Dans ton frmPrincipal_Load je ne vois pas la requête SQL lancée sur dataBase pour remplir la myDataTable
-
Peux tu nous donner la requête qui rempli myDataTable pour qu'on vérifie que tu as bien ID
Si tu veux t'aider (en mode debug), rend la colonne ID visible comme ça tu verras bien si tu as une valeur.
-
-
Salut,
je sais pas comment sa tourne s't'histoire, mais sa tourne :/. Avec ce code la:
{
string id = (dataGridView1.CurrentRow.Cells["ID"].Value as int?).GetValueOrDefault(-1).ToString(); //bool maRequete = cGestClient.delClient(id); frmViewClient _frm = new frmViewClient(id);_frm.ShowDialog();
cGestClient.viewClient();myDataView =
dataBase.myDataTable.DefaultView; this.dataGridView1.DataSource = myDataView;dataGridView1.Invalidate();
}
il me sélectionne tout le temps la première ligne.
Je sais pas trop plus, si tu as un moment aujourd'hui ou ce soir pour du shareview?
Meilleures salutations.
-
-
Bonjour,
il me dit: Le cast spécifié n'est pas valide
code:
{
int id = (int)((DataRowView)(this.BindingContext[myDataView].Current)).Row["ID"]; //bool maRequete = cGestClient.delClient(id); frmViewClient _frm = new frmViewClient();_frm.ShowDialog();
//Quand la _frm.ShowDialog se ferme, le code reprends ici, il faut donc r‚afficher les mises … jour. cGestClient.viewClient();myDataView =
dataBase.myDataTable.DefaultView; this.dataGridView1.DataSource = myDataView;dataGridView1.Invalidate();
}
//Edit: Second problème résolu. Solution: je parse le int en string
Meilleures salutations !
-
Bonjour,
Mise à jour
le dataGridView ne semble pas récupéré l'id car lorsque je fais:
{
string id = this.dataGridView1.CurrentRow.Cells["id"].Value.ToString(); MessageBox.Show("" + id + "");}
Jvous explique pas le code vous etes fort
. \o/ bah le msgBox est vide.
Solution? Je sais pas
Meilleure salutations !
-
-
-
-
-
Voici un code:
{
_frmViewClient.Show();
}
else{
MessageBox.Show("Veuillez choisir un client", "Erreur de s‚lection", MessageBoxButtons.OK, MessageBoxIcon.Error);}
Evidemment il ne fonctionne pas: erreur:
Impossible d'effectuer un cast d'un objet de type 'System.DBNull' en type 'System.String'.
Mais bon, la jsuis pas sur que sa me récupère mon id pour me remplire mes champs dans l'autre forme
---------------------
Edit:
tandis que ce code me renvoie toujours a la première ligne, mais me remplis les champs... Alors que je veux peut être editer la 3eme ligne.
_frm.ShowDialog();
//Quand la _frm.ShowDialog se ferme, le code reprends ici, il faut donc r‚afficher les mises … jour. cGestClient.viewClient();myDataView =
dataBase.myDataTable.DefaultView; this.dataGridView1.DataSource = myDataView;dataGridView1.Invalidate();