In dit hoofdstuk leer je hoe je ASP.net kan gebruiken voor toepassingen die verbinding maken met een server-side gegevensbron zoals een SQL Server Database.
De basisklassen die je hiervoor nodig hebt leer je kennen in de cursus ADO.net.
Database Spionshop.mdf voor SQL Server downloaden
(unzippen, toevoegen via Alle Taken > Attach Database, eigen uid en pwd gebruiken)
Web.config <?xml version="1.0" encoding="utf-8" ?> <configuration> <appSettings> <add key="SpionString" value="server=(local);database=Spionshop;uid=spion;pwd=spionpas;" /> </appSettings> <system.web> ...
Je kan de gegevens binnen het configuratiebestand benaderen via de namespace System.Configuration.
...
using System.Configuration;
...
private void Page_Load(object sender, System.EventArgs e)
{
SqlConnection conn = new SqlConnection(ConfigurationSettings.AppSettings["SpionString"]);
SqlDataAdapter da = new SqlDataAdapter("select * from Klant", conn);
DataSet ds = new DataSet();
da.Fill(ds, "Klanten");
DataGrid1.DataSource=ds.Tables["Klanten"].DefaultView;
DataGrid1.DataBind();
}
DataGrid1.DataSource=ds; DataGrid1.DataMember = "Klanten"; DataGrid1.DataBind();
SqlConnection conn = new SqlConnection(ConfigurationSettings.AppSettings["SpionString"]);
SqlCommand cmd = new SqlCommand("select * from Klant", conn);
conn.Open();
SqlDataReader dr = cmd.ExecuteReader();
DataGrid1.DataSource = dr;
DataGrid1.DataBind();
conn.Close();
In de cursus ADO.net leerde je reeds hoe je parameters kan toevoegen aan een SqlCommand. Deze keer leer je hoe je een parameter kan toevoegen aan een SqlDataAdapter om een DataSet te vullen.
In deze toepassing vullen we een ListBox met de categorieën uit de database. Wanneer de gebruiker een categorie kiest worden de artikels uit deze categorie getoond in een DataGrid. Voor het vullen van de DataGrid kijken we naar de SelectedValue van de DataList die het cat_id voor deze categorie bevat.
We voegen de SqlParameter toe aan het SelectCommand van de SqlDataAdapter.
Je kan voor de DataGrid de eigenschap EnableViewState best op false plaatsen. Het heeft geen zin de inhoud van de DataGrid te laten opnemen in de ViewState wanneer deze bij elke PostBack wijzigt.
...
using System.Data.SqlClient;
using System.Configuration;
namespace Basis
{
public class Parameter : System.Web.UI.Page
{
protected System.Web.UI.WebControls.DataGrid dgArtikel;
protected System.Web.UI.WebControls.ListBox lstCategorie;
private void Page_Load(object sender, System.EventArgs e)
{
if(!IsPostBack)
{
SqlConnection conn = new SqlConnection(ConfigurationSettings.AppSettings["SpionString"]);
SqlCommand cmd = new SqlCommand("select * from Categorie order by categorie", conn);
conn.Open();
SqlDataReader dr = cmd.ExecuteReader();
lstCategorie.DataSource = dr;
lstCategorie.DataTextField = "Categorie";
lstCategorie.DataValueField = "cat_id";
lstCategorie.DataBind();
conn.Close();
if(lstCategorie.Items.Count > 0)
{
lstCategorie.SelectedIndex = 0;
VulArtikels();
}
}
}
private void VulArtikels()
{
String sql = @"select artikel, omschrijving, verkoopprijs
from artikel
where cat_id = @catid
order by artikel";
SqlConnection conn = new SqlConnection(ConfigurationSettings.AppSettings["SpionString"]);
SqlDataAdapter da = new SqlDataAdapter(sql, conn);
da.SelectCommand.Parameters.Add(new SqlParameter("@catid",SqlDbType.SmallInt));
da.SelectCommand.Parameters["@catid"].Value = lstCategorie.SelectedValue;
DataSet ds = new DataSet();
da.Fill(ds, "Artikels");
dgArtikel.DataSource= ds;
dgArtikel.DataMember = "Artikels";
dgArtikel.DataBind();
}
...
private void lstCategorie_SelectedIndexChanged(object sender, System.EventArgs e)
{
VulArtikels();
}
}
}
We staan de gebruiker toe artikels toe te voegen aan de database.
Hiertoe voorzien we TextBox-controls voorzien van Input Validation Conrols waar de gebruiker de gegevens voor een nieuw artikel kan ingeven. We voorzien een Button waarmee de gebruiker de opdracht kan uitvoeren.
Wanneer de pagina valid is worden de gegevens van het artikel toegevoegd, rekening houdend met de geselecteerde categorie.
...
using System.Data.SqlClient;
using System.Configuration;
namespace Basis
{
public class Toevoegen : System.Web.UI.Page
{
protected System.Web.UI.WebControls.DataGrid dgArtikel;
protected System.Web.UI.WebControls.TextBox txtArtikel;
protected System.Web.UI.WebControls.TextBox txtOmschrijving;
protected System.Web.UI.WebControls.TextBox txtPrijs;
protected System.Web.UI.WebControls.RequiredFieldValidator RequiredFieldValidator1;
protected System.Web.UI.WebControls.RequiredFieldValidator RequiredFieldValidator2;
protected System.Web.UI.WebControls.RequiredFieldValidator RequiredFieldValidator3;
protected System.Web.UI.WebControls.Button cmdToevoegen;
protected System.Web.UI.WebControls.CompareValidator CompareValidator1;
protected System.Web.UI.WebControls.Label lblBericht;
protected System.Web.UI.WebControls.ListBox lstCategorie;
private void Page_Load(object sender, System.EventArgs e)
{
if(!IsPostBack)
{
SqlConnection conn = new SqlConnection(ConfigurationSettings.AppSettings["SpionString"]);
SqlCommand cmd = new SqlCommand("select * from Categorie order by categorie", conn);
conn.Open();
SqlDataReader dr = cmd.ExecuteReader();
lstCategorie.DataSource = dr;
lstCategorie.DataTextField = "Categorie";
lstCategorie.DataValueField = "cat_id";
lstCategorie.DataBind();
conn.Close();
if(lstCategorie.Items.Count > 0)
{
lstCategorie.SelectedIndex = 0;
VulArtikels();
}
}
}
private void VulArtikels()
{
String sql = @"select artikel, omschrijving, verkoopprijs
from artikel
where cat_id = @catid
order by artikel";
SqlConnection conn = new SqlConnection(ConfigurationSettings.AppSettings["SpionString"]);
SqlDataAdapter da = new SqlDataAdapter(sql, conn);
da.SelectCommand.Parameters.Add(new SqlParameter("@catid",SqlDbType.SmallInt));
da.SelectCommand.Parameters["@catid"].Value = lstCategorie.SelectedValue;
DataSet ds = new DataSet();
da.Fill(ds, "Artikels");
dgArtikel.DataSource= ds;
dgArtikel.DataMember = "Artikels";
dgArtikel.DataBind();
}
...
private void lstCategorie_SelectedIndexChanged(object sender, System.EventArgs e)
{
VulArtikels();
}
private void cmdToevoegen_Click(object sender, System.EventArgs e)
{
lblBericht.Text = "";
if (Page.IsValid)
{
SqlConnection conn = new SqlConnection(ConfigurationSettings.AppSettings["SpionString"]);
String sql = @"insert into artikel (artikel, omschrijving, verkoopprijs, cat_id)
values (@artikel, @omschrijving, @verkoopprijs, @cat_id)";
SqlCommand cmd = new SqlCommand(sql, conn);
cmd.Parameters.Add(new SqlParameter("@artikel", SqlDbType.VarChar,50));
cmd.Parameters["@artikel"].Value = txtArtikel.Text;
cmd.Parameters.Add(new SqlParameter("@omschrijving", SqlDbType.VarChar, 500));
cmd.Parameters["@omschrijving"].Value = txtOmschrijving.Text;
cmd.Parameters.Add(new SqlParameter("@verkoopprijs", SqlDbType.SmallMoney, 4));
cmd.Parameters["@verkoopprijs"].Value = txtPrijs.Text;
cmd.Parameters.Add(new SqlParameter("@cat_id", SqlDbType.SmallInt, 2));
cmd.Parameters["@cat_id"].Value = lstCategorie.SelectedValue;
cmd.Connection.Open();
try
{
cmd.ExecuteNonQuery();
lblBericht.Text = "<b>Record toegevoegd</b>";
lblBericht.Style["color"] = "green";
}
catch (SqlException ex)
{
lblBericht.Text = "Fout: record kon niet worden toegevoegd:<br> " +ex.Message;
lblBericht.Style["color"] = "red";
}
cmd.Connection.Close();
}
VulArtikels();
}
}
}
Met een DataGrid kan je op een eenvoudige manier functionaliteit om gegevens te bewerken invoegen.
De DataGrid kan een EditCommandColumn bevatten die links weergeeft die drie speciale events uitvoeren: EditCommand, UpdateCommand, en CancelCommand.
Deze kolom kan je in Visual Studio.net eenvoudig toevoegen via de Property Builder... > Columns > Button Column > Edit, Update, Cancel
Je kan de tekst voor de hyperlinks zelf instellen.
Voor deze toepassing plaats je de eigenschap EnableViewState van de DataGrid weer op true.
Voeg voor de drie besproken events event-handler methoden toe. De UpdateCommand voert de eigenlijke update naar de database uit.
Het is nu wenselijk dat we beschikken over het juiste artikel_id. We zorgen er dus voor dat dit veld ook uit de tabel wordt geladen. Je kan dit veld instellen als DataKeyField van de DataGrid.
dgArtikel.DataKeyField = "artikel_id";
Wens je nu ook meer controle over het weergeven van de kolommen, werk dan bijvoorbeeld met BoundColumns in plaats van automatisch gegenereerde kolommen.
In deze toepassing zorgen we ervoor dat de kolom die de artikel_id's bevat onzichtbaar is.
Bewerken.aspx.cs ... using System.Data.SqlClient; using System.Configuration; namespace Basis { public class Bewerken : System.Web.UI.Page { ... private void Page_Load(object sender, System.EventArgs e) { if(!IsPostBack) { SqlConnection conn = new SqlConnection(ConfigurationSettings.AppSettings["SpionString"]); SqlCommand cmd = new SqlCommand("select * from Categorie order by categorie", conn); conn.Open(); SqlDataReader dr = cmd.ExecuteReader(); lstCategorie.DataSource = dr; lstCategorie.DataTextField = "Categorie"; lstCategorie.DataValueField = "cat_id"; lstCategorie.DataBind(); conn.Close(); if(lstCategorie.Items.Count > 0) { lstCategorie.SelectedIndex = 0; VulArtikels(); } } } private void VulArtikels() { String sql = @"select artikel_id, artikel, omschrijving, verkoopprijs from artikel where cat_id = @catid order by artikel"; SqlConnection conn = new SqlConnection(ConfigurationSettings.AppSettings["SpionString"]); SqlDataAdapter da = new SqlDataAdapter(sql, conn); da.SelectCommand.Parameters.Add(new SqlParameter("@catid",SqlDbType.SmallInt)); da.SelectCommand.Parameters["@catid"].Value = lstCategorie.SelectedValue; DataSet ds = new DataSet(); da.Fill(ds, "Artikels"); dgArtikel.DataSource= ds; dgArtikel.DataKeyField = "artikel_id"; dgArtikel.DataMember = "Artikels"; dgArtikel.DataBind(); } ... private void lstCategorie_SelectedIndexChanged(object sender, System.EventArgs e) { VulArtikels(); } private void dgArtikel_EditCommand(object source, System.Web.UI.WebControls.DataGridCommandEventArgs e) { dgArtikel.EditItemIndex = e.Item.ItemIndex; VulArtikels(); } private void dgArtikel_CancelCommand(object source, System.Web.UI.WebControls.DataGridCommandEventArgs e) { dgArtikel.EditItemIndex = -1; VulArtikels(); } private void dgArtikel_UpdateCommand(object source, System.Web.UI.WebControls.DataGridCommandEventArgs e) { lblUpdateBericht.Text=""; SqlConnection conn = new SqlConnection(ConfigurationSettings.AppSettings["SpionString"]); String sql = @"UPDATE artikel SET artikel = @artikel, omschrijving = @omschrijving, verkoopprijs = @verkoopprijs WHERE artikel_id = @artikel_id"; SqlCommand cmd = new SqlCommand(sql, conn); cmd.Parameters.Add(new SqlParameter("@artikel", SqlDbType.VarChar,50)); cmd.Parameters.Add(new SqlParameter("@omschrijving", SqlDbType.VarChar, 500)); cmd.Parameters.Add(new SqlParameter("@verkoopprijs", SqlDbType.SmallMoney, 4)); cmd.Parameters.Add(new SqlParameter("@artikel_id", SqlDbType.SmallInt, 2)); cmd.Parameters["@artikel_id"].Value = dgArtikel.DataKeys[(int)e.Item.ItemIndex]; // Een array voor alle celwaarden // we lezen dan een voor een met een lus de waarden van de tekstvakken uit String[] cols = {"@artikel_id","@artikel","@omschrijving","@verkoopprijs"}; lblUpdateBericht.Text = ""; int numCols = e.Item.Cells.Count; for (int i=1; i<numCols; i++) //eerste kolom overslaan, artikel_id werd reeds uitgelezen { String colvalue =((TextBox)e.Item.Cells[i].Controls[0]).Text; if (colvalue == "") { lblUpdateBericht.Text += "Fout: Null-waarde niet toegestaan voor " + cols[i] + "<br>"; } cmd.Parameters[cols[i]].Value = colvalue; } if ( lblUpdateBericht.Text != "" ) { lblUpdateBericht.Style["color"] = "red"; return; } cmd.Connection.Open(); try { cmd.ExecuteNonQuery(); lblUpdateBericht.Text = "<b>Record Bewerkt</b>"; lblUpdateBericht.Style["color"] = "green"; dgArtikel.EditItemIndex = -1; } catch (SqlException ex) { lblUpdateBericht.Text = "Fout: update niet geslaagd: " +ex.Message; lblUpdateBericht.Style["color"] = "red"; } cmd.Connection.Close(); VulArtikels(); } } } Bewerken.aspx <%@ Page language="c#" Codebehind="Bewerken.aspx.cs" AutoEventWireup="false" Inherits="Basis.Bewerken" %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" > <HTML> <HEAD> <title>Parameter</title> <meta name="GENERATOR" Content="Microsoft Visual Studio .NET 7.1"> <meta name="CODE_LANGUAGE" Content="C#"> <meta name="vs_defaultClientScript" content="JavaScript"> <meta name="vs_targetSchema" content="http://schemas.microsoft.com/intellisense/ie5"> </HEAD> <body> <form id="Form1" method="post" runat="server"> <P> <TABLE id="Table1" style="BORDER-RIGHT:black 1px solid; BORDER-TOP:black 1px solid; BORDER-LEFT:black 1px solid; BORDER-BOTTOM:black 1px solid" cellSpacing="0" cellPadding="5" border="0"> <TR> <TD style="WIDTH: 126px" vAlign="top"> <P><U><STRONG>Categorie:</STRONG></U></P> <P> <asp:ListBox id="lstCategorie" runat="server" Rows="3" AutoPostBack="True" BackColor="#FFC0C0" ForeColor="#C00000"></asp:ListBox></P> </TD> <TD> <P> </P> <BR> <BR> </TD> </TR> </TABLE> </P> <P> <asp:DataGrid id="dgArtikel" runat="server" BorderColor="#400000" AutoGenerateColumns="False"> <AlternatingItemStyle BackColor="#E0E0E0"></AlternatingItemStyle> <ItemStyle BackColor="Silver"></ItemStyle> <HeaderStyle Font-Size="Medium" ForeColor="Maroon" BackColor="#8080FF"></HeaderStyle> <Columns> <asp:EditCommandColumn ButtonType="LinkButton" UpdateText="OK" CancelText="Annuleren" EditText="Bewerken"></asp:EditCommandColumn> <asp:BoundColumn DataField="artikel" HeaderText="Artikel"></asp:BoundColumn> <asp:BoundColumn DataField="omschrijving" HeaderText="Omschrijving"></asp:BoundColumn> <asp:BoundColumn DataField="verkoopprijs" HeaderText="Verkoopprijs"></asp:BoundColumn> </Columns> </asp:DataGrid></P> <P> <asp:Label id="lblUpdateBericht" runat="server"></asp:Label></P> </form> </body> </HTML>
Soms is het wenselijk om de te editeren inhoud weer te geven in een andere Control dan een standaard TextBox. Hiervoor kan je gebruik maken van een TemplateColumn en de opmaak van de EditItemTemplate.
cmd.Parameters["@omschrijving"].Value = ((TextBox)e.Item.FindControl("txtEditOmschrijving")).Text;
In de oplossingencode gebruiken we bijgevolg geen lus meer om de bewerkte waarden op te vragen.
Bewerken2.aspx.cs ... private void dgArtikel_UpdateCommand(object source, System.Web.UI.WebControls.DataGridCommandEventArgs e) { lblUpdateBericht.Text=""; SqlConnection conn = new SqlConnection(ConfigurationSettings.AppSettings["SpionString"]); String sql = @"UPDATE artikel SET artikel = @artikel, omschrijving = @omschrijving, verkoopprijs = @verkoopprijs WHERE artikel_id = @artikel_id"; SqlCommand cmd = new SqlCommand(sql, conn); cmd.Parameters.Add(new SqlParameter("@artikel", SqlDbType.VarChar,50)); cmd.Parameters.Add(new SqlParameter("@omschrijving", SqlDbType.VarChar, 500)); cmd.Parameters.Add(new SqlParameter("@verkoopprijs", SqlDbType.SmallMoney, 4)); cmd.Parameters.Add(new SqlParameter("@artikel_id", SqlDbType.SmallInt, 2)); cmd.Parameters["@artikel"].Value = ControleerVak(((TextBox)e.Item.Cells[1].Controls[0]).Text); cmd.Parameters["@omschrijving"].Value = ControleerVak(((TextBox)e.Item.FindControl("txtEditOmschrijving")).Text); cmd.Parameters["@artikel_id"].Value = dgArtikel.DataKeys[(int)e.Item.ItemIndex]; cmd.Parameters["@verkoopprijs"].Value = ControleerVak(((TextBox)e.Item.Cells[3].Controls[0]).Text); if ( lblUpdateBericht.Text != "" ) { lblUpdateBericht.Style["color"] = "red"; return; } cmd.Connection.Open(); try { cmd.ExecuteNonQuery(); lblUpdateBericht.Text = "<b>Record Bewerkt</b>"; lblUpdateBericht.Style["color"] = "green"; dgArtikel.EditItemIndex = -1; } catch (SqlException ex) { lblUpdateBericht.Text = "Fout: update niet geslaagd: " +ex.Message; lblUpdateBericht.Style["color"] = "red"; } cmd.Connection.Close(); VulArtikels(); } private string ControleerVak(string tekst) { if(tekst=="") { lblUpdateBericht.Text = "Fout: Null-waarde niet toegestaan"; } return tekst; } Bewerken.aspx <%@ Page language="c#" Codebehind="Bewerken2.aspx.cs" AutoEventWireup="false" Inherits="Basis.Bewerken2" %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" > <HTML> <HEAD> <title>Parameter</title> <meta name="GENERATOR" Content="Microsoft Visual Studio .NET 7.1"> <meta name="CODE_LANGUAGE" Content="C#"> <meta name="vs_defaultClientScript" content="JavaScript"> <meta name="vs_targetSchema" content="http://schemas.microsoft.com/intellisense/ie5"> </HEAD> <body> <form id="Form1" method="post" runat="server"> <P> <TABLE id="Table1" style="BORDER-RIGHT:black 1px solid; BORDER-TOP:black 1px solid; BORDER-LEFT:black 1px solid; BORDER-BOTTOM:black 1px solid" cellSpacing="0" cellPadding="5" border="0"> <TR> <TD style="WIDTH: 126px" vAlign="top"> <P><U><STRONG>Categorie:</STRONG></U></P> <P> <asp:ListBox id="lstCategorie" runat="server" Rows="3" AutoPostBack="True" BackColor="#FFC0C0" ForeColor="#C00000"></asp:ListBox></P> </TD> <TD> <P> </P> <BR> <BR> </TD> </TR> </TABLE> </P> <P> <asp:DataGrid id="dgArtikel" runat="server" BorderColor="#400000" AutoGenerateColumns="False"> <AlternatingItemStyle BackColor="#E0E0E0"></AlternatingItemStyle> <ItemStyle BackColor="Silver"></ItemStyle> <HeaderStyle Font-Size="Medium" ForeColor="Maroon" BackColor="#8080FF"></HeaderStyle> <Columns> <asp:EditCommandColumn ButtonType="LinkButton" UpdateText="OK" CancelText="Annuleren" EditText="Bewerken"></asp:EditCommandColumn> <asp:BoundColumn DataField="artikel" HeaderText="Artikel"></asp:BoundColumn> <asp:TemplateColumn HeaderText="Omschrijving"> <ItemTemplate> <asp:Label id=Label1 runat="server" Text='<%# DataBinder.Eval(Container, "DataItem.omschrijving") %>'> </asp:Label> </ItemTemplate> <EditItemTemplate> <asp:TextBox id=txtEditOmschrijving runat="server" Width="300px" TextMode="MultiLine" Text='<%# DataBinder.Eval(Container, "DataItem.omschrijving") %>'> </asp:TextBox> </EditItemTemplate> </asp:TemplateColumn> <asp:BoundColumn DataField="verkoopprijs" HeaderText="Verkoopprijs"></asp:BoundColumn> </Columns> </asp:DataGrid></P> <P> <asp:Label id="lblUpdateBericht" runat="server"></asp:Label></P> </form> </body> </HTML>
Met een TemplateColumn kan je zelfs Input Validation Controls aan de EditItemTemplate toevoegen !
Je kan op een eenvoudige manier een kolom aan een DataGrid toevoegen waarmee je gegevens kan verwijderen. Dit doe je door een ButtonColumn toevoegen met CommandName Delete. Dit kan je voor jou laten doen door Visual Studio.net:
private void dgArtikel_DeleteCommand(object source, System.Web.UI.WebControls.DataGridCommandEventArgs e)
{
SqlConnection conn = new SqlConnection(ConfigurationSettings.AppSettings["SpionString"]);
String sql = "DELETE from Artikel where artikel_id = @artikel_id";
SqlCommand cmd = new SqlCommand(sql, conn);
cmd.Parameters.Add(new SqlParameter("@artikel_id", SqlDbType.SmallInt, 2));
cmd.Parameters["@artikel_id"].Value = dgArtikel.DataKeys[(int)e.Item.ItemIndex];
cmd.Connection.Open();
try
{
cmd.ExecuteNonQuery();
lblUpdateBericht.Text = "<b>Record Verwijderd</b>";
lblUpdateBericht.Style["color"] = "green";
}
catch (SqlException ex)
{
lblUpdateBericht.Text = "Fout: record niet verwijderd " +ex.Message;
lblUpdateBericht.Style["color"] = "red";
}
cmd.Connection.Close();
VulArtikels();
}
Wanneer voor een DataGrid de eigenschap AllowSorting op true staat ingesteld, worden de kolomkoppen als LinkButtons weergegeven. Wanneer je een LinkButton aanklikt wordt het event SortCommand van de DataGrid uitgevoerd. Standaard wordt de naam van de kolom meegegeven als waarde voor de eigenschap SortExpression van het argument DataGridSortCommandEventArgs in de event-handler. Deze SortExpression kan je gebruiken om de eigenschap Sort van de onderliggende DataView in te stellen.
Wanneer je de kolommen automatisch laat genereren wordt de SortExpression voor elke kolom automatisch ingesteld, gebruik je zelfgeplaatste kolommen zoals BoundColumn, dan stel je de SortExpression voor de kolom zelf in (op de naam van een veld van de onderliggende tabel).
Doordat we in onze toepassing PostBacks naar de server hebben wanneer de gebruiker een andere categorie kiest laat ik de gekozen SortExpression bijhouden in de ViewState.
Sorteren.aspx.cs private void VulArtikels() { String sql = @"select artikel_id, artikel, omschrijving, verkoopprijs from artikel where cat_id = @catid order by artikel"; SqlConnection conn = new SqlConnection(ConfigurationSettings.AppSettings["SpionString"]); SqlDataAdapter da = new SqlDataAdapter(sql, conn); da.SelectCommand.Parameters.Add(new SqlParameter("@catid",SqlDbType.SmallInt)); da.SelectCommand.Parameters["@catid"].Value = lstCategorie.SelectedValue; DataSet ds = new DataSet(); da.Fill(ds, "Artikels"); DataView bron =ds.Tables["Artikels"].DefaultView; if(ViewState["SortArtikels"] == null) ViewState["SortArtikels"] = "artikel"; bron.Sort = ViewState["SortArtikels"].ToString(); dgArtikel.DataSource= bron; dgArtikel.DataKeyField = "artikel_id"; dgArtikel.DataBind(); } ... private void dgArtikel_SortCommand(object source, System.Web.UI.WebControls.DataGridSortCommandEventArgs e) { ViewState["SortArtikels"] = e.SortExpression; VulArtikels(); } Sorteren.aspx <%@ Page language="c#" Codebehind="Sorteren.aspx.cs" AutoEventWireup="false" Inherits="Basis.Sorteren" %> ... <asp:DataGrid id="dgArtikel" runat="server" BorderColor="#400000" AutoGenerateColumns="False" AllowSorting="True"> <AlternatingItemStyle BackColor="#E0E0E0"></AlternatingItemStyle> <ItemStyle BackColor="Silver"></ItemStyle> <HeaderStyle Font-Size="Medium" ForeColor="Maroon" BackColor="#8080FF"></HeaderStyle> <Columns> <asp:BoundColumn DataField="artikel" SortExpression="artikel" HeaderText="Artikel"></asp:BoundColumn> <asp:TemplateColumn SortExpression="omschrijving" HeaderText="Omschrijving"> <ItemTemplate> <asp:Label id=Label1 runat="server" Text='<%# DataBinder.Eval(Container, "DataItem.omschrijving") %>'> </asp:Label> </ItemTemplate> <EditItemTemplate> <asp:TextBox id=txtEditOmschrijving runat="server" Width="300px" TextMode="MultiLine" Text='<%# DataBinder.Eval(Container, "DataItem.omschrijving") %>'> </asp:TextBox> </EditItemTemplate> </asp:TemplateColumn> <asp:BoundColumn DataField="verkoopprijs" SortExpression="verkoopprijs" HeaderText="Verkoopprijs"></asp:BoundColumn> </Columns> </asp:DataGrid></P> <P> <asp:Label id="lblUpdateBericht" runat="server"></asp:Label></P> </form> </body> </HTML>
De sortering van gegevens gebeurt standaard oplopend (ascending). Door aan de methode Sort van de DataView een extra string " DESC" mee te geven kan je de gegevens ook aflopend (descending) sorteren.
In de toepassing zorgen voor een extra element in de ViewState: SortArtikelsOplopend. We houden bij of er oplopend of aflopend wordt gesorteerd. We wisselen de sorteerorde wanneer twee keer op eenzelfde kolomkop wordt geklikt.
...
private void VulArtikels()
{
String sql = @"select artikel_id, artikel, omschrijving, verkoopprijs
from artikel
where cat_id = @catid
order by artikel";
SqlConnection conn = new SqlConnection(ConfigurationSettings.AppSettings["SpionString"]);
SqlDataAdapter da = new SqlDataAdapter(sql, conn);
da.SelectCommand.Parameters.Add(new SqlParameter("@catid",SqlDbType.SmallInt));
da.SelectCommand.Parameters["@catid"].Value = lstCategorie.SelectedValue;
DataSet ds = new DataSet();
da.Fill(ds, "Artikels");
DataView bron =ds.Tables["Artikels"].DefaultView;
if(ViewState["SortArtikelsOplopend"] == null) ViewState["SortArtikelsOplopend"] = true;
if(ViewState["SortArtikels"] == null) ViewState["SortArtikels"] = "artikel";
if((bool)ViewState["SortArtikelsOplopend"])
bron.Sort = ViewState["SortArtikels"].ToString();
else
bron.Sort = ViewState["SortArtikels"].ToString() +" DESC";
dgArtikel.DataSource= bron;
dgArtikel.DataKeyField = "artikel_id";
dgArtikel.DataBind();
}
...
private void lstCategorie_SelectedIndexChanged(object sender, System.EventArgs e)
{
VulArtikels();
}
private void dgArtikel_SortCommand(object source, System.Web.UI.WebControls.DataGridSortCommandEventArgs e)
{
if(ViewState["SortArtikels"].Equals(e.SortExpression)) ViewState["SortArtikelsOplopend"] = !(bool)ViewState["SortArtikelsOplopend"];
ViewState["SortArtikels"] = e.SortExpression;
VulArtikels();
}
}
}
CREATE PROCEDURE spToonArtikelGegevens AS SELECT artikel, omschrijving FROM artikel ORDER BY artikel
Werk je rechtstreeks met een SqlCommand, bijvoorbeeld voor het vullen van een SqlDataReader, dan stel je het CommandType van de SqlCommand in op StoredProcedure, en de CommandText op de naam van de Stored Procedure.
SqlConnection conn = new SqlConnection(ConfigurationSettings.AppSettings["SpionString"]); //STP aanroepen voor een DataReader SqlCommand cmd = new SqlCommand("spToonArtikelGegevens",conn); cmd.CommandType = CommandType.StoredProcedure; conn.Open(); SqlDataReader dr = cmd.ExecuteReader(); DataGrid1.DataSource=dr; DataGrid1.DataBind(); conn.Close();
Je kan ook een DataSet vullen met behulp van een Stored Procedure.
SqlConnection conn = new SqlConnection(ConfigurationSettings.AppSettings["SpionString"]); //STP aanroepen voor een DataAdapter SqlDataAdapter da = new SqlDataAdapter("drie duurste producten", conn); da.SelectCommand.CommandType = CommandType.StoredProcedure; DataSet ds = new DataSet(); da.Fill(ds, "ArtikelGegevens"); DataGrid2.DataSource=ds; DataGrid2.DataMember = "ArtikelGegevens"; DataGrid2.DataBind();
De Stored Procedure drie duurste producten ziet er als volgt uit:
CREATE procedure "Drie duurste producten" AS SET ROWCOUNT 3 SELECT artikel, verkoopprijs FROM artikel ORDER BY verkoopprijs DESC
De Stored Procedure:
CREATE PROCEDURE ArtikelUitCategorie @CatID smallint
AS
SELECT artikel, omschrijving, verkoopprijs
FROM artikel
WHERE cat_id = @CatID
ORDER BY artikel
Code in Page_Load:
SqlConnection conn = new SqlConnection(ConfigurationSettings.AppSettings["SpionString"]);
//STP met parameter aanroepen voor een DataAdapter
SqlDataAdapter daAC = new SqlDataAdapter("ArtikelUitCategorie", conn);
daAC.SelectCommand.CommandType = CommandType.StoredProcedure;
daAC.SelectCommand.Parameters.Add(new SqlParameter("@CatID", SqlDbType.SmallInt, 15));
daAC.SelectCommand.Parameters["@CatID"].Value = 1;
DataSet dsAC = new DataSet();
daAC.Fill(dsAC, "ArtikelGegevens");
DataGrid3.DataSource=dsAC;
DataGrid3.DataMember = "ArtikelGegevens";
DataGrid3.DataBind();
| Meer tutorials: |
| leer ook: | html | | xhtml | | css | | asp | | asp.net | | c# | | ado.net | | linq | | ajax | | java | | javascript |