Powershell individueller Rückgabewert von AddClick
Hi,
ich versuche gerade mit PS ein GUI zu bauen. Gibt besser Programmiersprachen keine Frage.
Jetzt habe ich das Problem das Ich Button Hinzufügen möchte und beim Klicken der Button Soll das Fenster zu gehen und das PS Programm wissen Welcher Button geklickt wurde.
Mien Script bis Jetzt:
Leider Ist die Variable $Buttonauswahl immer "LEER" :S
Habt Ihr ein Tipp für Mich?
ich versuche gerade mit PS ein GUI zu bauen. Gibt besser Programmiersprachen keine Frage.
Jetzt habe ich das Problem das Ich Button Hinzufügen möchte und beim Klicken der Button Soll das Fenster zu gehen und das PS Programm wissen Welcher Button geklickt wurde.
Mien Script bis Jetzt:
#Program definieren
$excel = New-Object -ComObject Excel.Application
#Datei Definieren
$file = 'c:\temp\Datei.xlsx'
#im hintergrund ausführen
$excel.visible = $true
#Datei öffnen
$workbook = $excel.workbooks.open($file)
$Buttons= @()
$x_pos= 10
$Buttonauswahl="LEER"
for ($i=2; $i -le $workbook.Worksheets.count(); $i++)
{
$tabelle = $workbook.Worksheets.Item($i)
$NameLen = ($tabelle.Name.Length)*12
$Button = New-Object System.Windows.Forms.Button
$Button.Size = New-Object System.Drawing.Size($NameLen,20)
$Button.Location = New-Object System.Drawing.Size($x_pos,10)
$Button.Text = $tabelle.Name
$Button.DialogResult = "OK"
#Button in Array Ablegen
$Buttons += $Button
$x_pos += $NameLen + 5
}
Start-Sleep -Seconds 0.5
$excel.Quit
Start-Sleep -Seconds 0.5
[System.Runtime.Interopservices.Marshal]::ReleaseComObject($excel)
[void] [System.Reflection.Assembly]::LoadWithPartialName(„System.Drawing“)
[void] [System.Reflection.Assembly]::LoadWithPartialName(„System.Windows.Forms“)
$objForm = New-Object System.Windows.Forms.Form
$objForm.Text = „Projektauswahl“
$objForm.Size = New-Object System.Drawing.Size($x_pos,300)
$objForm.StartPosition = „CenterScreen“
$objForm.KeyPreview = $True
#Bei ESC Fenster schließen
$objForm.Add_KeyDown({if ($_.KeyCode -eq „Escape“) { $objForm.DialogResult=“Cancel“;$objForm.Close()} })
#Buttons hinzufügen
foreach ($btn in $Buttons){
#Alle Button sollen das Fenster Schließen
$btn.Add_Click({
$Buttonauswahl=$btn.Text;
[void]$objForm.Close()
})
$objForm.Controls.Add($btn)
}
[void] $objForm.ShowDialog()
IF ($objForm.DialogResult -eq "OK"){
Write-Host "Auswahl:"
$Buttonauswahl
}
Leider Ist die Variable $Buttonauswahl immer "LEER" :S
Habt Ihr ein Tipp für Mich?
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 6070481670
Url: https://administrator.de/contentid/6070481670
Ausgedruckt am: 19.12.2024 um 09:12 Uhr
7 Kommentare
Neuester Kommentar
Hi,
Tipp 1 : Lesen und verstehen
Tipp 2: Ersetze $Buttonauswahl mit $script:Buttonauswahl an beiden Stellen
Gruß
Tipp 1 : Lesen und verstehen
Tipp 2: Ersetze $Buttonauswahl mit $script:Buttonauswahl an beiden Stellen
Gruß
$global:buttonauswahl = ""
#...
#...
$btn.Add_Click({
$global:buttonauswahl = $this.Text
[void]$objForm.Close()
})
#...
$global:buttonauswahl
Zitat von @6017814589:
$global
$global
Best practice ist die Variablen im kleinstmöglichen Scope zu definieren.
Moin,
man könnte zwar die Variablen in den global- oder script-Bereich legen, wie oben schon erwähnt - dies verstößt imho allerdings gegen den Grundsatz der Modularisierung.
Die in meinen Augen deutlich bessere Methode wäre, eine Eigenschaft zu setzen, die man hinterher überprüfen kann. Hierfür eignet sich zum Beispiel die Tag-Eigenschaft des Fensters:
so ist $objForm.Tag anschließend immer gleich dem Text des Buttons, der angeklickt wurde.
Gruß Thomas
man könnte zwar die Variablen in den global- oder script-Bereich legen, wie oben schon erwähnt - dies verstößt imho allerdings gegen den Grundsatz der Modularisierung.
Die in meinen Augen deutlich bessere Methode wäre, eine Eigenschaft zu setzen, die man hinterher überprüfen kann. Hierfür eignet sich zum Beispiel die Tag-Eigenschaft des Fensters:
$btn.Add_Click({
# Buttontext als Fenster-Tag setzen
$this.TopLevelControl.Tag = $this.Text
[void]$this.TopLevelControl.Close()
})
Gruß Thomas
Alternativ wenn man die Tag Eigenschaft anderweitig braucht kann man auch eine eigene Property hinzufügen und dann diese im Event nutzen
$objForm | Add-Member -MemberType NoteProperty -Name clickedButton -Value ""
# ....
$this.TopLevelControl.clickedButton = $this.text
# ...
$objForm.clickedButton
Zitat von @6017814589:
Alternativ wenn man die Tag Eigenschaft anderweitig braucht kann man auch eine eigene Property hinzufügen und dann diese im Event nutzen
Jup, allerdings würde ich die Eigenschaft erst im Click-Event hinzufügen, direkt mit Wert:Alternativ wenn man die Tag Eigenschaft anderweitig braucht kann man auch eine eigene Property hinzufügen und dann diese im Event nutzen
$objForm | Add-Member -MemberType NoteProperty -Name clickedButton -Value "" -Force
# ....
$this.TopLevelControl.clickedButton = $this.text
# ...
$objForm.clickedButton
Add-Member -InputObject $this.TopLevelControl -MemberType NoteProperty -Name clickedButton -Value $this.Text -force
Gruß Thomas
Serie: Powershell
Powershell für User in KMU6GPO Passwortrichtlinie finden18Powershell: Office Programme inkl.- Bit-Version Auslesen2W11: Aufgabenplanung führt PS Copy-item nicht aus3Powershell remote Session: UnauthorizedAccessException3Powershell eigenes Objekt in Funktion verändern2Powershell individueller Rückgabewert von AddClick7Aufgabenplanung: Powershell Script im Hintergrund mit Userbenachrichtigung im VordergrundPowershell: Aufgabe im Hintergrund MsgBox in Vordergrund25