2011-06-29 73 views
3

我已經創建了一個基本用戶控件(BaseUserControl),該控件由我的所有用戶控件實現。在那個類中,我有一個包含JavaScript URL引用集合的屬性。解析該類型的用戶控件的頁面的最佳方式是什麼?可能使用LINQ查找頁面上某種類型的所有UserControl?

我嘗試使用LINQ,但我不認爲我可以查詢控件集合吧:

var controls = (from c in page.Controls where c is BaseUserControl) 
foreach(control in controls){ 
    var javascript = control.JavaScriptReference 
} 

回答

5

略微更地道的方式來做到這一點是使用Enumerable.OfType

foreach(var control in page.Controls.OfType<BaseUserControl>()) { 
    var javascript = control.JavaScriptReference; 
} 
+0

哎呀...你打我吧:) +1 –

+0

打我也是!我只是在弄亂LINQ表達式的時候發現了這個。 – DDiVita

+0

我不知道OfType()。太好了! –

0

你正確選擇控制?

var controls = (from c in page.Controls where c is BaseUserControl select c) 
foreach(BaseUserControl control in controls) 
{  
var javascript = control.JavaScriptReference 
} 
1

如果你只是想JavaScriptReference值的集合,你可以這樣做:

var javascriptReferences = page.Controls.Where(c => c is BaseUserControl) 
             .Select(c => c.JavaScriptReference); 
0
foreach (var control in 
     page.Controls.OfType<BaseUserControl>()) 
{ 
     var javascript = control.JavaScriptReference; 
} 
1

我使用遞歸的辦法處理這一問題。見下面我通常使用的方法。

private void GetControls<T>(Control ctrl, List<T> result) 
{ 
    foreach (Control con in ctrl.Controls.OfType<Control>().Where(c => c.Controls.Count > 0)) 
     GetControls<T>(con, result); 
    foreach (T control in ctrl.Controls.OfType<T>()) 
     result.Add(control); 
} 

你可以這樣調用:

List<BaseUserControl> baseUserControls = new List<BaseUserControl>(); 
GetControls<BaseUserControl>(Page.Controls, out baseUserControl); 

之後List是充滿了你的BaseUserControls引用。遞歸方法是必需的,因爲Page.Controls不包含頁面上的所有控件。您網頁上的某些控件是此集合中的控件的子控件(甚至是這些控件的子控件),因此嵌套層次更深。因此遞歸方法。

3
var javascript = page.Controls.OfType<BaseUserControl>().Select(c=> c.JavaScriptReference); 

這應該工作。

相關問題