none
User Control - Custom template

    Question

  • Bonjour,

    Après avoir épluché des dizaines de forums, je fais finalement appel à vous.

    Fonctionnant sur ASP .NET, je souhaite créer un user control qui est en fait un tableau, mais dont les cellules sont personnalisées.

    Pour la création des lignes c'est OK (j'utilise une listview), mais pour la création de la cellule, je n'arrive pas à faire garder les informations lors d'un postback.
    Le user control qui construit la cellule du tableau est appelé "TemplateFieldCustom", avec un "DataSource" comme propriété qui prend mon objet, et un "ItemTemplate" de type "ITemplate" pour la partie design.

    Ici voici un exemple de code qui me permet d'écrire la ligne d'un tableau :

    <asp:ListView runat="server" ID="GridViewDynamicHeader"> <ItemTemplate> <th> <uc:TemplateFieldCustom runat="server" ID="uc_TemplateHeader" DataSource='<%# Container.DataItem %>'
    OnInit="uc_TemplateHeader_Init" OnPreRender="uc_TemplateSecondaryHeader_PreRender"> </uc:TemplateFieldCustom> </th> </ItemTemplate> </asp:ListView>

    Le "OnInit" permet d'initialiser la propriété "ItemTemplate" du "TemplateFieldCustom", et le "OnPreRender" réalise un "DataBind()" qui appelle les méthodes pour construire le template.

    Je me demande si ce n'est pas cette partie qui me bloque dans mon avancé...

    Dans mon "DataBind" voici ce qu'il s'y passe (la transformation se fait avec l'aide d'un "ListViewDataItem" :

    public new void DataBind()
    {
      ListViewDataItem item = new ListViewDataItem(0, 0);
      item.DataItem = DataSource;
      if (DataSource == null)
      {
        // A gérer
      }
      else
        ItemTemplate.InstantiateIn(item);
      this.Controls.Add(item);
      item.DataBind();
    }

    Voilà. Donc maintenant je cherche à garder les informations générés. Car lors d'un postback, c'est des cellules vide qui restent.

    Je pense avoir mis le nécessaire, mais si vous avez besoin de plus d'information je ferais ce que je peux.
    Je précise aussi que le gridview (et compagnies) ne suffisent pas. L'affichage final à avoir étant un peu particulier.
    Merci d'avance pour votre aide.

    Damien

    Edit : j'ai fait quelques tests supplémentaires en simplifiant le user control.
    Aspx :

    <gv:TemplateFieldCustom runat="server" ID="tfc">
      <ItemTemplate>
        <asp:PlaceHolder runat="server" ID="ph">
          <span><%# Eval("Un") %></span>
          <span style="color: red;"><%# Eval("Deux") %></span>
          <span style="color: green; font-weight: bold;"><%# Eval("Trois") %></span>
        </asp:PlaceHolder>
      </ItemTemplate>
    </gv:TemplateFieldCustom>

    cs :

    var obj1 = new { Un = "1", Deux = "2", Trois = "3" };
    tfc.DataSource = obj1;
    tfc.DataBind();

    Donc j'ai bien mes valeurs au chargement, mais après un postback, le controle renvoie "vide".

    Si quelqu'un qui connait comment fonctionne les gridview et consort à ce niveau ça m'intéresse. =)
    Merci encore d'avance.


    • Modifié Frontier. _ jeudi 20 juin 2013 07:16 Ajout test
    mercredi 19 juin 2013 08:22

Réponses

  • J'ai l'impression que la phrase n'est pas fini. =)

    Mais je comprends ce que vous voulez dire. Malheureusement c'est encore plus restrictif que de sérialiser des classes. Et ça ne correspond toujours pas à ce que je recherche. le développeur ne doit pas s'embêter à gérer les types de données dans la DataSource.
    J'ai tout de même trouvé un "moyen" pour arriver au résultat escompté (c'est plus une bidouille mais ça fonctionne en attendant d'adapter une autre solution que j'ai trouvé).

    En gros l'idée est d'utiliser une ListView avec "1" item. Le getter et le setter de la propriété DataSource suffira pour faire la conversion en Array.

    J'ai eu par la suite un soucis pour pouvoir replacer l'ITemplate comme il faut pour toutes les situations possibles (le contrôle a besoin d'être replacé après chaque postback, et impossible de le placer en ViewState ou autre). Mais j'ai au final fini par trouver hier soir le bon cheminement.

    Ici un exemple des sources fonctionnels, s'il y en a à qui ça intéresse :
    https://skydrive.live.com/redir?resid=1D35D94D4E1BFF82!3874&authkey=!ABzeU2A3aePZn50

    Concernant la partie pour garder des données dans la DataSource, j'ai trouvé il y a peu et par hasard cette page :
    http://msdn.microsoft.com/fr-fr/library/system.web.ui.webcontrols.databoundcontrol.aspx

    De ce que j'ai vu c'est cette classe qu'il faut donc utiliser pour gérer des DataSource convenablement.
    Mes premiers essais ne se sont pas révélés fructueux, j'ai donc opter pour la solution temporaire du ListView en attendant de m'y mettre sérieusement (et dans le cas actuel des choses, je doute que ce soit performant quand il y aura un grand nombre de données, ce qui risque d'être clairement mon cas).

    En tout cas merci pour votre aide.

    Damien

     

     


    • Marqué comme réponse Frontier. _ mercredi 26 juin 2013 08:22
    • Modifié Frontier. _ mercredi 26 juin 2013 08:23 Correction phrase
    mercredi 26 juin 2013 08:20

Toutes les réponses