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 , contenu dynamique


Sujet :

ASP.NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    121
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 121
    Par défaut [VB.Net] Repeater , contenu dynamique
    bonjour,


    j'ai creer un repeater, contenant sur chaque ligne 2 champs. l'un est un label, et le 2 doit etre dynamique et fonction du type de données présent dans ma base.

    alors pour le moment , jarrive tres bien a differencier le type de donnée, mais je ne vois vriament pas comment rendre invisible le champ qui ne m'est pas utile.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     <td>
                                <asp:Label id="champ_lab" text='<%# DataBinder.Eval(Container.DataItem, "champ_label") %>' runat="server" />
                            </td>
                            <td>
                                <asp:textbox id="champ_text" visible="false" Text='<%# DataBinder.Eval(Container.DataItem, "champ_textbox") %>' Runat="server" />
                                <asp:CheckBox id="champ_checkbox" visible="false" runat="server" Text='<%# DataBinder.Eval(Container.DataItem, "champ_textbox") %>'></asp:CheckBox>
                            </td>
    typiquement j'aimerai que seule l'un des 2 champs coloré s'affiche.
    le code , pour mettre a jour ces champs est :

    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 new(newchamp_label2 As String, newchamp_textbox2 As String, type as string )
          Me.champ_label2 = newchamp_label2
          select type
     
             case "System.String"
     
                Me.champ_textbox2 = type
     
             case "System.Boolean"
     
                Me.champ_checkbox2 = type
     
             case "System.Double"
     
                Me.champ_textbox2 = type
     
             case "System.int32"
     
                Me.champ_textbox2 = type
     
          end select
     
        End Sub
    le = type pour le moment ne sert a rien . c'etait plutot pour voir si j'arrivais a les differencier et c'est le cas. Sauf pour le Boolean qui ne fonction pas.

    Qqqun pourrait donc t il maidé ?

    merci d'avance

  2. #2
    Membre Expert Avatar de guitoux1
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 011
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 011
    Par défaut
    Si je comprend bien , tu veux afficher soit un TextBox soit une Chackbox selon la valeur d'un champ string de ton objet ?
    Genre si c'est "System.String", alors c'est textbox et si c'est System.Boolean, alors c'est checkbox ?

    Alors fait plutot un truc du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <td>
       <asp:textbox id="champ_text" visible="false" Text='<%#    DataBinder.Eval(Container.DataItem, "champ_textbox") %>' Runat="server" />
       <asp:CheckBox id="champ_checkbox" visible="false" runat="server" Text='<%# DataBinder.Eval(Container.DataItem, "champ_textbox") %>'></asp:CheckBox>
    </td>
    Puis dans le code behind, tu consomme l'evement ItemDataBoubd et tu fais un truc du genre :

    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
    	protected void Repeater1_ItemDataBound(object sender, RepeaterItemEventArgs e)
    	{
    		if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
    		{
    			MonItem item = e.Item.DataItem as MonItem;
     
    			switch (item.Type)
    			{
    				case "System.String":
    					e.Item.FindControl("champ_text").Visible = true;
    					break;
     
    				case "System.Booleen":
    					e.Item.FindControl("champ_checkbox").Visible = true;
    					break;
    			}
     
    		}
    	}
    dans ce cas, j'utilise un objet MonItem comme ç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
    22
    public class MonItem
    {
    	private string _type;
    	public string Type
    	{
    		get { return _type; }
    		set { _type = value; }
    	}
     
    	private string _champ_textbox;
     
    	public string champ_textbox
    	{
    		get { return _champ_textbox; }
    		set { _champ_textbox = value; }
    	}
     
    	public MonItem(string type)
    	{
    		_type = type;
    	}
    }

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    121
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 121
    Par défaut
    non cela ne passe pas,

    j'ai un probleme avec l'acces au elements du repeater
    peu importe lendroit ou je me trouve , il me dit qu'il ne connais pas l'element

    RepeaterIt.FindControl("champ_text")

    je peux y avoir acces mais pas avant que mon repeater soit binder -.-
    je ne comprend pas pourquoi je ne peu acceder ou je veux a des elements qui sont pourtant declarer dans mon code aspx

  4. #4
    Membre Expert Avatar de guitoux1
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 011
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 011
    Par défaut
    c'est normal. Quand tu met une texbox coté ASP dans le ItemTemplate de ton repeater, cette textbox (avec par exemple l'ID xhamp_textbox) sera répété par autant de ligne du repeater une fois binder.
    Donc, le framework te renomme le champ ID du textbox (car il ne peut y avoir qu'un seul control par ID dans une page HTML), soit :

    Repeater1::champ_textbox
    Repeater2::champ_textbox
    Repeater3::champ_textbox
    ...

    Donc du coup, tu ne peux pas faire : monRepeater.FindControl("champ_textbox") car ce controle n'existe pas au sein du repeater. Il existe au sein de chamque repeaterItem.

    C'est pourquoi tu doit mettre le code que je t'ai donné dans l'évenement OnItemDataBound Cet evenemtn est décmenché à chaque fois que le repeater à binder un élement (une ligne) de ta source de donnée.
    Ensuite, tu accède aux controles de la ligne qui vient d'être "bindée" dans ton repeater grace au parametre RepeaterItemEventArgs, soit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    e.Item.FindControl("champ_textbox");
    Ce qu'il faut garder en tête, c'est que t'es controle sont inaccessible tant que le "bindage" n'as pas eu lieu. Donc tu le fais dans les évenement qui sont déclenché APRES le bindage (OnItemDataBound par exemple)

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    121
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 121
    Par défaut
    marci beaucoup guitoux, je vais y travailler.

    tes connaissance n'ont d'egale que ta candeur

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    121
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 121
    Par défaut
    derniere petite question

    pour mon repeater, je lui donne comme source de "bindage" un arraylist. il les prend donc tous en une fois.
    ma question est, donc d'apres ce que tu dis ma fonction on itemdatabound va etre lancé autant de fois que jaurai d'élement dans mon arraylist et cela, malgre que j'ai tout binder d'un coup ?

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

Discussions similaires

  1. Effet visuel de Contenu dynamique
    Par kolib dans le forum ASP
    Réponses: 7
    Dernier message: 12/09/2005, 08h37
  2. Réponses: 2
    Dernier message: 09/09/2005, 10h06
  3. [VB.NET] repeater/datagrid dynamique clique d'un bouton
    Par lucie.houel dans le forum ASP.NET
    Réponses: 11
    Dernier message: 19/07/2005, 16h17
  4. [VB.NET] Treeview creer dynamiquement a partir d'une bd
    Par graphicsxp dans le forum Windows Forms
    Réponses: 3
    Dernier message: 31/03/2005, 17h02
  5. [VB.NET] Repeater imbriqué
    Par Sadneth dans le forum ASP.NET
    Réponses: 8
    Dernier message: 18/02/2005, 15h31

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