使用Page.FindControl()获取(第三方)控件的实例将继续返回null

时间:2011-07-28 23:31:00

标签: asp.net

我有一个ASP.NET站点,在一个页面上,有几个控件(第三方 - Telerik)。

如果我使用Page.FindControl(),并传入控件的ID(拼写正确),则返回null。为什么呢?

这是在.aspx页面上,并且控件不在其自身的控制之下。不记得是否有母版页,或者假设是和否任何可能的答案。

我怎么能以编程方式获取控件的实例?

由于

2 个答案:

答案 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. 它更快
  2. 它更清晰
  3. 它不容易出错:控件的ID只需要在它的NamingContainer中是唯一的,因此你可能会使用递归方法得到错误的控件(考虑一个带有它的行的GridView和一个在TemplateField中的Control)
  4. 您将了解更多ASP.NET页面如何工作以及控件是如何链接的
  5. 更多信息:MSDN How to: Access Server Controls by ID

答案 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;
    }