Avatar billede pede15 Nybegynder
25. juli 2004 - 20:03 Der 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...


Mvh

Peder Nielsen
Avatar billede nielsbrinch Nybegynder
25. juli 2004 - 20:11 #1
Uden at have testet det, er jeg alligevel temmelig sikker på at det ligger som Properties på dit repeater-objekt i codebehind.
Avatar billede pede15 Nybegynder
25. juli 2004 - 20:14 #2
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>' ?
Avatar billede pede15 Nybegynder
25. juli 2004 - 20:15 #3
(undskyld hvis det er sort... men har somsagt ikke rigtigt fattet det der med properties.. )
Avatar billede snepnet Nybegynder
25. juli 2004 - 20:19 #4
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.
Avatar billede nielsbrinch Nybegynder
25. juli 2004 - 20:22 #5
repeater1.HeaderTemplate = "<table>";
Avatar billede pede15 Nybegynder
25. juli 2004 - 20:25 #6
jeg vil gerne holde så meget som muligt i dll'en... men..ehm kan du givet et lille eksempel? (er ret "grøn" endnu :) )
Avatar billede pede15 Nybegynder
25. juli 2004 - 20:27 #7
ooh.. hm.. har lige prøvet det du skrev... men

får fejlen: "Cannot implicitly convert type 'string' to 'System.Web.UI.ITemplate'
Avatar billede pede15 Nybegynder
25. juli 2004 - 20:32 #8
nu er jeg på dybt vand mht ITemplate.. har aldrig leget med den før :( - yiaks
Avatar billede snepnet Nybegynder
25. juli 2004 - 20:39 #9
Jeg skriver et eksempel til dig her om lidt - giv mig lige 5-10 minutter.
Mvh
Avatar billede pede15 Nybegynder
25. juli 2004 - 20:45 #10
aww - det lyder godt! :)
Avatar billede nielsbrinch Nybegynder
25. juli 2004 - 20:48 #11
Jeg trækker mit svar tilbage, jeg troede bare det var en streng.
Avatar billede pede15 Nybegynder
25. juli 2004 - 20:54 #12
nielsbrinch>> okay, men hvis du ved hvordan det skal gøres, kan du jo stadig være med :)
Avatar billede snepnet Nybegynder
25. juli 2004 - 20:56 #13
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>"));
        }
    }
Avatar billede snepnet Nybegynder
25. juli 2004 - 21:02 #14
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.
Avatar billede snepnet Nybegynder
25. juli 2004 - 21:05 #15
Hvis du et sted har oprettet en repeater i forvejen... Altså noget i stil med nedenstående :

Repeater r = new Repeater();

Kan du selfølgelig også bruge dine egne templates der :
r.ItemTemplate = new osv...

Du behøver ikke at lave din egen repeater først (altså som jeg har gjort med public class SpecialRepeater : Repeater).

Håber du er med på det... Ellers skal du bare spørge.
Mvh
Avatar billede pede15 Nybegynder
25. juli 2004 - 21:19 #16
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
}
Avatar billede pede15 Nybegynder
25. juli 2004 - 21:31 #17
ah okay..  form.Controls.Add(btn1); selvfølgelig.. :)
Avatar billede snepnet Nybegynder
25. juli 2004 - 21:33 #18
Joda.

Repeater r = new Repeater();
r.ItemTemplate = someTemplate;
r.DataSource = someDataSource;
r.DataBind();
someContainer.Controls.Add(r);
Avatar billede snepnet Nybegynder
25. juli 2004 - 21:33 #19
Ok.. så kan du skifte someContainer ud med form :o)
Avatar billede snepnet Nybegynder
25. juli 2004 - 21:39 #20
Men du skal stadig lave din template... enten programmatisk, eller i en fil som du så loader i dit repeateritem med LoadTemplate(somevirtualpath);
Avatar billede pede15 Nybegynder
25. juli 2004 - 21:39 #21
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>
Avatar billede pede15 Nybegynder
25. juli 2004 - 21:43 #22
helt præcis... hvad gør jeg her:

Repeater repeater1 = new Repeater();
rep1.HeaderTemplate = ( ? )...

form.Controls.Add(repeater1);
Avatar billede snepnet Nybegynder
25. juli 2004 - 21:43 #23
Avatar billede snepnet Nybegynder
25. juli 2004 - 21:44 #24
5 minutter - så er jeg tilbage.
Avatar billede pede15 Nybegynder
25. juli 2004 - 21:59 #25
okay :)
Avatar billede snepnet Nybegynder
25. juli 2004 - 21:59 #26
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.
Avatar billede pede15 Nybegynder
25. juli 2004 - 22:19 #27
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 :) )
Avatar billede snepnet Nybegynder
25. juli 2004 - 22:27 #28
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
Avatar billede pede15 Nybegynder
25. juli 2004 - 22:35 #29
det lyder rigtig godt! :D

- 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;

        protected override void OnInit(EventArgs e)
        {
            InitializeComponent();
            base.OnInit(e);
            BuildPage(generateHtmlForm());
        }
   
        public void InitializeComponent()
        {
            this.Load += new EventHandler(Page_Load);
        }

        void Page_Load(object Sender, EventArgs e)
        {
            // do something
        }

        protected virtual void BuildPage(HtmlForm this_form)
        {
            this.Controls.AddAt(0,new LiteralControl(Header()));    //indsætter: <html><hea...[]...<body>
           
            this.Controls.Add(this_form);                            // indsætter: indhold

            this.Controls.Add(new LiteralControl(Footer()));        // indsætter: </body></html>       
        }

        protected virtual HtmlForm generateHtmlForm()
        {
            HtmlForm this_form = new HtmlForm();
           
            return this_form;
        }

        protected string Header()
        {           
            //StreamReader Sr = new StreamReader(Server.MapPath("/pageinheritance/") + "header.txt");
            //strHeader = (string)Sr.ReadToEnd();   
            //Sr.Close();
            return "<html>\n<head>\n<title>test</title>\n</head>\n<body><a href='index.aspx?page=adresser'>index.aspx</a> | <a href='adresser.aspx?page=adresser'>adresser.aspx</a>\n\n"; //strHeader;
        }


        protected string Footer()
        {
            //StreamReader Sr = new StreamReader(Server.MapPath("/pageinheritance/") + "footer.txt");
            //strFooter = (string)Sr.ReadToEnd();
            //Sr.Close();
            return "\n\n</body>\n</html>"; //strFooter;
        }

   
    } // Content

} // Site
Avatar billede pede15 Nybegynder
25. juli 2004 - 22:36 #30
arj... forkert.. undskyld :)
Avatar billede pede15 Nybegynder
25. juli 2004 - 22:36 #31
nej vent.. jo det er rigtigt nok... ( flot :) )
Avatar billede snepnet Nybegynder
25. juli 2004 - 22:50 #32
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.

Skal repeateren altid være der eller ?
Avatar billede pede15 Nybegynder
25. juli 2004 - 22:56 #33
well formål.. hm.. jeg vil bare gerne have ALT i dll'en.. tror det er sådan en fetish jeg har som newbie .NETer :)
Avatar billede snepnet Nybegynder
25. juli 2004 - 23:02 #34
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.
Avatar billede pede15 Nybegynder
25. juli 2004 - 23:09 #35
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?
Avatar billede snepnet Nybegynder
25. juli 2004 - 23:13 #36
Nej du tager bestemt ikke fejl, men hvis du vil have det hele skrevet i din code-behind har du bare en del arbejde foran dig :o)

Jeg sender dig lige en lille bitte eksempel på sådan et repeateritem, som det kunne se ud hvis du skulle skrive det hele i C#.

Det tager nok lige en 10-minutters tid.
Avatar billede pede15 Nybegynder
25. juli 2004 - 23:19 #37
Okay :D
Avatar billede snepnet Nybegynder
25. juli 2004 - 23:30 #38
Sorry... der dukkede lige noget op - jeg har ikke glemt dig.
Avatar billede pede15 Nybegynder
25. juli 2004 - 23:31 #39
bare rolig - jeg har rigeligt at lave :) - jeg er taknemlig for din hjælp! ;)
Avatar billede snepnet Nybegynder
25. juli 2004 - 23:40 #40
Ok... Jeg er tilbage.
Det her er et eksempel på en kontrol du kan bruger som repeateritem, og så sikrer dig noget databindingsfunktionalitet.

    public class MyRepeterItem : ITemplate, INamingContainer
    {
        private string fieldHeader;

        public MyRepeterItem(string fieldHeader)
        {
            this.fieldHeader = fieldHeader;
        }

        public void InstantiateIn(Control container)
        {
            TextBox txtText = new TextBox();
            txtText.DataBinding += new EventHandler(txtText_DataBinding);
            container.Controls.Add(txtText);
        }

        private void txtText_DataBinding(object sender, EventArgs e)
        {
            TextBox t = (TextBox)sender;
            RepeaterItem ri = (RepeaterItem)t.NamingContainer;
            t.Text = ((DataRowView)ri.DataItem)[fieldHeader].ToString();
        }
    }
Avatar billede snepnet Nybegynder
25. juli 2004 - 23:42 #41
Så kan du oprette repeater med :

Repeater r = new Repeater();
r.DataSource = someDataSet;
r.DataMember = someTable;
r.ItemTemplate = new MyRepeaterItem(dataColumnName);
r.DataBind();
Avatar billede snepnet Nybegynder
26. juli 2004 - 00:03 #42
Ved ikke om det hjælper dig så meget... Men du kan også lige få et eksempel her, hvor der er flere elementer der bruger data fra datakilden.

    public class MyRepeterItem : Control, ITemplate, INamingContainer
    {
        protected Panel panel;
        protected TextBox textBox1;
        protected TextBox textBox2;
        protected TextBox textBox3;

        private string fieldHeader;

        public MyRepeterItem(string fieldHeader)
        {
            this.fieldHeader = fieldHeader;
        }

        public void InstantiateIn(Control container)
        {
            textBox1 = new TextBox();
            textBox2 = new TextBox();
            textBox3 = new TextBox();           

            panel = new Panel();               

            panel.BackColor = Color.WhiteSmoke;           
            panel.BorderStyle = BorderStyle.Solid;
            panel.BorderWidth = 1;
            panel.BorderColor = Color.Navy;
            panel.ForeColor = Color.Navy;
            panel.Width = 200;
            panel.Height = 50;
            panel.DataBinding += new EventHandler(panel_DataBinding);
           
            panel.Controls.Add(textBox1);
            panel.Controls.Add(textBox2);
            panel.Controls.Add(textBox3);

            container.Controls.Add(panel);           
        }

        private void panel_DataBinding(object sender, EventArgs e)
        {
            RepeaterItem ri = (RepeaterItem)((Control)sender).NamingContainer;
            DataRowView drv = (DataRowView)ri.DataItem;
            textBox1.Text = drv[SampleTable.FldString].ToString();
            textBox2.Text = drv[SampleTable.FldDateTime].ToString();
            textBox3.Text = drv[SampleTable.FldDecimal].ToString();
        }
    }

Du kan jo se om du kan få det til at virke i din kode... Så kan du jo lege lidt med det.... Ellers spørg hvis der er noget.
Mvh
Avatar billede pede15 Nybegynder
26. juli 2004 - 00:10 #43
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 :)
Avatar billede snepnet Nybegynder
26. juli 2004 - 00:17 #44
Nej nej... bare tag det roligt :o) - du spørger bare indtil du får det til at funge.
For øvrigt... De der

            textBox1.Text = drv[SampleTable.FldString].ToString();
            textBox2.Text = drv[SampleTable.FldDateTime].ToString();
            textBox3.Text = drv[SampleTable.FldDecimal].ToString();

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

        private string fieldHeader;

og ændre constructoren til bare at være :

        public MyRepeterItem()
        {
        }

Undskyld jeg var så sjusket.
Avatar billede pede15 Nybegynder
01. august 2004 - 23:28 #45
Tak for hjælpen :D

Mvh

Peder Nielsen
Avatar billede snepnet Nybegynder
01. august 2004 - 23:32 #46
Velbekomme... har du fået det til at virke ?
Avatar billede pede15 Nybegynder
02. august 2004 - 00:16 #47
nej :/  - men tak fordi du tog dig tid alligevel :)
Avatar billede snepnet Nybegynder
02. august 2004 - 00:19 #48
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.
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester