2009-08-18 11 views
1

Ich bin beschäftigt mit einer einfachen Anwendung. Es liest XML und setzt die Informationen in eine Baumansicht.Wert der Tag-Eigenschaft verschwindet

Ich mache dies durch Erstellen von TreeNodes und verschachteln sie, und schließlich, geben Sie den Root-Treenode. Da ich bei der Auswahl eines Treenodes einige zusätzliche Informationen anzeigen möchte, lege ich die Informationen in die Tag-Eigenschaft des TreeNode. Auf diese Weise sollte ich die Informationen abrufen können, wenn der Knoten ausgewählt ist.

Wenn ich jedoch versuche, die Informationen in der Tag-Eigenschaft abzurufen, wird der Wert = null angegeben.

Hier ist der Code, wo ich das Tag füllen. Dies ist in einer Funktion, die rekursiv verwendet wird, um das XML-Dom zu lesen. treeNode ist ein Parameter für diese Funktion.

if (treeNode.Tag == null) 
{ 
treeNode.Tag = new List<AttributePair>(); 
} 
(treeNode.Tag as List<AttributePair>).Add(new AttributePair(currentNode.Name, currentNode.Value)); 

Dies ist der Fall, in dem ein treenode

private void tvXML_AfterSelect(object sender, TreeViewEventArgs e) 
{ 
    if (tvXML.SelectedNode.Tag != null) 
    { 
    } 
    if (e.Node.Tag != null) 
    { 
    } 
} 

Beide Werte auswerten ausgewählt ist auf null. Wie kann ich dieses Problem lösen?

+1

Dies funktioniert für mich - SOUN kann d dumm, aber bist du sicher, dass du die Knoten nicht irgendwo änderst, um das Tag auf null zu setzen? –

+0

Sie müssen den Debugger verwenden und Schritt in den Code, um zu sehen, was tatsächlich passiert –

+0

Dazwischen, ich nicht mehr die Tag-Eigenschaft zu berühren. Und ja, ich habe den Debugger benutzt. In der ersten Methode sehe ich, dass der Tag seinen Wert bekommt, und in der Sekunde sehe ich, dass der Wert leer ist. – Ikke

Antwort

8

Der Code, den Sie geschrieben sollte funktionieren, wie sie ist. Etwas anderes in deinem Code, Code, den du hier nicht gepostet hast, verursacht, dass dies kaputt geht. Es könnte das Tag löschen, es könnte eine Datenbindung sein, die auf dem Tag usw. gesetzt ist.

Ohne all Ihren Code zu sehen, ist das Beste, was ich tun kann, raten und Ihnen helfen, das Problem zu isolieren.

Folgendes würde ich tun: setup Visual Studio to allow stepping into the .NET framework source code with the debugger. Legen Sie dann einen Haltepunkt für die TreeNode.Tag-Eigenschaft fest. Nachdem Sie das Tag in Ihrem Code auf Ihre AttributePair-Liste gesetzt haben, sehen Sie, wann es wieder gesetzt wird. Der Haltepunkt wird getroffen, Sie sehen sich den Stack-Trace an und sehen, was genau die Tag-Eigenschaft löscht.

+2

Das scheint wie eine sehr brauchbare Antwort ... – JustLoren

0

Vielleicht weisen Sie die Werte nach Select-Ereignis zu. Andernfalls können Sie ein Verzeichnis mit TreeNode- und Tag-Werten als Umgehungslösung pflegen.

+0

Die Klasse, die den Wert zuweist, erstellt die Treenodes. Daher ist es nicht möglich, dass sie nach dem Select-Ereignis zugewiesen wird. Ich dachte auch an diese Problemumgehung, aber ich möchte es vermeiden – Ikke

3

Wenn Tag-Eigenschaft verwendet, ist im Prinzip nicht, ich bin empfehlen TreeItem erben:

public class MyTreeNode : TreeNode 
{ 
    public List<AttributePair> list; 

    public MyTreeNode (string text,List<AttributePair> list) : base(text) 
    { 
     this.list = list; 
    } 
    //or 
    public MyTreeNode (string text) : base(text) 
    { 
     this.list = new List<AttributePair>(); 
    } 
} 

Und es verwenden:

private void tvXML_AfterSelect(object sender, TreeViewEventArgs e) 
{ 
    if (tvXML.SelectedNode is MyTreeNode) 
    { 
     MyTreeNode selectedNode = tvXML.SelectedNode as MyTreeNode; 
     selectedNode.list.Add(.., ..); 
    } 
    if (e.Node is MyTreeNode) 
    { 
     MyTreeNode node = e.Node as MyTreeNode; 
     node.list.Add(.., ..); 
    } 
} 
0

Versuchen Sie, Ihr List-Objekt irgendwo oberhalb zu deklarieren/initialisieren (außerhalb des inneren Bereichs, in dem Sie sich befinden) und wenn Sie der .tag -Eigenschaft zuweisen - erstellen Sie keine neue Liste, sondern weisen Sie zuvor erstellte List-Objekte zu.

0

Ohne den Rest Ihres Codes zu sehen, müssen wir fundierte Vermutungen anstellen. Angesichts dessen, was Sie in den Kommentaren zu Ihrer Frage

Dazwischen habe ich nicht mehr die Tag-Eigenschaft zu berühren. Und ja, ich habe den Debugger benutzt. In die erste Methode, ich sehe das Tag bekommen seinen Wert, und in der Sekunde, sehe ich den Wert ist leer.

Ich würde sagen, dass die Kontrolle, die das Ereignis erzeugt (das, das durch den Parametergeber empfangen wird) nicht tvXML ist.

Haben Sie andere TreeViews in diesem Formular? Haben Sie zufällig das Ereignis an die falsche Instanz von TreeView gebunden?

Eine einfache Möglichkeit, dies zu überprüfen, ist der Vergleich zwischen Absender und tvXML.


private void tvXML_AfterSelect(object sender, TreeViewEventArgs e) { 
    // FOR DEBUG: Check it is the right instance 
    if (sender != tvXML) { 
     throw new InvalidOperationException(); 
    } 

    if (tvXML.SelectedNode.Tag != null) { 
    } 
    if (e.Node.Tag != null) { 
    } 
} 

+0

Ich habe nur ein Treeview-Objekt in meinem Projekt. Ich habe versucht, Sender anstelle von tvXML zu verwenden, aber das macht keinen Unterschied. – Ikke

0
private TreeViewItem _subsender; 
    private object _senderTag; 
    public TreeViewItem _sender 
    { 
     get { 
      return _subsender; 
     } 
     set 
     { 
      _senderTag = value.Tag; 
      _subsender = value; 
     } 
    } 

Haben Sie das gleiche Problem das die Lösung, die ich

Verwenden Sie einfach nicht die .tag gefunden, aber _senderTag

(die Linien nicht für einige in der Menge ändern Grund: D)

(Sie kann nicht nur den Tag zurückgesetzt (vielleicht neue TreeViewItem))

Verwandte Themen