2010-07-12 46 views
1

我希望我可以访问ASP.Net页面(HTML元素)的所有元素并操纵其文本属性/值。我怎么能这样做?ASP.Net - 循环当前页面中的所有HTML组件

我一直在检查,属性this.Page.Form.Controls显然获取所有元素,但我只会页面元素,捕捉事件。有人有什么主意吗。

我会举一个我正在学习的代码示例,并根据我的需要尝试adalter。

感谢

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"; 
    } 
} 

实验值:我使用的是Telerik的组件的一些部件。

+0

我不认为你想要达到什么从你的问题是明显的。你谈论的是过滤出引发事件的元素* - 什么事件?你也可以说你想要这样做来操作Text属性,但是你的代码似乎并不涉及任何这些。另外,注意:'Form.Controls'不会递归地给你一个页面的所有元素,也就是说,如果有一个拥有'.Controls'的PlaceHolder,'Form.Controls'只会产生PlaceHolder。 – 2010-07-12 18:38:23

+0

在上面的例子中,我只是想读取组件的ID,以便找到完美的代码来获得我想要的东西。简而言之,我搜索表单的所有对象。当我得到它,并以某种方式了解每个元素的类型时,我可以修改编程来处理每个元素。谢谢 – 2010-07-12 18:42:31

+1

我仍然不认为问题是清楚的。如果你想要做的就是找到表单中的所有控件,那么你想要的是多少“this.Page.Form.Controls”(不管我之前提到的递归问题,因为这似乎不是一个中心问题你的关注)?如果你想*以某种方式了解每种类型的*,那么这就是你在你的例子中所做的事情,通过用于测试类型的“TextBox”或用于测试类型的“GetType()”来简单地检索键入... – 2010-07-12 18:47:27

回答

1

运行这样一个代码的页面上的控件都存储在一个树数据结构。你可以使用递归的方法来做到这一点:

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

将你想要的元素附加到一个事件上,然后在它被触发时对其进行操作。这个例子是为了演示,但你可以定义一个自定义事件。

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> 

代码隐藏:

protected void TextBox1_TextChanged(object sender, EventArgs e) 
{ 
    TextBox tb = sender as TextBox; 
    //do something 
} 
+0

将工作,但我认为必须有一些方法更灵活。谢谢。 – 2010-07-12 18:49:53

+0

你想捕捉什么样的“事件”?你总是可以使用jQuery选择器,然后发布它们全部进行处理。 – 2010-07-12 20:06:18

1

我会在回答的刺,虽然我不知道它是什么,你”之后(请参阅我对问题的评论)。

如果你想要做的是快速处理的一种方式形式(比方说)的所有TextBoxes,及其所有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); 
} 
相关问题