Search code examples
c#asp.netfindcontrol

FindControl is not working as expected?


I have this structure :

Page
 |
 +---Ascx
      |
      +---<div  runat="server">
                    |
                    +---<asp:button>

I already know that Findcontrol doesn't work recursively .

However when I pressed the button and went to debug and wrote :

this.FindControl("btn1") it did find the "button"

But

  • this= the ascx
  • There is a div runat server which wraps the button

So how did it find it ? According to the definition , it doesn't suppose to work.

Msdn :

Control.FindControl --> The method does not search throughout a hierarchy of controls within controls


Solution

  • I found the answer.

    Only controls which inherits from TemplateControl, which implements the INamingContainer interface.

    and obviously <div runat server> is not one of them.

    i.e. UserControl :

    public class UserControl : TemplateControl, IAttributeAccessor, INonBindingContainer, INamingContainer, IUserControlDesignerAccessor
    {...}
    

    i.e. ContentPlaceHolder:

    public class ContentPlaceHolder : Control, INonBindingContainer, INamingContainer
    {...} 
    

    and here I can see all those controls :

    enter image description here