none
Récupération d'id dans un datagridView RRS feed

  • 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 !

    lundi 25 août 2008 06:14

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

     

    lundi 25 août 2008 07:38
    Modérateur
  • 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

    lundi 25 août 2008 07:42
  • Bonjour,

     

    Comment est alimenté votre DataGridView ?

    Quels sont les propriétés de DataSource et DataMember ?

     

    Cordialement

    lundi 25 août 2008 07:51
    Modérateur
  • 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 Wink

    //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 Wink

    //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 Wink

    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" Wink

    _server = server;

    _login = login;

    _password = password;

    _dBConn = new MySQLConnection(new MySQLConnectionString(_server, _login, _password, "").AsString);

    }

    #endregion

    #region Fonctions public Wink

    //les m‚thodes sont aussi "static", ca te permettra d'‚crire : dataBase.selectQuery(...) Smile plus besoin de new Smile

    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 myDataTable Wink lol

    myDataTable = new DataTable("MonDataTable");

    dadVideoCollection.Fill(myDataTable); //on ne fais pas "_instance.myDataTable" car myDataTable est static... a tester je crois Wink lol

    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 Wink

    //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 autre

    System.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 !

    lundi 25 août 2008 07:54
  • Bonjour,

     

    Sauf erreur de ma part, je ne vois dans votre code comment est rempli votre DataGridView...

     

    Cordialement

     

    lundi 25 août 2008 07:58
    Modérateur
  • mmm... Je suis peut être pas réveillé Stick out tongue

     

    Est-ce ceci que tu cherches?

     

    private void frmPrincipal_Load(object sender, EventArgs e)

    {

    cGestClient.viewClient();

    myDataView = dataBase.myDataTable.DefaultView;

    this.dataGridView1.DataSource = myDataView;

    }

     

     

    myDataView.Current n'existe pas Smile

    lundi 25 août 2008 07:59
  • Bonjour,

     

    2 choses:

    1. Dans ton frmPrincipal_Load je ne vois pas la requête SQL lancée sur dataBase pour remplir la myDataTable
    2. 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.

     

     

    lundi 25 août 2008 09:32
  • Salut,

     

    je sais pas comment sa tourne s't'histoire, mais sa tourne :/. Avec ce code la:

     

    private void btnEditClient_Click(object sender, EventArgs e)

    {

    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.

    lundi 25 août 2008 09:40
  • Bonjour,

     

    Essayez :

    int id = (int)((DataRowView)(this.BindingContext[myDataView].Current)).Row["ID"];

     

    Cordialement
    lundi 25 août 2008 19:08
    Modérateur
  • Bonjour,

     

    il me dit: Le cast spécifié n'est pas valide

     

    code:

     

    private void btnEditClient_Click(object sender, EventArgs e)

    {

    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 !

    mardi 26 août 2008 05:47
  • Bonjour,

     

    Mise à jour

     

    le dataGridView ne semble pas récupéré l'id car lorsque je fais:

     

    private void dataGridView1_CellMouseClick(object sender, DataGridViewCellMouseEventArgs e)

    {

    string id = this.dataGridView1.CurrentRow.Cells["id"].Value.ToString();

    MessageBox.Show("" + id + "");

    }

     

    Jvous explique pas le code vous etes fort Stick out tongue. \o/ bah le msgBox est vide.

     

    Solution? Je sais pas Sad

     

    Meilleure salutations !

    mardi 26 août 2008 12:01
  • Un petit sharedview ? J'ai un peu de temps là

     

    mardi 26 août 2008 14:27
  • Salut

     

     

    moi je peux toute la journée, dis moi quand tu es dispo.

     

    A+

     

    mercredi 27 août 2008 05:32
  • up,

     

    désolé de vous embettez avec ca :}

     

    vendredi 29 août 2008 06:19
  • Personne ne sait? :/

     

    lundi 1 septembre 2008 06:13
  • Voici un code:

     

    frmViewClient _frmViewClient = new frmViewClient();

    if ((string)this.dataGridView1.CurrentRow.Cells["id"].Value != null)

    {

    _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.

     

     

    string id = (dataGridView1.CurrentRow.Cells["id"].Value as int?).GetValueOrDefault(-1).ToString();

    //bool maRequete = cGestClient.delClient(id);

    frmViewClient _frm = new frmViewClient(id);

    _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();

     

    jeudi 4 septembre 2008 06:33