Sep.04

Fonetisch ("klinkt als") zoeken

loep.jpg’t is al weer even geleden na een heerlijke vakantie in Frankrijk hoop ik weer wat frequenter artikeltjes te plaatsen.

Misschien herken je het probleem. Je wilt zoeken op een persoon met een bepaalde naam maar was het nu “Kees” of “Cees” en Janssen, Jansen, Jensen of Johnson. Dit probleem is op te lossen met een fonetisch zoek algoritme. Er zijn genoeg bedrijven die hier in het bijzonder in zijn gespecialiseerd. Als “arme” developer moet je dan echter je baas zover zien te krijgen met zo’n partij in zee te gaan en dat is voor simpele zaken als een intranet zoekfunctie niet altijd haalbaar. Geen nood, ik kwam er achter dat er meerder open source algoritmen bestaan voor dit probleem. Een van de betere tot nu toe is het zogenaamde Double Metaphone algoritme van Lawrence Phillips.

De werking komt in feite neer op het vastleggen van een fonetische primaire en een alternatieve sleutel voor een bepaald woord. Deze sleutel is maximaal 4 karakters lang en bestaat alleen uit medeklinkers. Zo is de primaire sleutel van de naam “Snoei”, “SN” en de alternatieve sleutel “XN”. De namen “Snoo”, “Snoeij” en “Snoey” hebben exact dezelfde sleutels en worden bij het fonetisch zoeken ook als resultaat meegenomen. De sleutel van een woord kunnen via het algoritme van Lawrence razendsnel worden vastgesteld. Een praktische implementatie zou zijn dat je in een database voor elk te zoeken woord de fonetische sleutels vaststeld. Bij het daadwerkelijk zoeken worden de fonetische sleutels vastgesteld van de zoekterm en deze worden middels een query tegen de database aangehouden.

Meer over de werking van het algoritme is te vinden het 6-delige artikel Implement Phonetic (“Sounds-like”) Name Search With Double Metaphone. In dit artikel worden een aantal implementaties ter beschikking gesteld voor ASP, VB Script, C++ maar ook voor C# verder zijn er diverse interessante links te vinden met betrekking tot fonetisch zoeken.

Conversie van (nullable) valuetypes

Convert.pngJe kent het wel, je wilt de conversie van het ene naar het andere valuetype doen. Bijvoorbeeld een string omzetten naar een int. Gebruikelijk is om dat te doen met de volgende code:

Een andere optie is:

Deze laatste methode kan handig zijn als gebruik wordt gemaakt van reflection. Je weet dan vaak niet vooraf om welke bron en/of doeltypes het gaat.

Het type van MyProperty is onbekend maar zolang de string “881974” geconverteerd kan worden naar het type MyPropertyType is er geen probleem. Als MyPropertyType een string, decimal, int, float etc… is gaat het goed. Is het een bool dan gaat het uiteraard mis.

Allemaal heel mooi natuurlijk, maar deze Convert functies bieden geen ondersteuning voor nullable types. Willen we een bijvoorbeeld een string omzetten naar een int? (nullable int) dan hebben we een probleem. Tot nu toe, want hier is een oplossing ;-).

Bovenstaande functie ondersteund de conversie van nullable types. Wil je een echt elegante oplossing dan kunnen we met behulp van Generics de volgende methode maken binnen dezelfde DoConvert klasse, namelijk:

Je gebruikt deze functie als volgt:

Voila!

Html2Xhtml & Screen Scraping

HTML.pngWil je echt leuk informatie van het web plukken dan is die vaak niet toegankelijk via RSS. Neem bijvoorbeeld de site jaap.nl. Zoek je een koophuis dan moet je bij Jaap zijn en niet meer bij Funda. Want wat doet Jaap, Jaap scraped alle webpagina’s van Funda om de inhoud vervolgens op hun eigen website te publiceren. Scrapen is een methode om de voor jou doel relevante gegevens uit een (in dit geval) webpagina “te vissen”. Beleg je, dan is het bijvoorbeeld leuk om aan koersinformatie te komen. Denk maar niet dat die als RSS beschikbaar is. De gegevens zijn wel beschikbaar op openbaar toegankelijke webpagina’s van bijvoorbeeld morningstar.nl.

Nu is het voordeel van RSS dat het een XML standaard is en XML is gemakkelijk te gebruiken. HTML is echter een heel ander verhaal. HTML stelt lagere eisen aan consistentie en is daarom ook moeilijker te intepreteren. Wil je een HTML scrapen dan kun je voor de optie kiezen dit met behulp van regular expressions te doen. Ik heb zelf echter altijd het probleem dat ik vergeet hoe de syntax ook al weer was voor bepaalde zoekcriteria. Enkele jaren geleden heb ik daarom een setje klasses geschreven die HTML naar XML converteren. (Onder dit artikel vind je een link naar de download) Vervolgens kun je de gegevens in de HTML gemakkelijk parsen met behulp van bijvoorbeeld een XmlDocument object. Let op, het is geen rocket science maar het werkt en ik ben nog geen pagina tegengekomen die niet met de klasses kon worden geintepreteerd. Het is geen probleem als tags in de HTML die je om wil zetten niet worden gesloten (zoals bijv <P> of <BR>). De classes zorgen zelf dat dit op de juiste manier in de XML wordt afgehandeld.

Hoe werkt het?

Vervolgens kun je je uitleven op elke willekeurige pagina, van het KNMI tot flitsinformatie.

Download Html2XHtml.zip

Wat is een Lambda Expression?

LambdaExpressions.pngDe Lambda Expression is 1 van de nieuwe taalfeatures van C# 3.0. De nieuwe Visual Studio gaat hier ondersteuning voor bieden. Wat is een Lambda Expression eigenlijk?

Delegates
Even terug naar C# 1.0, daar begon het allemaal met delegates. Een delegate is eigenlijk een blauwdruk van een methode. Bijvoorbeeld

Bovenstaande delegate beschrijft een functie die een Person object als parameter verwacht en een boolean teruggeeft. Vervolgens kan er een functie worden gemaakt die met de delegate overeenkomt. Bijvoorbeeld:

Het voordeel van een delegate is dat de implementatie van de functie onafhankelijk is van de delegate blauwdruk. Zo zou de volgende implementatie ook prima overeenkomen met de genoemde delegate.

We kunnen met onderstaande methode de resultaten van beidde delegate implementaties testen:

Bovenstaande functie roepen we in C# 1.0 als volgt aan:

Delegates worden ook gebruikt in het event model van het .NET framework. In dat geval praten we over EventHandlers. Aangezien bovenstaande oplossing vrij omslachtig is als het gaat om een vrij simpele implementatie van een functie op basis van een delegate is er in C# 2.0 de anonymous method geintroduceerd.

Anonymous Methods
Dankzij de Anonymous Method hoeven we in bovenstaande geval geen specifiek implementatie te schrijven voor de IsTrue delegate maar kunnen we de FirstNameStartsWithT test als volgt formuleren:

Het grote voordeel, de inhoud van de functie FirstNameStartsWithT kan direct worden meegegeven zonder er een specifieke method te hoeven schrijven, een anonieme methode dus…

Lambda Expressions
Aangezien dit ook nog een redelijk omslachtige schrijfwijze is heeft men in C# 3.0 de Lambda Expression geintroduceerd. Syntactisch worden als eerste de parameters benoemd, benaming naar eigen keuze. Dan volgt “=>” daarna volgt de implementatie zoals in het bovenstaande delegate en anonymous method voorbeeld. Dus..

Deze korte schrijfwijze heeft zijn effect op de LINQ implementatie. Het is echter de vraag of dat dankzij de Lambda Expression mogelijk werd of dat de Lambda Expression zijn bestaan dankt aan de LINQ implementatie 😉 Ach, dat zullen we nooit weten…

LambdaExpressionsTest.zip – Voorbeeldcode voor Visual Studio Orcas Beta 1

WPF, WPF/E, Silverlight en XBAP

WPF.JPGIk ben al een tijdje in mijn vrije tijd aan het rommelen met WPF. De termen vliegen om je oren, maar wat is wat, waarvoor en hoe. Kortom dat kwam na een tijdje bij mij boven borrelen. Na wat zoekwerk heb ik het een en ander op een rijtje.

WPF is door Microsoft gelanceerd als de opvolger van het al verouderde WinForms ontwikkelmodel. WPF staat voor Windows Presentation Foundation, voorheen Avalon genoemd. Belangrijkste vooruitgang die met de introductie van WPF wordt geboekt is dat presentatie en logica nu strikter gescheiden zijn. De presentatie kan nu theoretisch gesproken gemakkelijker gebeuren door designers terwijl de businesslogic door de developers kan worden gedaan. In WPF worden windows (vergelijkbaar met forms) volledig beschreven in XAML een op XML gebaseerde taal. WPF combineert de kracht van 2 werelden. WinForms, het sterk interactieve model en Web dat geen beperkingen legt op vormgeving. WPF gaat nog verder, mogelijkheden als een roterend filmpje in een item van een listview zijn makkelijk te realiseren. Het is bovendien ook niet heel moeilijk zelf controls te bouwen. Een goed boek over WPF is Applications = Code + Markup van Charles Petzold. Met tools als Microsoft Expression Studio (met name Blend) kunnen gemakkelijk WPF applicaties gebouwd worden. Maar ook in de komende versie van Visual Studio, Visual Studio codename Orcas beschikt over mogelijkheden tot het maken van de diverse soorten WPF applicaties.

WPF/E, WPF Everywhere sinds kort officieel Silverlight genoemd. WPF/E bevat een subset van WPF met alleen de presentatielaag. De gestripte versie bevat bijvoorbeeld enkel een TextBlock control en geen button, listbox en welke andere controls dan ook. WPF/E is bedoeld voor het gebruik in browsers en biedt cross-platform ondersteuning. Het grote voordeel van deze gestripte versie is dat het in principe in een aantal browsers bruikbaar is middels plug-in van +/- 2Mb. Daarmee wordt meteen het voordeel duidelijk dat alleen de plug-in en niet het volledige .NET 3.0 framework op de client geïnstalleerd hoeft te worden (a 54Mb).

Bekijk deze Silverlight klok eens.. Wil je zelf aan de slag met Silverlight dan is dit een leuke tutorial om mee te beginnen.

XBAP, naast WPF/E is er ook nog de XBAP browser oplossing. XBAP staat voor XAML Browser Applications. Voor het gebruik van XBAP binnen de browser dient wel het volledige .NET 3.0 framework op de cliënt geïnstalleerd te zijn. Maar, dat heeft als voordeel dat WPF in al zijn facetten aanwezig en te gebruiken is. Ten opzichte van de “gewone” standalone WPF applicatie is er wel het verschil dat XBAP in een security sandbox draait waarbij rechten zijn ingeperkt zoals bijvoorbeeld toegang tot het bestandssysteem. Wil je een gecentraliseerde oplossing met een rijke GUI waarbij je bijvoorbeeld gebruik maakt van een webservice dan kan dit een prima mogelijkheid zijn.

Vage MS Access exceptions

AccessException.PNGWie kent ze niet, bijzonder vaag omschreven MS Access foutmeldingen in combinatie met een C# applicatie. Onlangs kwam ik er weer 2 tegen van het type, uren staren en dan nog niet begrijpen wat het probleem is. Hier komen ze.

Nummer 1: “Data type mismatch in criteria expression”
Ik kreeg deze melding bij het uitvoeren van een update van een record in mijn MS Access database. Bij insert trad dit probleem niet op. Uiteindelijk na lang zoeken bleek het te maken te hebben met de DateTime velden. Als ik geen DateTime velden meenam in de update was er niets aan de hand. Voor je daar achter bent ben je natuurlijk ff bezig. Wat bleek MS Access vindt het niet leuk als de milliseconds van een DateTime een waarde heeft die anders is dan “0”. Dit geldt echter alleen bij een update statement, voor een insert is het geen probleem en wordt de millisecond waarde gewoon opgeslagen in de database. De waarde is er ook uit te vissen op 1/1000 nauwkeurig. Pffff, is dat unexpected behavior of niet…

Nummer 2: “Operation must use an updateable query”
Hoe vaag… Wat is een updateable query? Ik weet wel wat een update query is en die schoot ik bij het optreden van deze exceptie naar binnen. Een melding als “.mdb file is readonly” zou beter op zijn plek zijn. Readonly vlag van het mdb bestand en de operatie met de updateable query kon ongestoord doorgang vinden binnen de ondoorgrondelijke radars van de motor die Access heet.

Ik hoor je denken: “Ach, gebruik ook gewoon SQL-Server stumper.” 😉

May.08

(D)LINQ

LINQ.pngNa de installatie van VS Orcas (de opvolger van Visual Studio 2005) een tijdje geleden alweer, ben ik eindelijk eens met Orcas gaan stoeien. M’n laptop had het overigens wel zwaar met het draaien van 2 operating systemen tegelijkertijd. Orcas draait namelijk onder Microsoft Virtual PC met Windows 2003 operating systeem. Mijn laptop is uitgerust met 1 Gb geheugen maar toch is mijn systeem dan continue aan het swappen. Is Orcas in de lucht dan duld mijn OS geen enkele andere RAM-vretende applicatie zoals Outlook of Onenote. Dit heeft me een tijdje weerhouden van het onderzoeken van LINQ maar ik ben nu toch maar aan de slag gegaan. Met het vooruitzicht van een geheugenuitbreiding van een halve Gig (bedankt baas) wil ik nu wel even in de wacht staan.

Een leuke nieuwe feature in Orcas is onder andere ondersteuning van de LINQ syntax. LINQ staat voor Language INtegrated Query en voorziet in de mogelijkheid met SQL-achtige queries binnen je code data te verzamelen uit bijvoorbeeld collections. De scheidslijn tussen database data en object data wordt hierdoor een stuk kleiner.

Om te beginnen heb ik binnen Orcas een Console applicatie aangemaakt. In de main functie van Program.cs heb ik de volgende code geschreven:

In deze code wordt een string array gecreeerd met namen. De LINQ query, op regel 2, is van het type IEnumerable en verzamelt alle namen met een lengte van maximaal 4 karakters en sorteert daarnaast de namen op alfabet. In de foreach lus worden de namen naar de console geschreven. Het resultaat is dus dit:

Console1.JPG

Lazy loading?
Wat belangrijk is om te weten is dat op de 2e regel waarbij de LINQ query wordt toegewezen aan de variabele IEnumerable “result” niet het resultaat wordt vastgelegd maar enkel de query definitie. Als op de 3e regel daadwerkelijk in de foreach loop van de IEnumerable de items op worden gevraagd, dan wordt pas daadwerkelijk de selectie van de data uitgevoerd. In dit geval is het om het even. Maar gaan we gebruiken maken van een database voor het ophalen van data via een DLINQ query dan is dit weldegelijk een relevant gegeven! We hebben het hier dus over mix tussen normale en lazy loading.

Meer voorbeelden van LINQ queries kan je vinden op de “101 LINQ samples” pagina van Microsoft.

Nu wat meer over DLINQ en laat je verbazen. LINQ op zich geeft mij al een WOW! gevoel, maar DLINQ is echt WOW! in het kwadraat. Het stappenplan:

  1. Ga gewoon verder in dezelfde console applicatie
  2. Aangezien op de Virtual PC image ook SQL Server is geinstalleerd, creeer een database.
  3. Creeer 2 tabellen in de database 1 met de naam “Medewerker” en een andere met de naam “Bedrijf”.
  4. Voeg de volgenden velden toe aan de tabel “Medewerker”: Id (int), Voornaam, Achternaam, BedrijfId (int).
  5. Medewerker.JPG

  6. Voeg de volgenden velden toe aan de tabel “Bedrijf”: Id (int), Naam.
  7. Bedrijf.JPG

  8. De Id velden in beide tabellen zijn van het type Identity.
  9. Leg een Foreign key relatie van Medewerker.BedrijfId naar Bedrijf.Id.
  10. Relationship.JPG

  11. Nu kiezen we voor ons console project Add > New Item > LINQ To SQL File. We noemen de file Bedrijfsdata.dbml.
  12. DBMLDialog.JPG

  13. Bedrijfsdata.dbml wordt nu getoond. We slepen nu vanuit de “Server Explorer” de tabellen op de dbml.
  14. DBMLBedrijfsdata.JPG

  15. We hebben nu een koppeling gecreeerd met een database die we kunnen gebruiken binnen LINQ. We kunnen nu code gaan kloppen.

Binnen het project is nu de class BedrijfsdataDataContext beschikbaar waarmee we de database kunnen benaderen. Met de volgende code voegen we een bedrijf toe aan de database:

//Creer een nieuwe datacontext
BedrijfsdataDataContext dc = new BedrijfsdataDataContext();
//Creeer een Bedrijf (is automatisch beschikbaar via Context)
Bedrijf b = new Bedrijf();
//Vul de properties
b.Naam = "Conclusion Core Technologies";
//Voeg het bedrijf toe in de context
//Door engelse context wordt lijst met bedrijven "Bedrijfs" genoemd
dc.Bedrijfs.Add(b);
//Sla alle wijzigingen in de context op in de database
dc.SubmitChanges();

Console.WriteLine("Press a key...");

Medewerkers kunnen als volgt aan dit bedrijf worden toegevoegd:

BedrijfsdataDataContext dc = new BedrijfsdataDataContext();
Medewerker m = new Medewerker();
m.Voornaam = "Ton";
m.Achternaam = "Snoei";
m.Bedrijf = (from b in dc.Bedrijfs where
  b.Naam.StartsWith("Conclusion") select b).First();
dc.Medewerkers.Add(m);
dc.SubmitChanges();
Console.WriteLine("Press a key...");

Het leuke is dat voor elke willekeurige medewerker het bedrijfobject kan worden opgevraagd of voor elk bedrijf een lijst met alle medewerkers. Zoals eerder gezegd, het bedrijf object bevat dan wel een property van het type IEnumerable met de naam Medewerkers, dat wil echter niet zeggen dat zich hier een gevulde collectie met medewerkers bevindt. Deze property bevat een definitie om alle medewerkers van het betreffende bedrijf op te halen. Zolang echter niets met de medewerkers property wordt gedaan worden deze dus ook niet uit de database opgehaald. De optimale manier van lazy loading!!

Het is jammer voor teams als die van NHibernate die jaren hebben besteedt aan het bouwen van een mooie oplossing om objecten van en naar een database te “mappen”. Denk eens aan mijn mooie mapper die kan ook de kast in ;-). Maar een betere object relational mapper als DLINQ ben ik nog niet tegengekomen. Dit komt natuurlijk mede door het feit dat Microsoft vrij is om de syntax van een ontwikkeltaal aan te passen. Daarnaast is het concept natuurlijk ook goed doordacht. Er is wel 1 nadeel, DLINQ werkt vooralsnog alleen met SQL Server.

Ik zou zeggen experimenteer er zelfs een mee. Leuk is ook om de SQL Profiler er bij te pakken om eens te kijken hoe de LINQ queries zich verhouden met SQL. Ik heb zelf ervaren dat dit heel leerzaam is. Voor degene die ook al een blik hebben geworpen op WPF is het duidelijk dat het koppelen van data op alle vlakken gemakkelijker is geworden.

Kortom, ik denk dat we hier met zijn alle heel veel profijt van gaan hebben. Ik kan niet wachten tot de officiele release uit is van Orcas en kan elk bedrijf dan ook aanraden direct over te stappen op dit nieuwe concept. Er valt heel wat geld te besparen, want over het algemeen slokt een datalaag toch een redelijk deel van een ontwikkelbudget op van een willekeurig project.

Apr.11

Goedkope ASP.NET hosting

hosting2.jpgAls ontwikkelaar is het natuurlijk altijd leuk om ook een stukje webruimte te hebben waar het een en ander kan worden gepubliceerd. Maar ja, het mag niet te veel kosten maar moet wel kwaliteit zijn. Dit blog en allerlei ASP.NET pilotjes draaide vooralsnog bij een hostingprovider in Amerika met een server in Engeland. Ik betaalde daar zo’n $ 80,- per jaar voor 5Gb schijfruimte en een onbeperkt aantal MySQL databases, e-mail functionaliteit en 1 domein gekoppeld (snoei.com). Met deze account kon ik op MySQL gebaseerde .NET applicaties bouwen via een Odbc koppeling. Verder zijn er allerlei PHP-applicaties te vinden die dankbaar gebruik maken van MySQL, zoals dit blog.

PHP draaide als een zonnetje maar met .NET waren altijd wat problemen. Als een .NET applicatie namelijk een uurtje in was geslapen (geen bezoek) dan ging het wakker worden wat moeizaam. Het tonen van de eerste pagina duurde dan een niet mis te verstane 15 tot 30 seconden. En dat is lang, veeeeel te lang. Daar was ik al niet erg over te spreken maar ach, ik dacht, alle waar naar zijn geld. Nadat de hoster een update had gedraaid van de ODBC driver tbv van MySQL werkte geen van mijn ASP.NET applicaties meer. En omdat vervolgens ook de support van ene op de andere dag een reactietermijn kreeg van 7 tot 14 dagen was voor mij de maat vol. Overstappen geblazen. Maar ja, waar naar toe.

Ik had een aantal eisen. Zoals elke recht geaarde Hollander natuurlijk veel voor weinig:

  • Kosten max +/- €100,- p/j
  • Meerder domeinen ondersteund (min. 3)
  • Min. 1 Gb schijfruimte
  • Min. 10 Gb traffic p/m
  • Min. 10 MySQL databases
  • Als het ff kan MS SQL
  • E-mail met spam control.
  • Hoe vind je dat? Er is wat dat betreft heel wat hulp te vinden op het WWW. Ik wist in ieder geval van de zoektocht naar mijn vorige provider dat je het in Nederland niet moet zoeken. Veeeel te duur ;-). Bovendien als je de juiste tijdzone uitkiest, bijv Amerika, dan heb je het voordeel dat als de Nederlandse peikuren beginnen de Amerikaanse voorbij zijn. Dat is een indirecte garantie voor een redelijke performance. Dus op zoek naar Amerikaans hosters via de volgende websites:

  • http://www.hostsearch.com
  • http://www.vistainter.com
  • http://www.hostingchecker.com
  • http://www.webhostingjury.com
  • Uiteindelijk vond ik meer dan ik zocht:

  • http://www.digitalibiz.com (met veel positieve reviews)
  • 15 domeinen ondersteund
  • 25Gb schijfruimte
  • 350Gb traffic p/m
  • 250 MySQL databases
  • 25 MS SQL databases!!
  • E-mail (onbeperkt aantal POP accounts) met spam control en eigen SMTP server
  • PHP, CGI, ASP en ASP.NET v1 en v2
  • Shared SSL
  • Onbeperkt aantal POP accounts.
  • Nog mooier is dat de performance prima is, en geen spam meer. De support reageert als de meeste Amerikanen net zijn ontwaakt. Bovendien geven ze een kijkje in de keuken en dat wekt vertrouwen.

    Wat kost dat? Slechts $108,- per jaar (nee, ik heb geen aandelen bij deze club). Daar krijg je bij webstekker.nl een enkele domeinnaam, een schamele 500Mb schijfruimte, 35Gb traffic p/m, 1 SQL Server database, 4 MySQL databases en 60 pop accounts voor. Een pakket wat een beetje in de buurt komt kost bij webstekker zonder voorjaarsvoordeel €80,- p/m da’s €1000,- per jaar. Mmmm… makkelijk kiezen toch….

    En ja… binnenkort echt iets over LINQ en DLINQ.

    Mar.27

    Aan de slag met Visual Studio "Orcas" March 2007 CTP

    De nieuwe versie van Visual Studio staat qua RTM (Release To Manufacturer) vooralsnog gepland tussen eind 2007 en begin 2008. Ik vondt het wel tijd worden om eens een kijkje te nemen in deze opvolger van de VS 2005. In dit artikeltje vindt je wat ervaringen met de installatie van de jongste CTP.

    Op deze pagina kan Microsoft Pre-release Software Visual Studio Code Name “Orcas” – March 2007 Community Technology Preview (CTP) worden gedownload. Schrik niet het gaat om ongeveer 10Gb. Ik heb hiervoor Mozilla gebruikt met de DownThemAll plugin (onder IE was de dowloadsnelheid namelijk dramatisch laag +/- 40Kb/sec). De download bestaat uit de volgende onderdelen:

  • Virtual PC (18Mb)
  • Base “Orcas” Image voor Virtual PC (1.2Gb)
  • “Orcas” March 2007 CTP Image voor Virtual PC (6Gb)
  • Reserveer op je systeem +/- 26Gb, dat betekent 8Gb voor de download en +/- 18Gb voor het extracted image. Daarnaast is het handig om toch wel op zijn minst 1Gb geheugen in je PC te hebben. Na extractie kan de March 2007 CTP image worden gestart met behulp van Virtual PC. De image is heel compleet en bevat o.a.:

  • Windows 2003 Server (OS)
  • SQL Server 2005
  • Visual Studio “Orcas” Team System met WinFX ondersteuning
  • Na het opstarten van Virtual PC kun je naar hartelust experimenteren met alle WinFX onderdelen en nieuwe C# 3.0 taalfeatures zoals LINQ.

    Volgende artikeltje wil ik een en ander vertellen over LINQ en DLINQ.

    Mar.25

    LinkButton disable na click (dubbel opslaan voorkomen)

    Bij het bouwen van ASP.NET applicaties een bekend fenomeen, je wilt na het opslaan van gegevens niet dat de gebruiker nogmaals op “opslaan” kan klikken om te verkomen dat er meerdere entries worden opgeslagen. Dit probleem kan voorkomen als de verbinding traag is of de server niet erg snel reageert. De oplossing: vul de OnClientClick property van de LinkButton met het volgende javascript:

    this.disabled=true;this.onclick=function(){return false;}

    this.disabled = true zorgt voor het disablen van de link. this.onclick=function(){return false} knoopt een event aan de button. Dit event retourneert bij de eerstvolgende click false en de click (save) wordt dan ook echt niet meer afgehandeld.

    Wil je deze oplossing gebruiken schakel dan wel client-side script validatie uit (property: EnableClientScript) voor alle controls van het betrokken scherm.