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.aspmen 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