C# Birden Fazla Kontrolü Tek Olaya Bağlamak
Bu yazımda C#’ta birden fazla kontrolün tek olaya nasıl bağlandığını göreceğiz.Farklı kontrol tiplerini aynı olaya bağlayabiliriz.Bu durumda hangi kontrolün olayının tetiklendiğini nasıl bulacağımızı göreceğiz.
Formumuzda üç adet button,bir adet textbox ve bir adette checkbox var.Ben örneklerimi bu kontroller üzerinden göstereceğim.Örnek olarak Click olayı üzerinden yazımı devam ettireceğim.Sizler diğer olayları kullanabilirsiniz.
!!Olaylarda bir metotdur.
Formdaki bütün kontrollerin Clik olayını “tikla” metoduna bağlayalım.(Bu işlemi yapabilmek için öncelikle tikla metodunu yazınız.Sonra herhangi bir kontrolün Properties-Events bölümünden Click özelliğine bağlayabilirsiniz.)
//tikla Metodu private void tikla(object sender, EventArgs e) { }
Aslında bu yazının başlığından anlaşılan içerik buraya kadar anlatıldı.Şimdi yazıyı sonlandırmam gerekiyor ama asıl mevzuya yeni geldik.Yukardaki gördüğünüz metod textboxa, buttonlardan birine ya da checkboxa basınca calısacaktır.Ancak hangi kontrole tıklanmış olduğunu öğrenmek isteyebilir ona görede işlem yaptırmak ihtiyacı duyabiliriz.
Hangi kontrole tıklandığı, tikla metodunun ilk parametresi olan “object sender” komutunda gizlidir.Object tipinden sender isimli bu değişken sayesinde biz tıklanan kontrolün türünü alabiliriz.
private void tikla(object sender, EventArgs e) { MessageBox.Show(sender.GetType().ToString()); }
Yukarıdaki tikla metodu çalıştığında mesaj kutusunda,tikla metodunu tetikleyen kontrolün tipi yazdırılacaktır.Buradaki GetType() metodu sayesinde değişkenin tipini öğrenebiliyoruz.Tıklanan kontrolün tipi sender isimli object değişkene gönderiliyorsa bu metod sayesindede değişkenin tipini öğrenebiliyoruz.
Şimdi mevzuyu birazdaha derinleştirelim.Ben button1 adlı Button nesnesine tıkladığım zaman sender adlı object değişkenine bastığım kontrolün tipi gidecektir.Öyle mi?Evet öyle.Yani Button nesnesine bastığım için Button tipi gidecektir.O halde sender değişkeni Button özelliklerini taşıması lazım.Ancak “sender.” yazınca bana Button özellikleri gelmiyor..??
Sebebi sender değişkeni object tipinde bir değişken olduğu için,Button tipi object tipine bağlanırken “Boxing” e uğrar.Eğer sender değişkenini “Unboxing” yaparsak Button özelliklerini kullanabiliriz.(Boxing,Unboxing kavramlarını buradan daha ayrıntılı inceleyebilirsiniz.)
private void tikla(object sender, EventArgs e) { Button b = (Button)sender; //sender değişkeninin unboxing yapılmış hali b değişkenine aktarıldı. b.Text="123"; }
Yukardaki gibi “Unboxing” yaptıktan sonra Button özelliklerini kullanabiliriz demektir.
Mevzuyu bir adım daha derinlere götürelim.Ben yukarıda , Button değişkenine tıklayacağımı bildiğim için sender değişkenini Button tipine “Unboxing” işlemi yaptım.Peki bu durumda textbox tikla metodunu tetiklemiş olsaydı ne olurdu?sender isimli object değişkene,textbox tıklandığından dolayı TextBox tipi gönderilecekti.Ancak biz sender değişkenini Button tipine “Unboxing” etmiş bulunuyoruz.Bu durumda program batlayacaktır…
Bu durumu kontrol edebiliriz.sender değişkenine gelen tipin(TextBox,Button vs..) ne olduğunu kontrol ederiz.
private void tikla(object sender, EventArgs e) { if (sender.GetType()==typeof(Button)) { button1.Text = "asd"; } else if (sender.GetType()==typeof(TextBox)) { textBox1.Text = "asd"; } else if (sender.GetType()==typeof(CheckBox)) { checkBox1.Text = "asd"; } }
Yukarıdaki kodlarda sender değişkenine gelen tipi sorguluyoruz.typeof() metodu sayesinde hangi kontrolün geldiğini sorgulayabiliyoruz.Artık textboxa da tıklansa checkboxa da tıklansa istediğimiz işlemleri tek metodda yaptırabiliyoruz.Aşağıdaki gibide kontrol edebiliriz.
if (sender is TextBox)//sender değişkenine gelen tip TextBox mu? { MessageBox.Show("evet textbox"); }
Yukarıdaki gibi “is” operatörünü kullanarak sender değişkeninin tipini öğrenebildik.
NOT:is operatörünü object’in içinde ki eleman aslında bu mudur ? amacıyla kullanamayız.
Son olarak Control tipinden bahsedeceğim.Control tipi,Button,TextBox v.s gibi tiplerin türediği bir tiptir.Bundan dolayı tüm Control tipinden türeyen nesnelerde ortak bir takım özellikler bulunur.Text,Name,BackColor v.s,Bunları sağlayan Control türüdür.
Unutmamamız gereken bir nokta ise,Control tipinden bir nesne üzerinde kendine has özellikleri kullanamayız.Örneğin,TextBox nesnesini kullanırsak eğer,kendine has özelliği olan(yani TextBox tipindeki) .TextAlign özelliği,Control tipinde(yani Control tipinden TextBoxta) bulamayız.
aradığım buydu sağolasın
Elinize sağlık
Benim şöyle bir sorum var.Kod ile farklı sayıda buton oluşturmam gerekiyor ve bu formları yine kod ile oluşturduğum formlar ile eşliyorum ve bütün butonların olayı buton_click() oluyor haliyle burda sıkıntı yok ama butonlardan hangisini tıkladığımı nasıl tespit edebilirim.teşekkürler.
Çözdüm teşekkürler
benim de aynısına ihtiyacım var ama aklıma birşey gelmiyor yeni sayılırım yardımcı olur musun?
senin için geç olmuş ama başkasının ihtiyacı olur diye yazayım.
click event inin içine
Button btn = sender as Button;
bu sana tıklanan butonu verecek.
mesela
btn.BackColor = Color.Red;
bu özelliği tıklanan butona uygular
Öncelikle esselamu aleyküm ve rahmetullah ve berakatüh
Aleyküm Selam 🙂
Merhaba,
Dışarıdan alınan sayılara bağlı panelin içinde dinamik butonlar oluşturuyorum, butonların text ine başta 0 yazdırıyorum. butonlara tıklandığında sıfırlar bire, birler sıfıra dönüyor. işin sonunda benim hangi butonda 1 hangi butonda 0 yazdığını bilmem lazım ki buna bağlı işlem yapacağım. Her butona özel veriyi nasıl toplayabilirim, yardımcı olur musunuz?
Tıklanan butonun hangisi olduğunu ‘sender’ parametresi getirecektir.
Button tiklananButon = (Button)sender
komutuyla ilgili tıklanan butonu alabilir vetiklananButon.Text
komutuylada değerini okuyabilirsiniz.Sevgiler.
Gençay hocam. Visual Studio 2015 kullanıyorum fakat bende bu şekilde çalışmadı. Acaba VS da mı sorun var yoksa bir şeyler eksik mi yapıyorum. (Not: Başka uygulama yaparkende denedim çalışmamıştı.)
kodunda “button1_Click(sender, e);” kod satırı ne işe yarıyor???
biraz karışık olmuş üzgünüm, son satıra bakın lütfen