PostBack上动态嵌套控件的FindControl()方法

时间:2011-09-13 14:24:19

标签: asp.net vb.net

如何获得动态创建控件的特定嵌套控件(即动态控件的子控件)? FindControl()方法不起作用,因为它只处理我认为的TopLevel动态控件。

2 个答案:

答案 0 :(得分:3)

您需要通过控件递归:( C#代码)

   public static Control FindControl(Control parentControl, string fieldName)
    {
        if (parentControl != null && parentControl.HasControls())
        {
            Control c = parentControl.FindControl(fieldName);
            if (c != null)
            {
                return c;
            }

            // if arrived here, then not found on this level, so search deeper

            // loop through collection
            foreach (Control ctrl in parentControl.Controls)
            {
                // any child controls?
                if (ctrl.HasControls())
                {
                    // try and find there
                    Control c2 = FindControl(ctrl, fieldName);
                    if (c2 != null)
                    {
                        return c2; // found it!
                    }
                }
            }
        }

        return null; // found nothing (in this branch)
    }

答案 1 :(得分:0)

这是我过去使用过的一种扩展方法。我发现使用它作为扩展方法会使代码更具表现力,但这只是偏好。

/// <summary>
/// Extension method that will recursively search the control's children for a control with the given ID.
/// </summary>
/// <param name="parent">The control who's children should be searched</param>
/// <param name="controlID">The ID of the control to find</param>
/// <returns></returns>
public static Control FindControlRecursive(this Control parent, string controlID)
{
    if (!String.IsNullOrEmpty(parent.ClientID) && parent.ClientID.Equals(controlID)) return parent;

    System.Web.UI.Control control = null;
    foreach (System.Web.UI.Control c in parent.Controls)
    {
        control = c.FindControlRecursive(controlID);
        if (control != null)
            break;
    }
    return control;
}