2011-01-06 39 views
2

Ich frage mich nur, wie die Leute darüber gehen würden. Angenommen, ich habe eine Klasse, die eine Treeview erstellt und füllt, die dann zu einer Winform hinzugefügt wird.C# Daten zwischen Klassen übergeben

Ich habe eine andere Klasse, die von Daten innerhalb der Treeview abhängig ist. Wenn ein Benutzer beispielsweise auf einen bestimmten Knoten in der Treeview klickt, benötigt die Klasse b die Informationen, die der Knoten enthält, damit er eine Berechnung durchführen und das Ergebnis anzeigen kann.

Wäre es besser, einfach einen Verweis auf die Treeview an die zweite Klasse oder nur die Daten zu übergeben, die sie benötigt? Oder wäre es in Ordnung, die Baumansicht als statisch zu setzen und Ereignisse zu verwenden, damit die neue Klasse direkt auf die Baumansicht zugreifen kann, wenn auf einen Knoten geklickt wird?

Danke.

+0

Wann erstellen Sie die Instanz der Klasse b? –

Antwort

5

Ich würde ein Ereignis in der Klasse auslösen, die die Baumansicht enthält. Definieren Sie also einen Delegaten und ein Ereignis Ihrer Klasse. Dann kann die abhängige Klasse dieses Ereignis abonnieren und auf die in dem Ereignis enthaltenen Daten einwirken. Da ich Ihre Frage verstehe, muss die abhängige Klasse nichts mit der Baumansicht tun und sollte daher nicht über die Baumansicht Bescheid wissen.

public delegate void YouControlHandler(int relevantData1, string relevantData2); 
public class ClassContainingTreeView 
{ 
    public event YouControlHandler TreeViewClickedEvent; 
    public void OnTreeViewClicked(object sender, EventArgs) 
    { 
     // Handle request locally first and extract relevantData1/2 
     if(TreeViewClickedEvent != null) 
      TreeViewClickedEvent(relevantData1, relevantData2); 
    } 
} 

public class DependingClass 
{ 
    ClassContainingTreeView yourObject = new ClassContainingTreeView(); 

    public DependingClass() 
    { 
     yourObject.TreeViewClickedEvent += new YouControlHandler(EventHandler); 
    } 

    protected void EventHandler(int relevantData1, string relevantData2) 
    { 
      // Handle event 
    } 
} 
+0

Ich denke, das möchte ich erreichen. Vielen Dank. –

+0

Hallo Tomas, deklarieren Sie den Delegaten außerhalb der Klasse hier auf globaler Namespace-Ebene? Tut mir leid, wenn es eine dumme Frage ist, ich bin neu für die Delegierten. Vielen Dank. –

+1

@Darren: Ja, so machst du es. Mein Code kompiliert wahrscheinlich nicht .. schrieb es einfach aus meinem Kopf. Lesen Sie hier mehr: http://msdn.microsoft.com/en-us/library/9aackb16.aspx. Wenn es nicht klar ist, frage einfach nochmal. –

4

Einfach die Daten übergeben.

Sie möchten nicht, dass eine Klasse eng an ein UI-Steuerelement gekoppelt ist.

Nebenbei, warum denken Sie, Sie müssen das TreeView statisch machen, um Ereignisse davon zu verbrauchen?

Sie können ein Ereignis von Objekten abonnieren, die nicht statisch sind.

+1

Aber jetzt haben Sie eine andere Art von Abhängigkeit, würde ich stattdessen für meine Lösung mit einem Ereignis gehen. Dadurch wird es noch stärker gekoppelt und es können mehr Klassen auf den eigentlichen "Klick" in der Baumansicht wirken. –

+0

@Tomas Jansson - Wirklich? Mit TreeView spezifischen Ereignisargumenten? Die Verwendung von Primitiven (oder DTOs) stellt eine geringere Kopplung sicher. Wenn die Klasse mit ein paar Strings und einem int arbeiten kann, ist das eine lose Kopplung. – Oded

+0

@Oded: Ich denke, Sie bekommen es falsch. Die Klasse mit der Baumansicht reagiert auf das Baumansichtsereignis. Wenn es fertig ist, das Ereignis zu behandeln, löst es ein eigenes definiertes Ereignis aus, auf das die Baumansicht mit relevanten Daten geklickt wurde. –

Verwandte Themen