ASP.NET如何在父页面上访问深层嵌套的用户控件

时间:2010-09-15 17:43:09

标签: c# asp.net user-controls findcontrol

我有一个登录控件,并在标题控件中嵌套2深 即Page - >标题控制 - >登录控制。我无法使用FindControl获取对页面控件的引用。我希望能够设置控件的可见属性,如

  if (_loginControl != null)
            _loginControl.Visible = false;

我最终使用递归FindControl方法来查找嵌套控件。

    public static Control FindControlRecursive(Control root, string id)
    {
        if (root.ID == id)
        {
            return root;
        }

        foreach (Control c in root.Controls)
        {
            Control t = FindControlRecursive(c, id);
            if (t != null)
            {
                return t;
            }
        }

        return null;
    }

5 个答案:

答案 0 :(得分:0)

一个好方法是使用:

Page.FindControl() 

如果产生null,则控件不存在。

答案 1 :(得分:0)

尝试调用this.FindControl(“_ loginControl”)或this.Page.FindControl(“_ loginControl”)。

有关方法详细信息,请参阅MSDN: http://msdn.microsoft.com/en-us/library/system.web.ui.control.findcontrol.aspx

答案 2 :(得分:0)

您是否需要从其所在的ASP.NET页面中禁用/隐藏用户控件(或者,如果用户控件存在于母版页上)?如果它在同一页面中,那么在你的ASP.NET页面的代码隐藏中你会做:

MyUserControlsID.Visible = false

MyUserControl是用户控件的ID。要确定用户控件的ID,请查看.aspx页面的标记,您将看到如下内容:

<uc1:UserControlName ID="MyUserControlsID" runat="server" ... />

快乐编程!

答案 3 :(得分:0)

登录控件(如果已在标记中注册)也将是您的代码隐藏页面的实例成员;您可以从代码隐藏类中引用它,就像它是普通成员一样,使用您提供的相同名称作为ID(我建议对大多数逻辑使用代码隐藏,而不是在标记中插入代码,BTW)。

您还可以使用页面的FindControl()方法,该方法将在其控制子树中搜索具有给定ID的控件。这需要更长的时间,所以我建议使用第一个选项,除非动态添加逻辑控件,并且你并不总是知道它在那里。

答案 4 :(得分:0)

private List<Control> GetAllNestedUserControl(Control ph)
    {
        List<Control> Get = new List<Control>();
        foreach (var control in ph.Controls)
        {
            if (control is UserControl)
            {
                UserControl uc = control as UserControl;
                if (uc.HasControls())
                {
                   Get =  GetAllNestedUserControl(uc);

                }
            }
            else
            {
                Control c = (Control)control;
                if (!(control is LiteralControl))
                {
                     Get.Add(c);
                }
            }
        }
        return Get;
    }

只需从您的任何父页面调用此代码,然后通过以下代码获取任何控件

        List<Control> Get = GetAllNestedUserControl(ph);
        Label l = (Label)Get.Find(o => o.ID == "lblusername");
        l.Text = "changed from master";