spsman
Goto Top

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:

#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?

Content-ID: 6070481670

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

Ausgedruckt am: 19.12.2024 um 09:12 Uhr

3063370895
3063370895 21.02.2023 aktualisiert um 10:56:49 Uhr
Goto Top
Hi,

Tipp 1 : Lesen und verstehen

Tipp 2: Ersetze $Buttonauswahl mit $script:Buttonauswahl an beiden Stellen

Gruß
6017814589
6017814589 21.02.2023 aktualisiert um 10:57:44 Uhr
Goto Top
$global:buttonauswahl = ""  
#...
#...
$btn.Add_Click({
    $global:buttonauswahl = $this.Text
    [void]$objForm.Close()
})
#...
$global:buttonauswahl
Zum Lernen about_Scopes
3063370895
3063370895 21.02.2023 um 11:03:53 Uhr
Goto Top
Zitat von @6017814589:
$global

Best practice ist die Variablen im kleinstmöglichen Scope zu definieren.
TK1987
Lösung TK1987 21.02.2023 um 11:09:18 Uhr
Goto Top
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:
$btn.Add_Click({
    # Buttontext als Fenster-Tag setzen
    $this.TopLevelControl.Tag = $this.Text
    [void]$this.TopLevelControl.Close()
})
so ist $objForm.Tag anschließend immer gleich dem Text des Buttons, der angeklickt wurde.

Gruß Thomas
SPSman
SPSman 21.02.2023 aktualisiert um 11:22:11 Uhr
Goto Top
Hi,

die Anderen Varianten gehen auch sicherlich, aber das scheint mir die Beste zu sein:
Zitat von @TK1987:
... deutlich bessere Methode wäre, eine Eigenschaft zu setzen,.
$objForm.Tag anschließend immer gleich dem Text des Buttons, der angeklickt wurde.

Gruß Thomas


Dankeschön!
6017814589
6017814589 21.02.2023 aktualisiert um 11:28:38 Uhr
Goto Top
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
TK1987
TK1987 21.02.2023 um 11:31:38 Uhr
Goto Top
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
$objForm | Add-Member -MemberType NoteProperty -Name clickedButton -Value "" -Force  
# ....
    $this.TopLevelControl.clickedButton = $this.text
# ...
$objForm.clickedButton
Jup, allerdings würde ich die Eigenschaft erst im Click-Event hinzufügen, direkt mit Wert:
Add-Member -InputObject $this.TopLevelControl -MemberType NoteProperty -Name clickedButton -Value $this.Text -force

Gruß Thomas