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 :

Serialization d'un Panel et des ses controles


Sujet :

ASP.NET

  1. #1
    Membre confirmé
    Inscrit en
    Août 2007
    Messages
    174
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 174
    Par défaut Serialization d'un Panel et des ses controles
    Bonjour,

    J'ai créé un contrôle héritant du CheckBoxList qui me permet d'afficher des Panels en dessous de chaque CheckBox coché.

    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
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
     
            public long AttIdARetirer
            {
                get
                {
                    return ViewState["ActivityTypeCheckBoxList_AttIdARetirer"] as long? ?? -1;
                }
                set
                {
                    ViewState["ActivityTypeCheckBoxList_AttIdARetirer"] = value;
                }
            }
     
    public Dictionary<int, List<Panel>> ListPanel  = new Dictionary<int, List<Panel>>();
     
           protected override void RenderContents(HtmlTextWriter output)
            {
                output.Write(Text);
            }
     
            protected override void RenderItem(ListItemType itemType, int repeatIndex, RepeatInfo repeatInfo, HtmlTextWriter writer)
            {  
                base.RenderItem(itemType, repeatIndex, repeatInfo, writer);
     
                //Ajout du panel s'il existe
                if (this.Items[repeatIndex].Selected)
                {
                    ListItem li = this.Items[repeatIndex];
                    int Id;               
                    int.TryParse(li.Value,out Id);
     
                    if (ListPanel.ContainsKey(Id))
                    {
                        int i = 0;
                        foreach (Panel p in ListPanel[Id])
                        {                        
                            p.Visible = true;
                            p.Style.Add("padding-left", "40px");
                            p.Style.Add("padding-top", "2px");
                            p.Style.Add("padding-bottom", "2px");
                            p.Style.Add("padding-right", "2px");
                            p.Style.Add("margin", "5px");
                            p.CssClass = i++ % 2 == 0 ? ItemCss : AlternateCss;
                            p.BorderStyle = BorderStyleCss;
                            p.BorderWidth = BorderWidthCss;
                            p.BorderColor = BorderColorCss;
                            p.RenderControl(writer);
                        }
                    }
                }
            }
    Fonctionnement : Ce contrôle se trouve à la fin d'une liste de Panel.
    Sur un choix via un DropDownList d'activité, certains Panels sont affichés (Date, Commentaires,...).
    Le CheckBoxList se recharge à chaque action sur le DropDownList et contient les mêmes valeurs que le DropDownList moins l'activité sélectionné dans le DDL.
    Lors d'une action sur un CheckBox, je regarde les Panels qui me manque par rapport à ceux affiché via le DDL et j'enregistre ces Panels dans ListPanel du CheckBoxList, ce qui m'affiche correctement tous les Panels dont j'ai besoin entre le DDL et le CBXL.

    Le souci vient que si je modifie la valeur d'un contrôle dans un panel du CheckBoxList, la modification n'est pas prise en compte lors du rafraichissement.

    J'ai essayé de remplacé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    public Dictionary<int, List<Panel>> ListPanel  = new Dictionary<int, List<Panel>>();
    par

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
            public Dictionary<int, List<Panel>> ListPanel
            {
                get
                {
                    object o = ViewState["ListPanel"];
                    return o == null ? new Dictionary<int, List<Panel>>() : (Dictionary<int, List<Panel>>)ViewState["ListPanel"];
                }
                set
                {
                    ViewState["ListPanel"] = value;
                }
            }
    afin d'avoir une persistance, mais impossible de dé sérialiser le panel.

    Donc comment faire ?

    Merci de votre aide.

  2. #2
    Expert confirmé
    Avatar de Immobilis
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2004
    Messages
    6 559
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 559
    Par défaut
    Salut,

    As-tu résolu ton problème? Je m'interesse un peu aux custom controls en ce moment et j'aimerai en savoir plus sur l'utilisation du viewstate pour conserver leur état.

    Merci.

    A+
    "Winter is coming" (ma nouvelle page d'accueil)

  3. #3
    Membre confirmé
    Inscrit en
    Août 2007
    Messages
    174
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 174
    Par défaut
    Non, je n'ai pas encore eu le temps de creuser, j'ai mis un contrôle simple en attendant d'y revenir.

    Je pense qu'il faut s'orienter vers une création de classe Panel avec une interface de sérialisation.

    Si tu utilises un custom controls héritant de Controls, normalement le ViewState est déjà géré et si tu met EnableViewState = true, la persistence à chaque PostBack est présente.
    Ensuite, tu peux rajouter facilement via des accesseurs ce que tu veux sauvegarder.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
            public long AttIdARetirer
            {
                get
                {
                    return ViewState["ActivityTypeCheckBoxList_AttIdARetirer"] as long? ?? -1;
                }
                set
                {
                    ViewState["ActivityTypeCheckBoxList_AttIdARetirer"] = value;
                }
            }

Discussions similaires

  1. Remettre à 0 un panel qui contient des Users Controls
    Par Nadiya dans le forum Windows Forms
    Réponses: 2
    Dernier message: 25/09/2010, 12h08
  2. Soucis avec panel, ses controls et les événements
    Par Arno_94 dans le forum Général Dotnet
    Réponses: 6
    Dernier message: 06/08/2008, 12h25
  3. Panel avec des bords ronds ....
    Par Djedjeridoo dans le forum Composants VCL
    Réponses: 3
    Dernier message: 13/01/2006, 01h25
  4. Réponses: 3
    Dernier message: 04/08/2004, 19h48
  5. redimensionnement d'une fiche et de ses controles
    Par spoony dans le forum C++Builder
    Réponses: 5
    Dernier message: 04/04/2004, 12h15

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