Benutzer mit den meisten Antworten
Powershell Button-Text automatisch einfügen

Frage
-
Hallo Zusammen,
ich habe eine Anwendung mit mehreren Buttons. Die Eigenschaft "Text" dieser Buttons soll nachträglich im Rahmen eines XLS-Exports eingefügt werden. Die Excel-Datei beinhaltet Platznamen und dazugehörige Computernamen. In einer Schleife möchte ich dann die Buttonnamen als Variabel ansprechen und den Text ebenfalls aus der Exceldatei importieren. Ich hab mir das ungefähr so vorgestellt
$platzname = Exportiert aus Exceldatei, Spalte 1, Zeile 2++
$buttonname = "Button" + "$platzname"
$buttonname.text = "Exportiert aus Exceldatei, Spalte2, Zeile 2++ || Genau hier kommt es zum Fehler, Eigenschaft Text nicht gefunden
Mein Problem ist, dass er keine Eigenschaft .text für die Variabel $buttonname kennt. Es wird also scheinbar nicht erkannt, dass sich unter dem selben Inhalt der Variabel auch ein Button verbirgt. Nun zu meiner Frage:
Was muss ich tun, damit diese Operation funktionert, oder gibt es alternativ einen Befehl, mit dem ich mir sämtliche Button-Elemente ausgeben lassen kann?
Viele Grüße
Sebamedo
Antworten
-
Jetzt habe ich erst verstanden was du willst, die willst die Buttonnamen Dynamisch auflösen.
Das könnte z. B. über Get-Variable funktionieren, siehe als Beispiel:
Add-Type -AssemblyName System.Windows.Forms $Form = New-Object system.Windows.Forms.Form $Form.Text = "Sample Form" $Button1 = New-Object System.Windows.Forms.Button $Button1.Text = "B1" $Button1.Location = New-Object System.Drawing.Size(55,100) $Button2 = New-Object System.Windows.Forms.Button $Button2.Text = "B2" $Button2.Location = New-Object System.Drawing.Size(55,120) $Button3 = New-Object System.Windows.Forms.Button $Button3.Text = "B3" $Button3.Location = New-Object System.Drawing.Size(55,140) $platzname = '123' #Exportiert aus Exceldatei, Spalte 1, Zeile 2++ $buttonname = "Button" + " $platzname" $Form.Controls.Add($Button1) $Form.Controls.Add($Button2) $Form.Controls.Add($Button3) $Buttonname = 'Button2' (Get-Variable -Name $buttonname).Value.Text = $platzname $Form.ShowDialog()
- Bearbeitet Olaf Reitz Mittwoch, 12. April 2017 13:39
- Als Antwort markiert Sebamedo Mittwoch, 12. April 2017 13:47
Alle Antworten
-
Moin,
es fehlt der Kontext im deinem Script. Poste mal den relevanten Teil des Scripts, dann können wir dir besser helfen.
Ansonsten schau dir das hier nochmal an:
Add-Type -AssemblyName System.Windows.Forms $Form = New-Object system.Windows.Forms.Form $Form.Text = "Sample Form" $Button = New-Object System.Windows.Forms.Button $platzname = '123' #Exportiert aus Exceldatei, Spalte 1, Zeile 2++ $buttonname = "Button" + " $platzname" $Button.Text = $buttonname $Form.Controls.Add($Button) $Form.ShowDialog()
-
Hallo Sebamedo,
ohne den Rest vom Quelltext zu sehen, ist das jetzt etwas geraten aber ich vermute dein Problem liegt daran das du deine Variable mit dem Button überschreibst. Ausgehend davon das $buttonname deine Variable mit dem Button ist überschreibst du deinen Button in der zweiten geposteten Zeile mit einem String Objekt. Prüfe einfach mal z. B. per Get-Member welcher Variablentyp tatsächlich hinter der Variable steckt.
$Button = New-Object System.Windows.Forms.Button $Button | gm # System.Windows.Forms.Button und die Eigenschaft Text exisitert $Button = "Toller Text" $Button | gm # System.String aka keine Eigenschaft Text vorhanden
Gruß Olaf
- Bearbeitet Olaf Reitz Mittwoch, 12. April 2017 13:23
-
Hey danke für die schnelle Antwort. Ich habe gehofft euch mit dem "unnötigen" Code zu verschonen aber gut, wenn Sie insistieren ;-)
Ich möchte nochmal erwähnen, dass es nicht ums erstellen der Buttons geht. Diese lege ich bereits vorher an (Als Hintergrundbild ist ein Umriss der Halle, in dem sich die Plätze finden. Es geht eben nur darum, diese Buttons mit dem richtigen Computernamen zu befüllen, da sich der Name hingegen bei einem defekt beispielsweise verändern kann und dann eben nicht ständig im Quellcode verändert werden soll.
Was deine Anmerkung betrifft: Klar so gehts natürlich, ich kann direkt sagen
$buttonPlatzXA01 = $Computername
Allerdings müsste ich dann für alle Buttons eine solche Zeile einbauen. Mein Plan war es daraus eine kleine Schleife zu basteln, sodass ich nicht jeden Button einzelnd ansprechen muss.
Hier der Code
#Öffnen der Exceldatei (Exceldatei ist wie folgt aufgebaut #Spalte 1: PCName #Spalte 2: Bereich #Spalte 3: Platz #Spalte 2 und 3 zusammengefügt + einer Zahl am Ende ergibt den Namen des genauen Platzes UND des #Buttons. # Einige Plätze haben den selben Namen, aber mehrere PCs, daher eine laufende Zahl zum Schluss. #Hierfür dient die IF, ElseIF, Else-Bedingung, die prüft ob zur eindeutigen Identifizierung des Platzes noch #eine laufende Zahl hochgezählt werden muss, oder ob dieser eindeutig ist und daher nur eine 1 #bekommt. $Filepath = "C:\Daten\Powershell_Skripte\Terminals.xlsx" # Variablen [int]$Zeile1 = 2 # ab 2, da in Zeile 1 Die Titel stehen [int]$Spalte1 = 2 [int]$Zeile2 = 2 # ab 2, da in Zeile 1 Die Titel stehen [int]$Spalte2 = 3 $TableName = "terminals" #Instanzieren eines COM-Objektes für Excel $Excel = New-Object -ComObject excel.application #Excel-Sheet sichtbar machen, heißt, ob es im Vordergrund oder im Hintergrund geschehen soll. $Excel.Visible = $false #Arbeitsmappe laden $Workbook = $Excel.Workbooks.Open($Filepath) $Table = $workbook.Worksheets.Item($TableName) # alternativ zum TableName: #$Table = $workbook.Worksheets.Item(1) do { $bpbefore = $bpnow $bpnow = $null $bereich = $Table.Cells.Item($Zeile1, $Spalte1).Text $platz = $Table.Cells.Item($Zeile1, $Spalte2).Text $pcname= $Table.Cells.Item($Zeile1, 1).Text $bpnow = "$bereich" + "$platz" if ($bpbefore -eq $null) { $i = 1 $bpnow = "$bereich" + "$platz" #Write-Host "keine Zeile zuvor ausgelesen. BPnow = $bpnow" $platzname = "$bereich" + "$platz" + "_" + "$i" #Write-Host "Die endgültige Platzbezeichnung für den Button ist $platzname" } elseif ($bpnow -eq $bpbefore) { $i++ #Write-Host "Die vorherige Zeile $bpbefore ist gleich $bpnow" $bpnow = "$bereich" + "$platz" $platzname = "$bereich" + "$platz" + "_" + "$i" #Write-Host "Die endgültige Platzbezeichnung für den Button ist $platzname" } else { $i = 1 #Write-Host "die vorherige Zeile $bpbefore ist nicht gleich mit $bpnow" $bpnow = "$bereich" + "$platz" $platzname = "$bereich" + "$platz" + "_" + "$i" #Write-Host "Die endgültige Platzbezeichnung für den Button ist $platzname" } #Write-Host "Die endgültige Platzbezeichnung für den Button ist $platzname" $buttonname = "Button" + "$platzname" #Das hier ist die entscheidende Zeile, die so noch nicht funktioniert. $buttonname'.text = $pcname $Zeile1++ $bpefore = $null } while ($Table.Cells.Item($Zeile1, $Spalte2).Text.Length -gt 0) Write-Host $hashtable #COM-Objektes beenden $Excel.Quit() #COM-Objektes aus dem Speicher entfernen [System.Runtime.Interopservices.Marshal]::ReleaseComObject($excel) $form1_Load={ UpdateNavButtons } function UpdateNavButtons { $buttonNext.Enabled = $Tab_WE.SelectedIndex -lt $Tab_WE.TabCount - 1 $buttonPrev.Enabled = $Tab_WE.SelectedIndex -gt 0 } $buttonPrev_Click={ if($Tab_WE.SelectedIndex -gt 0) { $Tab_WE.SelectedIndex-- } UpdateNavButtons } $buttonNext_Click={ if($Tab_WE.SelectedIndex -lt $Tab_WE.TabCount - 1) { $Tab_WE.SelectedIndex++ } UpdateNavButtons } $buttonButton1_Click={ #TODO: Place custom script here $gesuchteripc = $textboxIPCsuchen.text Write-Host $gesuchteripc $buttonME02_1.backcolor = 'Aqua' } #region Control Helper Functions function Update-ListBox { <# .SYNOPSIS This functions helps you load items into a ListBox or CheckedListBox. .DESCRIPTION Use this function to dynamically load items into the ListBox control. .PARAMETER ListBox The ListBox control you want to add items to. .PARAMETER Items The object or objects you wish to load into the ListBox's Items collection. .PARAMETER DisplayMember Indicates the property to display for the items in this control. .PARAMETER Append Adds the item(s) to the ListBox without clearing the Items collection. .EXAMPLE Update-ListBox $ListBox1 "Red", "White", "Blue" .EXAMPLE Update-ListBox $listBox1 "Red" -Append Update-ListBox $listBox1 "White" -Append Update-ListBox $listBox1 "Blue" -Append .EXAMPLE Update-ListBox $listBox1 (Get-Process) "ProcessName" .NOTES Additional information about the function. #> param ( [Parameter(Mandatory = $true)] [ValidateNotNull()] [System.Windows.Forms.ListBox] $ListBox, [Parameter(Mandatory = $true)] [ValidateNotNull()] $Items, [Parameter(Mandatory = $false)] [string] $DisplayMember, [switch] $Append ) if (-not $Append) { $listBox.Items.Clear() } if ($Items -is [System.Windows.Forms.ListBox+ObjectCollection] -or $Items -is [System.Collections.ICollection]) { $listBox.Items.AddRange($Items) } elseif ($Items -is [System.Collections.IEnumerable]) { $listBox.BeginUpdate() foreach ($obj in $Items) { $listBox.Items.Add($obj) } $listBox.EndUpdate() } else { $listBox.Items.Add($Items) } $listBox.DisplayMember = $DisplayMember } #endregion
- Bearbeitet Sebamedo Mittwoch, 12. April 2017 13:21 Anmerkung
-
Jetzt habe ich erst verstanden was du willst, die willst die Buttonnamen Dynamisch auflösen.
Das könnte z. B. über Get-Variable funktionieren, siehe als Beispiel:
Add-Type -AssemblyName System.Windows.Forms $Form = New-Object system.Windows.Forms.Form $Form.Text = "Sample Form" $Button1 = New-Object System.Windows.Forms.Button $Button1.Text = "B1" $Button1.Location = New-Object System.Drawing.Size(55,100) $Button2 = New-Object System.Windows.Forms.Button $Button2.Text = "B2" $Button2.Location = New-Object System.Drawing.Size(55,120) $Button3 = New-Object System.Windows.Forms.Button $Button3.Text = "B3" $Button3.Location = New-Object System.Drawing.Size(55,140) $platzname = '123' #Exportiert aus Exceldatei, Spalte 1, Zeile 2++ $buttonname = "Button" + " $platzname" $Form.Controls.Add($Button1) $Form.Controls.Add($Button2) $Form.Controls.Add($Button3) $Buttonname = 'Button2' (Get-Variable -Name $buttonname).Value.Text = $platzname $Form.ShowDialog()
- Bearbeitet Olaf Reitz Mittwoch, 12. April 2017 13:39
- Als Antwort markiert Sebamedo Mittwoch, 12. April 2017 13:47