today12
Goto Top

Powershell - richtige Verwendung dieses Array

Hallo Leute,

bin wiedermal auf eure Hilfe angewiesen.
kurze Info vorweg: Ich arbeite mit dem Sapien Powershell Studio 2014

In dieser GUI befindet sich eine "Listbox" . Mit dieser werden nur die Namen aufgelistet.
...diese Namen werden aus der "Hash-Table" ausgelesen und sollen dann dem "Listbox" übergeben werden.
Das funktioniert soweit.

1a8c4d6b026b2c4068b57109c058c645


Was ich haben möchte ist, wenn ich auf einen dieser Namen klicke, dann soll mir in den unten definierten "Textboxen" die dazu gehörigen Werte noch angezeigt werden (wie: Vorname; OU)

Funktionieren tut das ganze leider nicht, da er ja anscheinend nicht mehr in der Hashtable sucht, sondern nur in der Tabelle "Nachname"


Meine Frage an euch ? .. Wie kann ich das am besten umsetzen.


18d14c9dce5299b29cdf38fe92806e86


Vielen Dank schon mal

Content-ID: 266683

Url: https://administrator.de/forum/powershell-richtige-verwendung-dieses-array-266683.html

Ausgedruckt am: 22.12.2024 um 23:12 Uhr

colinardo
colinardo 18.03.2015 aktualisiert um 16:25:14 Uhr
Goto Top
Hallo today12,

Hier eine mögliche Beispiel-Form / Code sagt mehr als 1000 Worte:
(Kommentare findest du im Code)

-edit- Verwende doch ein DataGridView Steuerelement das mehrere Spalten unterstützt und stelle die Daten gleich in der Liste dar, Platz wäre ja genug da...Siehe das Beispiel weiter unten
function GenerateForm {

#region Import the Assemblies
[reflection.assembly]::loadwithpartialname("System.Windows.Forms") | Out-Null  
[reflection.assembly]::loadwithpartialname("System.Drawing") | Out-Null  
#endregion

#region Generated Form Objects
$form1 = New-Object System.Windows.Forms.Form
$label3 = New-Object System.Windows.Forms.Label
$label2 = New-Object System.Windows.Forms.Label
$label1 = New-Object System.Windows.Forms.Label
$txtOU = New-Object System.Windows.Forms.TextBox
$txtNachname = New-Object System.Windows.Forms.TextBox
$txtVorname = New-Object System.Windows.Forms.TextBox
$lb1 = New-Object System.Windows.Forms.ListBox
$InitialFormWindowState = New-Object System.Windows.Forms.FormWindowState
#endregion Generated Form Objects

#----------------------------------------------
#Generated Event Script Blocks
#----------------------------------------------

# Beispieldaten generieren
$daten = @()
$daten += New-Object PSObject -Property @{Vorname="Max";Nachname="Muster";OU="Vertrieb"}  
$daten += New-Object PSObject -Property @{Vorname="Ute";Nachname="Musterfrau";OU="Marketing"}  
$daten += New-Object PSObject -Property @{Vorname="Sepp";Nachname="Meier";OU="Lager"}  

$handler_form1_Load= 
{
    # Listbox mit den Namen füllen
    $lb1.DataSource = $daten.Nachname
}

$handler_lb1_SelectedIndexChanged= 
{
    # wenn eine Auswahl existiert
    if($lb1.SelectedIndex -ne -1){
        # setze die Daten der Textboxen mit den gewünschten Index aus dem Daten-Array
        $txtVorname.Text = $daten[$lb1.SelectedIndex].Vorname
        $txtNachname.Text = $daten[$lb1.SelectedIndex].Nachname
        $txtOU.Text = $daten[$lb1.SelectedIndex].OU
    }
}

$OnLoadForm_StateCorrection=
{#Correct the initial state of the form to prevent the .Net maximized form issue
	$form1.WindowState = $InitialFormWindowState
}

#----------------------------------------------
#region Generated Form Code
$System_Drawing_Size = New-Object System.Drawing.Size
$System_Drawing_Size.Height = 318
$System_Drawing_Size.Width = 425
$form1.ClientSize = $System_Drawing_Size
$form1.DataBindings.DefaultDataSourceUpdateMode = 0
$form1.Name = "form1"  
$form1.Text = "Demo-ListBox-Selection-Change"  
$form1.add_Load($handler_form1_Load)

$label3.DataBindings.DefaultDataSourceUpdateMode = 0

$System_Drawing_Point = New-Object System.Drawing.Point
$System_Drawing_Point.X = 12
$System_Drawing_Point.Y = 292
$label3.Location = $System_Drawing_Point
$label3.Name = "label3"  
$System_Drawing_Size = New-Object System.Drawing.Size
$System_Drawing_Size.Height = 23
$System_Drawing_Size.Width = 59
$label3.Size = $System_Drawing_Size
$label3.TabIndex = 6
$label3.Text = "OU"  

$form1.Controls.Add($label3)

$label2.DataBindings.DefaultDataSourceUpdateMode = 0

$System_Drawing_Point = New-Object System.Drawing.Point
$System_Drawing_Point.X = 195
$System_Drawing_Point.Y = 266
$label2.Location = $System_Drawing_Point
$label2.Name = "label2"  
$System_Drawing_Size = New-Object System.Drawing.Size
$System_Drawing_Size.Height = 23
$System_Drawing_Size.Width = 61
$label2.Size = $System_Drawing_Size
$label2.TabIndex = 5
$label2.Text = "Nachname"  

$form1.Controls.Add($label2)

$label1.DataBindings.DefaultDataSourceUpdateMode = 0

$System_Drawing_Point = New-Object System.Drawing.Point
$System_Drawing_Point.X = 12
$System_Drawing_Point.Y = 266
$label1.Location = $System_Drawing_Point
$label1.Name = "label1"  
$System_Drawing_Size = New-Object System.Drawing.Size
$System_Drawing_Size.Height = 17
$System_Drawing_Size.Width = 59
$label1.Size = $System_Drawing_Size
$label1.TabIndex = 4
$label1.Text = "Vorname"  

$form1.Controls.Add($label1)

$txtOU.DataBindings.DefaultDataSourceUpdateMode = 0
$System_Drawing_Point = New-Object System.Drawing.Point
$System_Drawing_Point.X = 77
$System_Drawing_Point.Y = 289
$txtOU.Location = $System_Drawing_Point
$txtOU.Name = "txtOU"  
$System_Drawing_Size = New-Object System.Drawing.Size
$System_Drawing_Size.Height = 20
$System_Drawing_Size.Width = 112
$txtOU.Size = $System_Drawing_Size
$txtOU.TabIndex = 3

$form1.Controls.Add($txtOU)

$txtNachname.DataBindings.DefaultDataSourceUpdateMode = 0
$System_Drawing_Point = New-Object System.Drawing.Point
$System_Drawing_Point.X = 262
$System_Drawing_Point.Y = 263
$txtNachname.Location = $System_Drawing_Point
$txtNachname.Name = "txtNachname"  
$System_Drawing_Size = New-Object System.Drawing.Size
$System_Drawing_Size.Height = 20
$System_Drawing_Size.Width = 151
$txtNachname.Size = $System_Drawing_Size
$txtNachname.TabIndex = 2

$form1.Controls.Add($txtNachname)

$txtVorname.DataBindings.DefaultDataSourceUpdateMode = 0
$System_Drawing_Point = New-Object System.Drawing.Point
$System_Drawing_Point.X = 77
$System_Drawing_Point.Y = 263
$txtVorname.Location = $System_Drawing_Point
$txtVorname.Name = "txtVorname"  
$System_Drawing_Size = New-Object System.Drawing.Size
$System_Drawing_Size.Height = 20
$System_Drawing_Size.Width = 112
$txtVorname.Size = $System_Drawing_Size
$txtVorname.TabIndex = 1

$form1.Controls.Add($txtVorname)

$lb1.Anchor = 15
$lb1.DataBindings.DefaultDataSourceUpdateMode = 0
$lb1.FormattingEnabled = $True
$System_Drawing_Point = New-Object System.Drawing.Point
$System_Drawing_Point.X = 12
$System_Drawing_Point.Y = 12
$lb1.Location = $System_Drawing_Point
$lb1.Name = "lb1"  
$System_Drawing_Size = New-Object System.Drawing.Size
$System_Drawing_Size.Height = 238
$System_Drawing_Size.Width = 401
$lb1.Size = $System_Drawing_Size
$lb1.TabIndex = 0
$lb1.add_SelectedIndexChanged($handler_lb1_SelectedIndexChanged)

$form1.Controls.Add($lb1)

#endregion Generated Form Code

#Save the initial state of the form
$InitialFormWindowState = $form1.WindowState
#Init the OnLoad event to correct the initial state of the form
$form1.add_Load($OnLoadForm_StateCorrection)
#Show the Form
$form1.ShowDialog()| Out-Null

} #End Function

#Call the Function
GenerateForm

back-to-topNachtrag
Hier noch eine Variante mit einem DataGridView
function GenerateForm {
#region Import the Assemblies
[reflection.assembly]::loadwithpartialname("System.Windows.Forms") | Out-Null  
[reflection.assembly]::loadwithpartialname("System.Drawing") | Out-Null  
#endregion

#region Generated Form Objects
$form1 = New-Object System.Windows.Forms.Form
$dgv = New-Object System.Windows.Forms.DataGridView
$InitialFormWindowState = New-Object System.Windows.Forms.FormWindowState
#endregion Generated Form Objects

#----------------------------------------------
#Generated Event Script Blocks
#----------------------------------------------
$daten = @()
$daten += New-Object PSObject -Property @{Vorname="Max";Nachname="Muster";OU="Vertrieb"}  
$daten += New-Object PSObject -Property @{Vorname="Ute";Nachname="Musterfrau";OU="Marketing"}  
$daten += New-Object PSObject -Property @{Vorname="Sepp";Nachname="Meier";OU="Lager"}  

$handler_form1_Load= 
{
    $arrList = New-Object System.Collections.ArrayList
    $arrList.AddRange($daten)
    $dgv.DataSource = $arrList
}

$OnLoadForm_StateCorrection=
{#Correct the initial state of the form to prevent the .Net maximized form issue
	$form1.WindowState = $InitialFormWindowState
}

#----------------------------------------------
#region Generated Form Code
$System_Drawing_Size = New-Object System.Drawing.Size
$System_Drawing_Size.Height = 262
$System_Drawing_Size.Width = 425
$form1.ClientSize = $System_Drawing_Size
$form1.DataBindings.DefaultDataSourceUpdateMode = 0
$form1.Name = "form1"  
$form1.Text = "Demo mit DataGridView"  
$form1.add_Load($handler_form1_Load)

$dgv.Anchor = 15
$dgv.DataBindings.DefaultDataSourceUpdateMode = 0
$System_Drawing_Point = New-Object System.Drawing.Point
$System_Drawing_Point.X = 12
$System_Drawing_Point.Y = 12
$dgv.Location = $System_Drawing_Point
$dgv.Name = "dgv"  
$System_Drawing_Size = New-Object System.Drawing.Size
$System_Drawing_Size.Height = 234
$System_Drawing_Size.Width = 401
$dgv.Size = $System_Drawing_Size
$dgv.TabIndex = 7

$form1.Controls.Add($dgv)

#endregion Generated Form Code

#Save the initial state of the form
$InitialFormWindowState = $form1.WindowState
#Init the OnLoad event to correct the initial state of the form
$form1.add_Load($OnLoadForm_StateCorrection)
#Show the Form
$form1.ShowDialog()| Out-Null

} #End Function

#Call the Function
GenerateForm


Grüße Uwe
today12
today12 19.03.2015 um 08:44:53 Uhr
Goto Top
Vielen Vielen Dank =)

Leider funktioniert das ganze noch nicht so wie es sein sollte ^^

Das mit dem "SelectedIndexChanged" hab ich lt. deinem Bespiel überarbeitet..
...aber ich glaube das Problem liegt eher daran, dass die Hashtable über die Schleife gefüllt wird und somit die Variablen überschreibt.

Deine Methode funktioniert ;) - aber ich kann ja 600 Benutzer händisch anlegen .

Hast du noch einen Tipp für mich ?

Danke
colinardo
colinardo 19.03.2015 aktualisiert um 09:15:23 Uhr
Goto Top
Zitat von @today12:
Deine Methode funktioniert ;) - aber ich kann ja 600 Benutzer händisch anlegen .

Hast du noch einen Tipp für mich ?
Hallo today12,
das ganze war ja nur ein Beispiel und die Daten hatte ich nur manuell angelegt damit was zum Anzeigen da war !
Selbst verständlich kannst du das Array auch über eine Schleife mit deinen Daten befüllen.
Du erstellst wie in meinem Beispiel ein leeres Array
$daten = @()
und dann füllst du dieses Array in deiner Schleife mit "Custom Objects" in denen die Daten für den jeweiligen User stehen, da du hier zu wenig Code von dir gepostet hast kann ich wieder nur ein Beispiel anbringen:
foreach($user in $users){
   $daten += New-Object PSObject -Property @{Vorname=$user.FirstName;Nachname=$user.LastName;OU=$user.OU} 
}
Fertig!

Grüße Uwe
today12
today12 19.03.2015 um 11:55:16 Uhr
Goto Top
Danke, aber ich komm einfach nicht drauf... dürfe wohl einen großen Denkfehler haben =(

also das ganze befindet sich schon in einer Schleife, soll ich da dann noch eine machen ?! achhh ^^

While ($FirstDoc -ne $null)
{
$Voll = $FirstDoc.getItemValue("FullName")
$Voll = $Voll.Replace('CN=', '')
$Voll = $Voll.Replace('OU=', '')
$Voll = $Voll.Replace('O=', '')
$Split = $Voll.split("/")
[string]$OU = $Split[1]
$O = $Split[2]

[string]$Nachname = $FirstDoc.GetItemValue("LastName")
[string]$Vorname = $FirstDoc.GetItemValue("FirstName")
$Mail = $FirstDoc.GetItemValue("MailFile")


$Userinf = @()
$Userinf += New-Object PSObject -Property @{ Nachname = $nachnamen; Vorname = $Vorname; OU = $OU }


Load-ListBox $listboxNotesBenutzer $Userinf.Nachname -Append


$NextDoc = $DomView.GetNextDocument($FirstDoc)
$FirstDoc = $NextDoc


}


$listboxNotesBenutzer_SelectedIndexChanged={

Update-NavButtons

$txtNotesOU.Text = $Userinf[$listboxNotesBenutzer.SelectedIndex].OU


}
colinardo
Lösung colinardo 19.03.2015, aktualisiert am 20.03.2015 um 11:46:20 Uhr
Goto Top
Zitat von @today12:

Danke, aber ich komm einfach nicht drauf... dürfe wohl einen großen Denkfehler haben =(
Yup den hast du leider, das Array hast du nicht außerhalb der Schleife deklariert, so wird es ja immer wieder überschrieben face-wink. Da du den Code hier nicht in Code-Tags gesetzt hast folgender berichtigter Code ohne Gewähr auch weil ich den kompletten Code nicht kenne:
$Userinf = @()
While ($FirstDoc -ne $null)
{
    $Voll = $FirstDoc.getItemValue("FullName")  
    $Voll = $Voll.Replace('CN=', '')  
    $Voll = $Voll.Replace('OU=', '')  
    $Voll = $Voll.Replace('O=', '')  
    $Split = $Voll.split("/")  
    [string]$OU = $Split[1]
    $O = $Split[2]

    [string]$Nachname = $FirstDoc.GetItemValue("LastName")  
    [string]$Vorname = $FirstDoc.GetItemValue("FirstName")  
    $Mail = $FirstDoc.GetItemValue("MailFile")  
    
    $Userinf += New-Object PSObject -Property @{Nachname=$Nachname;Vorname=$Vorname;OU=$OU}

    Load-ListBox $listboxNotesBenutzer $Nachname -Append

    $NextDoc = $DomView.GetNextDocument($FirstDoc)
    $FirstDoc = $NextDoc
}

$listboxNotesBenutzer_SelectedIndexChanged={
    Update-NavButtons
    $txtNotesOU.Text = $Userinf[$listboxNotesBenutzer.SelectedIndex].OU
}
today12
today12 20.03.2015 um 11:47:09 Uhr
Goto Top
aahhh.. Vielen Vielen Dank =)
Hat funktioniert ;)