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.