RECUPERER L'INSTANCE D'UN CONTROL À PARTIR DE SON CLIENTID

cs_Nurgle Messages postés 1642 Date d'inscription samedi 6 novembre 2004 Statut Membre Dernière intervention 28 avril 2011 - 19 juin 2006 à 18:12
hugonjerome Messages postés 1 Date d'inscription mardi 18 octobre 2005 Statut Membre Dernière intervention 21 octobre 2008 - 21 oct. 2008 à 16:31
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/38193-recuperer-l-instance-d-un-control-a-partir-de-son-clientid

hugonjerome Messages postés 1 Date d'inscription mardi 18 octobre 2005 Statut Membre Dernière intervention 21 octobre 2008
21 oct. 2008 à 16:31
Salut,

J'ai ajouté une condition avant de renvoyer le contrôle trouvé pour vérifier que le ClientID du control trouvé est identique à celui cherché, j'ai rencontré le problème dans le cas d'un repeater où le contrôle renvoyé était toujours le premier, j'ai également modifié les métodes pour ne plus utiliser l'attribut static ni de string '_clientid':


private Control getControlFromClientID(Page page, string ClientID)
{
Control c = page.FindControl(ClientID);
if (c != null)
return c;
return getControlFromClientIDInternal(page, ClientID);
}
private Control getControlFromClientIDInternal(Control Container, string ClientID)
{
Control c;
if (ClientID.Length > Container.ClientID.Length)
{
c = Container.FindControl(ClientID.Remove(0, Container.ClientID.Length + 1));
if (c != null)
if (c.ClientID == ClientID)
return c;
}
foreach (Control child in Container.Controls)
{
if (child.Controls.Count > 0)
{
c = getControlFromClientIDInternal(child, ClientID);
if (c != null)
if (c.ClientID == ClientID)
{
ClientID = string.Empty;
return c;
}
}
}
return null;
}

J'utilise ce code pour rechercher des contrôles dans une page ayant une master page et sachant que le contrôle est inclus dans deux repeater imbriqués.

++
fcruveillier Messages postés 1 Date d'inscription vendredi 26 octobre 2007 Statut Membre Dernière intervention 21 décembre 2007
21 déc. 2007 à 11:19
Hello,
Je suis tombée sur un cas qui pose un problème (en vb.Net en tout cas):
- la CheckBoxList.

En effet, lorsque dans le processus de recherche d'un contrôle, "il" tombe sur une CBL, il effectue le getControlFromClientIDInternal, puisque que la CBL contient des CheckBox.

Et c'est là qu'il y a à mon avis un Bug(un bug vb j'entends!), car dans ce cas, la ligne
c = Container.FindControl(_clientID.Remove(0, Container.ClientID.Length + 1));
renvoie TOUJOURS la CheckBoxList en question !
j'ai même essayé dans la trace de mettre c = Container.FindControl("toto"), ça marche aussi !!...

j'ai donc ajouté une condition:

if (_clientID.Length > Container.ClientID.Length)
{
-> if (Container.GetType().ToString() != "System.Web.UI.WebControls.CheckBoxList" )
{
c = Container.FindControl(_clientID.Remove(0, Container.ClientID.Length + 1));
if (c != null)
return c;
}
// else:
// {
// ici il faut gérer la recherche des checkbox d'une CBL, si c'est nécessaire
// (avec un for each je pense)
// }
}

En espérant avoir aidé quelqu'un...
Mais peut-être quelqu'un a une meilleure idée pour gérer ce cas !

@Plus :o)
cs_Yopyop Messages postés 586 Date d'inscription lundi 7 janvier 2002 Statut Membre Dernière intervention 10 février 2010 1
6 juil. 2006 à 13:38
oki, donc environs 5000 contrôles...

tiens moi au courant pour la mémoire, ca m'intéresse énormément.

yopyop
jesusonline Messages postés 6814 Date d'inscription dimanche 15 décembre 2002 Statut Membre Dernière intervention 13 octobre 2010 29
6 juil. 2006 à 13:06
oui ta méthode est tout de même interessante niveau algo ;-)

pour ce qui est de ma page de test, je devais avoir une centaine de label dans un UC et une 50aine d'UC dans la page ...

Donc une trés grosse page :)

pour les temps, c'etait autour de 0,000150s pour ma méthode et 0,000800s pour ta méthode (en mode debug en plus) ... donc on essaye d'optimiser pour pas grand chose :-)

Le passage du _clientID est surement l'une des solutions que je vais adopter :p En ce qui concerne la mémoire utilisé, je vais essayer de trouver une astuce pour pouvoir comparer ca, car ca m'interesse :-)
cs_Yopyop Messages postés 586 Date d'inscription lundi 7 janvier 2002 Statut Membre Dernière intervention 10 février 2010 1
6 juil. 2006 à 12:57
yop,

effectivement, je n'ai pas tout testé.

Mais il me semble que les les contrôles doivent toujours être dans entre les balises form.
Autrement, pour partir de la page directement il suffit de ne pas utiliser l'instruction
form = FindFormControl(page); (mettre form=Page devrait enlever le bug).

Concernant la rapidité, je peux certainement améliorer ca (mais g pas le temps pour l'instant, surtout de créer la page de test. Environs combien de contrôles ? 5 fois plus rapide, mais genre on passe de 1 à 5 secondes ou de 0.1 seconde à 0.5 ?).

bref ... j'ai au moins montré comment parcourir un arbre sans récursivité, ce qui à mon avis est intéressant ... non ?

Concernant ton static, pourquoi ne passes-tu pas le ClientID en paramètre ?
private static Control getControlFromClientIDInternal(Control Container, ref String ClientId)
(je ne connais pas l'équivalent de ByRef en C#).
Avec ca ta variable n'est pas copiée en mémoire (juste la référence).

Concernant la mémoire sur le serveur, tout dépend de la fréquentation de ton application.
Sur les gros sites ca peut causer de gros problèmes (je prèfère ajouter 2-3 secondes de loading sur une page plutôt que d'empêcher 500 personnes de bosser pendant 30 minutes).

yopyop
jesusonline Messages postés 6814 Date d'inscription dimanche 15 décembre 2002 Statut Membre Dernière intervention 13 octobre 2010 29
6 juil. 2006 à 10:09
Je viens de tester. Il y a un enorme bug dans le cas ou tu ne met pas tes controles dans la balise <form> (ce qui arrive)

De plus d'aprés mes quelques test ma méthode est environ 5 fois plus rapide (dans le cas où il y ait beaucoup de controles) ...

En ce qui concerne la mémoire je n'ai pas testé mais sur les serveurs la consommation de la mémoire n'est pas le plus critique.

Le seul problème avec ma méthode est le static _ClientID qui merde lors d'appels simultanés à la méthode :s
cs_Yopyop Messages postés 586 Date d'inscription lundi 7 janvier 2002 Statut Membre Dernière intervention 10 février 2010 1
6 juil. 2006 à 02:28
GROSSE déception :(

Malheureusement, le ClientId d'un contrôle ne contient pas tous les contrôles de sa hiérarchie (si le contrôle est dans un placeholder, le nom du placeholder contenant le contrôle n'apparait pas dans le ClientId).

Donc on peut oublier l'idée d'utiliser le clientId afin de "scier" les mauvaises branches ... (mouaip, bravo Microsoft).

Bref, voici la même recherche, mais SANS utiliser la récursivité.
Je ne sais pas si c'est plus rapide .. (je pense que oui, mais surout que ca prends moins de mémoire) mais bon, comme ca je montre comment faire une recherche dans un arbre sans utiliser la récursivité (ca devrait au moins intéresser les codeurs portés sur l'aglorythmique...j'espère):

//Return the Control form
public Control FindFormControl(Page page)
{
foreach (Control c in page.Controls )
{
if (c.ToString() == "System.Web.UI.HtmlControls.HtmlForm")
return c;
}
return null;
}

//Return a Control retrived by its ClientId
public Control FindControlByClientID(Page page, String clientId)
{
Control c = null;
Control form = null;
ArrayList arr = new ArrayList(); //Buffer contenant les contrôles à checker

form = FindFormControl(page);

if (form!=null)
{
arr.Add(form);
while (arr.Count>0)
{
c = (Control)arr[0];
if (c.ClientID == clientId)
{
arr.Clear();
return c;
}
else
{
foreach (Control child in c.Controls)
{
arr.Add(child);
}
arr.RemoveAt(0);
}
}
}
return null;
}


Qu'en pensez-vous ?
jesusonline Messages postés 6814 Date d'inscription dimanche 15 décembre 2002 Statut Membre Dernière intervention 13 octobre 2010 29
5 juil. 2006 à 10:16
Pour ce qui est du shared/static c'est vrai qu'il y a un bug au niveau des appels concurrent ... :s

je l'avais mis en static car c'était une classe d'utilities donc il n'y a pas d'instance de cette classe ... je vais voir pour modifier ca :) sauf si tu trouves mieux ;-) ce que j'attends de voir avec impatience
cs_Yopyop Messages postés 586 Date d'inscription lundi 7 janvier 2002 Statut Membre Dernière intervention 10 février 2010 1
4 juil. 2006 à 23:48
re,

c'était un example pour parcourir un arbre sans utiliser la récursivité....
maintenant que l'arbre soit dans une base de données, en mémoire, en xml ca ne change rien, le principe est le même (faut vraiment te prendre par la main toi ;-) ).

bon bein
demain je pose le code en C#, avec le parcour de webcontrols
apacheswiss Messages postés 154 Date d'inscription mercredi 13 octobre 2004 Statut Membre Dernière intervention 22 août 2007
4 juil. 2006 à 23:05
et modifer le code
if (_clientID.Contains(child.ClientId)
{
c = getControlFromClientIDInternal(child);
if (c != null)
{
_clientID = string.Empty;
return c;
}
}
apacheswiss Messages postés 154 Date d'inscription mercredi 13 octobre 2004 Statut Membre Dernière intervention 22 août 2007
4 juil. 2006 à 22:55
il doit manquer un return null a la fin du foreach (Control inexistant)
apacheswiss Messages postés 154 Date d'inscription mercredi 13 octobre 2004 Statut Membre Dernière intervention 22 août 2007
4 juil. 2006 à 22:48
désolé (indentation)
je verrais un truc du genre:
ne sais pas si ca fonctionne, pas tester... merci de me dire mes erreurs... j'apprends tjs.


internal static Control getControlFromClientID(Page page, String ClientID)
{
_clientID = ClientID;
Control c = page.FindControl(ClientID);
if (c != null)
return c;

return getControlFromClientIDInternal(page);
}

private static Control getControlFromClientIDInternal(Control Container)
{
Control c;
if (_clientID.Length > Container.ClientID.Length)
{
foreach (Control child in Container.Controls)
{
if (child.Controls.Count > 0)
{
if (_clientID.Contains(child.ClientId)
{
getControlFromClientIDInternal(child);

}
}
}
}
elseif(_clientID == Container.ClientID)
{
return container;

}
else
{
return null;
}
}
apacheswiss Messages postés 154 Date d'inscription mercredi 13 octobre 2004 Statut Membre Dernière intervention 22 août 2007
4 juil. 2006 à 22:46
je verrais un truc du genre:
ne sais pas si ca fonctionne, pas tester... merci de me dire mes erreurs... j'apprends tjs.


internal static Control getControlFromClientID(Page page, String ClientID)
{
_clientID = ClientID;

Control c = page.FindControl(ClientID);
if (c != null)
return c;

return getControlFromClientIDInternal(page);
}

/// <summary>
/// Obtain a control from a container
/// </summary>
///


/// <returns>use recursivity</returns>
/// <remarks>the _clientID params is extern to not put into stack the value each call : better performance</remarks>
private static Control getControlFromClientIDInternal(Control Container)
{
Control c;
if (_clientID.Length > Container.ClientID.Length)
{
foreach (Control child in Container.Controls)
{
if (child.Controls.Count > 0)
{
if (_clientID.Contains(child.ClientId)
{
getControlFromClientIDInternal(child);

}
}
}
}
elseif(_clientID == Container.ClientID)
{
return container;

}
else
{
return null;
}
}
apacheswiss Messages postés 154 Date d'inscription mercredi 13 octobre 2004 Statut Membre Dernière intervention 22 août 2007
4 juil. 2006 à 22:22
excuse moi, mais c'est un exemple de quoi?
de comment construire l'Unique Id des enfant d'un contrôl web?

le but du code présenté au début n'est pa celui la..
le but du code présenté était de récupérer un control en ne connaissant que sont ID..
donc il faut trouver tous ces parent.. et sans requête SQL...

donc il faut d'abord bouclé les contrôle de ta page, pour troiver le "super parent"
et ensuite parcourir "tout" les enfants de ce contrôle et ne pas parcourir les enfant (du super parent) d'un contrôl s'il n'est pas dans l'unique ID du contrôle rechercher..
cs_Yopyop Messages postés 586 Date d'inscription lundi 7 janvier 2002 Statut Membre Dernière intervention 10 février 2010 1
4 juil. 2006 à 22:00
bon, bein voilà un example .... en java:

je lui passe un message_id et je vais chercher tous ses enfants.


/**
* build a string containing the id of a message and all ids of its replies
*
* @param String inSQL
* @return a String
*/
private static String getAll(String inSQL){
String firstId = inSQL;
Vector inIds = new Vector();
Vector outIds = new Vector();
String anId = "";
inIds.addElement(inSQL);
while(inIds.size()>0){
anId = (String)inIds.firstElement();
outIds.addElement(inIds.firstElement());
inIds.removeElementAt(0);
try{
ResultSet rs = ForumApplicationDB.execSql("select message_id from message where parent_id=" + anId );
while(rs.next()){
inIds.addElement(rs.getString("message_id"));
//Tools.toConsole("MessageDB: enfant trouve ", "" + inIds.lastElement() );
}
}catch(SQLException sqlEx){
Tools.toConsole("MessageDB: error listing", sqlEx.toString());
}
//Tools.toConsole("MessageDB: hors boucle", "hors");
//Tools.toConsole("MessageDB: liste out ", "" + outIds.toString() );
//Tools.toConsole("MessageDB: liste in ", "" + inIds.toString() );
}
return outIds.toString();
}
apacheswiss Messages postés 154 Date d'inscription mercredi 13 octobre 2004 Statut Membre Dernière intervention 22 août 2007
4 juil. 2006 à 21:39
2 boucle en un peut plus compliquée.. tu es plus ou moins obligé de faire de la récursivité (arrétée a plusieures reprise) dans la branche trouvée..
apacheswiss Messages postés 154 Date d'inscription mercredi 13 octobre 2004 Statut Membre Dernière intervention 22 août 2007
4 juil. 2006 à 21:36
désolé......
mais lors d'un return dans ta fonction recursive, tu sort de ta récursivité...
tu tu rappelle ta fonction, c'est récursif...

je ne vois pas ou tu évite...

je suis d'accord avec toi au sujet de l'arbre... si tu cherche d'abord la branche, et ensuite tu parcoours la branche, ce n'est plus récursif.. tu ne fais que 2 boucle.
cs_Yopyop Messages postés 586 Date d'inscription lundi 7 janvier 2002 Statut Membre Dernière intervention 10 février 2010 1
4 juil. 2006 à 21:21
ca veux dire:

la récursivité peut être évitée si la dernière instruction est un return (évité ne veut pas dire arrêté !!!!)

ce qui veux dire que
1/
il faut éviter la récursivité au maximum, surtout lorsqu'on ne sait pas combien d'appels récursifs il va y avoir (ca prend beaucoup beaucoup beaucoup beaucoup de mémoire).
2/
si la dernière instruction de ta fonction récursive est un return (ou un appel à la fonction récursive, j'avoue ne plus me souvenir .. l'âge sans doute), tu peux transformer ta fonction récursive en une fonction non récursive (donc pas arrêter, mais éviter la récursivité. Essaie d'éviter une voiture qui roule à 50km/h et ensuite essaie de l'arrêté, tu comprendras qu'il y a une différence entre ces deux mots ;-) ).

donc au final, ca veut dire beaucoup si on veux bien se donner la peine de comprendre ;-)

"qui ne veut pas dire grand chose à part arrêter tout une fois qu'on a trouvé ce qu'on cherche..." <- tsss tsss ... pas très gentleman de votre part monsieur ;-)

yopyop

PS:
Merci Nurgle ...
apacheswiss Messages postés 154 Date d'inscription mercredi 13 octobre 2004 Statut Membre Dernière intervention 22 août 2007
4 juil. 2006 à 20:55
je pense aussi...
moi je voulais juste débatre sur.
Et finalement, un vieux de la vielle m'a appris il y a bien longtemps que la récursivité pouvait être évitée si la dernière instruction est un return ;)

qui ne veut pas dire grand chose à part arrêter tout une fois qu'on a trouvé ce qu'on cherche...
cs_Nurgle Messages postés 1642 Date d'inscription samedi 6 novembre 2004 Statut Membre Dernière intervention 28 avril 2011 4
4 juil. 2006 à 20:52
Oui mais le cas du ClientID, on a pas que le nom qui est sur la porte, on a aussi le chemin qu'il faut faire pour y arriver (et donc le nom des rues).
Donc en théorie on peut ne pas utiliser la récursivité... ou du moins l'utiliser intelligement :p
Je crois que c'est ce que voulais dire Yopyop.
apacheswiss Messages postés 154 Date d'inscription mercredi 13 octobre 2004 Statut Membre Dernière intervention 22 août 2007
4 juil. 2006 à 20:46
si tu utilise la recursivité, c'est que tu n'as que le nom qui est sur la porte.. mais pas la rue.. donc pour trouver cette porte tu dois te taper toutes les rues
apacheswiss Messages postés 154 Date d'inscription mercredi 13 octobre 2004 Statut Membre Dernière intervention 22 août 2007
4 juil. 2006 à 20:44
d'accord... mais si tu ne sais pas qui est le parent... tu dois te taper les quatre routes...
cs_Yopyop Messages postés 586 Date d'inscription lundi 7 janvier 2002 Statut Membre Dernière intervention 10 février 2010 1
4 juil. 2006 à 20:33
re,

pas d'accord,
lorsque tu as un itinéraire et 4 routes devant toi, tu n'essaies pas les 4 routes et toutes leurs "sous-routes". Tu regardes les 4 routes et t'engouffre uniquement dans celle qui est dans ton itinéraire.

c'est la même chose dans ce cas là...

si ton contrôle est à la racine (ta destination est l'une des 4 routes), là c'est effectivement kifkif, mais si c'est un contrôle "enfant" (une "sous-route"), tu évites de parcourir tout les autres enfants des autres contrôles...

et quand je parle d'éviter la récursivité, je ne parle pas simplement de l'arrêter, mais de ne pas l'utiliser du tout.

yopyop
apacheswiss Messages postés 154 Date d'inscription mercredi 13 octobre 2004 Statut Membre Dernière intervention 22 août 2007
4 juil. 2006 à 20:12
la recursivité peut bien être arrétée... mais ca ne change pas le problème de lenteur..
ca va juste empecher de passer a travers tout les contrôle une fois que tu as trouver le bon..

mais si celui que tu cherche est dans les dernier... ca ne cas rien changer.
cs_Yopyop Messages postés 586 Date d'inscription lundi 7 janvier 2002 Statut Membre Dernière intervention 10 février 2010 1
4 juil. 2006 à 18:55
exact,

JesusOnline:
mon idée pose effectivement des problèmes dans le cas où un développeur mets un "_" dans le nom d'un contrôle (peut-être faut-il changer de développeur ;-) ). L'idée n'est donc pas très "universelle".

Nurgle:
bien que l'on puisse spécifier le controle séparateur, il ne faut pas modifier celui utilisé par ClientId (_ est supporté par le client script c'est pour cela que Microsoft l'utilise et non un "#","@","*" ou autre).


Deux suggestions (encore):

1/
Si FindControl fait lui-même une recherche récursive, pourquoi ne par continuer à utiliser l'idée du split mais en partant de la fin de la string (ClientID). En 2-3 findcontrol on retrouve le composant (n + le nombre de _ mis par le développeur)

2/
Autrement, pourquoi ne pas "scier" les mauvaises branches dès le départ ??
Tu check si le Container.ClientId est contenu dans le _ClientID (Instr)
Si oui, tu es dans la bonne ramification tu continues
Si non, tu n'as même pas besoin de checker les enfants, la branche est "pourrie".

Pourquoi déclarer _ClientId en shared ... euh pardon ... en static (vb.net)????
Si tu lances ta recherche 2 fois en même temps (+- en même temps) ca ne fonctionne plus...
Non ?

Et finalement, un vieux de la vielle m'a appris il y a bien longtemps que la récursivité pouvait être évitée si la dernière instruction est un return ;)
cs_Nurgle Messages postés 1642 Date d'inscription samedi 6 novembre 2004 Statut Membre Dernière intervention 28 avril 2011 4
4 juil. 2006 à 18:54
t'es sûr qu'on est obligé de faire ça pour chaque control ?? :S
(les controls n'héritent pas cette propriété du control parent ? arg...)

Mouais bon... c'est vrai que ta méthode est totalement indépendante du caractère de séparation... ok :)

D'ailleurs, String est un des seuls types de base à être de type Reference, donc ce n'était pas grave quand tu le passait à chaque appel (voir mise à jour n°1) !! :p
jesusonline Messages postés 6814 Date d'inscription dimanche 15 décembre 2002 Statut Membre Dernière intervention 13 octobre 2010 29
4 juil. 2006 à 18:38
la propriété existe mais on est obligé de faire ca pour chaque controle, donc c'est injouable.

Pour ce qui est des ID automatique, à ton avis pourquoi le premier s'appelle ctl00 ;-) il y a un compteur qui va s'incrémenter à chaque fois qu'on l'appelle donc ctl01, etc...
cs_Nurgle Messages postés 1642 Date d'inscription samedi 6 novembre 2004 Statut Membre Dernière intervention 28 avril 2011 4
4 juil. 2006 à 18:31
exact... mais ça me fait me poser une question : Comment est le ClientID d'un control dont le control parent n'a pas d'ID ??
Le framework doit bien faire quelque chose dans ce cas là ?!!

De plus, pour l'histoire des "_", il suffit de dire à ASP.NET d'utiliser par exemple "$" ou "#" pour séparer les controls... (il y a une Property je sais plus où qui permet de choisir ça)
jesusonline Messages postés 6814 Date d'inscription dimanche 15 décembre 2002 Statut Membre Dernière intervention 13 octobre 2010 29
4 juil. 2006 à 18:21
Je ne pense pas que ca fonctionnne. Dans la boite ou je suis par exemple certains Controles sont nommé id="_toto", imagine aussi un controle nommé "_to_to"

Les controles n'ont pas obligatoirement d'id, ce qui veut dire qu'on pourrait faire c'est pas conseillé mais ca fonctionne :) dans certains cas le framework ou le concepteur de controle peut l'utiliser, du coup si ton controle est contenu dans un de ses controles tu peux rien faire.
cs_Nurgle Messages postés 1642 Date d'inscription samedi 6 novembre 2004 Statut Membre Dernière intervention 28 avril 2011 4
4 juil. 2006 à 18:15
Oui YopYop a raison, ça peut aller plus vite.
Si j'ai bien compris, tu split (sur le "_") ça dans un tableau, et ensuite, un simple :
Dim control As Control = Me.Page
For i As Integer = 1 To tableau.Length - 1
control = control.FindControl(tableau(i))
Next
Et à la fin tu as ton controle dans "control"
Il y a d'autres moyens de coder ça, mais effectivement c'est plus rapide...
(Attention dans ce cas, bien partir de 1 et pas de 0 car le premier element une variable ("ct100" par exemple) qui ne correspond à aucun controle)
Pourquoi ne posterai-tu pas une petite source sur cette(/ta) technique YopYop ? :p
jesusonline Messages postés 6814 Date d'inscription dimanche 15 décembre 2002 Statut Membre Dernière intervention 13 octobre 2010 29
4 juil. 2006 à 17:46
YopYop, je suis trés interessé par ta solution, tu pourrais développer, car la je vois pas la diférence entre ta méthode et la mienne :s
cs_Yopyop Messages postés 586 Date d'inscription lundi 7 janvier 2002 Statut Membre Dernière intervention 10 février 2010 1
4 juil. 2006 à 17:33
salut,

source intéressante.

Perso je n'aurai pas utilisé la récursivité (Ca peut utiliser pas mal de ressources suivant la profondeur. De plus, dans le pire des cas, tu parcours TOUS les contrôles de la page), mais simplement le fait que ClientId contient "l'arbre" des contrôles parents:

ctrl1_subctrl1_subsubctrl3_ControlToFind_subctrl, split + while et on trouve le contrôle sans devoir parcourir tous les contrôles dans la page mais uniquement sa hiérarchie.

Mais bon, on a tous notre façon de faire ;)

yopyop
cs_Nurgle Messages postés 1642 Date d'inscription samedi 6 novembre 2004 Statut Membre Dernière intervention 28 avril 2011 4
19 juin 2006 à 19:17
ah exact... c'est logique :p

très bonne idée en tout cas, ça peut parfois servir quand on fait de l'ajax :D
10/10
jesusonline Messages postés 6814 Date d'inscription dimanche 15 décembre 2002 Statut Membre Dernière intervention 13 octobre 2010 29
19 juin 2006 à 18:23
C'est la condition de fin de la recursivité ...

oui ca veut bien dire que c.clientID == c.id, mais n'oublie pas que ClientID est tronqué de "parentID_" à chaque fois :)
cs_Nurgle Messages postés 1642 Date d'inscription samedi 6 novembre 2004 Statut Membre Dernière intervention 28 avril 2011 4
19 juin 2006 à 18:12
Eh ben voilà, on avait bien la même idée :)
Mais pourquoi ça :
# Control c = Container.FindControl(ClientID);
# if (c != null)
# return c;

??
ça voudrait dire que c.ClientID = c.ID