2016-04-29 7 views
-1

Ich habe ein Projekt, in dem ich 70 Schaltflächen implementiert und deklariert jede von ihnen mit einem Array x. Wenn ich auf eine Schaltfläche klicke, muss ich die Farbe und andere Dinge ändern, mit denen ich kein Problem habe. Deshalb habe ich ein Ereignis erstellt, das mir dabei hilft: ClickedButton. Der Code sieht wie folgt aus bisher: Wie kann ich wissen, ob eine bestimmte Schaltfläche mit dem "Absender" eines Ereignisses identisch ist? C#

private void ClickedButton(object sender, EventArgs e)   
{ 
    Button button_send = (Button)sender; 

    for (int i = 0; i < 70; i++) 
     if (x[i] == button_send) 
     /* 
      instructions 
     */ 
} 

Die Sache ist, ich brauche, welche Taste das Ereignis ausgelöst wissen, indem sie angeklickt wird, weil ich die i Position benötigen. Wie mache ich das? Offensichtlich funktioniert der Vergleich mit == nicht.

+2

Bitte zeigen, wie Sie deklarieren und füllen Ihre 'x' Kollektion –

+9

Warum sollte == nicht funktionieren? –

+0

Verwenden Sie die CommandArgument-Eigenschaft, um einen eindeutigen Wert für jede Schaltfläche zu definieren. Holen Sie das hier zum Vergleichen und Schreiben Sie Ihre Logik – techspider

Antwort

0

unabhängig von der Plattform - WinForms oder WPF - Steuerelemente haben eine Tag Eigenschaft:

public object Tag { get; set; } 

Was ich in der Vergangenheit getan haben, ist einen bestimmten Wert zuweisen Tag s zu steuern. Weisen Sie in diesem Fall die int zu. Anschließend können Sie etwas tun, wie folgt aus:

Dictionary<Button, int> 

Die Prüfung wird viel kürzer und schneller in der Event-Handler mit einer direkten Zuordnung zu einem bestimmten Wert:

private void ClickedButton(object sender, EventArgs e)   
{ 
    Button button_send = (Button)sender; 
    var value = string.Empty; 

    if (button_send.Tag != null && int.TryParse(button_send.Tag.ToString(), out value) 
    { 
     // check int 'value' against whatever logic you need 
    } 
} 

Eine weitere Option ist ein Wörterbuch sein könnte.

Für was es wert ist, ist die Tag Eigenschaft am Ende flexibler. Wenn es kein int Ihr nach ist, aber vielleicht ein Delegierter, könnten Sie ebenso einfach einen Verweis auf eine Func<T> oder Action<T> in der Tag speichern.

+0

Wie weise ich dem 'Tag' das' int' zu? –

+0

'myButton.Tag = i;' – IAbstract

0

Diese Aussage x[i] == button_send sollte gut funktionieren, aber der beste Weg, um eine id mit jeder Taste Instanz und den Vergleich mit dieser ID wie

Statt eine List<Button> müssen anhängen würde sein kann Button-Instanz erstellen und fügen Sie sie wie

Button b1 = new Button(); 
b1.id = "btn1"; 
x.Add(b1); 

Dann können Sie tun, wie

x.Select(b => b.id == button_send.id); 
1

in wpf jeder Taste a hat Tag propery so dass Sie die tage Eigenschaft auf die Schaltfläche positioin im array.You kann wie

etwas tun einstellen
int i=0; 
foreach(var button in x){ 
button.tag=i; 
++i; 
} 

dann können Sie wie

für den Tag überprüfen
private void ClickedButton(object sender, EventArgs e)   
{ 

     Button button_send = (Button)sender; 
     int position=Convert.ToInt32(button_send.Tag) 
     for (int i = 0; i < 70; i++) 
      if (position==i) 
      /* 
       instructions 
      */ 
} 
+0

bitte können Sie es als Antwort markieren, wenn es Ihnen hilft – suulisin

+0

Wenn ich 'i' auf die' button.Tag' zuweisen gibt es mir den Fehler von 'Objektreferenz nicht auf die Instanz von gesetzt ein Objekt.' :(Was soll ich tun? –

+0

ist Ihre Schaltfläche Array initialisiert? Wenn es nicht ist, initialisiert es in der Contractor und auch den ersten Code-Block in den Konstruktor.Hoffe wird es Ihnen helfen – suulisin

Verwandte Themen