Problème avec la méthode FindControl

Résolu
cs_mathmax Messages postés 403 Date d'inscription vendredi 28 octobre 2005 Statut Membre Dernière intervention 31 août 2008 - 16 juil. 2007 à 18:41
cs_mathmax Messages postés 403 Date d'inscription vendredi 28 octobre 2005 Statut Membre Dernière intervention 31 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);
        }
    }

Je l'ai trouvé dans cet article : http://blogs.codes-sources.com/cyril/archive/2007/06/23/la-methode-findcontrol.aspx

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 ?

Merci d'avance.
Mathmax

4 réponses

jesusonline Messages postés 6814 Date d'inscription dimanche 15 décembre 2002 Statut Membre Dernière intervention 13 octobre 2010 29
17 juil. 2007 à 12:09
Oui, c'est normal

quand tu fais

Cyril - MSP - MCPD ASP.net & MCTS SQL
3
jesusonline Messages postés 6814 Date d'inscription dimanche 15 décembre 2002 Statut Membre Dernière intervention 13 octobre 2010 29
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.

<hr />Cyril - MSP - MCPD ASP.net & MCTS SQL
0
cs_mathmax Messages postés 403 Date d'inscription vendredi 28 octobre 2005 Statut Membre Dernière intervention 31 août 2008
17 juil. 2007 à 02:03
Mon contrôle n'est pas dans le Panel. Il peut être n'importe où dans la page. Je n'ai d'ailleurs pas oublié de le mettre dans ma page.

J'ai par contre partiellement résolu le problème en écrivant :

        private Image Img;
        private string _ImageControlID;

        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...

Mathmax
0
cs_mathmax Messages postés 403 Date d'inscription vendredi 28 octobre 2005 Statut Membre Dernière intervention 31 août 2008
17 juil. 2007 à 15:11
ok merci.

Mathmax
0
Rejoignez-nous