友
我有一个包含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)。
答案 0 :(得分:8)
查看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();
答案 1 :(得分:1)
您可以在javascript中执行此操作 - 为其提供一个类名称并将它们全部放入集合中并循环遍历集合,然后使用ajax简单地发布值。 JQuery在这里非常方便 -
$( “yourclassname”)。每个(函数(指数){ $(this).val()//这将是文本框的值 })
你可以在服务器端硬币一个大字符串并解析,或者你可以构建一个名称值数组,然后用它代替
答案 2 :(得分:1)
或者您可以执行以下操作:
int index = 1;
while ( ( TextBox tb
= FindControl (
string.Concat ( "TxB_Customize", index.ToString ( ) ) as TextBox != null )
{
MyList.Add ( tb.Text );
index++;
}
如果您实际上还有其他一些文本框,这可能会很好,这不是这个数据数组的一部分。
答案 3 :(得分:0)
你可以遍历容器的控件(使用MyContainer.Controls),如果你在那里有文本框就很容易,否则你可能需要这样做:
foreach (Control myBox in MyContainer.Controls)
{
TextBox myBox = Control As TextBox
if (myBox != null)
// Do Stuff
}
答案 4 :(得分:0)
当代码的逻辑与textboxes'name相关时,我看到的唯一解决方案是从头开始重写这段代码,然后向编写这个废话的程序员购买一些好的设计书。
答案 5 :(得分:0)
如果您不想依赖服务器控件,可以使用Request.Form集合。
但是,您需要使用控件ID来判断它是否是文本框,使用问题ID:
Request.Form.AllKeys.Where(n => n.StartsWith("TxB_Customize"))
.Select(n => new[] { n, Request.Form[n] });
返回{Id,Value}对的集合。