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

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()

 

 

Link zu diesem Kommentar
  • Beste Lösung

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

 

Link zu diesem Kommentar

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
Link zu diesem Kommentar
Der letzte Beitrag zu diesem Thema ist mehr als 180 Tage alt. Bitte erstelle einen neuen Beitrag zu Deiner Anfrage!

Schreibe einen Kommentar

Du kannst jetzt antworten und Dich später registrieren. Falls Du bereits ein Mitglied bist, logge Dich jetzt ein.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung jetzt entfernen

  Only 75 emoji are allowed.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor-Fenster leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

×
×
  • Neu erstellen...