2009-12-10 11 views
11

C#でオブジェクトをツリービュー(Winforms)ノードにバインドするにはどうすればよいですか?ツリービューノードへの簡単なオブジェクトのバインド

私はExNode:Windows.Forms.Nodeのようなものを考えました。これは、treenodeの名前の他にメンバとしてオブジェクトを取ることができます...しかし、私はそれが正しいアプローチであるとは確信していません。

答えて

17

私見あなたはいくつかの戦略を持っている:欠点:

  1. は、任意のノードのTagプロパティに任意の型のオブジェクトを貼りあなたが戻っての母国にキャストする必要がありますあなたがそれを使用するためにそれを取得するときに「フォーム」:その「ネイティブフォーム」がタイプ「オブジェクト」であるなら。

  2. サブクラスTreeNodeのサブクラスTreeNodeを追加し、オブジェクト、またはList ... ...などのパブリックフィールド、パブリックプロパティなどをノードに追加する必要があります。

  3. あなたのオブジェクトが同じタイプである、あなたは種類の辞書を作成したと仮定すると:辞書<のTreeNode、myObjectType >は、必要に応じて、それをインスタンス化し、そして、ツリーノードおよびそれに関連するオブジェクト(複数可)を保存するようにその方法キーと値のペア

戦略#1、#3は、あなただけの必要な戦略#2と関連するオブジェクトを格納することができるという利点を持っている:あなたは、すべてのTreeNodeが(関連するオブジェクトを持っているとしている予想される場合に適していますs)。

もちろん、#1と#3のstragiesでは、実行時に特定のノードに関連付けられたオブジェクトの有無をテストする必要があります。

ストラテジ#1は簡単なテストです:ノードのタグがヌルである場合:オブジェクトがないことを知っている:ヌルでない場合...タグフィールドに複数のオブジェクトが格納されている可能性があります。 (以下の例では、「Class1」というパブリッククラスがTreeViewの最初のノードのタグに割り当てられていることを前提としています)。次のように、Tagオブジェクトを引き出して正しいタイプであることを確認します。

TreeNode thisNode = theTreeView.Nodes[0]; 
if (((thisNode.Tag != null) && (thisNode.Tag is Class1))) ... handle the object ... 

戦略#3は、辞書<ノード、myObjectという> .Containsキーとしてノードの場合は、単に評価することができるので少し楽です。

+0

戦略#1は私にとって最高のようです。私はそれを試してみるよ、 – Kai

+1

私はそれが "束縛"よりむしろオブジェクトを保持していると思う。 –

1

This MSDN article例えば、いくつかの良い情報を持っています

class myTreeNode : TreeNode 
{ 
    public string FilePath; 

    public myTreeNode(string fp) 
    { 
     FilePath = fp; 
     this.Text = fp.Substring(fp.LastIndexOf("\\")); 
    } 
} 
関連する問題