Jump to content

Powershell GUI Listbox ein-/ausblenden


Direkt zur Lösung Gelöst von NilsK,
Der letzte Beitrag zu diesem Thema ist mehr als 180 Tage alt. Bitte erstelle einen neuen Beitrag zu Deiner Anfrage!

Empfohlene Beiträge

Geschrieben

Hallo zusammen,

 

ich arbeite mich gerade in PS ein und bin dabei ein kleines Script zu schreiben welches dem User mittels zwei Radiobuttons Auswahlmöglichkeiten bietet. 

Es soll folgendes Verhalten zeigen:

 

Form wird geladen und nur die Radiobuttons sind zu sehen.

Bei Auswahl von Option 1 erscheint rechts der GroupBox eine ListBox aus der dann ein Eintrag ausgewählt werden kann.

Bei Auswahl von Option 2 erscheint eine andere ListBox aus der ein Eintrag ausgewählt werden kann.

 

Ich möchte jedoch das immer nur die ListBox zu sehen ist, welche zu dem ausgewählten RadioButton gehört.

 

Das Einblenden der ListBoxen funktioniert, aber wenn die einmal mittels .Add_Click Event eingeblendet sind, bekomme ich sie nicht mehr ausgeblendet.

Hat vielleicht jemand eine Lösung für mein Problem?

 

Ich google mir seit knapp einer Woche nen Wolf und komm nicht weiter. :frown: Daher dacht ich mich mir stell mal hier die Frage. Vermutlich ist es ziemlich einfach und ich sehe den Wald vor lauter Bäumen nicht. 

 

 

Grüße

Stefan

 

 

Hier mal der Code:

 

 

[void] [System.Reflection.Assembly]::LoadWithPartialName("System.Drawing") 
[void] [System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms")

$Abfrage=New-Object System.Windows.Forms.Form
$Abfrage.StartPosition="CenterScreen" 
$Abfrage.Size=New-Object System.Drawing.Size(1000,600)
$Abfrage.Text="Allgemeine Infos"
$Abfrage.Font=New-Object System.Drawing.Font("Microsoft Sans Serif",12) 

$Group=New-Object System.Windows.Forms.GroupBox
$Group.Name="Group"
$Group.Text="Gruppe"
$Group.Location=New-Object System.Drawing.Point(10,40)
$Group.Size=New-Object System.Drawing.Size(220,130) 
$Abfrage.Controls.Add($Group)

$Option1=New-Object System.Windows.Forms.RadioButton
$Option2=New-Object System.Windows.Forms.RadioButton
$Option1.Name="Option1"
$Option2.Name="Option2"
$Option1.Text="Option1"
$Option2.Text="Option2"
$Option1.Location=New-Object System.Drawing.Point(10,20)
$Option2.Location=New-Object System.Drawing.Point(10,50)
$Option1.Size=$Option2.Size=New-Object System.Drawing.Size(180,40)
$Option1, $Option2 | ForEach-Object {$Group.Controls.Add($_)}

$Option1.Add_Click({
    $Auswahlfeld2=New-Object System.Windows.Forms.Listbox
    $Auswahlfeld2.SelectionMode="One"
    $Auswahlfeld2.Height=150
    $Auswahlfeld2.Width=150
    $Auswahlfeld2.Location =New-Object System.Drawing.Point(500,50)
    $Abfrage.Controls.Add($Auswahlfeld2)
    $Abfrage.Controls.Remove($Auswahlfeld)
})

$Option2.Add_Click({

    $Auswahlfeld=New-Object System.Windows.Forms.Listbox
    $Auswahlfeld.SelectionMode="One"
    $Auswahlfeld.Height=150
    $Auswahlfeld.Width=150
    $Auswahlfeld.Location =New-Object System.Drawing.Point(300,50)
    $Abfrage.Controls.Add($Auswahlfeld)
    $Abfrage.Controls.Remove($Auswahlfeld2)
})

[void]$Abfrage.ShowDialog()

 

 

  • Beste Lösung
Geschrieben

Moin,

 

vorweg: GUIs sind nicht die Stärke der PowerShell, eigentlich hat PowerShell einen Automatisierungsfokus.

 

Ohne die Technik, die du da einsetzt, näher zu kennen und ohne lange analysiert zu haben, würde ich vermuten, dass du hier in eine Scope-Falle gelaufen bist. Deine Objekte $Auswahlfeld und $Auswahlfeld2 sehen mir so aus, dass sie nur im Scope des jeweiligen Blocks existieren. Der Block $Option1 kennt also nur das $Auswahlfeld2, aber nicht das $Auswahlfeld, entsprechend im anderen Block.

 

Hab's jetzt mal geprüft, das dürfte so sein. Diese Ergänzung des Codes illustriert das:

$Option1.Add_Click({
    $Auswahlfeld2=New-Object System.Windows.Forms.Listbox
    $Auswahlfeld2.SelectionMode="One"
    $Auswahlfeld2.Height=150
    $Auswahlfeld2.Width=150
    $Auswahlfeld2.Location =New-Object System.Drawing.Point(500,50)
    Write-Host 'Option1'
    Write-Host "Auswahlfeld2: $Auswahlfeld2"
    Write-Host "Auswahlfeld: $Auswahlfeld"
    $Abfrage.Controls.Add($Auswahlfeld2)
    $Abfrage.Controls.Remove($Auswahlfeld)
})

$Option2.Add_Click({

    $Auswahlfeld=New-Object System.Windows.Forms.Listbox
    $Auswahlfeld.SelectionMode="One"
    $Auswahlfeld.Height=150
    $Auswahlfeld.Width=150
    $Auswahlfeld.Location =New-Object System.Drawing.Point(300,50)
    Write-Host 'Option2'
    Write-Host "Auswahlfeld2: $Auswahlfeld2"
    Write-Host "Auswahlfeld: $Auswahlfeld"
    $Abfrage.Controls.Add($Auswahlfeld)
    $Abfrage.Controls.Remove($Auswahlfeld2)
})

 

Gruß, Nils

 

  • Like 1
Geschrieben (bearbeitet)

Danke! Das war die Lösung!

 

Ich weiß um PS und GUI, aber im angestrebten Nutzungsfall ist PS der kleinste gemeinsame Nenner und ich brauche nur 2 Formulare auf denen insgesamt keine 10 Optionen verteilt sind. Daher habe ich mich für PS entschieden.

 

Die Lösung ist es die Objekte $Auswahlfeld und $Auswahlfeld2 auf global zu setzen.

Ich weiß nicht ob es da eine "bessere" oder andere Lösung gibt, aber für mein Problem funktioniert sie :)

 

$Option1.Add_Click({
    $global:Auswahlfeld2=New-Object System.Windows.Forms.Listbox
    $Auswahlfeld2.SelectionMode="One"
    $Auswahlfeld2.Height=150
    $Auswahlfeld2.Width=150
    $Auswahlfeld2.Location =New-Object System.Drawing.Point(500,50)
    Write-Host 'Option1'
    Write-Host "Auswahlfeld2: $Auswahlfeld2"
    Write-Host "Auswahlfeld: $Auswahlfeld"
    $Abfrage.Controls.Add($Auswahlfeld2)
    $Abfrage.Controls.Remove($Auswahlfeld)
})

$Option2.Add_Click({

    $global:Auswahlfeld=New-Object System.Windows.Forms.Listbox
    $Auswahlfeld.SelectionMode="One"
    $Auswahlfeld.Height=150
    $Auswahlfeld.Width=150
    $Auswahlfeld.Location =New-Object System.Drawing.Point(300,50)
    Write-Host 'Option2'
    Write-Host "Auswahlfeld2: $Auswahlfeld2"
    Write-Host "Auswahlfeld: $Auswahlfeld"
    $Abfrage.Controls.Add($Auswahlfeld)
    $Abfrage.Controls.Remove($Auswahlfeld2)
})

 

 

bearbeitet von StefanS1982
Der letzte Beitrag zu diesem Thema ist mehr als 180 Tage alt. Bitte erstelle einen neuen Beitrag zu Deiner Anfrage!

Erstelle ein Benutzerkonto oder melde dich an, um zu kommentieren

Du musst ein Benutzerkonto haben, um einen Kommentar verfassen zu können

Benutzerkonto erstellen

Neues Benutzerkonto für unsere Community erstellen. Es ist einfach!

Neues Benutzerkonto erstellen

Anmelden

Du hast bereits ein Benutzerkonto? Melde dich hier an.

Jetzt anmelden
×
×
  • Neu erstellen...