Чтобы найти элемент управления на своей странице, это должен быть серверный элемент управления, например:
<asp:Table runat="server">
...
</asp:Table>
Обычный HTML на странице - это не «элементы управления», это просто текст, который отправляется в браузер. Серверные элементы управления, с другой стороны, являются реальными классами .NET, которые могут взаимодействовать с кодом.
Вы все еще можете получить дескриптор этого элемента управления без его идентификатора, выполнив поиск в коллекции Controls его контейнера или рекурсивно выполнив поиск на странице. Давайте начнем с рекурсивного поиска в коллекции Controls:
Коллекция Controls относится только к непосредственным дочерним элементам управления данного элемента управления. Или непосредственные дочерние элементы управления страницы. Эти элементы управления в свою очередь имеют собственные дочерние элементы управления. Он представляет дерево в памяти.
Вот метод, позволяющий извлечь дерево из заданного элемента управления и найти элемент управления по идентификатору:
private Control FindControlRecursive(Control control, string id)
{
Control returnControl = control.FindControl(id);
if (returnControl == null)
{
foreach (Control child in control.Controls)
{
returnControl = child.FindControlRecursive(id);
if (returnControl != null && returnControl.ID == id)
{
return returnControl;
}
}
}
return returnControl;
}
(За рамками этого ответа это лучше сделать как метод расширения ).
Чтобы найти элемент управления не по его идентификатору, вы можете выполнить поиск по типу:
if(someControl is System.Web.UI.WebControls.Table)
Обратите внимание, что это, как правило, не очень хорошая идея. Это не очень хорошая модель, если вам приходится искать элементы управления таким образом - у вас должен быть идентификатор для вашего элемента управления, или у вас должна быть ссылка на него, потому что он был создан в коде.
Тем не менее, просто изменить метод для рекурсивного поиска типа:
private Control FindTable(Control startFrom)
{
foreach(Control child in startFrom.Controls)
{
if(child is System.Web.UI.WebControls.Table)
{
return child;
}
else
{
return FindTable(child);
}
}
return null;
}
Вы также можете иметь общую форму этого метода:
private Control FindControl<T>(Control startFrom)
{
foreach(Control child in startFrom.Controls)
{
if(child.GetType().IsAssignableFrom(typeof(T)))
{
return child;
}
else
{
return FindControl<T>(child);
}
}
return null;
}
Вы определенно не хотите включать System.Windows.Forms, поскольку это просто включает в себя весь код для приложения WinForms. Вот почему Visual Studio не включил его для вас в веб-проект - он вам никогда не понадобится. В System.Web.UI есть все для веб-элементов управления.