2013-07-30 10 views
7

In C# (.NET 4.5) Ich möchte ein Ereignis abonnieren, während ich ein Objekt erstellen.Subscribed to event beim Erstellen eines Objekts in C#

Die folgenden, natürlich funktionieren würde:

CheckBox c = new CheckBox(); 
c.Name = "TheCheckBox"; 
c.Checked += c_Checked; 

Aber wollen herausfinden, ob es möglich ist, etwas entlang der Linien von dem zu tun:

CheckBox c = new CheckBox() { 
    Name = "TheCheckBox", 
    Checked += c_Checked 
} 

Post-Diskussion bearbeiten: Dies ist, um zu erreichen, ist etwas wie:

MyUniformGrid.Add(new CheckBox() { 
    Name = "TheCheckBox", 
    Checked += CheckHandler 
}); 
+0

wenn es Ihre eigenen Kontrollen sollten Sie in der Lage sein, eine 'Func <>' als Argument an den Konstruktor zu haben und es bis dort – Default

+0

@Default könnten Sie eine Antwort mit Beispiel-Code posten? – mbaytas

Antwort

12

Nein, leider wird die Ereignissubskription in Objektinitialisierern nicht unterstützt. Es würde es wirklich einfachen GUIs in einigen Fällen zu schaffen, aber keine ...

Das Haus auf halbem Weg ist:

Checkbox c = new CheckBox { Name = "TheCheckBox" }; 
c.Checked += c_Checked; 

(Idealer c_Checked auf einen Namen umbenennen, die tatsächlich sinnvoll ist - Ich hasse die VS-generierten Namen hier ...)

+0

Vielen Dank. Ich kenne die halbwegs Lösung, aber es funktioniert nicht für mich. Was ich machen wollte, war etwas wie 'MyUniformGrid.Add (neues CheckBox() {Checked + = CheckHandler});'. – mbaytas

+3

@baytas: Richtig - es wird nicht, im Grunde genommen. Sie könnten eine Erweiterungsmethode anschließen, um: 'MyUniformGrid.Add (neue CheckBox(). Mit (c => c.Checked + = CheckHandler))' wenn das helfen würde ... –

+1

@baytas Einliner nicht immer lesbar, btw. – Leri

0

Wenn Sie Kontrolle über Ihre Steuerelemente haben, können Sie den eventhandler im Konstruktor immer einrichten. Etwas wie:

public class Program 
{ 
    private static void Main(string[] args) 
    { 
     Checkbox checkbox = new Checkbox(OnChecked); 
     checkbox.TriggerChecked(); 
    } 

    private static void OnChecked(object sender, EventArgs args) 
    { 
     Console.WriteLine("triggered event"); 
    } 
} 

public class Checkbox 
{ 
    public event EventHandler<EventArgs> Checked; 

    public Checkbox(EventHandler<EventArgs> eventHandler) 
    { 
     Checked += eventHandler; 
    } 


    public void TriggerChecked() 
    { 
     var handler = Checked; 
     if (handler != null) 
      handler(this, new EventArgs()); 
    } 
} 
+0

In meinem Fall geht es mir besser, wenn ich die Dinge einfach so mache (erster Codeblock in der Frage). Nichtsdestotrotz ist das neu für mich und ich freue mich immer neue Sachen zu lernen. Danke für das Zeigen. – mbaytas

Verwandte Themen