2011-06-27 38 views
3

我有顯示兩件事情TreeView控件:有什麼辦法可以強制鍵入一個控件的標籤屬性?

1) Folder 
2) Item 

如果文件夾包含的項目。並且根文件夾包含所有子文件夾以及不屬於文件夾的項目。

我有一個Folder類型與表示文件夾的節點相關聯,並且與代表項目的節點相關聯的Item類型。

現在,用戶可以選擇任何節點,並執行不同的操作。我需要能夠區分Tag屬性中存儲的類型。如果這是不可能的,我有什麼選擇來解決這個問題?

+0

您可以從幾乎所有的WinForms控件的繼承,並添加你所希望的任何屬性。起初,你被告知這樣做首先。 「Tag」屬性只是作爲對VB 6程序員的讓步而加入的,他們不理解OOP並希望緩解遷移。在大多數情況下,您可能應該忽略它並添加強類型的自定義屬性。 –

回答

2

如果需要,您可以輕鬆地進行類型化標籤:

public class MyTreeNode<T> : TreeNode 
{ 
    public T TypedTag { get; set; } 
} 
+0

當然,如果您有兩種不同的類型,那麼您必須將treenode重新轉換回正確的形式,或者將兩種類型添加到treenode並選擇其中一個或其他爲空。 – tyranid

+0

@tyranid實際上,難道你不能實現兩個重載的方法,一個採用FolderTreeNode,另一個採用ItemTreeNode來正確處理它們而不必投射? – Pete

+0

嗯,我認爲你想要這個AfterSelect事件觸發(或類似)時。在這一點上,你將得到的是一個TreeNode對象引用,你必須從中推斷出「真實」的對象類型。你可以重載OnAfterSelect方法來爲不同的節點類型激發不同的事件,但你只是將問題推到別的地方。另一種方法是定義一個標準的接口,並說一個「DoAction」方法,每種類型的TreeNode都可以實現,然後只能轉換爲該接口類型,但這可能不是很靈活,並且不能真正解決問題。 – tyranid

2

使用'as'和or'is'運算符?例如

if(node.Tag is Folder) 
{ 
    Folder f = node.Tag as Folder; 
} 
else if (node.Tag is Item) 
{ 
    ... 
} 
相關問題