ASP.Net - цикл всех компонентов HTML на текущей странице - PullRequest
1 голос
/ 12 июля 2010

Хотелось бы перейти на все элементы страницы ASP.Net (элементы HTML) и манипулировать ее текстовым свойством / значением. Как я мог это сделать?

Я проверял, и свойство this.Page.Form.Controls, по-видимому, получает все элементы, но я бы только отображал элементы страницы, которые получили событие. У кого-нибудь есть идеи.

Я приведу пример кода, который я сейчас изучаю, и пробую adpater для своих нужд.

Спасибо

 string x = String.Empty;
 string y = String.Empty;

 foreach (Control ctrl in this.Page.Form.Controls){
     if (ctrl is TextBox){
        x += ((TextBox)(ctrl)).ID + ((TextBox)(ctrl)).Parent + "\n";
     } else {
        y += ctrl.GetType().Name + ctrl.GetType().Namespace + "\n";
     }
 }

Obs .: Я использую некоторые компоненты компонентов Telerik.

Ответы [ 3 ]

1 голос
/ 12 июля 2010

У меня будет ответ на вопрос, хотя я не уверен, что это то, что вам нужно (см. Мои комментарии к вопросу).

Если вы хотите быстро обработать все (1003) формы (скажем) одним способом, а все ее DropDownLists другим способом, то то, что вы ищете, может быть OfType

DoSomethingWithAllTextBoxes( Page.Form.Controls.OfType<TextBox>() );
DoSomethingWithAllDropDownLists( Page.Form.Controls.OfType<DropDownList>() );

private void DoSomethingWithAllTextBoxes( IEnumerable<TextBox> textboxes) {
    foreach(TextBox txt in textboxes) {
       txt.Text = "Modified";
    }
}

Если вы ищете привязку к событию, вы можете запустить такой код в OnInit

protected override void OnInit(EventArgs e) {

    foreach(TextBox txt in Page.Form.Controls.OfType<TextBox>() ) {
       txt.OnTextChanged += TextChangedEventListener;
    }        

    base.OnInit(e);
}
1 голос
/ 15 июля 2010

Элементы управления на странице хранятся в древовидной структуре данных. Вы можете использовать рекурсивный метод для этого:

    private void SetText(ControlCollection controls, String textToSet)
    {
        foreach(Control c in controls)
        {
            if (c is ITextControl)
                ((ITextControl)c).Text = textToSet;

            if (c.HasControls())
                SetText(c.Controls, textToSet);
        }
    }

и вы бы вызвали этот метод где-нибудь, скажем, в событии OnPreRender (чтобы убедиться, что вы получаете все элементы управления, которые были добавлены на страницу) и передаете Page.Controls ControlCollection:

    protected override void OnPreRenderComplete(EventArgs e)
    {
        base.OnPreRenderComplete(e);
        SetText(Page.Controls, "new text");
    }
0 голосов
/ 12 июля 2010

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

ASPX:

   <asp:TextBox ID="TextBox1" AutoPostBack="true" runat="server"
        ontextchanged="TextBox1_TextChanged"></asp:TextBox>
   <asp:TextBox ID="TextBox2" AutoPostBack="true" runat="server"
       ontextchanged="TextBox1_TextChanged"></asp:TextBox>

Code-Behind:

 protected void TextBox1_TextChanged(object sender, EventArgs e)
 {
     TextBox tb = sender as TextBox;
     //do something
 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...