当我将Page.Controls
传递给方法时,有没有办法通过其名称或任何其他快速方式获取特定控件?而不是如此迭代ControlCollection
:http://msdn.microsoft.com/en-us/library/yt340bh4.aspx
?
编辑:
对不起,我应该更清楚。我有一个执行数据库工作的类的实例(例如插入表单数据)。从.aspx页面的代码隐藏,我将Page.Controls
传递给该类实例的方法。该方法将此作为ControlCollection
接收。在该方法中,没有Page.FindControl
这样的方法。但是,我可以迭代这个集合。但是更快的方式呢?
答案 0 :(得分:0)
尝试此操作以查找Page
Control control = Page.FindControl["ControlId"]
在此之后,您可以cast
对此原始control
进行TextBox textbox=(TextBox)control;
这样的控制
Linq
如果你想从ControlCollection中找到特定的控件,那么你可以使用TextBox
之类的(我正在举例Control myControl = myControlCollection.OfType<TextBox>().Where(a => a.ID == "controlId").FirstOrDefault();
)这个
{{1}}
答案 1 :(得分:0)
Page.FindControl("lblControl")
答案 2 :(得分:0)
根据您想要找到的控件类型,您可以执行以下操作:
Control ctrl = FindControl("TextBox1");
答案 3 :(得分:0)
如果控件处于“相同级别”,则Page.FindControl方法正常,但通常情况下,控件隐藏在其他控件中。不幸的是,您需要以递归方式搜索给定页面中的所有控件。这是我用来通过给定的id值来查找控件的一段代码......
string g_Error = string.Empty;
List<Control> _infos = new List<Control>();
_infos = ProcessControls(_infos, Page, "info_");
...
public List<Control> ProcessControls(List<Control> MatchControls, Control controls, string FieldKey)
{
try
{
//get a recusive listing of all existing controls for reference
foreach (Control cControl in controls.Controls)
{
if (cControl.Controls.Count > 0)
{
//recusive call
MatchControls = ProcessControls(MatchControls, cControl, FieldKey);
}
//field rules
//must contain Fieldkey to be collected (i.e. control id = FirstName where the FieldKey is "Name")
//so first, loop through and collect controls with FieldKey
if (cControl != null)
{
if (cControl.ClientID.Contains(FieldKey))
{
MatchControls.Add(cControl);
}
}
}
}
catch (Exception ex)
{
g_Error = ex.ToString();
}
return MatchControls;
}