2010-06-24 52 views
0

的包裝可以說我有下面的代碼:創造TreeView.Node

public class Base 
{ 
    // Some stuff here 
    public int var 
} 

public class UsingBase 
{ 
    // Some more stuff here 
    public Base B = new Base(); 
} 

現在讓我們假設這些類的實際代碼是巨大的,我想UsingBase做一些額外的東西。所以我正在考慮對它進行子類化。現在讓我們說,我真正想要做的是添加一個方法,給我兩次var。由於var是Base的一個字段,因此將該方法添加到Base的子類而不是UsingBase的子類會更加優雅。但我不想重寫UsingBase,而UsingBase使用Base而不是我的Base的子類。其實,這正是我想要做的:

TreeView(.NET)有一個TreeNodeCollection類型的屬性,名爲Nodes,它存儲了一堆TreeNode類型的對象。節點中的每個TreeNode都可以有一個標籤,我可以用它來存儲我想要的任何對象。但是類TreeNodeCollection沒有一個函數,它給了我對應於某個Tag的TreeNode。所以,我希望能夠做到這一點:

TreeView myTreeView = new TreeView(); 
// Add some TreeNode's and asign unique tags to each of them 
TreeNode someNode = myTreeView.Nodes.GetNodeByTag(object Tag); 

我知道我可以繼承TreeView和添加,做一個函數,但我只是像其他解決好了很多。所以我想知道這是否可能。

回答

2

由於TreeNodeCollection實現了IEnumerable,因此您可以使用LINQ where子句通過特定標籤查找節點。

即:

TreeNode myTaggedNode = myTreeView.Nodes.Cast<TreeNode>().Where(n=>n.Tag == myTag).SingleOrDefault() 

我個人避免在這種情況下的子類。

編輯:根據您的評論;你想知道你是否可以讓你的treeview使用包含GetNodeByTag(object tag)方法的TreeNodeCollection的子類版本。有兩種方法可以做到這一點(這兩者都將是比一個我原來提出的解決方案矯枉過正)

方法1)子類TreeNodeCollection,包括你的 GetNodeByTag(object tag)方法。然後,子類的TreeView使用派生TreeNodeCollection

這是行不通的,因爲在TreeView控件的節點屬性不是虛擬

方法2)使用一個包裝LINQ表達上TreeNodeCollection擴展方法我原來給你看的是:

public static TreeNodeCollectionExtensions 
{ 
    public static TreeNode GetNodeByTag(this TreeNodeCollection tnc, object tag) 
    { 
     return tnc.Cast<TreeNode>().Where(n=>n.Tag == tag).SingleOrDefault();   
    } 

} 

但是,這只是簡單地包裝了我最初提供的原始linq表達式。

+0

但是,仍然有辦法按照我想要的方式來做到這一點嗎? – Juan 2010-06-24 04:52:27

+0

更新了我的答案;這是否解決您的問題? – Pierreten 2010-06-24 05:33:42

+0

太酷了!沒有想法延伸方法存在。其實我問這不僅僅是因爲我想要做TreeView的東西,而且因爲我想爲WebBrowser子類化,並向該類所用的Document Property和HtmlElement添加一些方法(幾個),所以擴展方法將保持代碼乾淨而優雅。 – Juan 2010-06-24 05:39:54

1

如果你自己寫這些類,那麼是的,但是因爲你不是,那麼不完全是。

另一方面,可能所做的是爲TreeNodeCollection編寫擴展方法,它可以爲您調用GetNodeByTag提供完全相同的語法。

0

TreeNodeCollection上很不錯的擴展方法!

我的問題是,如果有子節點它似乎不工作。