De klassen gebruikt in dit hoofdstuk werden aangemaakt in het vorige hoofdstuk data binding en list controls.
Een DataList stelt je in staat gegevens op het scherm te brengen waarbij de standaardlayout een kolom is. Deze control biedt opties voor auto-opmaak: naast het aanmaken van de inhoud met behulp van templates kan je deze keer ook telkens een Style voor de Template opgeven.
Deze Control biedt ook ondersteuning voor het bewerken van elementen.
In Visual Studio kan je op een WYSIWYG-manier een DataList opmaken:
Nu kan je de Item Templates WYSIWYG aanmaken
Wij wensen de details van een fietsroute te zien wanneer de gebruiker de betreffende fietsroute selecteert.
Doe volgende instellingen om de Naam van de fietsroute in de LinkButton te zien.
Dit heeft zijn oorzaak in het laden van de pagina: de ViewState bevat alle gegevens van de DataList die oorspronkelijk werden getoond, dus enkel de namen van de fietsroutes, doch niet de detailgegevens van een fietsroute.
We kunnen dit corrigeren door na het selecteren van een Item de DataList opnieuw te binden met de DataSource.
De DataSource zelf is nog steeds gekend daar deze door ASP.Net tags in onze .aspx pagina aan de DataList is gebonden.
protected void DataList2_SelectedIndexChanged(object sender, EventArgs e)
{
DataList2.DataBind();
}
protected void DataList2_ItemCommand(object source, DataListCommandEventArgs e)
{
if (e.CommandName == "unselect")
DataList2.SelectedIndex = -1;
DataList2.DataBind();
}
In de voorgaande voorbeelden hebben we een aantal keer gebruik gemaakt van een Object Data Source: een Data Source waarbij we de gegevens manipuleren met behulp van onze eigen klassen.
Een ObjectDataSource maakt deel uit van de namespace System.Web.UI.WebControls
Om een ObjectDataSource te hergebruiken op verschillende pagina's kan je handig gebruik maken van MasterPages, in plaats van op elke pagina de ObjectDataSource opnieuw aan te maken.
Meester.master
<%@ Master Language="C#" AutoEventWireup="true" CodeFile="Meester.master.cs" Inherits="Meester" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>Untitled Page</title>
</head>
<body>
<form id="form1" runat="server">
<div>
ODS in Masterpage<br />
<br />
<asp:contentplaceholder id="ContentPlaceHolder1" runat="server">
</asp:contentplaceholder>
<br />
<asp:ObjectDataSource ID="ODSFiets" runat="server" SelectMethod="GetFietsRoutes"
TypeName="Logic.Fietsroutes"></asp:ObjectDataSource>
<asp:ObjectDataSource ID="ODSGroenten" runat="server" SelectMethod="GetGroenten"
TypeName="Logic.Business"></asp:ObjectDataSource>
</div>
</form>
</body>
</html>
public partial class Meester : System.Web.UI.MasterPage
{
public ObjectDataSource OdsFiets
{
get { return ODSFiets; }
}
public ObjectDataSource OdsGroenten
{
get { return ODSGroenten; }
}
...
}
Datalist_child.aspx
...
<%@ MasterType VirtualPath="~/Meester.master" %>
...
DataList_child.aspx.cs
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
LBGroenten.DataSource = Master.OdsGroenten;
DLFiets.DataSource = Master.OdsFiets;
DataBind();
}
}
protected void DLFiets_ItemCommand(object source, DataListCommandEventArgs e)
{
if (e.CommandName == "unselect")
{
DLFiets.DataSource = Master.OdsFiets;
DLFiets.SelectedIndex = -1;
}
DLFiets.DataBind();
}
protected void DLFiets_SelectedIndexChanged(object sender, EventArgs e)
{
DLFiets.DataSource = Master.OdsFiets;
DLFiets.DataBind();
}
Een DataList kan je ook gebruiken om gegevens uit de Datasource aan te passen.
Om realistischer te werken koppelen we onze Webapplicatie deze keer aan een database.
In volgende stapjes maak je een nieuwe SQL Server 2005 Express-database aan met Visual Studio 2005.
Werk je liever met SQL Server 2000 / 2005 open dat resp. Enterprise Manager / Management Studio, en maak een nieuwe database aan.
CREATE PROCEDURE dbo.DrankSelect AS SET NOCOUNT ON; SELECT id, naam, prijs FROM drank ORDER BY naam GO CREATE PROCEDURE dbo.DrankUpdate ( @id int, @naam varchar(50), @prijs float ) AS SET NOCOUNT OFF; UPDATE [drank] SET [naam] = @naam, [prijs] = @prijs WHERE [id] = @id;
... <configuration> <appSettings/> <connectionStrings> <add name="DrankConn" providerName="System.Data.SqlClient" connectionString="Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|Drank.mdf;Integrated Security=True;Connect Timeout=30;User Instance=True"/> </connectionStrings> <system.web> ...
using System;
using System.Collections.Generic;
using System.Text;
using System.Configuration;
using System.Data;
using System.Data.SqlClient;
namespace DAL
{
public class DrankDB
{
public static DataSet GetDranken()
{
SqlConnection myConnection = new SqlConnection(ConfigurationManager.ConnectionStrings["DrankConn"].ConnectionString);
SqlCommand myCommand = new SqlCommand("DrankSelect", myConnection);
myCommand.CommandType = CommandType.StoredProcedure;
SqlDataAdapter da = new SqlDataAdapter(myCommand);
DataSet ds = new DataSet("DsDranken");
da.Fill(ds,"Dranken");
return ds;
}
public static void DrankenUpdate(int id, string naam, float prijs)
{
SqlConnection myConnection = new SqlConnection(ConfigurationManager.ConnectionStrings["DrankConn"].ConnectionString);
SqlCommand myCommand = new SqlCommand("DrankUpdate", myConnection);
myCommand.CommandType = CommandType.StoredProcedure;
myCommand.Parameters.Add(new SqlParameter("@id", id));
myCommand.Parameters.Add(new SqlParameter("@naam", naam));
myCommand.Parameters.Add(new SqlParameter("@prijs", prijs));
myConnection.Open();
myCommand.ExecuteNonQuery();
myConnection.Close();
}
}
}
Deze klasse bevat de methoden die werkelijk connectie met de database maken. We retourneren nog geen custom objecten, maar ADO.Net - objecten. Op deze manier moeten we hier geen referentie naar Logic maken en blijft onze DAL onafhankelijk.
Voor het gebruik van ConfigurationManager is het mogelijk dat je nog eens expliciet een referentie moet leggen naar System.Configuration.
We gebruiken vanuit de DAL-laag de connectionstring uit de Web.Config van de site, je kan de connectiestring ook in een app.config-file van de DAL-laag opnemen.
Drank.cs
using System;
using System.Collections;
using System.Collections.Generic;
using System.Text;
using System.Data;
using DAL;
namespace Logic
{
public class Drank
{
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 Single prijs;
public Single Prijs
{
get { return prijs; }
set { prijs = value; }
}
public Drank()
{
}
public Drank(int id, string naam, Single prijs)
{
Id = id;
Naam = naam;
Prijs = prijs;
}
}
public class Drankcollection : CollectionBase
{
public Drankcollection()
{
}
public void Add(Drank d)
{
InnerList.Add(d);
}
//indexer: "Item"-property
public Drank this[int index]
{
get { return (Drank)InnerList[index]; }
set { InnerList[index] = value; }
}
}
public class Dranken
{
public static Drankcollection GetDranken()
{
DataSet ds = DrankDB.GetDranken();
DataTable dt = ds.Tables["Dranken"];
Drankcollection dc = new Drankcollection();
for (int i = 0; i < dt.Rows.Count; i++ )
{
Drank d = new Drank();
d.Id = Convert.ToInt32(dt.Rows[i]["id"]);
d.Naam = dt.Rows[i]["Naam"].ToString();
d.Prijs = Convert.ToSingle(dt.Rows[i]["Prijs"]);
dc.Add(d);
}
return dc;
}
public static void DrankenUpdate(int id, string naam, float prijs)
{
DrankDB.DrankenUpdate(id, naam, prijs);
}
}
}
De methode GetDranken uit de klasse Dranken haalt de gegevens op uit de Datalaag en maakt er Custom Objecten van.
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
DLdrank.DataSource = Dranken.GetDranken();
DLdrank.DataBind();
}
}
protected void DLdrank_SelectedIndexChanged(object sender, EventArgs e)
{
DLdrank.DataSource = Dranken.GetDranken();
DLdrank.DataBind();
}
protected void DLdrank_ItemCommand(object source, DataListCommandEventArgs e)
{
if (e.CommandName == "unselect")
{
DLdrank.SelectedIndex = -1;
DLdrank.DataSource = Dranken.GetDranken();
DLdrank.DataBind();
}
}
protected void DLdrank_EditCommand(object source, DataListCommandEventArgs e)
{
DLdrank.EditItemIndex = e.Item.ItemIndex;
DLdrank.DataSource = Dranken.GetDranken();
DLdrank.DataBind();
}
protected void DLdrank_CancelCommand(object source, DataListCommandEventArgs e)
{
DLdrank.EditItemIndex = -1;
DLdrank.DataSource = Dranken.GetDranken();
DLdrank.DataBind();
}
protected void DLdrank_UpdateCommand(object source, DataListCommandEventArgs e)
{
DLdrank.EditItemIndex = -1;
int id = Convert.ToInt32(DLdrank.DataKeys[e.Item.ItemIndex]);
string naam = ((TextBox)e.Item.FindControl("TxtNaam")).Text;
float prijs = Convert.ToSingle(((TextBox)e.Item.FindControl("TxtPrijs")).Text);
Dranken.DrankenUpdate(id, naam, prijs);
DLdrank.DataSource = Dranken.GetDranken();
DLdrank.DataBind();
}
CREATE PROCEDURE dbo.DrankInsert ( @naam varchar(50), @prijs float, @id int output ) AS SET NOCOUNT OFF; INSERT INTO [drank] ([naam], [prijs]) VALUES (@naam, @prijs); Set @id = SCOPE_IDENTITY()
public static int DrankenInsert(string naam, float prijs)
{
SqlConnection myConnection = new SqlConnection(ConfigurationManager.ConnectionStrings["DrankConn"].ConnectionString);
SqlCommand myCommand = new SqlCommand("DrankInsert", myConnection);
myCommand.CommandType = CommandType.StoredProcedure;
myCommand.Parameters.Add(new SqlParameter("@naam", naam));
myCommand.Parameters.Add(new SqlParameter("@prijs", prijs));
SqlParameter pid = new SqlParameter("@id", SqlDbType.Int);
pid.Direction = ParameterDirection.Output;
myCommand.Parameters.Add(pid);
myConnection.Open();
myCommand.ExecuteNonQuery();
myConnection.Close();
int id = Convert.ToInt32(pid.Value);
return id;
}
public static int DrankenInsert(string naam, float prijs)
{
return DrankDB.DrankenInsert(naam, prijs);
}
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
DLdrank.DataSource = Dranken.getDranken();
DLdrank.DataBind();
}
LblMsg.Text = "";
}
protected void DLdrank_ItemCommand(object source, DataListCommandEventArgs e)
{
...
if (e.CommandName == "insert")
{
string naam = ((TextBox)e.Item.FindControl("TxtNaamNew")).Text;
float prijs = Convert.ToSingle(((TextBox)e.Item.FindControl("TxtPrijsNew")).Text);
DLdrank.SelectedIndex = -1;
int id = Dranken.DrankenInsert(naam, prijs);
DLdrank.DataSource = Dranken.GetDranken();
DLdrank.DataBind();
LblMsg.Text = "Drank toegevoegd met id " + id;
}
}
CREATE PROCEDURE dbo.DrankDelete ( @id int ) AS SET NOCOUNT OFF; DELETE FROM [drank] WHERE [id] = @id
public static void DrankenDelete(int id)
{
SqlConnection myConnection = new SqlConnection(ConfigurationManager.ConnectionStrings["DrankConn"].ConnectionString);
SqlCommand myCommand = new SqlCommand("DrankDelete", myConnection);
myCommand.CommandType = CommandType.StoredProcedure;
myCommand.Parameters.Add(new SqlParameter("@id", id));
myConnection.Open();
myCommand.ExecuteNonQuery();
myConnection.Close();
}
...
public static void DrankenDelete(int id)
{
DrankDB.DrankenDelete(id);
}
...
protected void DLdrank_DeleteCommand(object source, DataListCommandEventArgs e)
{
int id = Convert.ToInt32(DLdrank.DataKeys[e.Item.ItemIndex]);
Dranken.DrankenDelete(id);
DLdrank.DataSource = Dranken.GetDranken();
DLdrank.DataBind();
}
| Meer tutorials: |
| leer ook: | html | | xhtml | | css | | asp | | asp.net | | c# | | ado.net | | linq | | ajax | | java | | javascript |