Насколько я могу судить, нет способа сделать то, что я пытаюсь выполнить, не добавив элемент управления на страницу. Если бы мне пришлось угадывать, я бы сказал, что FindControl использует свойство UniqueID элемента управления, которое обычно содержит идентификаторы всех элементов управления выше текущего (например, OuterControlID $ LowerControlId $ TargetControlID). Это будет сгенерировано только тогда, когда элемент управления будет добавлен на страницу.
В любом случае, вот реализация рекурсивного FindControl поиска в глубину, который будет работать, когда элемент управления еще не прикреплен к странице:
public static Control FindControl(Control parent, string id)
{
foreach (Control control in parent.Controls)
{
if (control.ID == id)
{
return control;
}
var childResult = FindControl(control, id);
if (childResult != null)
{
return childResult;
}
}
return null;
}