2009-12-10 2 views
11

Come posso associare un oggetto a un nodo di treeview (Winform) in C#?Oggetto facile da legare a Treeview Node

Ho pensato a qualcosa come ExNode: Windows.Forms.Node che può prendere un oggetto come membro oltre al nome di treenode ... tuttavia non sono sicuro che sia l'approccio giusto.

risposta

17

imho si hanno diverse strategie:

  1. bastone un oggetto di qualsiasi tipo nella proprietà Tag di qualsiasi nodo: rovescio della medaglia: dovrete lanciare di nuovo al suo 'nativo modulo 'quando lo si recupera per usarlo: se quel "modulo nativo" è tutto tranne il tipo' Oggetto.

  2. Sottoclasse TreeNode e aggiungere un campo pubblico, Proprietà pubbliche o qualsiasi altra cosa, per i propri oggetti ... o anche Elenco ... ... o qualsiasi cosa sia necessario associare al nodo.

  3. assumendo gli oggetti sono dello stesso tipo, si potrebbe creare un dizionario di tipo: Dizionario < TreeNode, myObjectType >, un'istanza, e, se necessario, memorizzare un TreeNode e il suo oggetto associato (s) in questo modo come una coppia chiave/valore.

Strategie # 1 e # 3 hanno il vantaggio che è possibile memorizzare un oggetto associato solo come strategia necessaria # 2: è più adatta al caso in cui si prevede ogni TreeNode sta per avere un oggetto associato (S).

Ovviamente con gli stracci 1 e 3, è necessario testare in fase di esecuzione per la presenza o l'assenza di un oggetto associato a un nodo particolare.

La strategia numero 1 è un test semplice: se la proprietà del nodo del nodo è nulla: si sa che non c'è alcun oggetto: se non è null ... e potrebbero esserci più tipi di oggetti memorizzati nel campo Tag. quindi dovrai estrarre l'oggetto Tag e assicurarti che sia del tipo corretto come in: (l'esempio che segue presuppone che una classe pubblica, "Class1", sia stata assegnata al tag del primo nodo in TreeView:

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

strategia # 3 è un po 'più facile perché si può solo valutare se il Dizionario < Nodo, myObject > .Contains il nodo come una chiave.

+0

Strategia # 1 sembra essere la migliore per me. Ci proverò, thx – Kai

+1

Penso che sia un oggetto che tiene piuttosto che "Binding". –

1

This MSDN article ha alcune buone informazioni, ad esempio:

class myTreeNode : TreeNode 
{ 
    public string FilePath; 

    public myTreeNode(string fp) 
    { 
     FilePath = fp; 
     this.Text = fp.Substring(fp.LastIndexOf("\\")); 
    } 
}