none
Windows Forms: Button korrekt einbinden/initialisieren RRS feed

  • Frage

  • Hi zusammen,

    ich habe eine GUI, die dynamisch Checkboxen erzeugt.

    Nun habe ich einen Button, der beim klick den Checked Status der Checkboxen überprüft und den Text dieser an ein Array übergibt.

    Nun habe ich folgendes Problem, wenn ich auf den Button klicke, wird nichts an das Array übergeben. Beende ich das Fenster und führe die Schleife manuell aus, funktioniert es. Irgenwie scheint der Button zum falschen Zeitpunkt initialisiert zu werden oder ich binde ihn falsch ein.

    Das ist der Teil des Codes:

    $checkedcheckboxes=@()
    
    $Checkboxbutton = New-Object -TypeName System.Windows.Forms.Button
    $Checkboxbutton.Location = New-Object -TypeName System.Drawing.Size -ArgumentList (600,420)
    $Checkboxbutton.Size = New-Object -TypeName System.Drawing.Size -ArgumentList (75,23)
    $Checkboxbutton.Text = 'checkboxcheck'
    $Checkboxbutton.Name = 'checkboxcheck'
    
    $checkboxbutton.Add_Click(
                                {foreach ($Checkbox in $allcheckboxesarray)
                                            {if ($Checkbox.Checked -eq $True) {$checkedcheckboxes += $Checkbox.Text}}
                                }
                            )
         
         
         $Form.controls.AddRange(@($checkboxbutton)

    Insgesamt tue ich mir bei komplexeren Verschachtelungen und dem Nutzen von .NET Classen häufig schwer, wie man am besten die Objekte und Methoden verarbeitet. Hat da vll. jmd. einen Tipp, wie ich da Knowhow aufbauen kann?

    Gruß

    Mittwoch, 11. September 2019 11:53

Antworten

  • > Und unbeabsichtigt tue ich das eigentlich nicht =)

    Das hab ich nicht gemeint. :)
    Du erstellst einmal die Variable mit dem Namen $checkedcheckboxes im Root als Array. Und dann -unbeabsichtigt- noch eine zweite mit dem gleichen Namen im Eventhandler.

    Um hingegen die Variable zu befüllen die du im Root erstellt hast, musst du $script: davor schreiben. Noch besser, schreib das vor alle Variablen die du skriptweit benutzen willst, immer davor. Das verhindert solche Probleme wie oben.
     
    > Habe die Variable extra ohne Inhalt vor der Schleife erstellt, damit sie auch im Root Scope verfügbar ist, wenn ich sie mit der Schleife befüllt habe.
     
    Kann man der Übersicht halber machen (ich mache das auch so, in einer extra Sektion am Anfang der Skripte), nötig ist es nicht. Du kannst skriptweit verfügbare Variablen von jedem Scope aus erstellen, schreib einfach  $script: davor.


    Mittwoch, 11. September 2019 19:02
    Moderator

Alle Antworten

  • Sieht soweit richtig aus, aber du musst $checkedcheckboxes als skriptweite Variable anlegen, damit du auf den Wert außerhalb des Eventhandlers zugreifen kannst.
     
    $script:checkedcheckboxes += $Checkbox.Text
     
    Grüße, Denniver

    Blog: http://www.bytecookie.de

    Powershell Code Manager: Link
    (u.a. Codesnippets verwalten + komplexe Scripte graphisch darstellen)

    Hilf mit und markiere hilfreiche Beiträge mit dem "Abstimmen"-Button (links) und Beiträge die eine Frage von dir beantwortet haben, als "Antwort" (unten).
    Warum das Ganze? Hier gibts die Antwort.

    Mittwoch, 11. September 2019 14:41
    Moderator
  • Sieht soweit richtig aus, aber du musst $checkedcheckboxes als skriptweite Variable anlegen, damit du auf den Wert außerhalb des Eventhandlers zugreifen kannst.
      

    Habe ich das nicht mit der ersten Zeile getan? Die ist ja außerhalb der Schleife?

    Gruß


    • Bearbeitet marc-sysadmn Mittwoch, 11. September 2019 15:07
    Mittwoch, 11. September 2019 15:07
  • Anhand deines Snippets ist nicht offensichtlich, wo die Variable im echten Script erstellt wird.
    Wenn du Sie im Root erstellst, dann existiert in der Tat skriptweit ein Array mit diesem Namen. Wenn du dieses aber nun innerhalb einem untergeordneten Scope (also z.b. einer Funktion oder Event) beschreiben willst, musst du explizit angeben ($script:) das du diese meinst. Was du oben stattdessen (unbeabsichtigt) tust, ist eine weitere Variable $checkedcheckboxes zu erstellen (kein Array), die nur in diesem Eventhandler existiert und dieser die Werte zuzuweisen.

    Schau mal hier: Variablen
     

    Grüße, Denniver


    Blog: http://www.bytecookie.de

    Powershell Code Manager: Link
    (u.a. Codesnippets verwalten + komplexe Scripte graphisch darstellen)

    Hilf mit und markiere hilfreiche Beiträge mit dem "Abstimmen"-Button (links) und Beiträge die eine Frage von dir beantwortet haben, als "Antwort" (unten).
    Warum das Ganze? Hier gibts die Antwort.

    Mittwoch, 11. September 2019 17:16
    Moderator
  • Anhand deines Snippets ist nicht offensichtlich, wo die Variable im echten Script erstellt wird.
    Wenn du Sie im Root erstellst, dann existiert in der Tat skriptweit ein Array mit diesem Namen. Wenn du dieses aber nun innerhalb einem untergeordneten Scope (also z.b. einer Funktion oder Event) beschreiben willst, musst du explizit angeben ($script:) das du diese meinst. Was du oben stattdessen (unbeabsichtigt) tust, ist eine weitere Variable $checkedcheckboxes zu erstellen (kein Array), die nur in diesem Eventhandler existiert und dieser die Werte zuzuweisen.

    Stimmt, ist so erstmal nicht zu erkennen, aber ja, wird im root erstellt.

    Wird aus der Variable nicht automatisch ein Array, wenn ich es mit mehreren Objekten fülle?

    Und unbeabsichtigt tue ich das eigentlich nicht =)

    Habe die Variable extra ohne Inhalt vor der Schleife erstellt, damit sie auch im Root Scope verfügbar ist, wenn ich sie mit der Schleife befüllt habe.

    Mittwoch, 11. September 2019 18:48
  • > Und unbeabsichtigt tue ich das eigentlich nicht =)

    Das hab ich nicht gemeint. :)
    Du erstellst einmal die Variable mit dem Namen $checkedcheckboxes im Root als Array. Und dann -unbeabsichtigt- noch eine zweite mit dem gleichen Namen im Eventhandler.

    Um hingegen die Variable zu befüllen die du im Root erstellt hast, musst du $script: davor schreiben. Noch besser, schreib das vor alle Variablen die du skriptweit benutzen willst, immer davor. Das verhindert solche Probleme wie oben.
     
    > Habe die Variable extra ohne Inhalt vor der Schleife erstellt, damit sie auch im Root Scope verfügbar ist, wenn ich sie mit der Schleife befüllt habe.
     
    Kann man der Übersicht halber machen (ich mache das auch so, in einer extra Sektion am Anfang der Skripte), nötig ist es nicht. Du kannst skriptweit verfügbare Variablen von jedem Scope aus erstellen, schreib einfach  $script: davor.


    Mittwoch, 11. September 2019 19:02
    Moderator
  • > Und unbeabsichtigt tue ich das eigentlich nicht =)

    Das hab ich nicht gemeint. :)
    Du erstellst einmal die Variable mit dem Namen $checkedcheckboxes im Root als Array. Und dann -unbeabsichtigt- noch eine zweite mit dem gleichen Namen im Eventhandler.


    Ahh, verstehe. das mit $script: werde ich morgen probieren.

    Kann man der Übersicht halber machen (ich mache das auch so, in einer extra Sektion am Anfang der Skripte), nötig ist es nicht. Du kannst skriptweit verfügbare Variablen von jedem Scope aus erstellen, schreib einfach  $script: davor.

    Wieder was gelernt :-D

    Schonmal danke.

    Mittwoch, 11. September 2019 20:22
  • So funktionierts, danke!

    Gruß

    Donnerstag, 12. September 2019 08:05