2009-08-21 3 views
0

Ich habe ein Formular mit einem geteilten Panel. In der einen Spalte befindet sich eine Gruppe von Schaltflächen, die programmgesteuert die Farbe der zuletzt gedrückten Schaltfläche ändern soll. Die folgende Schleife scheint korrekt zu funktionieren und die Farben korrekt zu setzen, aber das Formular repräsentiert das nicht. Sobald die Schleife abgeschlossen ist und ich die Schaltflächenfarben erneut überprüfe, kehren sie zum vorherigen Zustand zurück.Button BackColor funktioniert nicht wie erwartet

For Each formControl As Control In Me.FormSplitContainer.Panel1.Controls 
    If formControl.GetType() Is GetType(Button) Then 
    If CType(sender, Button) Is CType(formControl, Button) Then 
     CType(sender, Button).BackColor = Color.White 
    Else 
     CType(sender, Button).BackColor = System.Drawing.SystemColors.ControlDark 
    End If 
    End If 
Next 

Ich kann den gewünschten Effekt erzielen, indem ich den folgenden Code tue, aber scheint weniger elegant und würde offensichtlich Updates erfordern, wie Schaltflächen hinzugefügt oder entfernt werden würden.

DataFeedButton.BackColor = System.Drawing.SystemColors.ControlDark 
IncentiveButton.BackColor = System.Drawing.SystemColors.ControlDark 

CType(sender, Button).BackColor = Color.White 

Wer sieht was ich vermisse?

Antwort

1

Weisen Sie den Absender einer Schaltflächenvariablen zu und weisen Sie die Farbe zu.

dim b as button 

Und dann in der Schleife, weisen Sie auf diese Weise:

b = sender 
b.backcolor = color.white 
+0

Nicht sicher, warum genau, aber das Hinzufügen innerhalb der Schleife ermöglicht den Code wie erwartet zu arbeiten. Danke –

+0

Ich bin nicht sicher, genau warum cType auf der linken Seite der Zuweisungsanweisung nicht gearbeitet hat, aber es ist sicherer, Absender zu einer Variablen des richtigen Typs zuzuweisen, wenn Sie Änderungen an seinen Eigenschaften vornehmen werden. Es ist möglich, dass der C-Typ außerhalb der Schleife auf eine Kopie des Schaltflächenobjekts optimiert wurde, sodass die Eigenschaftsänderung keinen Einfluss auf die ursprüngliche Schaltfläche hatte. Die Verwendung von cType als Zuweisungsziel erscheint im Allgemeinen ein wenig unzuverlässig. Ich bin mir nicht sicher, warum Sie FormControl Teil der Zeit und Sender Teil der Zeit verwenden. Das könnte ein (oder das) Problem sein. – xpda

0

Wo rufst du diesen Code an? Jedes Mal, wenn sie auf eine Schaltfläche klicken? Für mich sieht es so aus, als ob es die Hintergrundfarbe aller Schaltflächen des Formulars auf weiß setzt. Ich sehe nicht, wo Sie für die Bedingung "letzte Taste gedrückt" testen.

+0

Sie richtig sind. Ich versuche die Schleife jedes Mal auszuführen, wenn auf eine Schaltfläche geklickt wird. Absender ist die Schaltfläche, auf die geklickt wurde. Entschuldigung für die Verwirrung. –

+0

Anstatt die gesamte Sammlung durchzulaufen, können Sie die Schaltfläche "Zurück" in einer Variablen auf Modulebene speichern. Wenn Sie also auf eine andere klicken, wissen Sie genau, wie Sie auf controlDark zurücksetzen sollen. – Beth

+0

Ya das geht mit dem, was Kyralessa sagte. Einfach alle Standard-Buttons und den angeklickten Button auf Weiß setzen. Es würde sowohl die Probleme abdecken, die Beth als auch Kyralessa aufwerfen. – kralco626