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 :

[VB.NET] repeater/datagrid dynamique clique d'un bouton


Sujet :

ASP.NET

  1. #1
    Membre régulier
    Inscrit en
    Février 2005
    Messages
    270
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 270
    Points : 92
    Points
    92
    Par défaut [VB.NET] repeater/datagrid dynamique clique d'un bouton
    Bonjour à tous et à toutes,

    Voici ma question du jour :

    J'ai créer un controle utilisateur qui me permet de créer dynamiquement un repeater. Chaque item de mon repeater contient :

    un tableau tjs visible avec un bouton
    un tableau qui n'est pas forcement visible

    Le but c'est que qd je clique sur le bouton du premier, si le deuxième est invisble, il devient visible et inversement.

    Le résultat c'est que de visu, j'ai un tableau dont je peux "déplier" chaque ligne.

    Donc dans la fonction qui gère l'évènement du clique du bouton, je teste si le deuxième tableau est visible pour savoir si je suis entrain de plier ou déplier la ligne, le hic c'est que même qd la ligne est dépliée, il me met

    Je sens bien qu'il doit y avoir un problème d'initialisation qqpart, le truc c'est que si je mets l'inititalisation du repeater dans un if not ispostback, je n'ai plus rien qd je clique sur le bouton.

    Je pense que ce genre de problème doit aussi se poser avec des datagrids dynamiques, c'est pourquoi j'ai mis aussi datagrid dans le sujet.

    Voilà

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Août 2003
    Messages
    835
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2003
    Messages : 835
    Points : 1 046
    Points
    1 046
    Par défaut
    Salut,

    C'est quoi que tu appelles "créer dynamiquement un repeater" ? Si c'est faire un nouveau repeater avec un "new" puis l'ajouter aux controles de ta page, alors il faut effectuer cette opération à chaque postBack, MAIS il ne faut l'initialiser (le DataBind) qu'une seule fois. Ce qui donne en gros :

    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
     
     
    protected Repeater MonRepeater;
     
    void Page_Load()
    {
       //Ici tu ajoutes ton repeater
       MonRepeater = new Repeater;
       this.Controls.Add(MonRepeater );
     
       if( ! Page.IsPostBack )
       {
          //Ici tu l'initialises
          MonRepeater.DataSource = UnTruc;
          MonRepeater.DataBind();
     
       }
    }

  3. #3
    Membre régulier
    Inscrit en
    Février 2005
    Messages
    270
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 270
    Points : 92
    Points
    92
    Par défaut
    c'est un peu plus compliqué que ca

    Sur ma page principale, j'ai placeholder. Dans le page_load, je fais appel à un controle utilisateur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
     
            TBD_tableau = CType(LoadControl("TableauDepliable.ascx"), TableauDepliable)
            ' passage de valeurs à TBD_tableau avec des propriétés publiques
            PH_Repeater.Controls.Add(TBD_tableau)
     
    End Sub
    Dans mon controle utilisateur je créé dynamiquement mon repeater :

    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
     
     
    Public Sub AfficheRepeater()
     
            ' Initialisation du dataview
            DV_Repeater = New DataView
            DV_Repeater.Table = Me.table
            RPT_TableauDepliable.DataSource = DV_Repeater
            RPT_TableauDepliable.DataBind()
     
    End Sub
     
    Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
     
            ' Initialisation des templates 
            RPT_TableauDepliable.HeaderTemplate = New TableauDepliableTemplate(ListItemType.Header)
            RPT_TableauDepliable.ItemTemplate = New TableauDepliableTemplate(ListItemType.Item)
            RPT_TableauDepliable.AlternatingItemTemplate = New TableauDepliableTemplate(ListItemType.AlternatingItem)
            RPT_TableauDepliable.FooterTemplate = New TableauDepliableTemplate(ListItemType.Footer)
     
            Me.AfficheRepeater()
     
    End Sub
    pour simplifier la lecture j'ai enlevé les autres paramètres du constructeur : TableauDepliableTemplate, ce sont des paramètres de style, etc.

    comme tu peux voir ma fonction AfficheRepeater() est publique car je me suis dit que j'allais faire l'appelle dans ma page pcpal, comme suit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
     
            TBD_tableau = CType(LoadControl("TableauDepliable.ascx"), TableauDepliable)
            ' passage de valeurs à TBD_tableau avec des propriétés publiques
            PH_Repeater.Controls.Add(TBD_tableau)
     
            if not ispostback
              TBD_tableau.AfficheRepeater()
            end if
     
    End Sub
    donc ca rejoint ce que tu disais, mais si je fais ca rien ne s'affiche :

  4. #4
    Membre régulier
    Inscrit en
    Février 2005
    Messages
    270
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 270
    Points : 92
    Points
    92
    Par défaut
    j'suis pitetre pas très claire :

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    130
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 130
    Points : 91
    Points
    91
    Par défaut
    Dans la méthode : AfficheRepeater() , c'est sensé charger les données qui doivent tantôt être visibles/non-visibles ?

  6. #6
    Membre régulier
    Inscrit en
    Février 2005
    Messages
    270
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 270
    Points : 92
    Points
    92
    Par défaut
    nan la méthode affiche Repeater me charge les lignes toujours visible de mon tableau :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    ------------------------------------------------------------------
     :arrow:  toto1
    ------------------------------------------------------------------
     :arrow:  toto2
    ------------------------------------------------------------------
     :arrow:  toto3
    ------------------------------------------------------------------
     :arrow:  toto4
    ------------------------------------------------------------------
     :arrow:  toto5
    ------------------------------------------------------------------
    affiche repeater me charge les données toto1, .....
    et quand je clique sur un : la ligne correspondate ce déplie (ie : affiche un tableau vide)

  7. #7
    Membre éprouvé
    Profil pro
    Inscrit en
    Août 2003
    Messages
    835
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2003
    Messages : 835
    Points : 1 046
    Points
    1 046
    Par défaut
    J'ai l'impression comme je te l'ai dit que tu rebind tes données a chaque postback (dans le Page_Load de ton controle utilisateur) , il ne faut pas. Ton page_load devrait ressembler a ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
     
            ' Initialisation des templates
            RPT_TableauDepliable.HeaderTemplate = New TableauDepliableTemplate(ListItemType.Header)
            RPT_TableauDepliable.ItemTemplate = New TableauDepliableTemplate(ListItemType.Item)
            RPT_TableauDepliable.AlternatingItemTemplate = New TableauDepliableTemplate(ListItemType.AlternatingItem)
            RPT_TableauDepliable.FooterTemplate = New TableauDepliableTemplate(ListItemType.Footer)
     
         if( ! Page.IsPostBack )
            Me.AfficheRepeater()
     
    End Sub

  8. #8
    Membre régulier
    Inscrit en
    Février 2005
    Messages
    270
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 270
    Points : 92
    Points
    92
    Par défaut
    le pblm c'est que si je fais ca, mon tableau s'affiche bien au chargement de la page, mais disparait lorsque je clique sur le bouton de "dépliage" d'une des lignes

  9. #9
    Membre éprouvé
    Profil pro
    Inscrit en
    Août 2003
    Messages
    835
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2003
    Messages : 835
    Points : 1 046
    Points
    1 046
    Par défaut
    Désolé Lucie, je ne vois pas bien ce qui cloche là, il faudrait regarder plus en profondeur ton code. Ce que je sais concernant les controles chargés dynamiquement c'est qu'ils doivent l'etre a chaque postBack, mais ne doivent etre initialisés qu'une seule fois (en regle générale...).

  10. #10
    Membre régulier
    Inscrit en
    Février 2005
    Messages
    270
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 270
    Points : 92
    Points
    92
    Par défaut
    ce que je trouve bizarre, c'est que dans la cas d'un datagrid par exemple, il ne doit etre chargé (les données j'entends) qu'une seule fois, mais si on veut appliquer le tri, la pagination, les commandes de modifs, etc., alors il faut le rechargé. C'est pour quoi suite à ton message, je mets bien l'appel de la fonction dans le if not ispostback et je la rappelle en fin d'évènement de clique sur mes boutons, mais ca ne focntionne pas : ie mon repeater disparait

    en tous cas merci pour ton aide

  11. #11
    Membre régulier
    Inscrit en
    Février 2005
    Messages
    270
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 270
    Points : 92
    Points
    92
    Par défaut
    il est vraiment .... il est vraiment ....
    bon d'accord je

    Gros merci à Sphax

    la solution était de mettre le code qui était dans le page_load du controle utilisateur dans la fonction : onInit

    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
     
     
    Protected Overrides Sub OnInit(ByVal e As System.EventArgs)
     
            ' Initialisation des templates 
            RPT_TableauDepliable.HeaderTemplate = New TableauDepliableTemplate(ListItemType.Header)
            RPT_TableauDepliable.ItemTemplate = New TableauDepliableTemplate(ListItemType.Item)
            RPT_TableauDepliable.AlternatingItemTemplate = New TableauDepliableTemplate(ListItemType.AlternatingItem)
            RPT_TableauDepliable.FooterTemplate = New TableauDepliableTemplate(ListItemType.Footer)
     
            If Not IsPostBack Then
                Me.AfficheRepeater()
            End If
     
    End Sub

  12. #12
    Membre éprouvé
    Profil pro
    Inscrit en
    Août 2003
    Messages
    835
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2003
    Messages : 835
    Points : 1 046
    Points
    1 046
    Par défaut
    On sent que t'es vraiment heureuse que ça marche finalement . Content d'avoir pu aider.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [VB.Net] Repeater , contenu dynamique
    Par dyree dans le forum ASP.NET
    Réponses: 31
    Dernier message: 11/07/2006, 10h54
  2. Réponses: 14
    Dernier message: 25/06/2006, 19h18
  3. [VB.NET] ComboBox/Datagrid enabled mais pas en saisie
    Par Cereal123 dans le forum Windows Forms
    Réponses: 6
    Dernier message: 10/09/2004, 14h11
  4. [VB.NET] Pagination DataGrid
    Par sehing dans le forum ASP.NET
    Réponses: 5
    Dernier message: 20/07/2004, 16h28
  5. [VB.NET] [Winform] DataGrid Excel et CheckBox
    Par mic56 dans le forum Windows Forms
    Réponses: 4
    Dernier message: 24/06/2004, 15h10

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