cs_mathmax
Messages postés403Date d'inscriptionvendredi 28 octobre 2005StatutMembreDernière intervention31 août 2008
-
16 juil. 2007 à 18:41
cs_mathmax
Messages postés403Date d'inscriptionvendredi 28 octobre 2005StatutMembreDernière intervention31 août 2008
-
17 juil. 2007 à 15:11
Bonjour,
J'ai un contrôle "CustomPanel" qui hérite de Panel et dans lequel j'essai d'obtenir un autre contrôle de type Image en fonction de son ID. J'ai donc écrit la propriété suivante :
private Image _ImageControl = new Image();
public string ImageControlID
{
get { return _ImageControl.ID; }
set { _ImageControl = (Image) ControlUtil.FindTargetControl(value, this, true); }
}
où ControlUtil.FindTargetControl() est définie comme suit :
public class ControlUtil
{
internal static Control FindTargetControl(string controlID, Control control, bool searchNamingContainers)
{
if (searchNamingContainers)
{
Control namingContainer = control;
Control control2 = null;
while ((control2 == null) && (namingContainer != control.Page))
{
namingContainer = namingContainer.NamingContainer;
if (namingContainer == null)
{
return control2;
}
control2 = namingContainer.FindControl(controlID);
}
return control2;
}
return control.FindControl(controlID);
}
}
Le problème est que la propriété namingContainer de mon controle "CustomPanel" renvoi toujours nul donc FindTargetControl renvoi toujours une valeur nulle.
Sauriez-vous quel est le problème ?
jesusonline
Messages postés6814Date d'inscriptiondimanche 15 décembre 2002StatutMembreDernière intervention13 octobre 201029 17 juil. 2007 à 00:58
oulà attention avec cette bidouille :-)
Tu veux récuperer un controle qui est contenu dans ton panel ? inutile alors d'utiliser cette bidouille, elle sert seulement pour faire une recherche "recursive ascendante" or toi ton controle est à l'interieur de celui où tu recherches.
Si la propriété NamingContainer est toujours à null ca peut vouloir dire 2 choses : la premiere (et la plus probable) tu n'as pas ajouté le control dans la page, comme Panel n'implémente pas INamingContainer et qu'il n'a pas de control parent (puisque tu l'as ajouté null part) alors sa propriété namingcontainer est nulle. L'autre possibilité est au niveau du controle personalisé (plus j'y réfléchis moins je vois comment c'est possible :-p), mais tu as peut etre surchargé une méthode qu'il fallait pas et pas correctement.
public string ImageControlID
{
get { return _ImageControlID; }
set { _ImageControlID = value; }
}
protected override void OnPreRender(System.EventArgs e)
{
Img = (Image)ControlUtil.FindTargetControl(_ImageControlID, this, true);
}
et là ça marche bien. Celà vient du fait que la propriété NamingContainer du Panel, n'est plus nulle quand on l'invoque dans la méthode OnPreRender. Elle est par contre null (tout comme la propriété Page) si on l'utilise dans un set d'une propriété comme je l'ai fait tout à l'heure. Pourquoi ?? J'aimerais bien le comprendre...