【问题标题】:how to retrieve values from 100 Textboxes using loop如何使用循环从 100 个文本框中检索值
【发布时间】:2009-02-27 10:23:29
【问题描述】:

朋友们,

我有一个包含 100 个或更多文本框(HTML 或 ASP.NET)的网格,每个文本框都将包含一个固定长度的文本值,需要将所有这些都传递回后端表单以进行数据库的大规模更新。

我可以通过简单地检查后面代码中的每个控件的 .text 属性来做到这一点。

但是这会使代码变得又大又丑。

我想知道是否有任何理由使用一些受控循环结构来遍历每个控件并检索数据

Private List<string> getdata()
{
  Private List<String> MyList = new List<string>();
    foreach (Textbox)control txbControl in ....// don't know what this will be
     {
       MyList.Add(txbControl.text);
     }
}

请注意,所有这些文本框在页面上都有唯一的 ID 标签,即

<tablr>
<tbody>
<tr>
<td>
<asp:TextBox ID="TxB_Customize1" runat="server"></asp:TextBox>
<td/>
<td>
<asp:TextBox ID="TxB_Customize2" runat="server"></asp:TextBox>
<td/>
<td>
<asp:TextBox ID="TxB_Customize3" runat="server"></asp:TextBox>

... ... ...

很抱歉忘记提及这一点,文本框按列分组,给定列中的每个文本框共享相似的名称,即给定实例中的“Txb_Customize”。

因此,在检索值时,我还需要知道它的来源(可能是文本框 ID)。

【问题讨论】:

    标签: .net asp.net


    【解决方案1】:

    查看Control.Controls 属性。

    你想要这样的东西:

    foreach (Control control in Controls)
    {
        TextBox textBox = control as TextBox;
        // Ignore non-textboxes
        if (textBox != null)
        {
            list.Add(textBox.Text);
        }
    }
    

    如果您使用的是 .NET 3.5,您可以使用 LINQ 以更简单的方式执行此操作:

    return Controls.OfType<TextBox>()
                   .Select(textBox => textBox.Text)
                   .ToList();
    

    【讨论】:

      【解决方案2】:

      或者你可以这样做:

      int index = 1;
      while ( ( TextBox tb
        = FindControl (
            string.Concat ( "TxB_Customize", index.ToString ( ) ) as TextBox != null )
      {
        MyList.Add ( tb.Text );
        index++;
      }
      

      如果您实际上还有其他一些文本框,这可能会很好,这些文本框不属于该数据数组的一部分。

      【讨论】:

        【解决方案3】:

        您可以在 javascript 中执行此操作 - 给它们一个类名并将它们全部放入一个集合中并循环通过该集合,然后使用 ajax 简单地发布值。 JQuery 在这里可以非常方便 -

        $(".yourclassname").each(function(index){ $(this).val() //这将是你的文本框的值 })

        您可以创建一个大字符串并在服务器端解析,或者您可以构建一个名称值数组,然后使用它来代替

        【讨论】:

        • 嘿 Bharani 我对 JQuery 不太熟悉,但我喜欢它,因为我在页面上有大量的 java 脚本。您能否解释一下答案中的“(索引)”部分。即我如何得到它。或者它只是一个占位符。我已经想好休息了。谢谢
        • 每个函数就像一个for循环,被迭代的集合的索引作为参数传递给回调函数。如果在回调中你需要实际的 DOM 元素,你可以使用 this 或者如果你需要 jquery 对象,你可以使用 $(this)。
        【解决方案4】:

        您可以遍历容器的控件(使用 MyContainer.Controls),如果您拥有的只是文本框,那将很容易,否则您可能需要这样做:

        foreach (Control myBox in MyContainer.Controls)
        {
            TextBox myBox = Control As TextBox
            if (myBox != null)
                // Do Stuff
        }
        

        【讨论】:

          【解决方案5】:

          当代码的逻辑与文本框的名称有关时,我看到的唯一解决方案就是从头开始重写这段代码,然后给写过这种垃圾的程序员买一些好的设计书籍。

          【讨论】:

            【解决方案6】:

            如果您不想依赖服务器控件,可以使用 Request.Form 集合。

            但是,您需要使用控件 ID 来判断它是否是文本框,使用问题的 ID:

            Request.Form.AllKeys.Where(n => n.StartsWith("TxB_Customize"))
                                .Select(n => new[] { n, Request.Form[n] });
            

            返回 {Id,Value} 对的集合。

            【讨论】:

            • 不会是唯一 ID 吗?在这种情况下,n.StartsWith 将不起作用。
            • UniqueID:当然。需要更复杂的东西来匹配键。
            猜你喜欢
            • 1970-01-01
            • 2016-03-28
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2016-06-22
            • 2020-09-07
            • 1970-01-01
            相关资源
            最近更新 更多