Как получить элементы управления на странице главной страницы? - PullRequest
0 голосов
/ 21 декабря 2009

У меня есть главная страница и страница с ее содержимым. Я хочу, чтобы текстовые поля находились на странице контента. Как я могу получить их в коде C # позади страницы контента?

1 Ответ

0 голосов
/ 21 декабря 2009

Доступ к нему по его идентификатору:

Markup:

<asp:TextBox runat="server" ID="myTextBox"></asp:TextBox>

Код:

myTextBox.Text = "This is a text!";

Обратите внимание , что вам нужно добавить runat="server", чтобы он был доступен.

Редактировать
После вашего комментария я думаю, что понимаю, к чему вы клоните. Вам нужно пройти через все элементы управления вниз по дереву элементов управления, чтобы найти все текстовые поля.

Вот рекурсивная реализация:

public List<Control> FindControls(Control root, Type type)
{
    var controls = new List<Control>();

    foreach (Control ctrl in root.Controls)
    {
        if (ctrl.GetType() == type)
            controls.Add(ctrl);

        if (ctrl.Controls.Count > 0)
            controls.AddRange(FindControls(ctrl, type));
    }

    return controls;
}

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

var allTextBoxes = FindControls(Page, typeof(TextBox));

Приведенный выше пример проясняет идею того, как вам следует действовать. Я бы сделал это немного по-другому, используя метод расширения:

public static class ExtensionMethods
{
    public static IEnumerable<Control> FindControls(this Control root)
    {
        foreach (Control ctrl in root.Controls)
        {
            yield return ctrl;
            foreach (Control desc in ctrl.FindControls())
                yield return desc;
        }

    }
}

Теперь вы можете использовать его непосредственно на любом элементе управления и даже применять Linq к результату, так как это IEnumerable.

Это даст вам массив всех элементов управления на странице:

var allControls = this.FindControls().ToArray();

Чтобы получить массив всех элементов управления TextBox:

var allTextBoxes = this.FindControls()
                       .OfType<TextBox>().ToLArray<TextBox>();

и получить список текстовых ящиков с определенным идентификатором:

var myTextBox = this.FindControls()
                    .OfType<TextBox>()
                    .Where<TextBox>(tb => tb.ID.Equals("textBox1")).ToList<TextBox>();

Вы также можете использовать его в выражениях foreach:

foreach (Control c in this.FindControls())
{
  ...
}
...