Пример кода:Проблемы с FindControl и динамически создаваемые элементы управления
var div = new HtmlGenericControl("div");
div.Controls.Add(new Literal() { ID = "litSomeLit" });
var lit = (Literal)div.FindControl("litSomeLit");
Assert.IsNotNull(lit);
Этот код не проходит утверждают, потому что горит равно нулю. Отладка показывает, что div.Controls определенно содержит литерал с идентификатором «litSomeLit». Мои вопросы: «Почему?» и «Есть ли способ получить контроль над конкретным идентификатором, не делая рекурсивного поиска div.Controls [] вручную по одному элементу за раз?»
Причина, по которой я делаю это, заключается в том, что мое фактическое приложение не так просто - метод, который я пишу, получает комплексное управление с несколькими субконтролями в ряде возможных конфигураций. Мне нужно получить доступ к определенному элементу управления несколькими слоями (например, элемент управления с идентификатором «txtSpecificControl» может быть равен StartingControl.Controls[0].Controls[2].Controls[1].Controls[3]
). Обычно я мог бы просто делать FindControl("txtSpecificControl")
, но это не работает, когда элементы управления были просто динамически созданы (как в приведенном выше примере кода).
+1 Хорошая рекурсивная функция. Очень полезно – brenjt