问题
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
回答1:
The asp.net have a different tree struct than the actually DOM of html page.
The controls on the same page are like on the same branch of the tree. So all the controls on the same page can be found by searching the page. The controls that are inside some custom control are also all together.
回答2:
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 :
来源:https://stackoverflow.com/questions/15189571/findcontrol-is-not-working-as-expected