none
Post back sur Gridview avec Groupement -> Pertes de lignes RRS feed

  • Question

  • Bonjour,

    Je cherche à faire ce qui à priori pas mal de monde à essayé de faire, mais sans que cela me convienne totalement.

    En effet le but est simple, faire de mon GridView la possibilité de lui rajouter des lignes de "Groupage". Beaucoup d'exemples sur internet, malheureusement ils ont tous un inconvénient majeur : lors d'un postback quelconque le groupage disparait.

    Je cherche donc à le maintenir. Ma méthode :
    - Dans un RowCreated -> Calculer et ajouter les lignes de Groupes adéquates pour la première utilisation + Sauvegarde dans le ViewState (ce cas est pour le premier chargement).
    - Dans le Render -> Récupérer ce qui a été générer du ViewState, et ajout des lignes en questions (ce cas est pour après un postback).

    Voici ce que j'ai lors du premier chargement :

    Ici nickel, et voici ce qu'il se passe lorsque je clique sur le bouton :

    On remarque que des lignes disparaissent, et celles qui restent sont les premières qui se décalent au fur et à mesure.

    Saurez-vous comment éviter cette "effet de bord" ?

    Ici un projet à télécharger pour ceux qui veulent essayer et comprendre : http://sdrv.ms/1erxls2

    Merci d'avance pour votre aide.

    Damien

    • Type modifié Aurel Bera vendredi 16 août 2013 04:30 Discussion
    • Type modifié Aurel Bera vendredi 16 août 2013 14:14 question
    mercredi 7 août 2013 07:27

Réponses

  • J'ai modifié le code comme ça, pour faire les choses fonctionner:

      protected void GVGroup_RowCreated(object sender, GridViewRowEventArgs e)
            {
                if (e.Row.RowType == DataControlRowType.DataRow)// && (e.Row.DataItem != null || GroupColumns.ElementAt.[e.Row.DataItemIndex]!=null))
                {
                    Object value = DataBinder.Eval(e.Row.DataItem, "Pays");
                    if (value == null)
                        value = DataBinder.Eval(GetVilles().ElementAt(e.Row.DataItemIndex), "Pays");
                    if (!value.Equals(_oldValue))
                    {
                        GridViewRow row = new GridViewRow(0, 0, DataControlRowType.Separator, DataControlRowState.Normal);
                        Literal field = new Literal();
                        field.Text = "Pays : " + value.ToString();
                        TableCell td = new TableCell();
                        td.ColumnSpan = GVGroup.Columns.Count;
                        td.Controls.Add(field);
                        row.Cells.Add(td);
                     //   try
                        {
                            //GVGroup.Controls[0].Controls.AddAt(e.Row.DataItemIndex + 1 + _oldIndex, row);
                            GVGroup.Controls[0].Controls.Add( row);
                        }
                       // catch (Exception ex) { }
                        StringBuilder sb = new StringBuilder();
                        HtmlTextWriter htw = new HtmlTextWriter(new StringWriter(sb));
                        field.RenderControl(htw);
                        String ctrl = sb.ToString();
                       // Dictionary<Int32, String> group = GroupColumns;
                       // group.Add(e.Row.DataItemIndex + 1 + _oldIndex, ctrl);
                       // GroupColumns = group;
                        ++_oldIndex;
                        _oldValue = value;
                    }
                }
    Cordialement,

    Aurel BERA, Microsoft
    Microsoft propose ce service gratuitement, dans le but d'aider les utilisateurs et d'élargir les connaissances générales liées aux produits et technologies Microsoft. Ce contenu est fourni "tel quel" et il n'implique aucune responsabilité de la part de Microsoft.

    • Marqué comme réponse Aurel Bera vendredi 16 août 2013 14:14
    jeudi 8 août 2013 10:26
  • Bonjour,

    C'est bon, j'ai (enfin) pu résoudre mon problème.

    Voici les sources qui donne la solution : http://sdrv.ms/1ePbmLM

    Donc pour résumer, tout est fait dans le RowCreated, avec un "IsDatabind" pour déterminer si on est sur le databind d'un GridView ou non (ici le premier chargement, c'est plus propre qu'avec un IsPostBack).

    J'ai donc suivi l'exemple d'Aurel pour trouver la réponse, et le tout en gardant mon idée de sauvegarder les informations de groupage dans le ViewState.

    Le fait de tout placer en mémoire j'y ai pensé et ai déjà fait des tests, mais cela est difficile, étant donné que toutes mes données ne sont pas forcément sérializable, et que le cache mémoire est static, donc si deux utilisateurs accèdent à la page en même temps... Je ne vous dit pas le résultat.
    En plus de ça pas très optimisé : ViewState du GridView + Objet en mémoire... on arrive facilement à plusieurs Mo utilisé pour une page.
    Le fait de garder le contenu des lignes de groupage dans le ViewState est ce qu'il y a de plus raisonnable en traitement je trouve.

    Voila pour ceux qui veulent s'amuser et merci à vous.
    Damien

    (PS : Je ne sais pas comment remettre le post en "Question" et le placer en résolu... ^^').

    • Marqué comme réponse Aurel Bera vendredi 16 août 2013 14:14
    vendredi 16 août 2013 14:05

Toutes les réponses