Avatar billede omansf Nybegynder
13. maj 2005 - 19:17 Der er 9 kommentarer og
1 løsning

Udskrive data fra egne objekter

Hejsa

Jeg har et problem når jeg skal udskrive data fra et objekt i html siden på en c# asp.net app.
Jeg henter data fra min database fint nok og laver et objekt kaldet en article. Dernæst sender jeg den gennem min controller til grænsefladen og her springer min kæde så af... Nu vil jeg gerne flette noget nydeligt html rundt om data udtræk fra mit objekt. Hvordan gør jeg det?

På forhånd tak
/Ole
Avatar billede snepnet Nybegynder
13. maj 2005 - 23:43 #1
halløjsa .... det må siges at være et spørgsmål der er mange svar til.
det kommer meget an på hvad det er for en slags præsentation du er ude efter.

er det noget du skal have vist i en liste på en enkelt side... er det et view af en enkelt artikel du skal bygge op i en designer, og så benytte på forskellige sider i dit projekt.
skal det være en præsentationsklods du kan bruge i alle mulige forskellige projekter.
skal du kunne se flere forskellige views af den/de samme ?

du må gerne lige komme med lidt mere info omkring det, men som udgangspunkt er databinding en af de teknikker i asp.net der er bygget med det for øje, så det kan du måske tage taget et kig på.

databinding kan i sin simpleste form se sådan her ud (en label på en webform) :

<asp:Label id="someLabel" runat="server"/></asp:Label>

den kan du så give et databindingudtryk :

<asp:Labe id="someLabel" runat="server" Text='<%# SomeText %>'></asp:Label>

du kan så ved at fremtvinge databinding din på form, får proppet indholdet af propertien SomeText ind som tekst i din label.

i din code-behind (eller inline code, hvis det er det du arbejder med) kunen du så have en property :

public string SomeText
{
  get{return = "et eller andet";}
}

og i din page_load kan du så kalde databind sådan her :

private void Page_Load(object sender, System.EventArgs e)
{
  DataBind();
}

typisk vil dine grafiske elementers tilstand blive husket i et skjult felt på formen (viewstate), og du vil derfor kun have brug for at databinde når siden vises til en bruger første gang, hvilket du kan sikre sådan her :

private void Page_Load(object sender, System.EventArgs e)
{
  if(!IsPostBack)
    DataBind();
}

... ved ikke om du kunne bruge den smøre til så meget - men skriv lidt mere, så har vi lidt nemmere ved at give et bud.

mvh
Avatar billede omansf Nybegynder
15. maj 2005 - 07:57 #2
Det er et godt svar. Jeg er gammel ASP programmør og jeg har haft svært ved at omstille mig til brugen af alle de controls i præsentationen. Før dit svar var min tanke at jeg, som i traditionel ASP, kunne tilgå det/de objekter jeg havde hentet i Code behind og så foretage nogle response.writes rundt omkring i html'en.
Mit mål er at lave en præsentations skabelon til artikler som kan bruges flere steder på hjemmesiden. Vil du anbefale anvendelse af dataview til dette?
Avatar billede snepnet Nybegynder
15. maj 2005 - 10:06 #3
hej ole,

der er 3 standardkontroller du som udgangspunkt kan bruge til at lave databundne lister.
DataGrid, DataList og Repeater. et DataView er mere som et view i en database, og bruges til at lave et mere nyanceret kig på nogle eksisterende tabeller i memmory (som datatables i et dataset).

der er en artikel kontrollerne her :
http://msdn.microsoft.com/asp.net/articles/data/default.aspx?pull=/library/en-us/dnaspp/html/aspnet-whenusedatawebcontrols.asp

men sådan hurtigt fortalt, så kan du bruge datagridd'et til meget hurtigt at lave en rimelig fleksibel præsentation af dine data i excell-grid stil. hvad de andre to kontroller angår, skal du først lave templates i html for at få noget at se - til gengæld har du så en højere grad af fleksibilitet.
(men.. kast et blik på artiklen).

du har selvfølgelig også muligheden for at lave dine egne kontroller... og hvis man skulle fortsætte lidt i det spor du selv lagde op til, kan du lige prøve at se et eksempel her.

bare for eksemplet, siger vi at du har en forretningsklasse SomeClass :

public class SomeClass
{
  private string _someString;
 
  public string SomeString
  {
    get{return _someString;}
    set{_someString = value;}
  }
}

hvis vi så siger, at du laver en liste af dem :

ArrayList liste = new ArrayList();

for(int i=0;i<50;i++)
{
  SomeClass sc = new SomeClass();
  sc.SomeString = i.ToString();
  liste.Add(sc);
}

ovenstående liste vil du direkte kunne bruge som datakilde for en af de databundne lister, og hvis du bruger et datagrid, vil du kunne nøjes med kode som det her :

// html'en
<asp:DataGrid id="dg" runat="server"></asp:DataGrid>

// og lidt kode
dg.DataSource = liste;
dg.DataBind();

skulle du basere det på den lidt mere fleksible DataList, ville du skulle lave (som minimum) noget i denne stil :

// listen - med en template for items
<asp:DataList id="dataList" runat="server">
    <ItemTemplate>
        <asp:Label id="someLabel" Runat="server" Text='<%# DataBinder.Eval(Container, "DataItem.SomeString") %>'>
        </asp:Label>
    </ItemTemplate>
</asp:DataList>

// databinding laver du på samme måde :
dataList.DataSource = liste;
dataList.DataBind();

men ....... du ville også kunne udvide dine klasser til at understøtte direkte rendering, hvis du skulle have lyst til det :
(her et eksempel på, at den renderer sig som en teksboks)

// eksemple på en Custom Rendered Control
public class SomeClass : Control
{
    private string _someString;

    public string SomeString
    {
        get{return _someString;}
        set{_someString = value;}
    }

    protected override void Render(HtmlTextWriter writer)
    {
        writer.AddAttribute(HtmlTextWriterAttribute.Type, "text");
        writer.AddAttribute(HtmlTextWriterAttribute.Value, _someString);
        writer.RenderBeginTag(HtmlTextWriterTag.Input);
        writer.RenderEndTag();
    }
}

her baserer du din klasse på en kontrol, og fortæller hvad den skal skrive ud når den skal vises på en side, men du kan og - i det tilfælde at du har brug for kontroller der kan lidt mere end vist - benytte en anden teknik :

// eksempel på en Custom Composit Control
public class SomeClass : Control
{
    private string _someString;

    public string SomeString
    {
        get{return _someString;}
        set{_someString = value;}
    }

    protected override void CreateChildControls()
    {
        Label l = new Label();
        l.Text = "Indholdet af SomeString er : ";
        Controls.Add(l);
        TextBox tb = new TextBox();
        tb.Text = _someString;
        Controls.Add(tb);
        base.CreateChildControls ();
    }
}

her konstruerer du sådan set din GUI ved at tilføje kontroller til kontroltræet... du angiver ikke hvordan kontrollen endeligt skal udskrives i html - istedet accepterer du bare frameworket standard for den slags.

der er masser af andre ting man kunne skrive om den slags, og man kan self. også diskutere om man synes det er en god idé at ens forretningsobjekter renderer sig selv til gui ;o)

men ... håber du har lidt at gå videre med, og du må bare spørge hvis der er noget af det jeg har skrevet du ikke synes giver mening.

mvh
Avatar billede omansf Nybegynder
15. maj 2005 - 10:27 #4
Det med at ligge UI i min objekter er for stort et religions spring til at jeg tør gøre det, men dine kommentarer har ledt mig i retningen af UserControls, som jeg sådan set godt kan li. Jeg har accepteret at der skal bruges nogle labels til at udskrive tekst fra objekterne i til html siden og så er det jo sådan set bare at komme derudaf. Kan du evt. anbefale en god bog omkring de ting du beskriver ovenfor, for jeg kan godt se at de andre ting du nævner er meget smarte i tilfælde af at noget reflection kommer ind i billedet.
Avatar billede omansf Nybegynder
15. maj 2005 - 10:30 #5
PS: Hvor er knapperne til accept af svar blevet af - du skal jo ha nogle point.
Avatar billede snepnet Nybegynder
15. maj 2005 - 10:37 #6
jeps - denne her er rigtig god.
den er skrevet af ham der har lavet mange af de kontroller der shipper med, så han ved hvad han snakker om.
mvh
(du kan først acceptere et svar når jeg lægger et, så det gør jeg nu.... så kommer der vist en boks op, hvor du skal markere mit navn).
Avatar billede omansf Nybegynder
15. maj 2005 - 10:44 #7
Jeps boksen er der nu. Kan jeg også lokke dig til at skrive bogens titel? ;o)
Avatar billede snepnet Nybegynder
15. maj 2005 - 10:50 #8
hehe.... det var da ikke så flot at glemme linket :o)
her er det :
http://www.amazon.co.uk/exec/obidos/ASIN/0735615829/qid=1116146996/sr=1-1/ref=sr_1_2_1/026-8883681-3495636
mvh
Avatar billede omansf Nybegynder
15. maj 2005 - 10:54 #9
Tusind tak for hjælpen!
Avatar billede snepnet Nybegynder
15. maj 2005 - 10:57 #10
det var så lidt :o)
- held og lykke med det!
mvh
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