使用asp.net迭代文本框

时间:2011-06-02 23:14:34

标签: c# asp.net html

我正在用asp.net构建一个页面。我有一个表格,其中包含TextBoxes和一个提交按钮。提交表单时,我想获取输入到TextBox中的所有文本并对其进行操作。为此,我有以下方法:

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。)

我的迭代器有问题吗?有没有其他方法可以迭代表或页面中的所有文本框?实现这一目标的最佳方法是什么?

3 个答案:

答案 0 :(得分:4)

如果您知道所有文本框控件,那么构建List<Textbox>会不会太多?

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

然后你有一个很好的列表可以使用

答案 1 :(得分: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));

答案 2 :(得分: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);
      }
  }
}