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 :

comment spécifier le contenu d'un custom control ?


Sujet :

ASP.NET

  1. #1
    Membre confirmé
    Inscrit en
    Février 2004
    Messages
    77
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 77
    Par défaut comment spécifier le contenu d'un custom control ?
    Bonjour

    j'ai un problème qui je pense doit être assez basique mais je n'arrive pas à trouver la réponse malheureusement...

    J'ai besoin d'afficher beaucoup de cadre aux angles arrondis dans ma page asp.net, et pour cela je dispose du code html et CSS (un div, des tables, des images pour les coins, le tout bien positioné etc...).

    Afin d'éviter d'avoir toutes les balises dans ma page aspx ce qui rendrait le code plus difficile à lire et à maintenir, j'ai essayé de faire un contrôle pour rendre cette boite.

    Comme je débute, je n'avais pas connaissance des fichiers .ascx qui semble parfait pour mon besoin, j'ai donc pris l'option d'hériter de WebControl et de mettre tous mes tags via HTMLTextWriter en surchargeant les méthodes RenderBeginTag et RenderEndTag. Cela fonctionne parfaitement à un détail près, il m'insère automatiquement une balise <span> autour de tout mon code et je n'en veux pas.
    1ère question: comment puis-je spécifier que la balise "de base" de rendu de mon WebControl serait un div et non un span ?

    Comme je n'ai pas trouvé, et que j'ai découvert les .ascx, je me suis orienté vers ça, mais là l'information qu'il me manque, c'est comment dans mon .ascx je précise l'endroit qui correspond au contenu de mon contrôle ? (autrement dit toutes les balises qui seront incluses dans mon controle).

    L'une ou l'autre réponse me sauverait l'après midi d'une nouvelle migraine (pas évident de débuter en asp.net sans expérience web solide... ça change des windows forms )

    Merci bcp

  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,

    En général, un "span" est ajouté pour les "label", un "div" pour les "panel". Vérifie.

    Ensuite, tu peux faire une propriété (un "Literal"?) à ton contrôle. Tu pourras ainsi lui passer du code HTML. Ce code HTML sera inséré où tu veux dans ton contrôle.

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

  3. #3
    Membre confirmé
    Inscrit en
    Février 2004
    Messages
    77
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 77
    Par défaut
    salut et merci

    je ne peux pas passer par une propriété pour setter mon code html car je veux justement éviter de le voir apparaitre dans ma page aspx (j'ai grosso modo une bonne vingtaine de balise pour mon cadre, et bcp de cadre par page... mon but c'est de condenser tout ça avec une seule balise).

    je vais mettre le code que j'ai fais, il fonctionne très bien sauf que j'ai un span comme balise principal et je ne sais pas comment modifier ça. Cela dit ça marche aussi avec un span (en précisant un vieux docType html 3.2 )

    J'ajoute les classes CSS des différents élément de mon cadre et dans le CSS je spécifie les border, les tailles, les images etc..


    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
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
     
        [ParseChildren()]
        public class CustomRoundBox : WebControl
        {
     
            public override void RenderBeginTag(HtmlTextWriter writer)
            {
     
                base.RenderBeginTag(writer);
     
                writer.AddAttribute(HtmlTextWriterAttribute.Border, "0");
                writer.AddAttribute(HtmlTextWriterAttribute.Cellpadding, "0");
                writer.AddAttribute(HtmlTextWriterAttribute.Cellspacing, "0");
                writer.AddAttribute(HtmlTextWriterAttribute.Width, "100%");
                writer.AddAttribute(HtmlTextWriterAttribute.Height, "100%");
                writer.RenderBeginTag(HtmlTextWriterTag.Table);
     
                //début 1ère ligne
     
                writer.AddAttribute(HtmlTextWriterAttribute.Class,"boxBorderTopRow");                        
                writer.RenderBeginTag(HtmlTextWriterTag.Tr);
                writer.RenderBeginTag(HtmlTextWriterTag.Td);
                writer.AddAttribute(HtmlTextWriterAttribute.Border, "0");
                writer.AddAttribute(HtmlTextWriterAttribute.Cellpadding, "0");
                writer.AddAttribute(HtmlTextWriterAttribute.Cellspacing, "0");
                writer.AddAttribute(HtmlTextWriterAttribute.Width, "100%");
                writer.AddAttribute(HtmlTextWriterAttribute.Height, "100%");
                writer.RenderBeginTag(HtmlTextWriterTag.Table);
     
                writer.RenderBeginTag(HtmlTextWriterTag.Tr);
                writer.AddAttribute(HtmlTextWriterAttribute.Class, "tl"); //top left
                writer.RenderBeginTag(HtmlTextWriterTag.Td);            
                writer.RenderEndTag();
     
                writer.AddAttribute(HtmlTextWriterAttribute.Class, "boxBorderTop");
                writer.RenderBeginTag(HtmlTextWriterTag.Td);
                writer.Write("&nbsp");
                writer.RenderEndTag();
     
                writer.AddAttribute(HtmlTextWriterAttribute.Class, "tr");  
                writer.RenderBeginTag(HtmlTextWriterTag.Td);
                writer.RenderEndTag(); 
                writer.RenderEndTag(); //TR
                writer.RenderEndTag(); //Table
                writer.RenderEndTag(); //TD
                writer.RenderEndTag(); //TR
                //fin 1ère ligne
     
                //début 2ème ligne (contenu)
                writer.RenderBeginTag(HtmlTextWriterTag.Tr);
                writer.AddAttribute(HtmlTextWriterAttribute.Class, "roundBoxBody");
                writer.RenderBeginTag(HtmlTextWriterTag.Td);
     
            }
     
            public override void RenderEndTag(HtmlTextWriter writer)
            {
                base.RenderEndTag(writer);
     
                writer.RenderEndTag(); //Tr 2ème ligne
     
                //début 3ème ligne            
     
                writer.AddAttribute(HtmlTextWriterAttribute.Class, "boxBorderBottomRow");
                writer.RenderBeginTag(HtmlTextWriterTag.Tr);
                writer.RenderBeginTag(HtmlTextWriterTag.Td);
                writer.AddAttribute(HtmlTextWriterAttribute.Border, "0");
                writer.AddAttribute(HtmlTextWriterAttribute.Cellpadding, "0");
                writer.AddAttribute(HtmlTextWriterAttribute.Cellspacing, "0");
                writer.AddAttribute(HtmlTextWriterAttribute.Width, "100%");
                writer.AddAttribute(HtmlTextWriterAttribute.Height, "100%");
                writer.RenderBeginTag(HtmlTextWriterTag.Table);
     
                writer.RenderBeginTag(HtmlTextWriterTag.Tr);
                writer.AddAttribute(HtmlTextWriterAttribute.Class, "bl"); //top left
                writer.RenderBeginTag(HtmlTextWriterTag.Td);
                writer.RenderEndTag();
     
                writer.AddAttribute(HtmlTextWriterAttribute.Class, "boxBorderBottom");
                writer.RenderBeginTag(HtmlTextWriterTag.Td);
                writer.Write("&nbsp");
                writer.RenderEndTag();
     
                writer.AddAttribute(HtmlTextWriterAttribute.Class, "br");
                writer.RenderBeginTag(HtmlTextWriterTag.Td);
                writer.RenderEndTag();
                writer.RenderEndTag(); //TR
                writer.RenderEndTag(); //Table
                writer.RenderEndTag(); //TD
                writer.RenderEndTag(); //TR
                //fin 3ème ligne
     
                writer.RenderEndTag(); //Table
                writer.RenderEndTag(); //Span
            }
        }
    Ensuite dans ma page aspx je mets :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
        <cc1:CustomRoundBox ID="CustomRoundBox2" runat="server" CssClass="roundBoxWhite" style="width:200; height:500;">   
        contenu 
        </cc1:CustomRoundBox>
    sans oublier le
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <%@ Register assembly="monAssembly" namespace="monNameSpace" tagprefix="cc1" %>
    qui va bien.

  4. #4
    Membre confirmé
    Inscrit en
    Février 2004
    Messages
    77
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 77
    Par défaut
    et voici le code HTML qui est généré :
    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
     
      <span id="MyCustomCC1" class="roundBoxWhite" style="width:300px;height:200px;">
    <table border="0" cellpadding="0" cellspacing="0" width="100%" height="100%">
    	<tr class="boxBorderTopRow">
    		<td><table border="0" cellpadding="0" cellspacing="0" width="100%" height="100%">
    			<tr>
    				<td class="tl"></td><td class="boxBorderTop">&nbsp</td><td class="tr"></td>
    			</tr>
    		</table></td>
    	</tr><tr>
    		<td class="roundBoxBody"> 
            contenu
        </td>
    	</tr><tr class="boxBorderBottomRow">
    		<td><table border="0" cellpadding="0" cellspacing="0" width="100%" height="100%">
    			<tr>
    				<td class="bl"></td><td class="boxBorderBottom">&nbsp</td><td class="br"></td>
    			</tr>
    		</table>
    </td>
    	</tr>
    </table>
    </span>

  5. #5
    Membre confirmé
    Inscrit en
    Février 2004
    Messages
    77
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 77
    Par défaut
    Citation Envoyé par duffman Voir le message
    salut et merci

    je ne peux pas passer par une propriété pour setter mon code html car je veux justement éviter de le voir apparaitre dans ma page aspx (j'ai grosso modo une bonne vingtaine de balise pour mon cadre, et bcp de cadre par page... mon but c'est de condenser tout ça avec une seule balise).
    pardon j'ai lu un peu trop vite ta réponse, dans le cas d'un ascx ça fonctionnera effectivement, je pensais qu'on pouvait faire autrement cela dit (faire ne sorte que le contenu soit situé entre les balises de mon ascx..

  6. #6
    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
    Et à quoi ressemble le code "frontal" de ton controle?
    "Winter is coming" (ma nouvelle page d'accueil)

  7. #7
    Membre confirmé
    Inscrit en
    Février 2004
    Messages
    77
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 77
    Par défaut
    dsl je comprends pas trop, qu'est ce que tu entends par code frontal ?

    la déclaration du controle dans la page aspx ?

    ou bien le code qui apparait dans le browser après génération ?
    (auquel cas c'est le code html qui est 2 messages plus haut)

  8. #8
    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
    Le code dans la page ascx, pas ascx.cs.
    "Winter is coming" (ma nouvelle page d'accueil)

  9. #9
    Membre confirmé
    Inscrit en
    Février 2004
    Messages
    77
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 77
    Par défaut
    bah il aurait exactement la même tête que le HTML généré mais j'ai laissé tomber cette option vu que j'ai quasiment réussi à faire fonctionnerle contrôle C# héritant de WebControl.

    Pour modifier la balise span par défaut en div il suffit de modifier le constructeur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
        [ParseChildren()]
        public class CustomRoundBox : WebControl
        {
     
            public CustomRoundBox() : base(HtmlTextWriterTag.Div)
            {
            }
    bon maintenant j'ai plein de problème d'affichage avec le doctype par défaut, en mettant un vieux ça fonctionne bien...

  10. #10
    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
    Ok, le span serait la valeur utilisée par défaut pour baliser le contrôle. A mon avis c'est parce que tu lui appliques un style
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        <cc1:CustomRoundBox ID="CustomRoundBox2" runat="server" CssClass="roundBoxWhite" style="width:200; height:500;">   
        contenu 
        </cc1:CustomRoundBox>
    alors que le contenu n'est qu'un tableau. Ce style est donc associé à un span qui est une balise relativement neutre. Essayes d'ajouter un panel qui contiendra ton tableau.
    "Winter is coming" (ma nouvelle page d'accueil)

  11. #11
    Membre confirmé
    Inscrit en
    Février 2004
    Messages
    77
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 77
    Par défaut
    c'est bon j'ai résolu mon problème merci il manquait un l'attribut taille 100% pour la partie du milieu de mon cadre qui faisait foirer l'affichage.

    Merci pour tes réponses elles m'ont été utiles

  12. #12
    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
    Cette discussion est interessante, tu as mis du code qui peut servir. Peux-tu nous indiquer un peu plus clairement comment tu as résolu tes deux questions?
    1ère question: comment puis-je spécifier que la balise "de base" de rendu de mon WebControl serait un div et non un span ?

    (...)

    c'est comment dans mon .ascx je précise l'endroit qui correspond au contenu de mon contrôle ? (autrement dit toutes les balises qui seront incluses dans mon controle).
    "Winter is coming" (ma nouvelle page d'accueil)

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

Discussions similaires

  1. [Custom Control] Comment modifier un Style en fonction de la visibilité ?
    Par choas dans le forum Windows Presentation Foundation
    Réponses: 3
    Dernier message: 30/09/2008, 16h27
  2. [Custom Control] Comment résoudre un problème d'affichage uniquement dans Blend ?
    Par choas dans le forum Windows Presentation Foundation
    Réponses: 15
    Dernier message: 29/09/2008, 12h23
  3. [C#/Custom Control] Comment personnaliser les évènements des contrôles enfants ?
    Par Anto03 dans le forum Windows Presentation Foundation
    Réponses: 21
    Dernier message: 26/09/2008, 08h45
  4. Comment Rafraichir le contenu de mes controles
    Par abir84 dans le forum Windows Forms
    Réponses: 16
    Dernier message: 16/05/2007, 15h12
  5. Comment imprimer le contenu d'un TStringGrid
    Par scorpiwolf dans le forum C++Builder
    Réponses: 2
    Dernier message: 19/06/2002, 15h41

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