none
Powershell Button-Text automatisch einfügen RRS feed

  • 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

    Mittwoch, 12. April 2017 12:18

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
    Mittwoch, 12. April 2017 13:38

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

    Mittwoch, 12. April 2017 13:04
  • 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
    Mittwoch, 12. April 2017 13:08
  • 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
    Mittwoch, 12. April 2017 13:14
  • 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
    Mittwoch, 12. April 2017 13:38
  • Genau! :) Klasse, vielen Dank, das ist genau das, was ich gesucht habe!
    Mittwoch, 12. April 2017 13:39