【问题标题】:Iterating through textboxes using asp.net使用 asp.net 遍历文本框
【发布时间】:2011-06-02 23:14:33
【问题描述】:

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

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

我的迭代器有问题吗?是否有另一种方法可以遍历表格或页面中的所有文本框?实现这一目标的最佳方法是什么?

【问题讨论】:

  • 试试this.Form.Controls。您的文本框基本上嵌套在另一个容器中,您需要查询该容器的控件。

标签: c# asp.net html


【解决方案1】:

构建一个List<Textbox> 会不会太过分了,因为您知道所有的文本框控件?

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

那么你有一个很好的列表可以使用

【讨论】:

    【解决方案2】:

    如果我知道控件都在给定的包含控件中,我会简单地轮询 那个 控件的控件。例如,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));
    

    【讨论】:

      【解决方案3】:

      我将假设您正在使用 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);
            }
        }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-06-19
        • 1970-01-01
        • 2020-08-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多