none
Sélection dans une GridView : petit doute RRS feed

  • Question

  • Bonjour tout le monde,

    Pour sélectionner en C# une ligne dans une GridView en fonction de la valeur d'un champ, est-ce bien comme ça qu'il faut faire, ou existe-t-il un moyen plus ... élégant ?

        protected void GridView1_PreRender(object sender, EventArgs e)
        {
            if (Request.QueryString["idPlat"] != null)
            {
                int i = 0;
                foreach (GridViewRow row in GridView1.Rows)
                {
                    if (row.Cells[1].Text == Request.QueryString["idPlat"].ToString())
                    {
                        GridView1.SelectedIndex = i;
                    }
                    i += 1;
                }
            }
        }
    

    mardi 3 juin 2014 21:46

Réponses

Toutes les réponses

  • Bonjour,

    Le plus simple est d'utiliser l'événement RowDataBound : http://msdn.microsoft.com/fr-fr/library/system.web.ui.webcontrols.gridview.rowdatabound(v=vs.110).aspx

    Cordialement


    Gilles TOURREAU - MVP C#
    Architecte logiciel/Consultant/Formateur Freelance - P.O.S Informatique
    Blog : http://gilles.tourreau.fr - Suivez-moi sur Twitter
    - MCPD : Enterprise Developper / Windows Developper 3.5 / ASP .NET 3.5/4.0
    - MCSA : SQL Server 2012
    - MCITP : SQL Server 2008 Developper
    - MCTS : ADO .NET 3.5 / SQL Server 2008 Developper / Windows Forms 3.5 / ASP .NET 3.5/4.0 / TFS 2010 / Windows Azure

    • Marqué comme réponse Gloops mercredi 4 juin 2014 13:34
    mercredi 4 juin 2014 00:37
    Modérateur
  • Bonjour,

    Ah oui, merci, il faut croire que je l'avais bel et bien oublié.

    J'ai bien vu l'événement dans la liste, mais n'ayant pas vu Select dans les méthodes de l'objet, je n'ai pas insisté.

    Pour sélectionner la ligne de clef 7, dans une GridView qui affiche les clefs sur la deuxième colonne :

        protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
        {
            if(((GridViewRow)e.Row).Cells[1].Text == "7")
              ((GridViewRow)e.Row).RowState = DataControlRowState.Selected;
        }
    

    En toute rigueur il faudrait vérifier que la propriété RowType vaut Data, là j'ai pu m'en affranchir puisque j'ai une clef numérique convertie en texte, et que donc les textes affichés dans l'entête et le pied ne coïncideront pas avec la valeur cherchée et ne poseront pas de problème de type.

    Attention que cette syntaxe permet de sélectionner plusieurs enregistrements, et vérifier ce qui se passe si un autre enregistrement est déjà sélectionné.

    Si je laisse traîner un point-virgule à la fin de la ligne du if, celui-ci sera ignoré et toutes les lignes seront sélectionnées.

    mercredi 4 juin 2014 13:33
  • Il est à noter que la modification du RowState tel que je viens de la proposer est nécessaire pour l'affichage de l'enregistrement avec le SelectedRowStyle, mais ne modifie pas le SelectedIndex de la GridView, ce qui est fâcheux si celui-ci sert à initialiser un autre contrôle.

    Mon code devient donc :

        protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
        {
            if (Request.QueryString["idPlat"] != null)
            {
                if (((GridViewRow)e.Row).Cells[1].Text == Request.QueryString["idPlat"].ToString())
                {
                    ((GridViewRow)e.Row).RowState = DataControlRowState.Selected;
                    GridView1.SelectedIndex = ((GridViewRow)e.Row).DataItemIndex;
                }
            }
        }
    

    en espérant que le fait d'avoir remplacé l'origine de la valeur à tester par un exemple numérique dans l'exemple précédent ne nuise pas trop à la lisibilité ...

    mercredi 4 juin 2014 14:51