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-Key: 6070481670

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

Printed on: April 28, 2024 at 07:04 o'clock

Mitglied: 3063370895
3063370895 Feb 21, 2023 updated at 09:56:49 (UTC)
Goto Top
Hi,

Tipp 1 : Lesen und verstehen

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

Gruß
Mitglied: 6017814589
6017814589 Feb 21, 2023 updated at 09:57:44 (UTC)
Goto Top
$global:buttonauswahl = ""  
#...
#...
$btn.Add_Click({
    $global:buttonauswahl = $this.Text
    [void]$objForm.Close()
})
#...
$global:buttonauswahl
Zum Lernen about_Scopes
Mitglied: 3063370895
3063370895 Feb 21, 2023 at 10:03:53 (UTC)
Goto Top
Zitat von @6017814589:
$global

Best practice ist die Variablen im kleinstmöglichen Scope zu definieren.
Member: TK1987
Solution TK1987 Feb 21, 2023 at 10:09:18 (UTC)
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
Member: SPSman
SPSman Feb 21, 2023 updated at 10:22:11 (UTC)
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!
Mitglied: 6017814589
6017814589 Feb 21, 2023 updated at 10:28:38 (UTC)
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
Member: TK1987
TK1987 Feb 21, 2023 at 10:31:38 (UTC)
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