Vandaag kwam ik tijdens de ontwikkeling van een web-applicatie iets vervelends tegen.
Momenteel ben ik bezig met een ASP.Net 2.0 applicatie en daar wordt gebruik gemaakt van een basis uit ASP.Net 1.1. Op zich geen probleem en alles werkt ook goed, echter hebben we enkele nieuwe features toegevoegd die mogelijk werden gemaakt in 2.0 van het .Net Framework. Een van die dingen zijn Masterpages.
Een enorm handige feature en het werkt ook wel leuk. Hoewel ik me er niet enorm in heb verdiept snap ik de basis wel en zie ook wel dat het handig (kan) zijn.

Met de introductie van Masterpages introduceer je ook weer nieuwe problemen in je al bestaande web-applicatie.
Een van die problemen die ik vandaag ben tegengekomen is het gebruik van de functie FindControl. Deze kun je normaliter gebruiken om een control in je pagina op te zoeken aan de hand van een ID. Dit is nog steeds het geval, echter worden de ID's van je controls aangepast zodra ze in een masterpage staan. Je kunt dus niet meer zoeken op bijvoorbeeld het ID testLabel. Nee, hier staat nu een hele prefix voor.
Na even te hebben gezocht op internet kwam ik al snel op een oplossing voor dit probleem. Door middel van een recursieve functie te gebruiken kun je alle controls doorlopen en dan toch naar je 'eigen' ID zoeken.
Zo ziet de functie er uit:

public static Control FindControlRecursive(Control Root, string Id)
{
if (Root.ID == Id)
return Root;
foreach (Control Ctl in Root.Controls)
{
Control FoundCtl = FindControlRecursive(Ctl, Id);
if (FoundCtl != null)
return FoundCtl;
}
return null;
}

Uiteraard zijn er talloze variaties mogelijk, maar dit is er dus een van.
Bron: http://www.petermeadit.net/content/index.php?option=com_content&task=view&id=45&Itemid=55

Nadeel is wel dat een recursieve functie relatief lang kan duren om uit te voeren. Het zal niet vaak voorkomen dat je een pagina hebt met honderden controls die verschillende lagen diep zitten, maar toch.

Een andere oplossing die ik tegen was gekomen is om al je controls in een panel te zetten.
Op deze manier kun je weer gewoon gebruik maken van je FindControl functie en hoef je dus geen moeilijke recursieve functie te implementeren.
Deze oplossing heb ik nu dus ook gebruikt in m'n web-applicatie.
Alles in een panel zetten en daar de controls in zoeken.

testPanel.FindControl("testControl");

Werkt dus uitermate goed. Hoewel het soms niet wenselijk is om alles in een grote panel te plaatsen, is het voor mij nu toch wel handig.
comments powered by Disqus