IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

ASP.NET Discussion :

Récupérer les données de la ligne d'un ButtonField dans un GridView


Sujet :

ASP.NET

  1. #1
    Membre éclairé
    Avatar de rozwel
    Inscrit en
    Mars 2002
    Messages
    324
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 324
    Par défaut Récupérer les données de la ligne d'un ButtonField dans un GridView
    J'ai un GridView dont l'une des colonnes est un ButtonField. J'ai défini l'event RowCommand sur ce GridView:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    protected void gvEmployees_RowCommand(object sender, GridViewCommandEventArgs e)
        {
            if(e.CommandName == "Grant")
            {
                //TODO
            }
        }
    Et d'après le debug, tout se passe comme prévu: quand je clique sur le bouton, je rentre bien dans cette méthode et le CommandName est bon. Maintenant à la place du TODO j'aimerais récupérer les infos de la ligne dans laquelle le bouton a été cliqué. Je me serais attendu à ce que le sender soit un GridViewRow, où à ce que e.CommandSource me donne une référence au GridViewRow, mais tous les deux m'amènent directement au GridView.

    Comment je peux faire pour récupérer les données du row en cours?

  2. #2
    Membre éclairé
    Avatar de rozwel
    Inscrit en
    Mars 2002
    Messages
    324
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 324
    Par défaut
    J'ai trouvé cet article qui contient un exemple intéressant grâce auquel j'ai pu récupérer mon instance de GridViewRow. Mais bizarrement le DataItem de cette instance est null. Or j'ai besoin de récupérer une info qui se trouve dans le DataItem mais qui n'est pas affiché dans la GridView, donc impossible de passer par les Cells.

    Des idées?

  3. #3
    Membre éprouvé Avatar de Mourad
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 152
    Par défaut
    essaies ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    GridViewRow selectedRow = (GridViewRow)(((Control)e.CommandSource).NamingContainer);

  4. #4
    Membre éclairé
    Avatar de rozwel
    Inscrit en
    Mars 2002
    Messages
    324
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 324
    Par défaut
    Voilà le code que je fais tourner avec ta suggestion:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    protected void gvEmployees_RowCommand(object sender, GridViewCommandEventArgs e)
        {
            if(e.CommandName == "Grant")
            {
                GridViewRow selectedRow = (GridViewRow)(((Control)e.CommandSource).NamingContainer);
                if (selectedRow.RowType == DataControlRowType.DataRow)
                {
                    AlpEmployeeVO employeeVO = (AlpEmployeeVO)selectedRow.DataItem;
                }
            }
        }
    Et j'obtiens l'exception suivante sur la ligne que tu m'as proposée:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    System.InvalidCastException was unhandled by user code
      Message="Impossible d'effectuer un cast d'un objet de type 'ASP.content_alp_admin_employeesconsultation_aspx' en type 'System.Web.UI.WebControls.GridViewRow'."
      Source="App_Web_wyegayu8"
      StackTrace:
           à content_alp_admin_employeesConsultation.gvEmployees_RowCommand(Object sender, GridViewCommandEventArgs e) dans e:\dev\axen\Code\Web\content\alp\admin\employeesConsultation.aspx.cs:ligne 109
           à System.Web.UI.WebControls.GridView.OnRowCommand(GridViewCommandEventArgs e)
           à System.Web.UI.WebControls.GridView.HandleEvent(EventArgs e, Boolean causesValidation, String validationGroup)
           à System.Web.UI.WebControls.GridView.RaisePostBackEvent(String eventArgument)
           à System.Web.UI.WebControls.GridView.System.Web.UI.IPostBackEventHandler.RaisePostBackEvent(String eventArgument)
           à System.Web.UI.Page.RaisePostBackEvent(IPostBackEventHandler sourceControl, String eventArgument)
           à System.Web.UI.Page.RaisePostBackEvent(NameValueCollection postData)
           à System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)
    Où content_alp_admin_employeesconsultation_aspx est le nom de la classe de ma page. J'en déduis que le NamingContainer, c'est ma page. Mais ce que je ne comprends pas c'est que quand j'inspecte selectedRow avec ce code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    protected void gvEmployees_RowCommand(object sender, GridViewCommandEventArgs e)
        {
            if(e.CommandName == "Grant")
            {
                int index = Convert.ToInt32(e.CommandArgument);
                GridViewRow selectedRow = gvEmployees.Rows[index];
                if (selectedRow.RowType == DataControlRowType.DataRow)
                {
                    AlpEmployeeVO employeeVO = (AlpEmployeeVO)selectedRow.DataItem;
                }
            }
        }
    Les données dans les cellules sont bonnes. Et pourtant selectedRow.DataItem est null. Au passage, la GridView gvEmployees est initialisée dans le PageLoad avec le code suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    IList<AlpEmployeeVO> _employees = new List<AlpEmployeeVO>();
    //Remplissage de _employees
    gvEmployees.DataSource = _employees;
    gvEmployees.DataBind();

  5. #5
    Membre éprouvé Avatar de Mourad
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 152
    Par défaut
    c'est très bizarre parce que le NamingContainer devrait être une row et non ta page !?
    je pense que t'as un problème au niveau du eventhandler enfin je ne sais pas trop... parce que là dans ce contexte le NamingContainer doit être obligatoirement une ligne.
    fais un exemple à part, regardes la différence et essaies d'inspecter ce qui ne va pas.. dsl mais là je ne vois vraiment pas d'où peut provenir ce problème

  6. #6
    Membre éclairé
    Avatar de rozwel
    Inscrit en
    Mars 2002
    Messages
    324
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 324
    Par défaut
    J'ai trouvé une solution détournée. La liste que je passe en datasource de mon GridView est stockée dans un membre de la classe de ma page. Du coup je peux y accéder depuis le gestionnaire d'évènement en utilisant le CommandArgument comme index. Et ça marche. C'est pas très propre mais ça fonctionne.

  7. #7
    Membre averti
    Inscrit en
    Mai 2006
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 15
    Par défaut
    Est ce que quelqu'un à trouvé une solution plus propre?

    J'expérimente le même problème avec un bouton dans un template. après moultes recherches je récupère la ligne mais pas moyen de récupérer l'objet correspondant...

Discussions similaires

  1. Récupérer les données de la ligne double Cliquée dans Userform
    Par yoker dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 26/02/2015, 01h21
  2. Réponses: 2
    Dernier message: 30/09/2014, 14h10
  3. Afficher les données d'une ligne d'une ListView dans des TextBox
    Par amimarcellin dans le forum Accès aux données
    Réponses: 0
    Dernier message: 05/05/2014, 11h02
  4. Réponses: 62
    Dernier message: 16/04/2009, 10h09
  5. Réponses: 17
    Dernier message: 16/03/2009, 09h21

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo