c # найти элементы управления и контрольную ссылку - PullRequest
4 голосов
/ 04 августа 2009

Как ссылаться на элементы управления в c # (время выполнения) без идентификатора?

Например, у меня есть страница с одной таблицей. Я буду загружать эту страницу рекурсивно, используя xmlhttp, поэтому я не могу ссылаться на таблицу, используя ее идентификатор. Есть ли что-то с эффектом this.Page.Controls[2]? или Controls["Tables"][0]?

Я пытался использовать имя this.Controls.Find("MyTableName", true);, но мне нужна ссылка на библиотеку System.Windows.Forms (я думаю), но я не знаю, как добавить его, поскольку 'using System.' intellisense его не видит.

Я перебрал все элементы управления в this.Controls, но 'system.ui.web.control' does not contain a definition for '.Name', поэтому могу искать только идентификатор.

Я новичок в этом, и я уверен, что решения невероятно просты.
Заранее спасибо

1 Ответ

12 голосов
/ 04 августа 2009

Чтобы найти элемент управления на своей странице, это должен быть серверный элемент управления, например:

<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 есть все для веб-элементов управления.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...