blackhawk17
Goto Top

Powershell Drop Down Menü erstellen

Guten Morgen,

ich möchte mir mit Windows Forms gerne ein Powershell Drop Down Menü bauen.

Das schaut bei mit im Versucht so aus:

        $objLabel = New-Object System.Windows.Forms.Label
        $objLabel.Location = New-Object System.Drawing.Size(28,60) 
        $objLabel.Size = New-Object System.Drawing.Size(1000,20) 
        $objLabel.Text = "Bitte Benutzernamen wählen:"  
        $objForm.Controls.Add($objLabel) 

            $objCombobox = New-Object System.Windows.Forms.Combobox 
            $objCombobox.Location = New-Object System.Drawing.Size(30,80) 
            $objCombobox.Size = New-Object System.Drawing.Size(200,20) 
            $objCombobox.Height = 70
            $objForm.Controls.Add($objCombobox) 
            $objForm.Topmost = $True
            $objForm.Add_Shown({$objForm.Activate()})
            $objCombobox.Items.AddRange($user) #User werden aus der Variable geladen und angezeigt
            $objCombobox.SelectedItem #ausgewählter Username wird übernommen
            
            $objCombobox.Add_SelectedIndexChanged({ 


                   $postfachordner = Get-MailboxFolder -Identity $objCombobox.SelectedItem -Recurse



                        $objLabel = New-Object System.Windows.Forms.Label
                        $objLabel.Location = New-Object System.Drawing.Size(28,120) 
                        $objLabel.Size = New-Object System.Drawing.Size(1000,20) 
                        $objLabel.Text = "Postfachordner wählen:"  
                        $objForm.Controls.Add($objLabel) 

                            $objComboboxpostfach = New-Object System.Windows.Forms.Combobox 
                            $objComboboxpostfach.Location = New-Object System.Drawing.Size(30,140) 
                            $objComboboxpostfach.Size = New-Object System.Drawing.Size(200,20) 
                            $objComboboxpostfach.Height = 70
                            $objForm.Controls.Add($objComboboxpostfach) 
                            $objForm.Topmost = $True
                            $objForm.Add_Shown({$objForm.Activate()})
                            $objComboboxpostfach.Items.AddRange($postfachordner) #User werden aus der Variable geladen und angezeigt
                            $objComboboxpostfach.SelectedItem #ausgewählter Username wird übernommen

                })

Ansicht funktioniert die Funktion so auch recht gut.

Wenn ich im ersten Dop Down Feld etwas auswähle, dass dann ein Befehl verarbeitet wird und die Ausgabe dann im nächsten Drop Down Feld steht, welches erst erscheint, wenn im ersten Feld etwas ausgewählt wurde.

Leider ist es aber so, dass der Wert, welchen ich im 2. Dropdown Feld auswähle irgendwie nicht übernommen wird. Die Variable $objComboboxpostfach.SelectedItem ist einfach leer.

Ich verstehe nicht warum das so ist.

Hat da jemand von Euch einen Tipp für mich?

Vielen Dank

Content-ID: 375749

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

Ausgedruckt am: 17.11.2024 um 01:11 Uhr

136166
136166 01.06.2018 aktualisiert um 12:17:29 Uhr
Goto Top
Mach bitte erst mal deine zwei anderen Fragen dicht ... In der man dir schon Lösungen angeboten hat.
Die Variable $objComboboxpostfach.SelectedItem ist einfach leer.
Erstens weil zu dem Zeitpunkt nichts ausgewählt ist, und zweitens du mein Kommentar in deinem letzten Beitrag nicht gelesen hast!
blackhawk17
blackhawk17 01.06.2018 um 12:33:55 Uhr
Goto Top
Hallo,
vielen Dank für deinen Beitrag.
Das eine hat aber hier nichts mit dem anderen zu tun.

Die Werte werden ja mit $postfachordner = Get-MailboxFolder -Identity $objCombobox.SelectedItem -Recurse sauber ausgegeben.

Nur was ich nicht verstehe ist, wenn du sagst, dass da bei der Auswahl nichts drin ist wie man den Wert dann übergeben bekommt.
136166
136166 01.06.2018 aktualisiert um 14:57:13 Uhr
Goto Top
Zitat von @blackhawk17:

Hallo,
vielen Dank für deinen Beitrag.
Das eine hat aber hier nichts mit dem anderen zu tun.
Eben doch!! Das versuche ich dir ja klar zu machen.
Die Werte werden ja mit $postfachordner = Get-MailboxFolder -Identity $objCombobox.SelectedItem -Recurse sauber ausgegeben.
Das meinst du, aber das was du dort als Ergebnis bekommst sind MailboxFolder -Objekte keine Strings, deswegen bekommst du als Ergebnis ein Objekt und keinen String
Nur was ich nicht verstehe ist, wenn du sagst, dass da bei der Auswahl nichts drin ist wie man den Wert dann übergeben bekommt.
Das steht in deinem letzten Beitrag in meinem Kommentar warum und wieso. Extrahiere die reine Eigenschaft "Folderpath", bei dir also den Pfad und dann bekommst du bei SelectedItem auch den String und nicht das Objekt.
Außerdem ist zum Zeitpunkt in Zeile 38 direkt nach dem Hinzufügen der Einträge kein Eintrag ausgewählt, .SelectedItem also NULL.
blackhawk17
blackhawk17 01.06.2018 um 22:00:49 Uhr
Goto Top
ah ok jetzt verstehe ich was du meinst.

Vielen Dank für den Tipp face-smile.

Wo es bei mir allerdings immer noch ein Unverständnis gibt ist die besagte Zeile 38.

Wie bekomme ich den Wert denn da vernünftig übergeben?
136166
136166 02.06.2018 aktualisiert um 07:13:00 Uhr
Goto Top
Wie bekomme ich den Wert denn da vernünftig übergeben?
Genau wie beim ersten DD sobald der User die Auswahl im DD tätigt im Changed Event.
blackhawk17
blackhawk17 02.06.2018 um 07:51:11 Uhr
Goto Top
Ja ok aber so meine ich es ja auch gemacht zu haben, aber trotzdem geht es ja nicht.
136166
136166 02.06.2018 aktualisiert um 13:24:24 Uhr
Goto Top
Hast du aber nicht, du hast nur das erste Drop-down mit dem Change Event versehen nicht das zweite und das ist ja das von welchem du ja gerade den Wert auslesen möchtest. Wenn der User eben noch nichts ausgewählt hat gibt es auch nichts anzuzeigen!

Hier ein Beispiel mit festen Daten, kannst du ja dann durch die echten dynamischen ersetzen:
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
$label2 = New-Object System.Windows.Forms.Label
$comboBox2 = New-Object System.Windows.Forms.ComboBox
$label1 = New-Object System.Windows.Forms.Label
$comboBox1 = New-Object System.Windows.Forms.ComboBox
$InitialFormWindowState = New-Object System.Windows.Forms.FormWindowState
#endregion Generated Form Objects

$handler_form1_Load= 
{
    $comboBox1.Items.AddRange(@('Max Mustermann','Susanne Musterfrau'))  
}

$handler_comboBox1_SelectedIndexChanged= 
{
    if($comboBox1.SelectedIndex -ne -1){
        $comboBox2.Enabled = $true
        switch($comboBox1.SelectedItem){
            'Max Mustermann' {  
                $comboBox2.Items.Clear()
                $comboBox2.Items.AddRange(@("test1","test2","test3"))  
            }
            'Susanne Musterfrau' {  
                $comboBox2.Items.Clear()
                $comboBox2.Items.AddRange(@("test4","test5","test6"))  
            }

        }
    }else{
        $comboBox2.Enabled = $false
        $comboBox2.SelectedIndex = -1
    }

}

$handler_comboBox2_SelectedIndexChanged= 
{
    if($comboBox2.SelectedIndex -ne -1){
        [System.Windows.Forms.MessageBox]::Show($comboBox2.SelectedItem)
    }

}

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

#----------------------------------------------
$System_Drawing_Size = New-Object System.Drawing.Size
$System_Drawing_Size.Height = 82
$System_Drawing_Size.Width = 238
$form1.ClientSize = $System_Drawing_Size
$form1.DataBindings.DefaultDataSourceUpdateMode = 0
$form1.FormBorderStyle = 3
$form1.Name = "form1"  
$form1.Text = "Dropdown Test"  
$form1.add_Load($handler_form1_Load)

$label2.DataBindings.DefaultDataSourceUpdateMode = 0

$System_Drawing_Point = New-Object System.Drawing.Point
$System_Drawing_Point.X = 12
$System_Drawing_Point.Y = 42
$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 = 55
$label2.Size = $System_Drawing_Size
$label2.TabIndex = 3
$label2.Text = "Second"  

$form1.Controls.Add($label2)

$comboBox2.DataBindings.DefaultDataSourceUpdateMode = 0
$comboBox2.Enabled = $False
$comboBox2.FormattingEnabled = $True
$System_Drawing_Point = New-Object System.Drawing.Point
$System_Drawing_Point.X = 73
$System_Drawing_Point.Y = 39
$comboBox2.Location = $System_Drawing_Point
$comboBox2.Name = "comboBox2"  
$System_Drawing_Size = New-Object System.Drawing.Size
$System_Drawing_Size.Height = 21
$System_Drawing_Size.Width = 121
$comboBox2.Size = $System_Drawing_Size
$comboBox2.TabIndex = 2
$comboBox2.DropDownStyle = 2
$comboBox2.add_SelectedIndexChanged($handler_comboBox2_SelectedIndexChanged)

$form1.Controls.Add($comboBox2)

$label1.DataBindings.DefaultDataSourceUpdateMode = 0

$System_Drawing_Point = New-Object System.Drawing.Point
$System_Drawing_Point.X = 12
$System_Drawing_Point.Y = 15
$label1.Location = $System_Drawing_Point
$label1.Name = "label1"  
$System_Drawing_Size = New-Object System.Drawing.Size
$System_Drawing_Size.Height = 23
$System_Drawing_Size.Width = 42
$label1.Size = $System_Drawing_Size
$label1.TabIndex = 1
$label1.Text = "First"  

$form1.Controls.Add($label1)

$comboBox1.DataBindings.DefaultDataSourceUpdateMode = 0
$comboBox1.FormattingEnabled = $True
$System_Drawing_Point = New-Object System.Drawing.Point
$System_Drawing_Point.X = 75
$System_Drawing_Point.Y = 12
$comboBox1.Location = $System_Drawing_Point
$comboBox1.Name = "comboBox1"  
$System_Drawing_Size = New-Object System.Drawing.Size
$System_Drawing_Size.Height = 21
$System_Drawing_Size.Width = 121
$comboBox1.Size = $System_Drawing_Size
$comboBox1.TabIndex = 0
$comboBox1.DropDownStyle = 2
$comboBox1.add_SelectedIndexChanged($handler_comboBox1_SelectedIndexChanged)

$form1.Controls.Add($comboBox1)

#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
blackhawk17
blackhawk17 02.06.2018 um 16:13:29 Uhr
Goto Top
oh vielen Dank face-smile.

Ich schaue es mir heute Abend an. Du hast da ja einen etwas anderen Aufbau als ich.

Ich dachte immer, wenn ich $objCombobox.Add_SelectedIndexChanged({ setze reicht das und mir fehlte das Verständnis wie denn der Wert in die 2. Combobox hineinkommen soll.
blackhawk17
blackhawk17 02.06.2018 um 20:14:52 Uhr
Goto Top
Tut mir leid aber ich kann dem was du da geschrieben nichts entnehmen.

Der Aufbau ist komplett anders als meiner. Und ich verstehe nicht warum mein Aufbau so wie er ist nicht funktioniert, da ich im 2. DropDown Feld ja die Werte angezeigt bekomme, diese aber nicht übernommen werden.

Ich weiß leider auch nicht wie ich meine Abfrage in deine Zeilen einbauen soll.

Trotzdem vielen Dank für deine Mühe.
136166
136166 02.06.2018 aktualisiert um 22:18:54 Uhr
Goto Top
Habe ich dir oben schon x mal geschrieben! Weil zu diesem Zeitpunkt keine Auswahl existiert.

Außerdem solltest du dich dringend mit folgendem Artikel beschäftigen about_Scopes - TechNet - Microsoft


Dann arbeite dich noch etwas weiter ins Thema ein, ein Meister fällt nicht mal eben vom Himmel.
blackhawk17
blackhawk17 03.06.2018 um 11:01:04 Uhr
Goto Top
Da hast du natürlich recht, dass noch kein Meister von Himmel gefallen ist face-smile.

Wenn ich mir jetzt dein Skript anschaue dann kann ich ja meine Variable $Shares bei $comboBox1.Items.AddRange(@('Max Mustermann','Susanne Musterfrau')) einsetzen.

Das funktioniert auch und mir werden die Daten aus der Variable angezeigt.

Die Combobox 2 hast du ja per Default auf "ausgeblendet" gesetzt, da sie erst aktiv werden soll, wenn in der 1. Combobox ein Wert eingetragen ist.

Wo es bei mir einfach dann stecken bleibt ist, wie ich meinen Befehl "$postfachordner = Get-MailboxFolder -Identity $objCombobox.SelectedItem -Recurse" abfeuern kann um damit die Combobox2 dann zu füttern, da dieser Befehl ja von der Combobox 1 abhängig ist.

Wenn ich dieses Verständnis hätte wie ich das realisieren kann wäre dieser Post eigentlich dann auch gelöst. face-smile