<%# naam van databron %>
in SingleValue.aspx.cs protected string titel = "Data binding"; protected string Figuur { get { return "eekhoorn.jpg"; } } public int TelOp (int a, int b) { return a + b; } private void Page_Load(object sender, System.EventArgs e) { if(!IsPostBack) DataBind(); } in SingleValue.aspx <form id="Form1" method="post" runat="server"> <h1><%# titel %></h1> <asp:Image id="Image1" runat="server" ImageUrl='<%# "images/" +Figuur %>'> </asp:Image> <br/><asp:Label id="Label1" runat="server"><%# "bron van de figuur: " +Image1.ImageUrl %></asp:Label> <h2><%# "Optellen van 4 en 8 levert: " +TelOp(4,8) %></h2> </form>
Hier gebruiken we single-value databinding op een aantal verschillende manieren.
Data-binding wordt pas heel interessant wanneer je gebruik maakt van een bron die meerdere waarden bevat. Elementen die als DataSource kunnen dienen zijn:
In ASP.net zijn er Controls die kunnen gebonden worden aan een datasource die meerdere items bevat:
De HTML-output die deze controls genereren hangt sterk af van eigenschappen die je instelt in de controls.
DropDownList, ListBox, RadioButtonList en CheckBoxList kan je zonder enige moeite aan een Datasource koppelen met de methode DataBind.
Repeater, DataList en DataGrid koppel je aan een DataSource door gebruik te maken van templates: je kan voor elke waarde in de datasource opgeven welke inhoud op de pagina moet verschijnen en welke opmaak er moet worden toegepast.
DataAccess.cs
using System;
using System.Collections;
using System.Collections.Generic;
using System.Text;
namespace DAL
{
public class DataAccess
{
public static ArrayList GetGroenten()
{
ArrayList groenten = new ArrayList();
groenten.Add("Sla");
groenten.Add("Wortel");
groenten.Add("Prei");
groenten.Add("Selder");
groenten.Add("Paprika");
groenten.Add("Ui");
groenten.Add("Courgette");
groenten.Sort();
return groenten;
}
public static Hashtable GetLanden()
{
Hashtable landen = new Hashtable();
landen.Add("NL", "Nederland");
landen.Add("B", "Belgie");
landen.Add("Fr", "Frankrijk");
landen.Add("Lux", "Luxemburg");
return landen;
}
}
}
using System;
using System.Collections;
using System.Collections.Generic;
using System.Text;
using DAL;
namespace Logic
{
public class Business
{
public static ArrayList GetGroenten()
{
return DataAccess.GetGroenten();
}
public static Hashtable GetLanden()
{
return DataAccess.GetLanden();
}
}
}
...
using Logic;
public partial class RepeatedValue : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
DropDownList1.DataSource = Business.GetGroenten();
ListBox1.DataSource = Business.GetGroenten();
DropDownList2.DataSource = Business.GetLanden();
DropDownList2.DataTextField = "value";
DropDownList2.DataValueField = "key";
ListBox2.DataSource = Business.GetLanden();
ListBox2.DataTextField = "value";
ListBox2.DataValueField = "key";
DataBind();
}
}
}
Je kan dit ook regelen met Visual Studio 2005, zonder code te moeten schrijven:
Je kan analoog werken voor een CheckBoxList en een RadioButtonList.
Merk op dat bij het werken met een ArrayList als bron, in de gegenereerde HTML-code voor de elementen het attribuut value dezelfde waarde krijgt als de eigenlijke tekst in de OPTION-tag.
De control Repeater geeft je een volledige vrijheid in de manier waarop de items uit de DataSource op het scherm worden gepresenteerd.
Wanneer je een Repeater op een pagina sleept krijg je in Visual Studio de melding om in HTML-view de Templates aan te passen.
De Repeater control ondersteund een aantal templates. Hiemee kan je opgeven hoe de datagegevens op het scherm worden weergegeven:
| Template | Omschrijving |
|---|---|
| ItemTemplate | Inhoud hiervan wordt herhaald voor elk item uit de DataSource. Deze template is vereist voor elke Repeater. |
| HeaderTemplate | Wordt weergegeven boven de items uit de DataSource |
| FooterTemplate | Wordt weergegeven onder de items uit de DataSource |
| AlternatingItemTemplate | Inhoud en opmaak voor afwisselende items |
| SeparatorTemplate | Wordt weergegeven tussen de verschillende items |
Repeater.aspx.cs
...
using Logic;
public partial class Repeater : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
Repeater1.DataSource = Business.GetGroenten();
Repeater2.DataSource = Business.GetLanden();
DataBind();
}
}
}
<asp:Repeater id="Repeater1" runat="server" DataSource="<%# groenten %>"> <ItemTemplate> <%# Container.DataItem %> </ItemTemplate> <SeparatorTemplate> - </SeparatorTemplate> </asp:Repeater>
In het ItemTemplate zien we de opdracht:
<%# Container.DataItem %>
De opdracht Container.DataItem verwijst naar een item uit de DataSource van de Container-Control: de Repeater.
Als SeparatorTemplate werd hier een streepje opgegeven: de verschillende items worden gescheiden door een streepje.
<asp:Repeater id="Repeater1" runat="server" DataSource="<%# groenten %>"> <ItemTemplate> <%# ((DictionaryEntry)Container.DataItem).Key %> = <%# ((DictionaryEntry)Container.DataItem).Value %> </ItemTemplate> <SeparatorTemplate> - </SeparatorTemplate> </asp:Repeater>
Een andere manier om velden uit een Datasource op te vragen is met de methode Eval van de klasse DataBinder. Deze methode is intern trager dan de standaard databinding maar biedt ook een manier om gegevens in een bepaald formaat te zetten, in een optioneel derde argument. Je hoeft ook niet meer aan de typecasting te denken.
<%# DataBinder.Eval(Container.DataItem, expression [, format]) %>
<%# Eval(expression [, format]) %>
...
public static DataTable GetFietsRoutes()
{
DataTable fietsroutes = new DataTable();
DataColumn id = new DataColumn("id");
id.DataType = typeof(int);
fietsroutes.Columns.Add(id);
DataColumn naam = new DataColumn("naam");
naam.DataType = typeof(string);
fietsroutes.Columns.Add(naam);
DataColumn afstand = new DataColumn("afstand");
afstand.DataType = typeof(float);
fietsroutes.Columns.Add(afstand);
fietsroutes.Rows.Add(0, "Kastelenroute", 56);
fietsroutes.Rows.Add(1, "Wijnendaleroute", 59);
fietsroutes.Rows.Add(2, "Oude Dijkenroute", 43);
fietsroutes.Rows.Add(3, "Riante Polderroute", 44);
fietsroutes.Rows.Add(4, "Permekeroute", 27);
int aantal = fietsroutes.Rows.Count;
return fietsroutes;
}
}
}
Fietsroute.cs
using System;
using System.Collections;
using System.Collections.Generic;
using System.Text;
using System.Data;
using DAL;
namespace Logic
{
public class Fietsroute
{
private int id;
public int Id
{
get { return id; }
set { id = value; }
}
private string naam;
public string Naam
{
get { return naam; }
set { naam = value; }
}
private double afstand;
public double Afstand
{
get { return afstand; }
set { afstand = value; }
}
public Fietsroute()
{
}
public Fietsroute(int id, string naam, double afstand )
{
Id = id;
Naam = naam;
Afstand = afstand;
}
}
public class Fietsroutecollection : CollectionBase
{
public Fietsroutecollection()
{
}
public void Add(Fietsroute f)
{
InnerList.Add(f);
}
//indexer: "Item"-property
public Fietsroute this[int index]
{
get { return (Fietsroute)InnerList[index]; }
set { InnerList[index] = value; }
}
}
public class Fietsroutes
{
public static Fietsroutecollection GetFietsRoutes()
{
DataTable dt = DataAccess.GetFietsRoutes();
Fietsroutecollection fietsroutes = new Fietsroutecollection();
foreach (DataRow rij in dt.Rows)
{
Fietsroute f = new Fietsroute();
f.Id = Convert.ToInt32(rij["id"]);
f.Naam = rij["naam"].ToString();
f.Afstand = Convert.ToDouble(rij["afstand"]);
fietsroutes.Add(f);
}
return fietsroutes;
}
}
}
<asp:Repeater ID="Repeater3" runat="server" DataSourceID="ODSFietsroutes">
<ItemTemplate>
<%# Eval("Naam") +" (" Eval("Afstand","{0:#,##0.0}") +")" %><br />
</ItemTemplate>
</asp:Repeater>
<asp:ObjectDataSource ID="ODSFietsroutes" runat="server" SelectMethod="GetFietsRoutes"
TypeName="Logic.Fietsroutes"></asp:ObjectDataSource>
Voor het handige gebruik van Object Data Sources kan je gebruik maken van attributen voor je dataaccess-methoden in de Logic-layer.
Op deze manier kan je gebruik maken van de optie "Show only data components" bij het instellen van de Object Data Source.
Je kan ook aangeven welke methoden je gaat gebruiken voor SELECT, UPDATE, INSERT en DELETE-opdrachten.
Business.cs ... namespace Logic { [DataObject] public class Business { [DataObjectMethod(DataObjectMethodType.Select)] public static ArrayList GetGroenten() { return DataAccess.GetGroenten(); } [DataObjectMethod(DataObjectMethodType.Select)] public static Hashtable GetLanden() { return DataAccess.GetLanden(); } } } Fietsroute.cs ... [DataObject] public class Fietsroutes { [DataObjectMethod(DataObjectMethodType.Select)] public static Fietsroutecollection GetFietsRoutes() { DataTable dt = DataAccess.GetFietsRoutes(); int aantal = dt.Rows.Count; Fietsroutecollection fietsroutes = new Fietsroutecollection(); foreach (DataRow rij in dt.Rows) { Fietsroute f = new Fietsroute(); f.Id = Convert.ToInt32(rij["id"]); f.Naam = rij["naam"].ToString(); f.Afstand = Convert.ToDouble(rij["afstand"]); fietsroutes.Add(f); } return fietsroutes; } }
| Meer tutorials: |
| leer ook: | html | | xhtml | | css | | asp | | asp.net | | c# | | ado.net | | linq | | ajax | | java | | javascript |