2011-06-02 47 views
4

我正在用asp.net構建一個頁面。我有一個包含文本框和提交按鈕的表格。提交表單時,我想抓取所有輸入到文本框中的文本並對其進行操作。要做到這一點,我有以下方法:使用asp.net遍歷文本框

protected void Button1_Click(object sender, EventArgs e) 
{ 
    System.Text.StringBuilder sb = new System.Text.StringBuilder(); 

    foreach (Control c in this.Controls) 
    { 
     if (c.GetType().Name == "TextBox") 
     { 
      TextBox tb = (TextBox)c; 
      sb.AppendLine(tb.Text); 
     } 
    } 
    Label1.Text = sb.ToString(); 
} 

問題是,控件顯然不包括我的任何文本框。當我遍歷控件並打印出他們的名字時,我得到的唯一一個是「site_master」。 (我也嘗試過Controls和Page.Controls而不是this.Controls)。

我的迭代器有什麼問題嗎?有沒有其他方法可以遍歷表或頁面中的所有文本框?什麼是完成這個最好的方法?

+1

試試'this.Form.Controls'。您的文本框基本上嵌套在另一個容器中,您需要查詢該容器的控件。 – 2011-06-02 23:24:04

回答

4

假如你知道所有的文本框控件,建立一個List<Textbox>是否太多了?

List<Textbox> txtBoxes = new List<Textbox>(); 
txtBoxes.Add(tb1); 
txtBoxes.Add(tb2); 
//etc.. 

那麼你有一個很好的清單,

0

我會假設你正在使用Web窗體ASP.NET工作。通常,您使用類似的aspx頁面上聲明你的控制,以

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

如果你這樣做的話在你的背後你的代碼應該只能夠引用變量someId和財產Text獲取/設置文本在控制中。

如果您在服務器上動態構建控件,應該可以將它們粘貼到列表中並遍歷它。確保在page lifecycle的正確部分創建控件並將它們添加到表中。當你將它們添加到表格中的一個單元格中時,你也可以在列表中保留對控件的引用,並在你的事件處理程序中枚舉該列表。

也許沿着線的東西(我沒編譯這個那麼有可能是問題):

public class MyPage: Page 
{ 
    private List<TextBox> TxtBoxes = new List<TextBox>(); 

    //registered for the preinit on the page.... 
    public void PreInitHandler(object sender, EventArgs e) 
    { 
     for(var i = 0; i < 2; i++) 
     { 
     var txtBox = new TextBox{Id = textBox+i}; 
     //...add cell to table and add txtBox Control 
     TxtBoxes.Add(txtBox); 
     } 
    } 
} 
1

如果我知道這些控件都在一個給定的包含控制,我只想輪詢控制控制。例如,this.Form.Controls。但是,如果它們可以嵌套在其他子控件中,則可以遞歸地從公共外部容器中探索深度。

private IEnumerable<T> FindControls<T>(Control parent) where T : Control 
{ 
    foreach (Control control in parent.Controls) 
    { 
     if (control is T) 
      yield return (T)control; 

     foreach (T item in FindControls<T>(control)) 
      yield return item; 
    } 
} 

因此,這將允許您檢索所有TextBox兒童。

List<TextBox> textBoxes = this.FindControls<TextBox>(this).ToList(); 
string output = string.Join(",", textBoxes.Select(tb => tb.Text));