Как динамически получить все элементы управления (и его идентификаторы) на странице aspx? - PullRequest
2 голосов
/ 18 мая 2009

Привет, мне нужно динамически активировать поля на странице в соответствии с сервисом, который будет выполняться ...

Позвольте мне объяснить:

Есть страница со всеми возможными полями и ListBox со всеми выбранными службами, которые нужно выполнить, затем, когда пользователь выбирает, какой сервис выполнять (например, сменить номерной знак), мне нужно активировать только поле (s) что сервис требует ... (отношения между Сервисами и Полями хранятся в базе данных).

public void CheckAll(int pService_Id, Control pPage)
{

    foreach (Control control in pPage.Controls)
    {
        busExecutaServico vExecuta = new busExecutaServico();

        if (vExecuta.EnableField(control.ID.ToString(), Convert.ToInt32(listBoxServices.SelectedValue)))
        {
            switch (control.GetType().ToString())
            {
                case "TextBox":
                    TextBox controleText = (TextBox)Page.FindControl(control.ID.ToString());
                    controleText.Enabled = true;
                    break;

Обратите внимание, что busExecutaServico - это класс, который содержит метод (EnableField) для проверки, соответствует ли выбранный элемент какому-либо полю в базе данных.

Кажется, я не могу заставить работать control.ID.ToString () (идентификатор всегда имеет значение NULL)

Если кто-нибудь может помочь мне решить эту проблему, или если есть другой способ (даже если он полностью отличается от того, что я пытаюсь), это было бы очень полезно. спасибо

Ответы [ 4 ]

3 голосов
/ 18 мая 2009

Мне нравится использовать рекурсивную функцию для поиска элементов управления по типу или идентификатору.

public Control FindControlRecursive(Control rootControl, string controlId)
{
    if (rootControl.ID == controlId)
        return rootControl;

    foreach (Control control in rootControl.Controls)
    {
        Control foundControl = FindControlRecursive(control, controlId);
        if (foundControl != null)
        {
            return foundControl;
        }
    }

    return null;
}

public Control FindControlRecursive(Control rootControl, Type type)
{
    if (rootControl.GetType().Equals(type))
        return rootControl;

    foreach (Control control in rootControl.Controls)
    {
        Control foundControl = FindControlRecursive(control, type);
        if (foundControl != null)
        {
            return foundControl;
        }
    }

    return null;
}

Вы можете адаптировать их, чтобы сначала возвращать коллекцию элементов управления, а затем обрабатывать их позже. Может быть легче отслеживать, что происходит.

Я изучил эту технику здесь: http://www.west -wind.com / Weblog / posts / 5127.aspx

1 голос
/ 18 мая 2009

Ваш код будет иметь нулевое значение для идентификатора, если каждому элементу управления не присвоен идентификатор.

Также зачем использовать: -

TextBox controleText = (TextBox)Page.FindControl(control.ID.ToString());

вообще вместо: -

TextBox controleText = (TextBox)control;

и действительно, поскольку вы хотите изменить только свойство Enabled, учтите: -

((WebControl)control).Enabled = False;

То, что я подозреваю, устранит многие заявления по делу.

1 голос
/ 18 мая 2009

Имейте в виду, что FindControl ищет только текущий контейнер имен, поэтому Page.FindControl будет искать только те элементы управления, которые добавлены непосредственно в Page. Например, если у вас был элемент управления повторителем, который содержал искомые элементы управления, и он был добавлен в Page, вы можете найти свой элемент управления повторителем через Page.FindControl, но он не найдет дочерние элементы управления в вашем повторителе, вы бы рекурсивно выполнить FindControl для всех элементов управления контейнера на странице.

Это может показаться немного странным, но позволяет вам иметь элементы управления с одинаковым идентификатором, существующие на той же странице. Например, если у вас было 10 экземпляров пользовательского элемента управления с текстовыми полями внутри них под названием «MyName», вы бы действительно хотели, чтобы они не перезаписывали поля «MyName» друг друга!

0 голосов
/ 18 мая 2009

В вашем коде вам не нужно искать какой-либо элемент управления - он уже есть в переменной «control». Вам даже не нужно приводить его к TextBox, просто к WebControl, просто сделайте это:

...
if (vExecuta.EnableField(control.ID.ToString(), Convert.ToInt32(listBoxServices.SelectedValue)))
    ((WebControl)control).Enabled = true;

P.S. control.ID уже является строкой, поэтому вы должны также удалить любой ID.ToString ().

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