2013-08-06 54 views
1

我试图对从主页面继承的页面上的每个控件执行操作。我不知道如何访问子页面控件。我曾尝试递归让我控制这样的:使用主页面循环浏览页面上的控件

private void checkControls(ControlCollection controlcollection) 
    { 

    foreach (Control control in controlcollection) 
    { 
     if (control.Controls.Count > 0) 
     { 
      Debug.WriteLine(control.GetType().ToString()); 
      checkControls(control.Controls); 
     } 
     else 
     { 
      Debug.WriteLine(control.GetType().ToString()); 
     } 

    } 

的方法被称为像这样:

protected void resettodefault() 
{ 
    checkControls(this.Page.Controls); 
} 

然而,从该执行打印的唯一控件是:

ASP.site_master 

System.Web.UI.LiteralControl 

我宁愿直接访问我的控件(没有递归)。否则,我如何修改递归以获得所需的页面控件?

+1

这是怎么回事功能递归?它不称自己。 – Magnus

+0

Typo on my end - good catch –

回答

2

我建议使用基本页面而不是母版页,这样您的迭代控件(以及随后将执行的任何操作)的逻辑不会绑定到页面正在使用的母版页。

就获得页面上的所有控件而言,因为控件是分层的,就像它们所代表的HTML一样,所以递归地迭代它们是有意义的。但是如果你是不是递归得到控制这样的事情应该工作死心塌地:

IEnumerable<Control> GetAllControls() 
{ 
    var allControls = new List<Control>(); 
    var currentControls = new Queue<Control>(); 
    currentControls.Enqueue(this.Page); 

    while (currentControls.Count >0) 
    { 
     var c = currentControls.Dequeue(); 
     if (!allControls.Contains(c)) 
     { 
      allControls.Add(c); 
      if (c.Controls != null && c.Controls.Count > 0) 
      { 
       foreach (Control e in c.Controls) 
       { 
        currentControls.Enqueue(e); 
       } 
      } 
     } 
    } 
    return allControls; 
} 

要考虑的最后一件事是页面的生命周期,当你遍历控制。如果您尝试走路过早来控制树,可能不存在所有控件。

编辑:更新的代码。

更新

为了验证目的我会强烈建议使用内置在asp.net的验证控件。你可以阅读更多关于他们here。这为客户端提供验证提供了额外的好处,可以提供更快的UI响应并减轻服务器的负载。

用于重置所有文本框。需要的,而不是与母版页搞乱时,我会建议为此创建一个新的类,然后呼吁那个类:

public class UIControlsHelper 
{ 
    public static void ClearTextboxes(Page page) 
    { 
     GetAllControls(page) 
      .Where(x => typeof(TextBox).IsAssignableFrom(x.GetType()) 
      .ToList() 
      .ForEach(x => (TextBox)x.Text = string.Empty); 

    } 

    IEnumerable<Control> GetAllControls(Page page) 
     // Same as above, but with the page parameter replaced. 
    } 
} 

而且在任何网页上:

UIControlsHelper.ClearTextboxes(this); 
+0

这是一个非常酷的使用队列 - 感谢这一点,以及基本页面上的参考。我可能应该已经更清楚了,当我循环控制(递归或迭代)时,遇到的问题是我只获取“ASP.site_master”以及“System.Web.UI.LiteralControl” 。 Site_master在初始调用时发生,LiteralControl在第二次调用中,并且函数在此之后结束。任何想法,为什么这是? –

+0

你期待什么结果? – Jay

+0

我有两个单独的目标,我正在使用它..一个是“清除全部”按钮,只是清除此页上的每个文本框。另一种是验证,它检查每个文本框是否有空值,并在文本框被留空时提醒用户。我可以在检查和验证硬编码,但是,有15个文本框 - 我想找一个更优雅的解决方案。 –

0

要访问控制你的孩子做页面下面的步骤:

1-声明要访问的类型的变量。例如,如果你希望你的孩子使用页面访问标签:

Label lbl_child=this.ContentPlaceHolder1.findcontrol("your label id in child page") as Label; 

现在,你有你的标签,你可以自由地做就可以了变化。这个控件的每一个变化都会反映在子控件上。

ContentPlaceHolder1是您的contentplace持有者ID,因此请使用您的内容ID对其进行更改。

+0

OP正试图在没有硬编码控件名称的情况下执行此操作。 – TheGeekYouNeed