2013-07-19 12 views
15

Ich habe gerade angefangen zu programmieren, und ich möchte WinForms verwenden, um mehrere Schaltflächen zu machen, die Sie anklicken können, um von weiß zu limone-grün und zurück zu weiß zu wechseln. Ich habe dies für eine Taste getan:Wie mache ich Knöpfe, die dasselbe tun?

private void button1_Click(object sender, EventArgs e) 
    { 
     if (button1.BackColor != Color.Lime) 
     { 
      button1.BackColor = Color.Lime; 
     } 
     else 
     { 
      button1.BackColor = Color.White; 
     } 
    } 

Jetzt konnte ich kopieren und dass für alle Schaltflächen einfügen, aber ich weiß, das ist ineffizient; und wenn ich Winforms verwenden, um Button1 auf Button2 zu referenzieren, wird es nur die Farbe von Button1 (offensichtlich) ändern.

Also, muss ich eine Hilfsmethode, eine neue Klasse oder etwas anderes verwenden? Wie würde das aussehen?

+13

Props Sie nicht wollen, den einfachen Weg zu nehmen und schneiden und eine Menge Code einfügen. Sie denken bereits über die Dinge richtig nach. –

Antwort

24

Es gibt ein paar Ansätze. Man könnte sein, eine gemeinsame Funktion zu schaffen, die die verschiedenen Tasten rufen:

private void button1_Click(object sender, EventArgs e) 
{ 
    ChangeColor(button1); 
} 

private void ChangeColor(Button button) 
{ 
    if (button.BackColor != Color.Lime) 
     button.BackColor = Color.Lime; 
    else 
     button.BackColor = Color.White; 
} 

Dann wird jeder Tastenhandler den gleichen Funktionsaufruf verwenden kann.

Oder, Wenn alle diese Schaltflächen immer genau die gleiche Sache tun, dann können Sie für alle eine Klick-Handler-Funktion verwenden. In diesem Fall müssen Sie bestimmen, welche Schaltfläche den Handler aufgerufen hat (während Sie gerade auf button1 verweisen), damit Sie wissen, welche geändert werden soll. Das Objekt sender, das an die Handler-Funktion übergeben wird, ist eigentlich eine Referenz auf das Formularelement, das den Handler aufgerufen hat. So

private void button_Click(object sender, EventArgs e) 
{ 
    var button = (Button)sender; 
    if (button.BackColor != Color.Lime) 
     button.BackColor = Color.Lime; 
    else 
     button.BackColor = Color.White; 
} 

ersten packt der Handler einen Verweis auf die Schaltfläche

, die sie aufgerufen wird, dann läuft die Logik auf diese Schaltfläche: Alles, was Sie tun müssen, ist es gegossen. Beachten Sie auch, wie ich den Namen der Handler-Funktion etwas generischer gemacht habe. Jetzt würden Sie zum Formular-Designer gehen und button_Click als Click-Handler für alle Schaltflächen festlegen, die dies aufrufen sollen.

+0

Genau das habe ich gesucht. Danke Ihnen allen für Ihre Hilfe, Erklärungen und freundlichen Worte. – user2600871

+0

+1 Große Antwort; sehr gut erklärt. –

5

Sie können die Schaltfläche, die das Ereignis Click ausgelöst hat, indem Sie sender auf Button werfen.

Sie können dann den gleichen Handler zu jeder Schaltfläche hinzufügen.

+2

Es gibt eine implizite "Habe die gleiche Methode behandeln alle Schaltflächen Ereignisse" hier auch. Sie können den Ereignishandler eines Steuerelements in Visual Studio auswählen, indem Sie das Steuerelement auswählen. Wählen Sie dann im Eigenschaftenfenster "Ereignisse" aus und scrollen Sie nach unten, bis Sie "Klicken" finden. Dann können Sie im Drop-Down-Feld neben "Click" die Methode auswählen, die beim Klick-Event aufgerufen werden soll. –

8

Wahrscheinlich wäre der einfachste Weg, jede Schaltfläche denselben Click-Handler aufrufen zu lassen. Dann verwenden Sie innerhalb Ihres Handlers den Absender statt der harten Kodierung Button1.

private void buttons_Click(object sender, EventArgs e) 
    { 
     var theButton = (Button) sender; 
     if (theButton.BackColor != Color.Lime) 
     { 
      theButton.BackColor = Color.Lime; 
     } 
     else 
     { 
      theButton.BackColor = Color.White; 
     } 
    } 
13

Sie tun dies die genau gleichen Weg Sie würden es für jede C# -Klasse tun. Sie leiten Ihre eigene Klasse ab und passen das Verhalten der Basisklasse an. Jedes Ereignis verfügt über eine entsprechende OnXxxx() -Methode, die Sie überschreiben können.

eine neue Klasse zu einem Projekt hinzufügen und diesen Code einfügen:

using System; 
using System.Windows.Forms; 

class MyButton : Button { 
    protected override void OnClick(EventArgs e) { 
     // Your code here 
     //... 
     base.OnClick(e); 
    } 
} 

Ändern Sie den Code in OnClick() zu tun, was Sie tun möchten. Kompilieren. Sie haben jetzt ein eigenes Button-Steuerelement oben in der Toolbox. Und Sie können so viele Kopien davon auf einem Formular ablegen, wie Sie möchten. Sie werden sich alle gleich verhalten, ohne dass irgendein Code in dem Formular hinzugefügt werden muss.

+0

Ich sehe nicht, warum dies eine bessere Methode als die Verwendung einer allgemeinen Methode oder eines gemeinsamen Ereignishandlers ist. Wenn der Knopf wirklich etwas Interessantes tut, das in verschiedenen Formen verwendet wird, dann ist diese Methode genau der richtige Weg. Ansonsten scheint es wie Overkill. – siride

+1

+1 Es ist besser, weil es nicht das 'Click'-Ereignis verzehrt, sondern nur das Verhalten in die Schaltfläche selbst umsetzt. Diese Lösung enthält keinen Event-Handler und setzt den Code genau dort hin, wo er hingehört. Ob das Overkill ist oder nicht ist irrelevant; Die Menge an Code zum Schreiben ist im Wesentlichen die gleiche, und es ist eine wiederverwendbare und wartbare Lösung - zukünftiges Selbst wird niemals fragen "Wo habe ich das Verhalten dieses Knopfes noch einmal kodiert?" weil der Code offensichtlich in der Klasse * MyButton * liegt. Mit jeder anderen Lösung * Wenn der Button irgendwo anders wiederverwendet werden muss, gibt es ein Problem *. –

+0

@retailcoder: Nein, es gibt so etwas wie overengineering. Das ist es. Siehe Jeff Atwood Blog für heute, BTW: http://www.codinghorror.com/blog/2013/07/rule-of-three.html. Verschwenden Sie keine Zeit mit übermäßiger Wiederverwendung, bis Sie sie wirklich brauchen, besonders für dieses offensichtlich triviale Programm. – siride

0

Ich bin ein VB-Typ .... in VB.Net können Sie mehrere Handler für Ereignisse hinzufügen und mehrere Ereignisse mit demselben Handler verbinden.

Dieses Sub hooks alle Klicks, um die Schaltflächen zu färben.

Private Sub ColorButtons(sender As System.Object, e As System.EventArgs) _ 
Handles Button1.Click, Button2.Click, .. 

ich tun dies die ganze Zeit zufällig, weil ich ziehen/kopieren, um eine Kontrolle um ein neues zu machen und die neue Schaltfläche wird auf den ursprünglichen die Ereignisse hinzugefügt.

Andere Subs können die gleichen Ereignisse für andere Arbeiten behandeln - beide werden ausgeführt.

Keine Ahnung, wie dies in C# zu tun.

+0

In C# ist das nicht anders. –

0

Der richtige Weg, dies zu tun ist, das Klickereignis jeder Schaltfläche mit der Funktion zu verknüpfen, die Sie für diesen Zweck programmiert haben (Sie möchten, dass die Funktion ausgeführt wird, wenn Sie auf die Schaltfläche klicken), also fügen Sie Folgendes hinzu (oder ähnlich) zu einem entsprechenden Abschnitt Ihres Codes:

MyButton1.Click += new RoutedEventHandler(buttons_Click); 
MyButton2.Click += new RoutedEventHandler(buttons_Click); 
etc... 

Sie können dem Ereignishandler so viele Steuerelemente zuordnen, wie Sie möchten.

+0

Beachten Sie, dass der 'RoutedEventHandler'-Teil redundant ist, da das 'Click'-Ereignis dies bereits angibt, daher ist' MyButton1.Click + = buttons_Click;' ausreichend. –

0

Was in der Regel vor, das ich dies tun:

private void button2_Click(object sender, EventArgs e) 
{ 
    button1.PerformClick(); 
} 

Dieser Code wird einfach nur die Codes unter button1_Click laufen.

Aber versuchen Sie nicht, als solche zu praktizieren und es einfach in eine Funktion/Methode zu setzen, genau wie David es vorgeschlagen hat.

Verwandte Themen