Je kan een GridView binden aan gegevensbron zoals een database, maar ook aan eenvoudige structuren zoals een ArrayList of aan je eigen collectie van Custom Objecten.
Een DataGrid wordt door de browser gerendered als een Table.
Aangezien we in deze lessenreeks gebruik maken van een gestructureerde onderverdeling in klassen, volgen we verder deze werkwijze.
De id-kolom is een identity-kolom
CREATE PROCEDURE dbo.NascholingSelect AS Select id, naam, plaats, datum, prijs, actief FROM nascholing RETURN
<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"/>
<add name="NascholingConn" providerName="System.Data.SqlClient" connectionString="Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|Nascholing.mdf;Integrated Security=True;Connect Timeout=30;User Instance=True"/>
</connectionStrings>
using System;
using System.Collections.Generic;
using System.Text;
using System.Data;
using System.Data.SqlClient;
using System.Configuration;
namespace DAL
{
public class NascholingDB
{
public static DataSet GetNascholingen()
{
SqlConnection myConnection = new SqlConnection(ConfigurationManager.ConnectionStrings["NascholingConn"].ConnectionString);
SqlCommand myCommand = new SqlCommand("NascholingSelect", myConnection);
myCommand.CommandType = CommandType.StoredProcedure;
SqlDataAdapter da = new SqlDataAdapter(myCommand);
DataSet ds = new DataSet("DsNascholing");
da.Fill(ds, "Nascholingen");
return ds;
}
}
}
using System;
using System.Collections.Generic;
using System.Text;
using System.Collections;
using System.Data;
using DAL;
namespace Logic
{
public class Nascholing
{
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 string plaats;
public string Plaats
{
get { return plaats; }
set { plaats = value; }
}
private DateTime datum;
public DateTime Datum
{
get { return datum; }
set { datum = value; }
}
private Decimal prijs;
public Decimal Prijs
{
get { return prijs; }
set { prijs = value; }
}
private Boolean actief;
public Boolean Actief
{
get { return actief; }
set { actief = value; }
}
public Nascholing()
{
}
}
public class Nascholingcollection : CollectionBase
{
public Nascholingcollection()
{
}
public void Add(Nascholing n)
{
InnerList.Add(n);
}
//indexer: "Item"-property
public Nascholing this[int index]
{
get { return (Nascholing)InnerList[index]; }
set { InnerList[index] = value; }
}
}
public class Nascholingen
{
public static Nascholingcollection GetNascholingen()
{
DataSet ds = NascholingDB.GetNascholingen();
DataTable dt = ds.Tables["Nascholingen"];
Nascholingcollection nc = new Nascholingcollection();
for (int i = 0; i < dt.Rows.Count; i++)
{
Nascholing d = new Nascholing();
d.Id = Convert.ToInt32(dt.Rows[i]["id"]);
d.Naam = dt.Rows[i]["naam"].ToString();
d.Plaats = dt.Rows[i]["plaats"].ToString();
d.Datum = Convert.ToDateTime(dt.Rows[i]["datum"]);
d.Prijs = Convert.ToDecimal(dt.Rows[i]["prijs"]);
d.Actief = Convert.ToBoolean(dt.Rows[i]["actief"]);
nc.Add(d);
}
return nc;
}
}
}
In dit voorbeeld doen we het binden van de gegevens aan de GridView handmatig: in de methode Page_Load van de pagina stellen we de custom collectie met nascholingen in als DataSource van de GridView.
...
using Logic;
public partial class Gridview_nascholing : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
GVnascholing.DataSource = Nascholingen.GetNascholingen();
GVnascholing.DataBind();
}
}
}
Werk je met een ObjectDataSource, dan hoef je het binden van de data aan de GridView niet meer zelf te doen in de code.
Vanzelfsprekend kan je de ObjectDataSource ook voorzien van insert, update en delete-functionaliteiten (door de achterliggende klassen aan te passen en de data source aan te passen) om aldus deze acties vanuit de GridView te kunnen uitvoeren.
Dit is de quick & dirty manier van werken: je koppelt de GridView rechtstreeks aan de SQL-Database. DAL en LOGIC uit onze toepassing worden hier niet gebruikt.
Deze keer maken we eerste een typed DataSet aan en binden we de GridView aan een TableAdapter van de DataSet. Het grote voordeel van deze werkwijze is dat je Visual Studio 2005 de opdracht kan geven om Stored Procedures (of ingebedde SQL) automatisch voor jou aan te maken. Deze manier van werken stelt je echt in staat aan RAD (Rapid Application Development) te doen. Opgepast, onze eigen DAL en LOGIC-laag worden hier niet meer gebruikt.
Welke manier moet je nu gebruiken in je toepassingen?
Vanuit deze editor kan je kolommen toevoegen, verwijderen en aanpassen. De verschillende kolomtypes:
| kolomtype | omschrijving |
|---|---|
| BoundField | Standaard type: toont de waarde van een veld als gewone tekst |
| Buttonfield | Toont de waarde van een veld als een CommandButton (linkbutton of push-button) |
| CheckBoxField | Toont de waarde van een veld als CheckBox, veelal gebruikt bij Boolean waarden |
| CommandField | Geavanceerde versie van Buttonfield, representeert een speciaal command zoals select, insert, delete, update; zelden gebruikt bij GridView. |
| HyperLinkField | Toont de veldwaarde als een hyperlink, bij klikken surf je naar de gekoppelde pagina |
| ImageField | Toont de waarde van een veld als src-attribuut van een IMG-tag |
| TemplateField | Toont eigen gedefiëerde inhoud voor een kolom. De inhoud kan literals, velden of andere controls bevatten |
<asp:BoundField DataField="datum" DataFormatString="{0:dd/MM/yyyy}" HeaderText="datum" SortExpression="datum" HtmlEncode="False" />
De TemplateField is de krachtigste kolom en staat je toe zelf een opmaak te definiëren voor een aantal varianten zoals AlternatingItem en EditItem
Deze vorm van sorteren werkt zonder code te schrijven, maar wordt volledig aan de hand van de ViewState berekend door de webserver.
Voor databasetoepassingen met behoorlijk wat records is het soms beter enig rekenwerk zoals sorteren over te laten aan de databaseserver in plaats van het door de webserver te laten doen.
CREATE PROCEDURE dbo.nascholingSelectSort @SortBy varchar(50) = 'naam' AS SET NOCOUNT ON; IF @SortBy = '' BEGIN SET @SortBy = 'naam' END EXEC( 'SELECT id, naam, plaats, datum, prijs, actief ' + 'FROM nascholing ' + 'ORDER BY ' +@SortBy)
Hier gebruiken we een exec voor het uitvoeren van de SQL omdat SQL server anders van zijn oren maakt wanneer je een variabele gebruikt als ORDER BY component.
Als je niet met een Typed DataSet werkt, maar met een eigen DAL en eventueel Logic-layer, dan kan je ook sortering voorzien wanneer je bvb. met een ObjectDataSource werkt.
De sortering die we hier voorzien gebeurt op de database.
NascholingDB.cs public static DataSet GetNascholingenSorted(string sortby) { SqlConnection myConnection = new SqlConnection(ConfigurationManager.ConnectionStrings["NascholingConn"].ConnectionString); SqlCommand myCommand = new SqlCommand("NascholingSelectSort", myConnection); myCommand.CommandType = CommandType.StoredProcedure; myCommand.Parameters.AddWithValue("@SortBy", sortby); SqlDataAdapter da = new SqlDataAdapter(myCommand); DataSet ds = new DataSet("DsNascholing"); da.Fill(ds, "Nascholingen"); return ds; }
[DataObjectMethod(DataObjectMethodType.Select)] public static Nascholingcollection GetNascholingenSorted(string sortby) { DataSet ds = NascholingDB.GetNascholingenSorted(sortby); DataTable dt = ds.Tables["Nascholingen"]; Nascholingcollection nc = new Nascholingcollection(); for (int i = 0; i < dt.Rows.Count; i++) { Nascholing d = new Nascholing(); d.Id = Convert.ToInt32(dt.Rows[i]["id"]); d.Naam = dt.Rows[i]["naam"].ToString(); d.Plaats = dt.Rows[i]["plaats"].ToString(); d.Datum = Convert.ToDateTime(dt.Rows[i]["datum"]); d.Prijs = Convert.ToDecimal(dt.Rows[i]["prijs"]); d.Actief = Convert.ToBoolean(dt.Rows[i]["actief"]); nc.Add(d); } return nc; }
Het aanduiden van de sorteervolgorde zorgt voor de gebruiker voor een grotere duidelijkheid.
Dit kunnen we eenvoudig doen door ervoor te zorgen dat het juiste tekeningetje wordt toegevoegd aan de kolom waarop werd gesorteerd.
Dit tekeningetje (driehoekje) is eigenlijk een letter uit het lettertype webdings: hierin vinden we een driehoekje met top boven en eentje met top onder.
We plaatsen het driehoekje in de hoofdingkolom nadat een rij uit de grid werd aangemaakt:
protected void GridView1_RowCreated(object sender, GridViewRowEventArgs e)
{
if (e.Row.RowType == DataControlRowType.Header)
AddSorteerDriehoek(GridView1, e.Row);
}
void AddSorteerDriehoek(GridView grid, GridViewRow item)
{
Label driehoek = new Label();
driehoek.EnableTheming = false;
driehoek.Font.Name = "webdings";
driehoek.Font.Size = FontUnit.Small;
driehoek.Text = (grid.SortDirection == SortDirection.Ascending ? "5" : "6");
for (int i = 0; i < grid.Columns.Count; i++)
{
string colExpr = grid.Columns[i].SortExpression;
if (colExpr != "" && colExpr == grid.SortExpression)
item.Cells[i].Controls.Add(driehoek);
}
}
Werk je met een GridView gekoppeld aan een typed DataSet, dan kan je paginering inschakelen via de smart tag of properties van de GridView.
Standaard pagineren gaat als volgt in het werk: de webserver leest alle records voor het vullen van bvb. een DataTable in het geheugen en plaatst enkel de benodigde records in de GridView. Wanneer je naar een andere pagina overstapt, worden opnieuw alle records gelezen en de gewenste door de webserver uitgefilterd. Behoorlijk intensief voor de webserver dus. Heb je een tabel met 1000 record en pagina's van 10 records, dan zijn er in totaal 100 pagina's. Als de gebruiker ze allemaal eens bezoekt worden dan eigenlijk in totaal 100 * 1000 records ingelezen (=100.000 records!), terwijl er slechts 1000 getoond worden.
Standaard paginering is heel interessant doordat het weinig extra werk levert voor de ontwikkelaar, voor toepassingen met een kleine database (tientallen tot honderden records) is dit een aanvaardbare oplossing.
Voor het illustreren van paginerig werden in de nascholingstabel een aantal records toegevoegd.
Voor een realistischer voorbeeld, en een vergelijk tussen standaard en custom pagineren gebruiken we een database met enkele duizenden records.
In de database Movie.mdf vinden we een tabel movie met een kleine 2.000 recors en een tabel casting met zo'n 30.000 records. Plaats deze database in de App_Data map van je Site.
<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"/>
<add name="NascholingConn" providerName="System.Data.SqlClient" connectionString="Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|Nascholing.mdf;Integrated Security=True;Connect Timeout=30;User Instance=True"/>
<add name="MovieConn" providerName="System.Data.SqlClient" connectionString="Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|Movie.mdf;Integrated Security=True;Connect Timeout=30;User Instance=True"/>
</connectionStrings>
CREATE PROCEDURE dbo.SelectAllMovie AS SELECT DISTINCT m.filmid, titel, jaar, score FROM movie m --vertrager: enkel om de query extra intensief te maken INNER JOIN casting c on m.filmid = c.filmid
Toon /verberg
Toon /verberg
using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
public partial class GridView_standardpaging : System.Web.UI.Page
{
DateTime starttijd;
protected void Page_Load(object sender, EventArgs e)
{
starttijd = System.DateTime.Now;
}
protected void GridView2_DataBound(object sender, EventArgs e)
{
DateTime eindtijd = System.DateTime.Now;
Label1.Text = ((TimeSpan)(eindtijd - starttijd)).TotalMilliseconds.ToString();
}
}
Het is nu de bedoeling de webserver te ontlasten, en enkel de benodigde records uit de database te lezen.
CREATE PROCEDURE dbo.SelectMovie
(
@sortby varchar(100) = 'titel',
@startrij int = 1,
@aantalrijen int = 10
)
AS
SELECT filmid, titel, jaar, score
FROM
(SELECT m.filmid, titel, jaar, score,
ROW_NUMBER() OVER(ORDER BY @sortby) as RowNum
FROM movie m
-- voor de lol, om het trager te maken!!
INNER JOIN casting c on m.filmid = c.filmid
) as volgorde
WHERE RowNum BETWEEN @startrij AND (@startrij + @aantalrijen) - 1
CREATE PROCEDURE dbo.CountMovie
AS
select count(*) from movie
De Stored Procedure SelectMovie maakt gebruik van de nieuwe SQL Server 2005 functie ROW_NUMBER() om elke rij een oplopend nummer te geven en op een eenvoudige manier welbepaalde records uit de tabel te halen.
Meer hierover bij 4GuysFromRolla.
Deze DataSet werkt met Stored Procedures die door de Visual Studio Wizard werden aangemaakt.
Het aanvinken van de optie Enable editing zorgt ervoor dat automatisch een CommandField-kolom wordt aangemaakt met een LinkButton Edit, wanneer je deze aanklikt kom je voor deze rij in editeermodus en zie je de LinkButtons Update en Cancel.
Werk je met een Typed DataSet als Data Source voor de ObjectDataSource, dan is editeren van records enkel een kwestie van het aanvinken van "enable editing" via de smart tag van de GridView.
Er is wel een heel vervelend probleem voor updaten van gegevens, dat een foutmelding 'Could not find a non-generic method "Update"...' wordt gegeven.
Dit is in ons geval opgelost door voor de id-kolom de eigenschap ReadOnly op false in te stellen. Niet echt elegant, maar wel een oplossing.
Dit probleem heeft te maken met de DataTableAdapter Wizard bij het maken van een DataSet die een stored procedure en methode voor Updaten aanmaakt die een id en een original_id gebruikt, terwijl de GridView deze niet allebei retourneert wanneer id een primary key-veld is, de GridView gaat er vanuit dat het id alleen-lezen is en geeft het originele id niet mee, terwijl de Wizard die de Stored Procedures, TableAdapter en methoden heeft aangemaakt ervan uitgaat dat het primaire sleutelveld wel kan worden gewijzigd.
De Stored Procedures die werden aangemaakt door de DataSet-Wizard van Visual Studio zijn handig, maar veelal zal je zelf reeds een Stored Procedure voor gegevensupdate aangemaakt hebben.
CREATE PROCEDURE dbo.NascholingUpdate
(
@id int,
@naam varchar(50),
@plaats varchar(50),
@datum datetime,
@prijs money,
@actief bit
)
AS
SET NOCOUNT OFF;
UPDATE nascholing SET
naam = @naam,
plaats = @plaats,
datum = @datum,
prijs = @prijs,
actief = @actief
WHERE id = @id;
Wanneer je zelf een DataAccess- en eventueel een Logic-layer hebt gemaakt voor je toepassing, dan kan je een ObjectDataSource aanmaken die jouw methoden gebruikt.
NascholingDB.cs
...
public static void Update(int id, string naam, string plaats, DateTime datum, decimal prijs, bool actief)
{
SqlConnection myConnection = new SqlConnection(ConfigurationManager.ConnectionStrings["NascholingConn"].ConnectionString);
SqlCommand myCommand = new SqlCommand("NascholingUpdate", myConnection);
myCommand.CommandType = CommandType.StoredProcedure;
myCommand.Parameters.AddWithValue("@id", id);
myCommand.Parameters.AddWithValue("@naam", naam);
myCommand.Parameters.AddWithValue("@plaats", plaats);
myCommand.Parameters.AddWithValue("@datum", datum);
myCommand.Parameters.AddWithValue("@prijs", prijs);
myCommand.Parameters.AddWithValue("@actief", actief);
myConnection.Open();
myCommand.ExecuteNonQuery();
myConnection.Close();
}
...
Nascholing.cs
...
[DataObjectMethod(DataObjectMethodType.Update)]
public static void Update(Nascholing n)
{
NascholingDB.Update(n.Id, n.Naam, n.Plaats, n.Datum, n.Prijs, n.Actief);
}
...
Om dit op te lossen moeten we handmatig een UpdateParameter-lijst voorzien waarbij we expliciet opgeven dat de datum van het type DateTime is:
...
<asp:ObjectDataSource ID="ODSnascholing_3tier" runat="server" DataObjectTypeName="Logic.Nascholing"
OldValuesParameterFormatString="original_{0}" SelectMethod="GetNascholingenSorted"
SortParameterName="sortby" TypeName="Logic.Nascholingen" UpdateMethod="Update">
<SelectParameters>
<asp:Parameter DefaultValue="naam" Name="sortby" Type="String" />
</SelectParameters>
<UpdateParameters>
<asp:Parameter Name="id" Type="Int32" />
<asp:Parameter Name="naam" Type="String" />
<asp:Parameter Name="plaats" Type="String" />
<asp:Parameter Name="prijs" Type="Decimal" />
<asp:Parameter Name="datum" Type="DateTime" />
<asp:Parameter Name="actief" Type="Boolean" />
</UpdateParameters>
</asp:ObjectDataSource>
...
De eerste drie mogelijkheden komen verderop in de cursus aan bod, voorlopig zullen we fouten onderscheppen vooraleer we proberen de Data Source te benaderen.
Om op een correcte manier fouten te kunnen afhandelen is het essentiëel te weten hoe gegevens worden doorgegeven van de GridView naar de ObjectDataSource en naar de Logic-laag of DAL.
Wensen we op het niveau van de GridView in te grijpen in de code, dan kunnen we dit in het RowUpdating event gaan doen
We werken verder met de laatst GridView uit het voige onderdeel: GridView gekoppeld aan een ObjectDataSource, ObjectDataSource gebonden aan ons eigen klassenmodel.
protected void GridView2_RowUpdating(object sender, GridViewUpdateEventArgs e)
{
string oudenaam = e.OldValues["Naam"].ToString();
bool updateok = true;
if (e.NewValues["Naam"] == null)
{
updateok = false;
}
else
{
if (e.NewValues["Naam"].ToString().Trim() == "") updateok = false;
}
if (!updateok)
{
LblMsg.Text = "Gelieve een naam op te geven, deze was oorsponkelijk " + oudenaam;
e.Cancel = true;
}
}
protected void Page_Load(object sender, EventArgs e)
{
LblMsg.Text = "";
}
Het verwijderen van records uit met behulp van een GridView gekoppeld aan een ObjectDataSource met DataSet met automatisch gemaakte Stored Procedures is heel eenvoudig: via smart tag zet je een vinkje bij Enable deleting.
CREATE PROCEDURE dbo.NascholingDelete ( @id int ) AS SET NOCOUNT OFF; DELETE FROM nascholing WHERE id = @id;
NascholingDB.cs
...
public static void Delete(int id)
{
SqlConnection myConnection = new SqlConnection(ConfigurationManager.ConnectionStrings["NascholingConn"].ConnectionString);
SqlCommand myCommand = new SqlCommand("NascholingDelete", myConnection);
myCommand.CommandType = CommandType.StoredProcedure;
myCommand.Parameters.AddWithValue("@id", id);
myConnection.Open();
myCommand.ExecuteNonQuery();
myConnection.Close();
}
...
Nascholing.cs
[DataObjectMethod(DataObjectMethodType.Delete)]
public static void Delete(Nascholing n)
{
NascholingDB.Delete(n.Id);
}
We hebben in de voorgaande cursusonderdelen gezien hoe je datamanipulaties kan doen in een GridView met behulp van Commandfields edit, update, cancel en delete. Soms zal je toepassingen maken waarbij een rij uit een GridView geselecteerd moet kunnen worden om bv. deze rij van buiten de GridView te manipuleren.
protected void GridView2_SelectedIndexChanged(object sender, EventArgs e)
{
LblRij.Text = "Rij: " +GridView2.SelectedRow.RowIndex.ToString();
}
De gegevens in de rij van een GridView zullen soms op een andere plaats van de toepassing getoond moeten worden.
protected void GridView2_SelectedIndexChanged(object sender, EventArgs e)
{
LblRij.Text = "Rij: " +GridView2.SelectedRow.RowIndex.ToString();
string naam = GridView2.SelectedRow.Cells[2].Text;
LblGegevens.Text = "Naam nascholing: " + naam;
}
protected void GridView2_SelectedIndexChanged(object sender, EventArgs e)
{
LblRij.Text = "Rij: " +GridView2.SelectedRow.RowIndex.ToString();
DataKey data = GridView2.SelectedDataKey;
LblGegevens.Text = data.Values["Naam"] + " - "
+ data.Values["Plaats"] + " - "
+ data.Values["Datum"] + " - "
+ data.Values["Prijs"] + " - "
+ data.Values["Actief"];
}
We zullen er nu voor zorgen dat de cursussen waarvoor Actief op false is ingesteld niet meer aangepast kunnen worden door deze rijen te disablen.
protected void GridView2_RowDataBound(object sender, GridViewRowEventArgs e)
{
if (e.Row.RowType == DataControlRowType.DataRow)
{
object dataitem = e.Row.DataItem;
e.Row.Enabled = (bool)DataBinder.Eval(dataitem,"Actief");
}
}
We controleren eerst of de rij een DataRow is (het kan ook bv. een Header of Footer zijn).
Een component die speciaal werd ontworpen om de detailgegevens van een geselecteerde record te bekijken is de DetailsView.
Deze component ondersteunt ook update, insert en delete-acties
We werken verder met de GridView die gekoppeld is aan een ObjectDataSource die gebruik maakt van ons eigen 3-tier klassenmodel, voor de andere situaties (bvb. typed DataSet) blijven de principes gelijklopend.
CREATE PROCEDURE dbo.NascholingSelectById ( @id int ) AS SELECT id, naam, plaats, datum, prijs, actief FROM nascholing WHERE id = @id RETURN
NascholingDB.cs
...
public static DataSet GetNascholingById(int id)
{
SqlConnection myConnection = new SqlConnection(ConfigurationManager.ConnectionStrings["NascholingConn"].ConnectionString);
SqlCommand myCommand = new SqlCommand("NascholingSelectById", myConnection);
myCommand.CommandType = CommandType.StoredProcedure;
myCommand.Parameters.AddWithValue("@id", id);
SqlDataAdapter da = new SqlDataAdapter(myCommand);
DataSet ds = new DataSet("DsNascholing");
da.Fill(ds, "Nascholingen");
return ds;
}
...
public static Nascholing GetNascholingById(int id)
{
Nascholing d = new Nascholing();
try
{
DataSet ds = NascholingDB.GetNascholingById(id);
DataTable dt = ds.Tables["Nascholingen"];
d.Id = Convert.ToInt32(dt.Rows[0]["id"]);
d.Naam = dt.Rows[0]["naam"].ToString();
d.Plaats = dt.Rows[0]["plaats"].ToString();
d.Datum = Convert.ToDateTime(dt.Rows[0]["datum"]);
d.Prijs = Convert.ToDecimal(dt.Rows[0]["prijs"]);
d.Actief = Convert.ToBoolean(dt.Rows[0]["actief"]);
}
catch
{
d = null;
}
return d;
}
Op deze manier 'luistert' deze ObjectDataSource naar veranderingen in de GridView, je hoeft niks meer te programmeren in het event SelectedIndexChanged
De Control DetailsView kan ook gebruikt worden om acties uit te voeren op de database: update, insert en delete.
Aangezien we update en delete al hebben besproken voor de GridView beginnen we met de actie insert: toevoegen van records.
CREATE PROCEDURE dbo.NascholingInsert ( @naam varchar(50), @plaats varchar(50), @datum datetime, @prijs money, @actief bit ) AS SET NOCOUNT OFF; INSERT INTO nascholing (naam, plaats, datum, prijs, actief) VALUES(@naam,@plaats,@datum,@prijs,@actief)
NascholingDB.cs
...
public static void Insert(string naam, string plaats, DateTime datum, decimal prijs, bool actief)
{
SqlConnection myConnection = new SqlConnection(ConfigurationManager.ConnectionStrings["NascholingConn"].ConnectionString);
SqlCommand myCommand = new SqlCommand("NascholingInsert", myConnection);
myCommand.CommandType = CommandType.StoredProcedure;
myCommand.Parameters.AddWithValue("@naam", naam);
myCommand.Parameters.AddWithValue("@plaats", plaats);
myCommand.Parameters.AddWithValue("@datum", datum);
myCommand.Parameters.AddWithValue("@prijs", prijs);
myCommand.Parameters.AddWithValue("@actief", actief);
myConnection.Open();
myCommand.ExecuteNonQuery();
myConnection.Close();
}
...
[DataObjectMethod(DataObjectMethodType.Insert)]
public static void Insert(Nascholing n)
{
NascholingDB.Insert(n.Naam, n.Plaats, n.Datum, n.Prijs, n.Actief); ;
}
<asp:ObjectDataSource ID="ODSNascholingDetail" runat="server" DataObjectTypeName="Logic.Nascholing"
InsertMethod="Insert" OldValuesParameterFormatString="original_{0}" SelectMethod="GetNascholingById"
TypeName="Logic.Nascholingen">
<SelectParameters>
<asp:ControlParameter ControlID="GridView2" Name="id" PropertyName="SelectedValue"
Type="Int32" />
</SelectParameters>
<InsertParameters>
<asp:Parameter Name="naam" Type="String" />
<asp:Parameter Name="plaats" Type="String" />
<asp:Parameter Name="prijs" Type="Decimal" />
<asp:Parameter Name="datum" Type="DateTime" />
<asp:Parameter Name="actief" Type="Boolean" />
</InsertParameters>
</asp:ObjectDataSource>
Om editeren en verwijderen via de DetailsView mogelijk te maken passen we eerst de ObjectDataSource aan.
Blijkbaar is er nu een probleempje met de Decimal waarde voor de prijs, we moeten daar nu met een '.' werken ipv ','
| Meer tutorials: |
| leer ook: | html | | xhtml | | css | | asp | | asp.net | | c# | | ado.net | | linq | | ajax | | java | | javascript |