我正在创建一个Web表单,我有5个文本框。将放在此处的数据来自Stored Proc,它返回一个包含3列的表格,如下所示:
---------------------
|Group| ID | Amount |
|-----+-----+--------|
|A |1 | 5 |
|B |2 | 9 |
|B |1 | 2 |
|A |2 | 1 |
|A |3 | 57 |
----------------------
现在,我如何以有效的方式将特定的Amount值分配给相应的文本框,该文本框取决于列Group和ID,如下所示:
txt_A1.Value=5;
txt_A2.Value=1;
txt_A3.Value=5;
txt_B1.Value=2;
txt_B2.Value=9;
我目前正在使用此代码,但它不起作用。
string CatID = String.Concat(dr["Group"], dr["ID"]);
var control = Controls.Cast<Control>().FirstOrDefault(x => x.ID == string.Format("txt_{0}", CatID)) as TextBox;
if (control != null)
control.Text = dr["Amount"].ToString();
请注意,文本框是一个HTML对象,如<input type="Text" id="txt_A1" runat="server">
答案 0 :(得分:0)
为了完成您的任务,所有这些<input type="text" id="txt_A1">
控件都应该有runat="server"
,以便服务器或代码隐藏可以访问它们。
接下来,我建议使用asp.net控件TextBox
而不是<input>
控件。与他们合作更容易。
你的想法不错,但它只通过第一级控件,这意味着如果你的输入在div
(它属于那个div
的控件集合),你的代码就赢了找不到它。你必须做出递归函数,在页面和所有具有子控件的控件上找到输入控件,并且所有控件的子控件都可以有子控件......
所以,这是这样的功能。我已将其键入,因此您可以传递您正在搜索的控件类型。在您的情况下,该值应为HtmlInputText
,因为input
是通用的html文本控件。如果您使用的是asp.net TextBox
控件,则应将TextBox
作为控件类型传递。
public IEnumerable<Control> GetControlsOfType<T>(Control parent)
{
if (parent.HasControls())
{
foreach (Control childControl in parent.Controls)
{
if (childControl is T)
yield return childControl;
foreach (var nextLevel in GetControlsOfType<T>(childControl))
{
yield return nextLevel;
}
}
}
}
现在,像这样使用它:
//find all textControls
var textControls = GetControlsOfType<HtmlInputText>(this);
//find specific control from the list
var control = textControls.FirstOrDefault(t => t.ID == string.Format("txt_{0}", CatID));
//set value
(control as HtmlInputText).Value = "some value";