2013-08-06 52 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