25. juli 2004 - 20:03Der er
47 kommentarer og 1 løsning
Repeater i en dll - C#
Jeg genererer al html i en class ('Content') - og virker ganske fint. På den måde har jeg kun 1 aspx fil. Jeg er nu kommet til en side hvorpå jeg ønsker en repeater til at vise et db-udtræk.
Men hvordan sætter jeg repeaterens header, footer og itemtemplate direkte i classen? - har kun kunnet finde eksempler hvor repeateren er brugt direkte på en .aspx side, altså <asp:repeater.....><headertemp... osv...
Ja, det er rigtigt... meen. eh ja nu har jeg stadig ikke helt fattet det der med properties... hvordan får jeg repeater1.HeaderTemplate til at indholde fx '<table>' ?
Du bliver nok under alle omstændigheder nødt til at angive dine templates programmatisk istedet, hvis du vil have repeateren i en "fri" dll. Men det er ikke så slemt, da du på det nærmeste kan få hvilken som helst kontrol til at fungere som et templateitem. Kontrollen skal bare implementere ITemplate. Du har dog også muligheden for at lave en usercontrol istedet, men så kan du ikke holde det i en dll-fil alene.
Så er jeg her igen... Du kan lige få et supersimpelt eksempel :
// første en repeater public class SpecialRepeater : Repeater { public SpecialRepeater() { this.ItemTemplate = new MyRepeterItem(); this.SeparatorTemplate = new MySeperator(); } }
// og et repeateritem public class MyRepeterItem : ITemplate { public void InstantiateIn(Control container) { container.Controls.Add(new LiteralControl("Hej med dig")); } }
// og en seperator public class MySeperator : ITemplate { public void InstantiateIn(Control container) { container.Controls.Add(new LiteralControl("<hr>")); } }
Du skal være opmærksom på, at du godt kan sørge for at din dll læser nogle templates et andet sted fra, men filerne skal kunne nås via en virtuel sti, og skal ligge under din web.
okay... jeg må indrømme at jeg ikke kan finde ud af det.. :/ -
-
kan man ikke bare gøre som med fx en knap:
... { Button btn1 = new Button(); // lave en instans af en repeater btn1.Text = "knapt"; // sætte header, footer og itemtemplate + databinde this.Controls.Add(btn1); // tilføje repeateren til siden }
okay.. men.. så kommer jeg tilbage til et andet spørgsmål... hvordan sætter jeg så Header, Footer template?... altså alternativet til <asp:repea.... <HeaderTemplate> <table> </HeaderTemplate>
Hvis du vil gøre det programmatisk så du kan pakke det hele ind i en dll-fil, skal du gøre som jeg skrev til dig... Altså lave nogle klasser / kontroller hvor du implementere ITemplate - f.eks. sådan en som den her :
public class MyRepeterItem : ITemplate { public void InstantiateIn(Control container) { container.Controls.Add(new LiteralControl("Hej med dig")); } }
Nu er den jo ikke så spændende da den bare skriver "Hej med dig", men jeg ved jo ikke hvad din forskellige typer item skal kunnne
Som jeg også har skrevet har du også muligheden for - i et item - at loade en template, men så skulle du lave sådan noget som nedenstående :
public class MyRepeterItem : TemplateControl, ITemplate { public void InstantiateIn(Control container) { this.LoadContr(someVirtualPath); } }
Men så kan du som tidligere nævnt ikke holde det i en dll-fil... Så skal du i hvert fald lave en hel del tricks, hvis du skal have det til at fungere.
Jeg "VIL" gerne have det hele pakket ind i dll'en - så det er vel den her jeg skal hve gang i:
public class MyRepeaterItem : ITemplate { public void InstantiateIn(Control container) { container.Controls.Add(new LiteralControl("Hej med dig")); } }
Mht til typen..såå eh.. mener du om det fx er strenge ?
...argh.. nu kører det.... rundt i hovedet på mig :) - undskyld jeg er så "dum".. men jeg forstår ikke helt hvordan jeg skal bruge dine kode eksempler.. - hvis jeg laver en skrabet version af mit projekt.. kan du så måske indsætte repeateren deri?
(jeg smider selvfølgelig ekstra point oveni... den blev vist lidt længere end 50 point :) )
Hvis du ikke har prøvet den slags før ser det selvfølgelig lidt sært ud. Det kan også være jeg har misforstået noget omkring din måde at have bygget det op på, så skyd det her ud, så skal vi nok finde ud af noget :o) mvh
- okay, har fjernet det jeg mente der var unødvendigt: -------------------------------------------------------------------------------------
using System; using System.Collections.Specialized; using System.ComponentModel; using System.Data; using System.Web.UI; using System.Web.UI.WebControls; using System.Web.Security; using System.Web.UI.HtmlControls;
namespace Site { public class Content : Page { protected string strPage;
Ah... det er jo bare din code-behind fil. Jeg tror du lige må fortælle min hvad formålet er med ikke at angive dine templates i aspx-filen - jeg er ikke helt sikker på at jeg forstår det.
Ok - hvad skal du helt nøjagtig bruge repeateren til ? Hvis du bare skal vise noget data fra en database på skærmen - er datagriddet klart nemmere at starte med. Du kan få det til at vise noget helt uden templates i aspx-filen.
skal fx vise adresser hentet ud fra databasen. Den der er felterne 'navn', 'faxnr' eksempelvis.
Men nu har jeg ikke arbejdet så meget med DataGrid.. er Repeateren ikke nemmere at "customize".. mht CSS osv.. Dataene skal ikke vises som en tabel, altså med kolonner og rækker.. men skal sættes op.. derfor tænkte jeg at repeateren nok var bedst, eftersom jeg så kan få dataene fremstillet ligsom jeg ønsker. - eller tager jeg fejl?
uh - mange tak :) - det er det jeg gør :) - eller okay.. "kæmper" er måske mere præcis :D - men mange tak :) jeg håber at jeg får det til at virke snart... det begynder at blive pinligt med alle disse spørgsmål :)
Jeg har skrevet... Der SampleTable.X bare et synonym for et eller andet kolonnenavn i din datakilde. Du har sikkret sådan noget som dr["emailadresse"] og den slags.
Desuden kan du i det sidste eksempel se bort fra private string fieldHeader;
public MyRepeterItem(string fieldHeader) { this.fieldHeader = fieldHeader; } Det var kun i det første eksempel det blev brugt... Du kan bare fjerne
trist.... hvis du har mulighed for at lægge det nuværende projekt i en zip-fil online... Så vil jeg gerne kigge på det hvis det skulle være.
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.