Recuperer l'instance d'un control à partir de son clientid

Contenu du snippet

Asp.net donne la possibilité de créer des ID "unique" pour les contrôles clients, il s'agit du ClientID du contrôle. Cet ID est généré en concatenant le ClientID du contrôle parent et de l'ID du contrôle.

Dans un de mes projets, j'avais besoin de récuperer le Control en ayant seulement son ClientID, voici donc une méthode qui rempli ce rôle :-)

Attention pour que cette source fonctionne il faut impérativement que l'arbre de contrôle soit créer c'est à dire qu'on doit obligatoirement appeller cette méthode aprés le page_init ...

C'est une fonction récursive, vous devez obligatoirement passer l'objet Page en premier paramètre

Source / Exemple :


/// <summary>
        /// Stock the ClientID of the control to find 
        /// </summary>
        private static String _clientID;

        /// <summary>
        /// Obtain a control from the ClientID
        /// </summary>
        /// <param name="page">You must pass the Page here</param>
        /// <param name="ClientID">the ClientID of the control you search</param>
        /// <returns>the Control matching the clientID, if not found return null</returns>
        /// <example>
        /// Control c = Utils.getControlsFromClientID(Page, "Panel1_Lbl1");
        /// </example>
        /// <remarks>Must be called after the page_init, before the tree of Control isn't construct</remarks>
        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> 
        /// <param name="Container"></param> 
        /// <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)
            {
                c = Container.FindControl(_clientID.Remove(0, Container.ClientID.Length + 1));
                if (c != null)
                    return c;
            }
            foreach (Control child in Container.Controls)
            {
                if (child.Controls.Count > 0)
                {
                    c = getControlFromClientIDInternal(child);
                    if (c != null)
                    {
                        _clientID = string.Empty;
                        return c;
                    }
                }
            }
            return null;
        }

Conclusion :


Je crois avoir géré la plupart des cas, mais si vous trouver un bug merci de le signaler ;-)

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.