ASP.NET : deux Repeater imbriqués ?

ASP.NET : deux Repeater imbriqués ? - C#/.NET managed - Programmation

Marsh Posté le 31-10-2005 à 15:08:00    

Alors voilà.
 
Ze truc à la con.
 
Histoire de faire un truc propre et avec peu de code, j'utilise un Repeater pour afficher le résultat d'une recherche.
 
Seulement, je dois diviser mon résultat par familles.
 
Et là ça coince :D
 
J'ai pas trouvé de notion de regroupement dans l'objet Repeater.
Du coup, j'ai modifié ma recherche de façon à retrouver les familles qui ont des éléments correspondants à la rechercher, puis pour chaque famille, je charge tous les items (ça tombe bien, c'est de toute façon ce qu'on me demande de faire).
 
Seulement, j'ai mon premier Repeater pour afficher les familles.
Cool.
 
Et je fais comment pour mettre un second Repeater à l'interrieur du ItemTemplate ? Surtout pour le remplir... En fait, je sèche. C'est possible ? Ou si je dois me faire un contrôle à la main ?

Reply

Marsh Posté le 31-10-2005 à 15:08:00   

Reply

Marsh Posté le 31-10-2005 à 15:31:19    

J'avoue que je n'ai jamais essayé, mais je ne vois pas ce qui pourrait empêcher l'imbrication de Repeater  [:airforceone]
Je suis justement en train de modifier un Repeater, je vais essayer si j'ai 2mn :jap:

Reply

Marsh Posté le 31-10-2005 à 15:36:37    

Ben... Bon, je vais faire, un test, ce sera plus simple :D

Reply

Marsh Posté le 01-11-2005 à 12:41:22    

Oui, c'est sûr, deux repeater imbriqués ça marche.
C'est même le moyen le plus simple pour faire une DataGrid custom, ou (précisémment) le résultat d'une page de recherche :)
Dsl, j'ai pas de sample sous la main...

Reply

Marsh Posté le 01-11-2005 à 12:54:48    

OK, bon, là pour le moment j'avais mis de côté la chose (grosse merde sur un autre truc qui n'a rien à voir, et ce développement n'étant pas prioritaire, je l'avais mis de côté).
 
Je devrais m'y remettre demain dans la journée. Si j'ai des PB, je ne manquerai pas de venir poser mes questions ;)
 
Mais le souci des Repeater imbriqués, c'est : comment je met le DataBind de celui qui est imbriqué ? Dans l'évent de pre-rendu du premier, je crée un Repeater dans l'Item et le lance ma requête ?

Reply

Marsh Posté le 01-11-2005 à 13:25:33    

Je conseillerai d'utiliser 'ItemDataBound' plutôt que 'PreRender'
Un exemple simple :
 

Code :
  1. <asp:Repeater id="Repeater1" runat="server">
  2. <itemtemplate>
  3.  <asp:Label id="lbl1" runat="server"></asp:Label><br>
  4.  <asp:Repeater id="Repeater2" runat="server">
  5.   <itemtemplate>
  6.    <asp:Label id="lbl2" runat="server"></asp:Label><br>
  7.   </itemtemplate>
  8.  </asp:Repeater><br>
  9. </itemtemplate>
  10. </asp:Repeater>


Code :
  1. private void Page_Load(object sender, System.EventArgs e)
  2. {
  3. Data []data = ...
  4. this.Repeater1.ItemDataBound += new RepeaterItemEventHandler(Repeater1_ItemDataBound);
  5. this.Repeater1.DataSource = data;
  6. this.Repeater1.DataBind();
  7. }
  8. private void Repeater1_ItemDataBound(object sender, RepeaterItemEventArgs e)
  9. {
  10. // get the data
  11. Data data = e.Item.DataItem as Data;
  12. if(data != null)
  13. {
  14.  // get the Label
  15.  Label lbl = (e.Item.FindControl("lbl1" ) as Label);
  16.  if(lbl != null)
  17.   lbl.Text = data.value;
  18.  // get the sub repeater
  19.  Repeater subrepeater = (e.Item.FindControl("Repeater2" ) as Repeater);
  20.  if(subrepeater != null)
  21.  {
  22.   subrepeater.ItemDataBound += new RepeaterItemEventHandler(Repeater2_ItemDataBound);
  23.   subrepeater.DataSource = data.subdatas;
  24.   subrepeater.DataBind();
  25.  }
  26. }
  27. }
  28. private void Repeater2_ItemDataBound(object sender, RepeaterItemEventArgs e)
  29. {
  30. // get the data
  31. SubData sub = e.Item.DataItem as SubData;
  32. if(str != null)
  33. {
  34.  // get theLabel
  35.  Label lbl = (e.Item.FindControl("lbl2" ) as Label);
  36.  if(lbl != null)
  37.   lbl.Text = SubData.value;
  38. }
  39. }

Reply

Marsh Posté le 01-11-2005 à 14:03:40    

oui, c'était ça donc je voulais parler, mais je ne me souvenais plus du nom ;)
 
merci, je regarde ça sans faute (là je peux pas, je suis en train de voler avec FS :D)

Reply

Marsh Posté le 02-11-2005 à 11:03:27    

Merci, je viens d'adapter ton exemple, et ça marche parfaitement !
 
Seul truc domage, c'est que c'est pas bien rapide (obligé de faire n requêtes là où avant j'en avais qu'une seule) mais bon :spamafote:

Reply

Marsh Posté le 04-11-2005 à 16:14:17    

Bah tu peux aussi ne faire qu'une seule requête et coller tes données dans une structure plus complexe.
Ca rajoute une phase de traitement avant affichage, mais ce sera plus rapide que N requête.
Si tu as de la motivation, je te conseille de te pencher sur les DataSet fortement typés...

Reply

Marsh Posté le 04-11-2005 à 16:25:58    

ouais, mais à ce moment, autant faire l'affichage dans le traitement pré-affichage, donc je fais rester avec cette structure simple pour le moment ;)
 
le but du jeu, c'est d'économiser le code et le rendre facilement lisible et compréhensible : je débute le c# et je suis nul. et je suis celui qui s'y connait le plus dans ma boîte, donc je pense à mes camarades qui risquent de devoir maintenir derrière moi ;)

Reply

Marsh Posté le 04-11-2005 à 16:25:58   

Reply

Marsh Posté le 04-11-2005 à 16:27:08    

mais sinon, je garde sous le coude le coup des dataset fortement typés, j'en ai vu passer dans la doc, et ça a l'air plutôt intéressant (ça ressemble un peu à ma notion de records fichiers dont je parle dans l'autre topic ;))

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed