2012-04-13 23 views
10

Windows formu UI üzerinde bir ağaç görünümü denetimim var ve birkaç düğümleri var (birden çok çocuk düğümleri ile). Düğümler koleksiyonunu sorgulamak istiyorum, örneğin, 1. 'x' ile başlayan adların seçilmesi
2. Node.Tag alanında hiç veri bulunmayanları seçin.Bir TreeNodeCollection Sorgulama

Lütfen birisi bana bunu yapmanın bir yolunu önerebilir. Linq kolay ve düzgün yapardı, ama TreeNodeCollection'u sorgulamak için Linq hakkında hiçbir şey bulamadım.

sayesinde

+1

izin ile böyle bir şey deneyebilirsiniz Treeview düğümlerinizin derinliği nedir? Eğer çocuk düğümleri düğümleri varsa, tekrarlayıcı bir sorguya ihtiyacınız vardır. –

+0

Şimdilik, derinliğin sadece 1 olduğunu söyleyebilirim. – ViV

+1

Bu Link yardımcı olabilir .... [1]: http://stackoverflow.com/questions/1815497/enumerating-collections-that-are-not- doğal olarak-ienumerable/1815600 # 1815600 –

cevap

32

TreeNodeCollection Çünkü önceden tarihleri ​​.NET 2.0, bu genel bir koleksiyon değil.

Ancak, sadece bir TreeNodeCollection üzerinde .Cast<TreeNode>() çağırabilir ve size sonra tüm LINQy iyilik yapabilir bir IEnumerable<TreeNode>, olsun.

(bu yaklaşım uygulayan tür koleksiyonu için çalışıyor IEnumerable ancak IEnumerable<T>)

+0

Teşekkürler. Yapacakmış gibi görünüyor. Ama başka bir temel sorunum var. Aşağıdakileri denedim: 0nm = childNodes = treeView2.Nodes.Cast (); var x = childNodes.Where (node ​​=> node.Tag == null); ' Bu gerçekten çalışmıyor çünkü çocuk düğümleri 'TÜM' alt düğümleri içermiyor. Temel olarak, bunu yapmaya çalışıyorum: n düğümleri ve her düğümün bir çocuk düğümleri olan bir ağaç görünümü var. Bu ağacın bazı kriterlere göre filtrelenmesini istiyorum. Bunun için nasıl giderim. Önerebilir misin? – ViV

+2

Tüm ağaca bakmak istiyorsanız, özyinelemeli bir yöntem doğal seçim gibi görünüyor. Bu muhtemelen daha önce SO üzerine çıktı - hızlı arama beni buldu [bu] (http://stackoverflow.com/questions/177277/how-to-get-a-list-of-all-child-nodes-in- VB.NET'te bulunan, ancak kolayca çevrilebilir olması gereken bir a-treeview-in-net); çok daha fazlası olacak. – AakashM

2

nedeniyle her ebeveyn altında iç içe düğümler koleksiyonuna son zamanlarda benzer bir şey denedim ve LINQ yaklaşımla mücadele ettik.

Sorunumu tüm düğümleri aradıran özyinelemeli bir işlevle çözdüm. Makul derecede zarif.

VB

: Bu LINQ iyilik 'master' türüdür IEnumerable<T>, uygulamıyor yüzden

Private Function FindNode(name As String, root As TreeNode) As TreeNode 
    For Each n As TreeNode In root.Nodes 
     If n.Name = name Then 
      'Found, get out 
      Return n 

     Else 
      'Recursively call FindNode to search this node's children 
      Dim soughtNode = FindNode(name, n) 
      If soughtNode IsNot Nothing Then 
       Return soughtNode 
      End If 
     End If 
    Next 

    Return Nothing 

End Function 
+0

Fikrini arkada paylaşır mısınız lütfen. – ViV

3

Bir Fixpoint operatör özyinelemeli Lambda'lar sonra

// Fix point operator 
public static Func<T, T> Fix<T>(Func<Func<T, T>, Func<T, T>> f) 
{ 
    return t => f(Fix<T>(f))(t); 
} 

// your treeView 
var tv = new TreeView(); 

// Your filter Func 
Func<TreeNode, bool> filterStartWithXorNoData = 
    node => node.Text.StartsWith("x") || string.IsNullOrEmpty(node.Text); 

// Your recursive lambda 
var filteredNodes = Fix<IEnumerable<TreeNode>>(
    f => 
    nodeList => 
    nodeList.SelectMany(node => f(node.ChildNodes.Cast<TreeNode>())) 
     .Union(nodeList.Where(filterStartWithXorNoData))) 
     (tv.Nodes.Cast<TreeNode>());