2009-03-05 4 views
1

При отладке проблемы я, имеющей на DetailsView нахождение управления в одном из шаблонов я столкнулся что-то странное. Я реализовал рекурсивное расширение FindControl, и там, где найти элемент управления с идентификатором, полностью отличным от того, который я ищу. реализация в основном вызывает Findcontrol на родительском элементе управления, а затем, если ничего не найдено, вызывая рекурсивную функцию для дочерних элементов управления.реализация FindControl

Я начал рыть в код asp.net с рефлектором и выяснил, как реализация для checkboxs методы FindControl где (Той, что в System.Web.UI.WebControls.CheckBoxList)

protected override Control FindControl(string id, int pathOffset) 
{ 
    return this; 
} 

Теперь это все имеет смысл, почему мой FindControl нашел CheckBoxList, я могу, однако, не разбираться в этой реализации, может ли кто-нибудь просветить меня?

ответ

2

Эта реализация FindControl является переопределение рекурсивного метода.

protected override Control FindControl(string id, int pathOffset) 
{ 
    return this; 
} 

Является ли переопределение:

protected virtual Control FindControl(string id, int pathOffset) 
{ 
    string str; 
    this.EnsureChildControls(); 
if (!this.flags[0x80]) 
{ 
    Control namingContainer = this.NamingContainer; 
if (namingContainer != null) 
{ 
    return namingContainer.FindControl(id, pathOffset); 
} 

Я бы предположить, что будет использоваться, когда рекурсивный метод не нужен IE, известно, что текущий контроль, который вы ищете.

дополнительное чтение MSDN

Control.FindControl выполняет поиск в текущем контейнере именования для управления сервером с указанным идентификатором и целым числом, указанным в параметре pathOffset, который помогает в поиске. Вы не должны переопределить эту версию метода FindControl.

ID
Идентификатор для управления, чтобы быть найдены.

pathOffset
Число элементов управления вверх по иерархии элементов управления страницы, необходимая для достижения контейнер именования.

link