2013-07-30 7 views
7

C# içinde (.NET 4.5) Bir nesne oluştururken bir etkinliğe abone olmak istiyorum.C# nesne oluştururken olaya abone #

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

Ama çizgisinde bir şey yapmak mümkün olup olmadığını öğrenmek istiyorum:

şu, tabii ki, çalışacak

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

Sonrası tartışma düzenlemek: Bu başarmak için şu gibi bir şeydir:

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

kendi kontrolleri olması gerekir onu eğer bir 'Func <>' kurucu argüman ve orada – Default

+0

kurmak olarak @Default örnek koduna sahip bir cevap sonrası olabilir? – mbaytas

cevap

12

Hayır, maalesef nesne başlatıcıları içinde etkinlik aboneliği desteklenmiyor. Bu

yarı yolda evdir ... Bu gerçekten basit bazı durumlarda GUI oluşturmak için yapmak, ancak hiçbir olacaktır:

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

(İdeal aslında anlamlı bir isme c_Checked yeniden adlandırma - VS tarafından oluşturulan adlardan nefret ediyorum ...)

+0

Çok teşekkürler. Yarı çözümün farkındayım, ama benim için çalışmıyor. Yapmak istediğim şey, 'MyUniformGrid.Add (yeni CheckBox() {Checked + = CheckHandler}); gibi bir şeydi. – mbaytas

+3

@baytas: Doğru - temelde değil. İzin vermek için bir uzantı yöntemini bağlayabilirsiniz: MyUniformGrid.Add (yeni CheckBox(). With (c => c.Checked + = CheckHandler)) Eğer yardımcı olursa ... –

+1

@baytas Tek liner her zaman okunabilir ortalama, btw. – Leri

0

Denetimleriniz üzerinde denetiminiz varsa, her zaman kurucunun içinde eventhandler'ı kurabilirsiniz. gibi bir şey:

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

Benim durumumda, her zamanki gibi şeyler yapmaktan daha iyidir (sorudaki ilk kod bloğu). Yine de, bu benim için yeni ve her zaman yeni şeyler öğrenmek için mutluyum. Gösterdiğiniz için teşekkür ederim. – mbaytas