Laden...

Herkunft von Windows.Forms.TreeView Nodes

Erstellt von chrisrabe vor 5 Jahren Letzter Beitrag vor 5 Jahren 1.903 Views
C
chrisrabe Themenstarter:in
25 Beiträge seit 2014
vor 5 Jahren
Herkunft von Windows.Forms.TreeView Nodes

Hallo Liebes Forum,

ich bearbeite ein fremdes Programm (C#) unter Visual Studio 2015 und muss dabei aus einem vorhandenen TreeView einen ChildNode entfernen. Klingt zwar komisch, aber ich bin dazu offensichtlich nicht in der Lage. Vielleicht könnt Ihr mir zeigen was ich nicht weiß?

Problem
Ich habe im laufenden Programm auf dem Haupt Form ein TreeView mit einem RootNode und vier ChildNodes. In den Properties kann ich unter 'Nodes' die 'Collection' ansehen und finde hier auch den RootNode. Die ChildNodes werden aber nicht durch die Einstellunden im treenode Editor angelegt/angezeigt (siehe anhängendes Bild).

In der Datei MeinProgram.Designer.cs finde ich wohl die Stelle, an welcher der RootNode zugewiesen wird:

  this.projectTreeView.Nodes.AddRange(new System.Windows.Forms.TreeNode[] {
            ((System.Windows.Forms.TreeNode)(resources.GetObject("projectTreeView.Nodes")))});

Mit einem Breakepoint vor dieser Zeile kann ich hier auch den RootNode und darunter die vier ChildNodes finden, habe aber schlicht keine Ahnung wo die vier ChildNodes definiert werden.
Klar ist, dass die ChildNodes durch Ausführen von 'InitializeComponent()' im Construktor des Hauptprogrammes bereits existieren.

Ich habe das Gesamte Projekt nach dem Namen des zu entfernenden ChildNodes "Control Loops" durchsucht und nichts gefunden.

Frage
Kann mir jemand sagen wo ich die Definition der ChildNodes finden kann?
Natürlich meine ich damit nicht die Zeile in meinem Euch unbekannten Quellcode, sondern ob der Ursprung irgendwo hinter der obigen Anweisung "...resources.GetObject("projectTreeView.Nodes")..." liegt. Ich verstehe diese Zeile nicht und kann in der Richtung deshalb nicht vernünftig suchen.

Vielen Dank im Voraus

5.657 Beiträge seit 2006
vor 5 Jahren

Siehe ResourceManager.GetObject. Die Werte sind also in den Resourcen gespeichert. Wenn man etwas nicht kennt, sollte man immer erstmal in der Doku nachlesen. Siehe dazu auch [Tipp] Schau in die Doku! - Möglichkeiten der Informationsgewinnung.

Weeks of programming can save you hours of planning

C
chrisrabe Themenstarter:in
25 Beiträge seit 2014
vor 5 Jahren

Hallo MrSparkle,

ich verstehe den Ansatz sich selbst vorab um eine Lösung zu bemühen durchaus richtig. Ich habe auch bereits vor Deinem Tipp als auch jetzt nochmals mich genau mit diesen Resourcen beschäftigt, komme aber sei gestern schlicht nicht vorwärts.

Es ist eine Datei MeinProgramm.Recources.dll vorhanden, in der diese ChildNodes zu finden sind. Was ich nicht verstehe ist die Herkunft dieser Datei und wie sie zu ihrem Inhalt kommt.
Ein 'Resource File' ist in den Projekt properties unter 'Application' nicht eingetragen.

Ist es denn vermessen zu fragen, ob mein Ansatz falsch ist, dass der Name der ChildNodes in exakter Schreibweise irgendwo innerhalb der Dateien im Projekt zu finden sein müsste?

Grüße

4.931 Beiträge seit 2008
vor 5 Jahren

Ich vermute, du schaust am falschen Ort.
Es sollte einen Unterordner "Properties" im Projekt geben und dort dann eine "Resources.resx" (sowie "Resources.designer.cs"), in der dann die vordefinierten Resourcen hinterlegt sind.

C
19 Beiträge seit 2017
vor 5 Jahren

Hallo chrisrabe,

grundsätzlich ist es durchaus ein möglicher Ansatz zu schauen wo die Daten herkommen und sie ggf. am Ursprung zu korrigieren. In deinem Fall liegt die Quelle der Daten außerhalb deines Einflussbereichs. Die Daten können in der dll statisch gespeichert sein, es kann aber auch sein, dass die dll einen Mechanismus enthält der die Daten zur Laufzeit aus dem Internet saugt - nur mal so ins blaue geraten.

Die Lösung für dein Problem liegt sehr warscheinlich in genau dem Codeabschnitt den du in deinem ersten Post gepostet hast. Setz an dieser Stelle einen Breakpoint und schau dir

resources.GetObject("projectTreeView.Nodes")

im Debugger an. Warscheinlich wird es der Knoten "Project - New Project*" sein, an dem dann die anderen Knoten hängen (schau dir die Nodes Eigenschaft an).

C
chrisrabe Themenstarter:in
25 Beiträge seit 2014
vor 5 Jahren

Hallo Th69,

dort habe ich als erstes eschaut, aber es gibt keinerlei Zusammenhang zwischen diesen Dateien und den ChildNodes - sprich sie tauchen dort nicht auf,

trotzdem danke für den Tip!

C
chrisrabe Themenstarter:in
25 Beiträge seit 2014
vor 5 Jahren

Hallo C#nup,

genau da liegt ja mein Problem.
Nach Ausführung dieser Zeile ist mein Knoten mit dem RootNode und den vier ChildNodes versehen.
Dies passiert also durch Ausführung der Operation von "resources.GetObject("projectTreeView.Nodes")".
Was ich halt nicht verstehe ist, woher die Informationen über diese Knoten kommen. Worauf greift denn das '.GetObject' zu?

Grüße

C
19 Beiträge seit 2017
vor 5 Jahren
  1. Knoten rausfiltern
    Chrisrabe, wenn du den Knoten rausfiltern möchtest, dann kommentiere den von dir geposteten Codeabschnitt aus und setzte den folgenden Codeabschnitt direkt darunter:


TreeNode projectNode = (System.Windows.Forms.TreeNode)(resources.GetObject("projectTreeView.Nodes"));
TreeNode controlLoopsNode = null;

            foreach(TreeNode node in projectNode.Nodes)
            {
                if (node.Text.Equals("Control Loops"))
                {
                    controlLoopsNode = node;
                    break;
                }
            }

            if (controlLoopsNode != null)
            {
                projectNode.Nodes.Remove(controlLoopsNode);
            }

this.projectTreeView.Nodes.AddRange(new System.Windows.Forms.TreeNode[] { projectNode} );            


  1. Zu deiner Frage nach dem "woher":
    Der Umstand, dass du nirgends in dem dir zugänglichen Code eine Stelle findest an der ein TreeNode Objekt mit dem Text "Control Loops" angelegt wird und die sprechende Benennung des "resources"-Objekts in deinem Quelcode deuten darauf hin, dass an dieser Stelle irgendeine Bibliothek ausgelesen wird. Diese Bibliothek zu "öffnen" und dort die Baumstruktur zu ändern ist sehr warscheinlich nicht zielführend. Einige Gründe:
  • die Bibliothek kann verschlüsselt sein
  • die Baumstruktur ist in der Bibliotek nicht hartcodiert, sondern wird zur Laufzeit aus irgendwelchen anderen Parametern erzeugt
  • andere Programme greifen auf "projectTreeView.Nodes" zu und brauchen dort den "Control Loops" Knoten

Deshalb scheint mir, dass du dich für die Entfernung "Control Loops" Knotens mit dem von mir geposteten Code begnügen solltest.

Falls du dennoch in den Bibliotheken graben willst, dann hol dir das Programm ILSpy oder einen anderen .NET Decompiler und schau dir damit die deinem Programm beigefügten .dll Dateien an. Vielleicht wirst da fündig. Aber ich rate dir nichts an den dlls zu ändern.

4.931 Beiträge seit 2008
vor 5 Jahren

Bei der "<projectname>.Resources.dll" handelt es sich um eine sog. Satelliten-Assembly, s. Erstellen von Satellitenassemblys für Desktop-Apps.
Sind evtl. noch andere DLLs dieser Art (mit Sprachkennzeichen, z.B. "de-DE" oder "en-US") vorhanden?

PS: Hier noch ein anderer Thread, der sich mit Satelliten-Assemblies beschäftigt hat (lesenswert zum besseren Verständnis): [gelöst] MultiLanguage mit RessourcenDateien (Sattelite Assemblies) - Wie Sprache hinzufuegen?
Dort (und auch im verlinkten Artikel [Tutorial] Lokalisierung von Texten in .NET) sind Links zu Ressource-Editoren angegeben, mit denen du dann die "resource.dll" öffnen und editieren kannst.

PPS: @c#nup, in der "designer.cs" sollte man händisch keine Änderungen vornehmen. Wenn, dann im Konstruktor (nach InitializeComponent())!

C
chrisrabe Themenstarter:in
25 Beiträge seit 2014
vor 5 Jahren

Guten Morgen Th69 und C#nup,

vielen Dank für Eure Tips!

Es ist zwar nicht unbedingt die elegante Variante, aber ich konnte durch Euch immerhin mein Ziel erreichen den ungewünschten Node zu entfernen.

Ein schlichtes

projectTreeView.Nodes[0].Nodes[2].Remove();

nach dem InitializeComponent() im Constructor beendet meine Suche nun bis auf weiteres erfolgreich.

Danke nochmals!!

Grüße
Chrisrabe

463 Beiträge seit 2009
vor 5 Jahren

Ein schlichtes

projectTreeView.Nodes[0].Nodes[2].Remove();  

nach dem InitializeComponent() im Constructor beendet meine Suche nun bis auf weiteres erfolgreich.

Sorry, aber das ist ein dreckiger Hack - du erzeugst zuerst die Node um Sie dann wieder zu löschen. Warum erledigst du deinen Job nicht sauber indem du gar nicht erst die Node erzeugst?