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 :

Gridview avec une colonne des checkboxs


Sujet :

ASP.NET

  1. #1
    Membre régulier
    Inscrit en
    Février 2006
    Messages
    373
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 373
    Points : 110
    Points
    110
    Par défaut Gridview avec une colonne des checkboxs
    Bonjour,

    J'ai un gridview avec une colonne des checkboxs pour sélectionner les lignes à sauvegarder. J'ai activé le tri pour les autres colonnes contenant des données de la base de données. Le problème c'est que lorsque je clique sur l'entête d'une colonne pour le trier, les checkboxs cochées revienent à l'état initial, c-a-d non cochées.

    Comment résoudre ce problème? Et merci.

  2. #2
    Membre confirmé Avatar de jacky01
    Profil pro
    Développeur .NET
    Inscrit en
    Juin 2007
    Messages
    537
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Juin 2007
    Messages : 537
    Points : 527
    Points
    527
    Par défaut
    Ce n'est pas un problème de postback ?

  3. #3
    Membre régulier
    Inscrit en
    Février 2006
    Messages
    373
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 373
    Points : 110
    Points
    110
    Par défaut
    Je ne pense pas.
    Parce que j'ai un boutton dans la même page où se trouve le gridview, et si je clique sur ce boutton, les checkboxs ne changent pas.

  4. #4
    Membre confirmé Avatar de jacky01
    Profil pro
    Développeur .NET
    Inscrit en
    Juin 2007
    Messages
    537
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Juin 2007
    Messages : 537
    Points : 527
    Points
    527
    Par défaut
    Il y a surement un update quelque part ...
    Lorsque tu click sur l'entête d'une colonne pour la trier, tu as surement un évènement de généré.
    Comment le gère-tu ?

  5. #5
    Membre régulier
    Inscrit en
    Février 2006
    Messages
    373
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 373
    Points : 110
    Points
    110
    Par défaut
    Lorsque je clique sur l'entête, c'est le Visual Studio qui gére cet évenement pour trier la colonne.
    Je ne gére pas cet évenement.

  6. #6
    Rédacteur
    Avatar de lutecefalco
    Profil pro
    zadzdzddzdzd
    Inscrit en
    Juillet 2005
    Messages
    5 052
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : zadzdzddzdzd

    Informations forums :
    Inscription : Juillet 2005
    Messages : 5 052
    Points : 8 734
    Points
    8 734
    Par défaut
    Quand tu lances le tri sur une colonne, le grid view est redatabindé, donc tu perds ta sélection. Rien de plus normal

  7. #7
    Membre régulier Avatar de beren.kei
    Inscrit en
    Mai 2008
    Messages
    135
    Détails du profil
    Informations personnelles :
    Âge : 36

    Informations forums :
    Inscription : Mai 2008
    Messages : 135
    Points : 123
    Points
    123
    Par défaut
    tu peux gérer l'évènement de clic sur les en-têtes de colonnes d'un gridview je crois, en tout cas en C# on trouve l'évènement ColumnHeaderMouseClick()... à voir en asp !
    ensuite plus qu'à faire un test pour voir si c'est bien l'en tête de ta colonne de checkbox qui est cliqué

    par contre, je pense aussi que ca vient des postback, après test les clic de boutons dans le gridview n'ont pas l'air de générer de postback, tandis que le tri de colonne oui je crois...

    EDIT : oups trop tard, explication + haut ^^

  8. #8
    Membre régulier
    Inscrit en
    Février 2006
    Messages
    373
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 373
    Points : 110
    Points
    110
    Par défaut
    Je travaille sur VS 2005 .net 2.0, donc je pense que l'évenement ColumnHeaderMouseClick() non disponible.

  9. #9
    Membre régulier Avatar de beren.kei
    Inscrit en
    Mai 2008
    Messages
    135
    Détails du profil
    Informations personnelles :
    Âge : 36

    Informations forums :
    Inscription : Mai 2008
    Messages : 135
    Points : 123
    Points
    123
    Par défaut
    nop, c'est parce que tu es en asp...
    j'ai vérifié et effectivement MouseClick() n'existe pas du tout comme évènement sur les gridview

  10. #10
    Membre régulier
    Inscrit en
    Février 2006
    Messages
    373
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 373
    Points : 110
    Points
    110
    Par défaut
    Quelqu'un a une autre solution SVP.
    J'ai besoin de permettre le tri pour l'utilisateur de l'application.

  11. #11
    Rédacteur
    Avatar de lutecefalco
    Profil pro
    zadzdzddzdzd
    Inscrit en
    Juillet 2005
    Messages
    5 052
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : zadzdzddzdzd

    Informations forums :
    Inscription : Juillet 2005
    Messages : 5 052
    Points : 8 734
    Points
    8 734
    Par défaut
    Y a des milliards de tutos sur internet pour trier un gridview

  12. #12
    Membre régulier
    Inscrit en
    Février 2006
    Messages
    373
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 373
    Points : 110
    Points
    110
    Par défaut
    Mon problème c'est pas comment trier un gridview.
    Mon problème est décrit au-dessus.
    Merci.

  13. #13
    Rédacteur
    Avatar de lutecefalco
    Profil pro
    zadzdzddzdzd
    Inscrit en
    Juillet 2005
    Messages
    5 052
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : zadzdzddzdzd

    Informations forums :
    Inscription : Juillet 2005
    Messages : 5 052
    Points : 8 734
    Points
    8 734
    Par défaut
    Citation Envoyé par insane_80 Voir le message
    Mon problème c'est pas comment trier un gridview.
    Mon problème est décrit au-dessus.
    Merci.
    Exact, j'ai lu trop vite
    Tu tries comment? A la main en interceptant l'événement Sorting ou via un ObjectDataSource

  14. #14
    Membre régulier
    Inscrit en
    Février 2006
    Messages
    373
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 373
    Points : 110
    Points
    110
    Par défaut
    Merci lutecefalco.
    Je trie à la main en interceptant l'événement Sorting (j'ai activé le tri, puis je clique sur l'entête d'une colonne pour le trier).

  15. #15
    Rédacteur
    Avatar de lutecefalco
    Profil pro
    zadzdzddzdzd
    Inscrit en
    Juillet 2005
    Messages
    5 052
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : zadzdzddzdzd

    Informations forums :
    Inscription : Juillet 2005
    Messages : 5 052
    Points : 8 734
    Points
    8 734
    Par défaut
    Ok donc avant de rebinder, tu récupères les cases cochées et tu les réaffectes aux bonnes lignes après le rebind

  16. #16
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 20
    Points : 24
    Points
    24
    Par défaut Persistance des contrôles
    Bonjour,

    Effectivement, les évènements que tu interceptes nécessitent de remplir ton grid de nouveau. C'est le cas pour les filtres, les tris et la pagination. L'idéal dans ton cas est de travailler avec les viewstates. C'est là que sont persitées les valeurs de tes objets.

    En utilisant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    using System.Collections;
    tu vas utiliser dans le pageload une arraylist pour stocker l'état des cases à cocher:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    ArrayList CheckBoxArray;
     
    if (ViewState["CheckBoxArray"] != null)
    {
        CheckBoxArray = (ArrayList)ViewState["CheckBoxArray"];
    }
    else
    {
        CheckBoxArray = new ArrayList();
    }
    Si tu gères la pagination et une cellule d'entête pour cocher ou décocher toutes les cases à cocher, tu vas devoir faire quelque chose qui ressemble à ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    int CheckBoxIndex;
        bool CheckAllWasChecked=false;
        CheckBox chkAll =
     
       (CheckBox)GridView1.HeaderRow.Cells[0].FindControl("chkAll");
        string checkAllIndex = "chkAll-" + GridView1.PageIndex;
        if (chkAll.Checked)
        {
            if (CheckBoxArray.IndexOf(checkAllIndex) == -1)
            {
                CheckBoxArray.Add(checkAllIndex);
            }
        }
        else
        {
            if (CheckBoxArray.IndexOf(checkAllIndex) != -1)
            {
                CheckBoxArray.Remove(checkAllIndex);
                CheckAllWasChecked = true;
            }
        }
    Enfin, tu vas itérer sur tes lignes pour vérifier l'état des cases à cocher :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    for (int i = 0; i < GridView1.Rows.Count; i++)
    {
        if (GridView1.Rows[i].RowType == DataControlRowType.DataRow)
        {
            CheckBox chk =
     
    (CheckBox)GridView1.Rows[i].Cells[0].FindControl("CheckBox1");
            CheckBoxIndex = GridView1.PageSize * GridView1.PageIndex + (i + 1);
            if (chk.Checked)
            {
                if (CheckBoxArray.IndexOf(CheckBoxIndex) == -1
                    && !CheckAllWasChecked)
                {
                    CheckBoxArray.Add(CheckBoxIndex);
                }
            }
            else
            {
                if (CheckBoxArray.IndexOf(CheckBoxIndex) != -1
                    || CheckAllWasChecked)
                {
                    CheckBoxArray.Remove(CheckBoxIndex);
                }
            }
        }
    }
    Tu gères maintenant l'état de tes cases à cocher dans une arraylist persistée sur ta page. Il te reste à utiliser cette liste lors de l'évènement que tu gères (sorting, paging...)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
     
    ArrayList CheckBoxArray = (ArrayList)ViewState["CheckBoxArray"];
    string checkAllIndex = "chkAll-" + GridView1.PageIndex;
    if (CheckBoxArray.IndexOf(checkAllIndex) != -1)
    {
        CheckBox chkAll =
         (CheckBox)GridView1.HeaderRow.Cells[0].FindControl("chkAll");
        chkAll.Checked = true;
    }
    for (int i = 0; i < GridView1.Rows.Count; i++)
    {
    if (GridView1.Rows[i].RowType == DataControlRowType.DataRow)
    {
        if (CheckBoxArray.IndexOf(checkAllIndex) != -1)
        {
            CheckBox chk =
             (CheckBox)GridView1.Rows[i].Cells[0].FindControl("CheckBox1");
            chk.Checked = true;    
        }
        else
        {
          int CheckBoxIndex =GridView1.PageSize*(GridView1.PageIndex)+(i + 1);
          if (CheckBoxArray.IndexOf(CheckBoxIndex) != -1)
          {
             CheckBox chk =
             (CheckBox)GridView1.Rows[i].Cells[0].FindControl("CheckBox1");
            chk.Checked = true;
          }
        }
    }
    }
    En espérant que cela te seras utile. Je t'invite à jeter un oeil aux notion de viewstate si tu n'es pas familier avec

Discussions similaires

  1. Réponses: 8
    Dernier message: 29/04/2010, 13h02
  2. [SQL] Effacer des membres avec une colonne ayant pour valeur un numéro
    Par mecmec dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 20/01/2008, 07h55
  3. Jvcl(grid avec une colonne checkbox)
    Par Klemsy78 dans le forum Delphi
    Réponses: 2
    Dernier message: 02/11/2006, 21h15
  4. Réponses: 3
    Dernier message: 26/07/2006, 10h18
  5. Réponses: 4
    Dernier message: 09/02/2005, 10h44

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