2010-07-12 43 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); 
} 
相關問題