我有一个ASP.NET站点,在一个页面上,有几个控件(第三方 - Telerik)。
如果我使用Page.FindControl(),并传入控件的ID(拼写正确),则返回null。为什么呢?
这是在.aspx页面上,并且控件不在其自身的控制之下。不记得是否有母版页,或者假设是和否任何可能的答案。
我怎么能以编程方式获取控件的实例?
由于
答案 0 :(得分:1)
如果您想使用NamignContainer,则需要引用控件的FindControl。如果您不知道(或者您没有引用),则必须递归循环控制树:
例如(作为扩展名):
namespace ExtensionMethods
{
public static class ControlExtensions
{
public static Control FindControlRecursive(Control rootControl, string controlID)
{
if (rootControl.ID == controlID) return rootControl;
foreach (Control controlToSearch in rootControl.Controls)
{
Control controlToReturn = FindControlRecursive(controlToSearch, controlID);
if (controlToReturn != null) return controlToReturn;
}
return null;
}
}
}
以这种方式使用:
using ExtensionMethods;
//.....
Control ctrl = this.FindControlRecursive("myControlID");
但如果您知道NamingContainer,那么最好使用FindControl,因为:
答案 1 :(得分:0)
您尝试查找的控件很可能嵌套在控件树中较低的位置。您可以使用以下代码递归遍历树并找到您的控件,无论它在控制层次结构中嵌套多远或多近
Control c = FindControl<Control>(Page,"controlIDStringLiteral");
public static T FindControl<T>(ControlCollection controls, string controlId) where T : Control
{
if (controls == null)
{
throw new ArgumentException("controls null");
}
if (string.IsNullOrEmpty(controlId))
{
throw new ArgumentException("controlId is null or empty");
}
if (controls.Count < 1)
{
return null;
}
Control retval;
foreach (Control control in controls)
{
if (control.ID == controlId)
{
return control as T;
}
}
foreach (Control control in controls)
{
retval = FindControl<T>(control, controlId);
if (retval != null)
{
return retval as T;
}
}
return null;
}
/// <summary>
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="control"></param>
/// <param name="controlId"></param>
/// <returns></returns>
public static T FindControl<T>(Control control, string controlId) where T : Control
{
if (control == null)
{
throw new ArgumentException("control null");
}
if (control.Controls == null)
{
return null;
}
if (control.Controls.Count < 1)
{
return null;
}
Control retval;
retval = control.FindControl(controlId);
if (retval != null)
{
return retval as T;
}
foreach (Control childControl in control.Controls)
{
retval = FindControl<T>(childControl, controlId);
if (retval != null)
{
return retval as T;
}
}
return null;
}