ASP.net : GridView - DetailsView

  1. GridView: voorbereiding en inleiding
  2. GridView: data tonen
  3. GridView: kolommen
  4. GridView: sorteren
  5. GridView: pagineren
  6. GridView: data editeren
  7. GridView: foutafhandeling
  8. GridView: data verwijderen
  9. GridView: rijen selecteren
  10. GridView: gegevens uit een rij tonen
  11. GridView: rijen aanpassen
  12. DetailsView: detailgegevens tonen
  13. DetailsView: gegevens toevoegen
  14. DetailsView: gegevens editeren en deleten

GridView: voorbereiding voor 3-tier toepassing

Het besturingselement GridView is een aan gegevens gebonden raster met meerdere kolommen waarmee je verschillende typen kolommen kan dfiniëren. Deze kolommen voorzien de rasterinhoud niet alleen van een lay-out, maar voegen ook functionaliteit toe om gegevens te selecteren, bewerken, sorteren en pagineren. De GridView biedt ook functionaliteit voor volledige aanpassing van de uitvoer middels het gebruik van sjabloonkolommen.

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.

Gridview: gegevens tonen

Handmatig binden aan Business object

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.

Met een ObjectDataSource

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.

Met een SqlDataSource

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.

Met een typed DataSet en automatisch gegenereerde Stored Procedures

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.

GridView: kolommen definiëren

In bovenstaande voorbeelden hebben we telkens gegevens in een GridView geplaatst door eenvoudigweg de GridView te binden aan een DataSource.
De GridView werd automatisch gevuld met gegevens en op de webpagina getoond. Je wil natuurlijk de bestaande kolommen aanpassen en eventueel aanvullen. Dit kunnen we allemaal regelen met onze editor Visual Studio 2005 of natuurlijk in de source-code van het aspx-bestand.
Kies je via de smart tag van de GridView voor Edit Columns... dan krijg je een dialoogvenster te zien waar je de kolommen van de GridView kan instellen:

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

Voorbeeld

De TemplateField is de krachtigste kolom en staat je toe zelf een opmaak te definiëren voor een aantal varianten zoals AlternatingItem en EditItem

GridView: kolommen sorteren

Codeless sorteren met de Typed DataSet

Deze vorm van sorteren werkt zonder code te schrijven, maar wordt volledig aan de hand van de ViewState berekend door de webserver.

Sorteren door de database-engine

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.

GridView: pagineren

Pagineren

Pagineren stelt je in staat om slechts een gedeelte van de aanwezige records op het scherm te tonen. ASP.Net zorgt er automatisch voor dat de gebruiker naar een andere resultaatpagina kan overschakelen.

Standaard pagineren

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.

Standaard pagineren - veel records

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.

Custom pagineren

Het is nu de bedoeling de webserver te ontlasten, en enkel de benodigde records uit de database te lezen.

GridView: Data editeren

Met een GridView is het ook mogelijk om de gebruiker toe te staan om de gegevens in de GridView aan te passen en de nieuwe waarden weg te schrijven in de onderliggende Data Source.

Typed DataSet

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.

Typed DataSet - eigen Stored Procedure

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.

Foutafhandeling

Om mogelijke invoerfouten van de gebruiker af te handelen zijn er binnen ASP.Net een aantal mogelijkheden.

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.

  1. Wannneer de gebruiker waarden editeert klikt hij op een Control met het update-command (in vele gevallen automatisch gegenereerd via enable editing).
  2. Het RowUpdating event van de GridView wordt geraised
  3. De GridView vult de set UpdateParameters van de ObjectDataSource
  4. De GridView start de UpdateMethod van de ObjectDataSource
  5. Het event Updating van de ObjectDataSource wordt geraised
  6. De ObjectDataSource start de UpdateMethode uit de onderliggende Business-laag of DAL
  7. Het event Updated van de ObjectDataSource wordt geraised
  8. Het event RowUpdated van de GridView wordt geraised

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.

GridView - records verwijderen

Typed DataSet

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.

Typed DataSet - eigen Stored Procedures

Eigen ObjectDataSource - 3-tier

GridView - rijen selecteren

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.

GridView: gegevens uit een rij tonen

De gegevens in de rij van een GridView zullen soms op een andere plaats van de toepassing getoond moeten worden.

GridView: rijen aanpassen

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.

  • Maak een eventhandler voor de event RowDataBound van de GridView
    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).

  • DetailsView - gegevens bekijken

    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.

    DetailsView - gegevens toevoegen

    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.

    DetailsView - gegevens editeren en verwijderen

    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
    Valid HTML 4.01! Valid CSS! © - Cursusweb