h41msh1c0r
Goto Top

Powershell Treeview Tiefe ermitteln

Hi@PS Profis,

mir ist der Codeschnipsel von Uwe wieder in die in die Finger gefallen.

$buttonXMLLoad_Click={
	#TODO: Place custom script here
	
	function parseXML([System.Xml.XmlNode]$node, [System.Windows.Forms.TreeNode]$treenode)
	{
		$node.Childnodes | %{ $tn = $treenode.Nodes.Add($_.Name); parseXML $_ $tn }
	}
	
	if ($openFileDialog1.ShowDialog())
	{
		$treeviewNav.Nodes.Clear()
		$xml = new-object XML
		$xml.Load($openFileDialog1.FileName)
		$rootNode = $treeviewNav.Nodes.Add($xml.ChildNodes[1].Name)
		
		parseXML $xml.DocumentElement $rootNode
	}
	
}

Jetzt wollte ich parseXML anpassen(um Parameter für die maximale Tiefe erweitern) und bekomme die Tiefe vom TreeView nicht raus.

Ich habe unterschiedliche Tiefen in den Subtrees. Jetzt soll in dem View nur bis zur Vorletzten Ebene die Elemente angezeigt werden.
Wenn ich in den Tree klicke soll der Inhalt der Node in einem Datagridview angezeigt werden.

getNoteCount

Liefert mir einen Counter allerdings immer von der aktuellen Ebene.

Über "Level" komm ich auch nur ran wenn die Node selektiert wäre.

;(

Über was bekomme ich die Tiefe vom Tree raus?

Gruß vom H41mS1C0r

Content-ID: 291060

Url: https://administrator.de/forum/powershell-treeview-tiefe-ermitteln-291060.html

Ausgedruckt am: 08.04.2025 um 14:04 Uhr

122990
122990 16.12.2015 aktualisiert um 15:19:47 Uhr
Goto Top
Prüfe einfach in parseXML den Knoten auf Vorhandensein von weiteren Childnodes und wenn diese keine mehr haben füge den Knoten nicht mehr hinzu...

Gruß grexit

p.s. Wer ist Uwe ?? Uwe Seeler ?
ITvortex
ITvortex 16.12.2015 um 13:30:11 Uhr
Goto Top
Zitat von @122990:

Prüfe einfach in parseXML in der Schleife den nächsten Knoten auf Vorhandensein von weiteren Childnodes und wenn diese keine mehr haben füge sie nicht mehr hinzu...

Gruß grexit

p.s. Wer ist Uwe ?? Uwe Seeler ?

@colinardo ist Uwe face-smile
122990
122990 16.12.2015 aktualisiert um 13:32:51 Uhr
Goto Top
Zitat von @ITvortex:
p.s. Wer ist Uwe ?? Uwe Seeler ?
@colinardo ist Uwe face-smile
Na das nenn ich mal eine Aussage, Danke. Gibt hier ja doch einige Uwe's face-smile
AnkhMorpork
AnkhMorpork 16.12.2015 um 13:38:25 Uhr
Goto Top
Zitat von @122990:

Zitat von @ITvortex:
p.s. Wer ist Uwe ?? Uwe Seeler ?
@colinardo ist Uwe face-smile
Na das nenn ich mal eine Aussage, Danke. Gibt hier ja doch einige Uwe's face-smile

Aber nur einen SuperPowerShell-Uwe! face-wink
TlBERlUS
TlBERlUS 16.12.2015 um 13:50:46 Uhr
Goto Top
Zitat von @AnkhMorpork:

Zitat von @122990:

Zitat von @ITvortex:
p.s. Wer ist Uwe ?? Uwe Seeler ?
@colinardo ist Uwe face-smile
Na das nenn ich mal eine Aussage, Danke. Gibt hier ja doch einige Uwe's face-smile

Aber nur einen SuperPowerShell-Uwe! face-wink
Also gefühlt kann dieser Uwe mit allem programmieren, was nicht bei 3 auf dem Baum ist face-smile
H41mSh1C0R
H41mSh1C0R 16.12.2015 aktualisiert um 14:47:30 Uhr
Goto Top
Hi Grexit,

	function parseXML([System.Xml.XmlNode]$node, [System.Windows.Forms.TreeNode]$treenode)
	{
		$node.Childnodes | %{	
			Write-Host $node.ChildNodes.Count
			if ($node.HasChildNodes -eq $true)
			{
				$tn = $treenode.Nodes.Add($_.Name);
			       parseXML $_ $tn
			}
			else
			{
				Write-Host "keine Childs"  
			}
		}
		
	}

Leider gibt er mit trotzdem alles aus.

;(

Gruß vom H41mSh1C0r

PS:

Die Write-Hosts sind nur zum Test.
122990
122990 16.12.2015 um 15:19:19 Uhr
Goto Top
Denk doch mal ganz genau nach... welche Nodes du hier zählst face-wink und trink mal einen Kaffee ...
H41mSh1C0R
H41mSh1C0R 16.12.2015 um 15:45:51 Uhr
Goto Top
Beim durchsteppen springt er auch immer brav raus wenn er sub erreicht.

<?xml version="1.0" encoding="UTF-8"?> 
<Config>
  <Ablage>
    <Lokal>
      <Sub>
      </Sub>
    </Lokal>
    <Zentral>
      <Sub>
      </Sub>
    </Zentral>
  </Ablage>
</Config>

Der Counter gibt mir die Anzahl der Childs aus, was in jeweiligen Zweig drinnen ist.
Sprich wenn der Root "Config" ist ist der Counter 1. Bei "Ablage" ist der Counter 2 usw..

Sobald $node.Childnotes leer ist überspringt er die Schleife dahinter und ist an dem Sub vorbei.

Ich hol mir jetzt erstmal einen Kaffee, steht immernoch auf dem Schlauch.
122990
122990 16.12.2015 um 15:52:01 Uhr
Goto Top
Ich lass dich noch was zappeln, sollst ja was lernen ich sag nur wo dein Fehler liegt ...
Hier
if($node.HasChildNodes -eq $true)
Wie gesagt solltest du dich hier fragen welchen Knoten du hier auf Childnodes prüfst face-smile, den aktuellen in der Schleife ? Nein ... wenns jetzt nicht klick macht, mach Feierabend...
H41mSh1C0R
H41mSh1C0R 16.12.2015 um 16:56:31 Uhr
Goto Top
Er prüft an der Stelle halt nicht sub sondern die node da drüber und die ist halt immer $true.

Die Platte glüht allerdings, Kaffee alle und die Frage wie ich an die letzte Node prüfe konnte ich mir noch nicht beantworten. ;(

Ich werd daher Feierabend machen und morgen mit gelüfteten Kopf weiter Steppen.
122990
122990 16.12.2015 aktualisiert um 17:11:00 Uhr
Goto Top
Er prüft an der Stelle halt nicht sub sondern die node da drüber und die ist halt immer $true.

Letzter Hinweis ...

$_

:-P
H41mSh1C0R
H41mSh1C0R 17.12.2015 um 12:00:08 Uhr
Goto Top
Guten Morgen =),

$_ liefert mir das aktuelle Element was in die Pipe geschoben wurde.

Das ist nach dem Punkt möglich.
9174ecf3351e408f960421e904a89b98

Da kein Node vorhanden ist geht auch nicht folgendes.
if($_.Node.HasChildren){ 'not the last node'}else{'last node'}  

*grübel*

Gruß vom H41mSh1C0r
122990
Lösung 122990 17.12.2015 aktualisiert um 12:43:09 Uhr
Goto Top
Das ist nach dem Punkt möglich.
Nope, der GUI sollte man nicht immer vertrauen ...
if ($_.HasChildNodes){
ist dein Rezept, hier ein simples funktionsfähiges Beispiel ohne das obige gebimmsel, gibt alle Knoten auf der Konsole aus bis auf die in der letzten Ebene
$xml = [xml]@"  
<?xml version="1.0" encoding="utf-8"?>  
<root>
	<test>
		<test2></test2>
	</test>
	<test>
	    <test2>
                <sub></sub>
            </test2>
	</test>
	<test>
		<test2></test2>
	</test>
	<test>
	</test>
</root>
"@  
function parseXML($node){
    $node.ChildNodes | %{
        if ($_.HasChildNodes){
            $_.name
            parseXML $_
        }
    }
}
parseXML $xml
Wenn du jetzt immer noch Kopfschmerzen hast, sorry, dann brauchst du nochmal einen 20er Pack RedBull face-wink

I'm out here now.
Gruß grexit
H41mSh1C0R
H41mSh1C0R 17.12.2015 um 12:43:02 Uhr
Goto Top
=) Phöser GUI Editor.

Danke dir es funktioniert.

Gruß vom H41mSh1C0r