2008-09-24 27 views
1

我正在用C#.NET編寫一個網頁。在JavaScript中有一個名爲GetElementsByTagName的函數...這對於從.aspx頁面調用的JavaScript很好。我的問題是,有沒有什麼辦法可以讓我的C#代碼隱藏這種功能?來自.net代碼隱藏頁面的GetElementsByTagName功能?

-

對於那些好奇的情景:我用一個asp:直放站產生大量的按鈕,現在我基本上是試圖讓一個按鈕,點擊它們。我試圖在創建列表時將所有按鈕都存儲在列表中,但列表在每次回發時都被清除,所以我想我可以嘗試上述方法。

回答

2

的FindControl(),或者通過網頁上的控件迭代...

For each ctl as Control in Me.Controls 
    If ctl.Name = whatYouWant Then 
    do stuff 
Next 'ctl 

- - 如果你正在創建的控件,您應該設置相應的ID

Dim ctl as New Control() 
ctl.ID = "blah1" 

等。 ..

+0

對不起vb。如果需要,我可以翻譯 – StingyJack 2008-09-24 19:41:42

+0

FindControl(字符串)不起作用,因爲我不知道他們的ID。 VB是有道理的,但我不知道我會用什麼在C#中的leiu那個Me.Controls – Aaron 2008-09-24 19:44:01

+0

this.Controls是C#equiv – 2008-09-24 22:59:31

1

那麼,你可以找到控件與頁面的FindControl方法,但Repeater元素具有由.net生成的名稱。另外,如果你真的想,你可以在你的頁面的ViewState中存儲按鈕列表(或者它們的名字列表)。

+0

我試圖在ViewState中存儲列表

0

每當你做任何回發,一切被重新創建,包括你的數據綁定控件。

如果您的列表不存在,按鈕控件也一樣。當然,除非你重新創建了它們,在這種情況下,你應該重新創建這個列表。

+0

不幸的是,序列是這樣的: - 創建按鈕/列表 - 點擊新按鈕,點擊所有其他按鈕: - 這將導致回發,所以屏幕變白,並立即嘗試展開按鈕後。 。這些不存在。 我可能做錯了,我不知道。 – Aaron 2008-09-24 19:47:53

+0

聽起來像你的問題是一個設計問題。 – devlord 2008-09-24 19:52:28

3

試試這個:

foreach (Control ctl in myRepeater.Controls) 
{ 
    if (ctl is Button) 
    { 
    ((Button)ctl).Click(); 
    } 
} 

HTH ...

+0

你會錯過容器中的按鈕,比如面板和這種方法的東西。我會使用遞歸函數。 – stephenbayer 2008-09-24 19:56:08

0

我不知道你點擊它們都意味着什麼。但是,以下代碼將如何爲您工作?我不知道,我還沒有測試......

protected void Page_Load(object sender, EventArgs e) 
{ 

    foreach (Control control in GetControlsByType(this, typeof(TextBox))) 
    { 
     //Do something? 
    } 

} 
public static System.Collections.Generic.List<Control> GetControlsByType(Control ctrl, Type t) 
{ 
    System.Collections.Generic.List<Control> cntrls = new System.Collections.Generic.List<Control>(); 


    foreach (Control child in ctrl.Controls) 
    { 
     if (t == child.GetType()) 
      cntrls.Add(child); 
     cntrls.AddRange(GetControlsByType(child, t)); 
    } 
    return cntrls; 
} 
0

ASPX:

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %> 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 

<html xmlns="http://www.w3.org/1999/xhtml"> 
    <head runat="server"> 
     <title>Untitled Page</title> 
    </head> 

    <body> 
     <form id="form1" runat="server"> 
      <asp:Repeater runat="server" ID="Repeater1"> 
       <ItemTemplate> 
        <asp:Button runat="server" ID="Button1" Text="I was NOT changed" /> 
       </ItemTemplate> 
      </asp:Repeater> 
     </form> 
    </body> 
</html> 

ASPX.CS:

using System; 
using System.Data; 
using System.Web.UI; 
using System.Web.UI.WebControls; 


public partial class _Default : System.Web.UI.Page 
{ 
    protected void Page_Load(Object sender, EventArgs e) 
    { 
     DataTable dt = new DataTable(); 

     dt.Columns.Add(new DataColumn("column")); 

     DataRow dr = null; 

     for (Int32 i = 0; i < 10; i++) 
     { 
      dr = dt.NewRow(); 

      dr["column"] = ""; 

      dt.Rows.Add(dr); 
     } 

     this.Repeater1.DataSource = dt; 
     this.Repeater1.DataBind(); 


     foreach (RepeaterItem ri in this.Repeater1.Controls) 
     { 
      foreach (Control c in ri.Controls) 
      { 
       Button b = new Button(); 


       try 
       { 
        b = (Button)c; 
       } 

       catch (Exception exc) 
       { 
       } 


       b.Text = "I was found and changed"; 
      } 
     } 
    } 
} 
0

或者我自己的代碼的變化,只改變ASPX.CS:

using System; 
using System.Data; 
using System.Web.UI; 
using System.Web.UI.WebControls; 
using System.Collections.Generic; 


public partial class _Default : System.Web.UI.Page 
{ 
    protected void Page_Load(Object sender, EventArgs e) 
    { 
     #region Fill Repeater1 with some dummy data 
     DataTable dt = new DataTable(); 

     dt.Columns.Add(new DataColumn("column")); 

     DataRow dr = null; 

     for (Int32 i = 0; i < 10; i++) 
     { 
      dr = dt.NewRow(); 

      dr["column"] = ""; 

      dt.Rows.Add(dr); 
     } 

     this.Repeater1.DataSource = dt; 
     this.Repeater1.DataBind(); 
     #endregion 


     foreach (Button b in this.FindButtonsInRepeater(ref this.Repeater1)) 
     { 
      b.Text = "I was found and changed"; 
     } 
    } 


    private List<Button> FindButtonsInRepeater(ref Repeater repeater) 
    { 
     List<Button> buttonsFound = new List<Button>(); 


     foreach (RepeaterItem ri in repeater.Controls) 
     { 
      foreach (Control c in ri.Controls) 
      { 
       try 
       { 
        buttonsFound.Add((Button)c); 
       } 

       catch (Exception exc) 
       { 
       } 
      } 
     } 


     return buttonsFound; 
    } 
}