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-Key: 291060

Url: https://administrator.de/contentid/291060

Printed on: April 18, 2024 at 23:04 o'clock

Mitglied: 122990
122990 Dec 16, 2015 updated at 14:19:47 (UTC)
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 ?
Member: ITvortex
ITvortex Dec 16, 2015 at 12:30:11 (UTC)
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
Mitglied: 122990
122990 Dec 16, 2015 updated at 12:32:51 (UTC)
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
Member: AnkhMorpork
AnkhMorpork Dec 16, 2015 at 12:38:25 (UTC)
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
Member: TlBERlUS
TlBERlUS Dec 16, 2015 at 12:50:46 (UTC)
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
Member: H41mSh1C0R
H41mSh1C0R Dec 16, 2015 updated at 13:47:30 (UTC)
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.
Mitglied: 122990
122990 Dec 16, 2015 at 14:19:19 (UTC)
Goto Top
Denk doch mal ganz genau nach... welche Nodes du hier zählst face-wink und trink mal einen Kaffee ...
Member: H41mSh1C0R
H41mSh1C0R Dec 16, 2015 at 14:45:51 (UTC)
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.
Mitglied: 122990
122990 Dec 16, 2015 at 14:52:01 (UTC)
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...
Member: H41mSh1C0R
H41mSh1C0R Dec 16, 2015 at 15:56:31 (UTC)
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.
Mitglied: 122990
122990 Dec 16, 2015 updated at 16:11:00 (UTC)
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
Member: H41mSh1C0R
H41mSh1C0R Dec 17, 2015 at 11:00:08 (UTC)
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
Mitglied: 122990
Solution 122990 Dec 17, 2015 updated at 11:43:09 (UTC)
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
Member: H41mSh1C0R
H41mSh1C0R Dec 17, 2015 at 11:43:02 (UTC)
Goto Top
=) Phöser GUI Editor.

Danke dir es funktioniert.

Gruß vom H41mSh1C0r