System.EventArgs Sınıfı
GUI kontrollerinde dikkat ettiyseniz kontrollerin çalıştırdığı metodlarda System.Object türünde sender ve System.EventArgs türünde e isimli iki tane parametre kullanılır. Bu format, önceki sayfada yazdığım gibi System.EventHandler isimli delegate’ten gelmektedir. Buradaki sender parametresi, eventi tetikleyen objeyi temsil eder. e parametresi ise o obje ile ilgili detayları bildirir. Bu parametreler, eventi üreten kontrolü öğrenmek ve ona ait ek özellikleri kullanmak için kolaylıklar sağlar. Örneğin mouse ile Form’a tıklandığında (MouseDown) mouse’in sağ mı yoksa sol mu tıklandığını e parametresinden anlarız.
Friend WithEvents Button1 As System.Windows.Forms.Button Private Sub Button1_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Button1.MouseDown If e.Button = MouseButtons.Left Then MsgBox("Sol tuşu tıkladınız.") End If End Sub
button1.MouseDown += new System.Windows.Forms.MouseEventHandler(button1_MouseDown); private void button1_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e){ if(e.Button==MouseButtons.Left) MessageBox.Show("Sol tuşu tıkladınız."); }
MouseDown için MouseEventHandler sınıfı kullanılmıştır. Nitekim MouseEventArgs sınıfı da System.EventArgs sınıfından inherit edilmiştir.
Şimdi de görmeye alıştığımız bu formatı kendi class’larımız için nasıl oluştururuz ona bakalım. Öncelikle EventArgs sınıfıntan türetilmiş bir sınıf oluşturalım. Sonra bu sınıfı parametre olarak kullanan bir delegate tanımlarız. Sonraki süreci zaten biliyoruz.
'LogMesajEventArgs sınıfı Public Class LogMesajEventArgs Inherits EventArgs 'Değişkenleri public yapmak yerine Property de kullanabilirdik. Public Tarih As Date Public Mesaj As String Sub New(ByVal Tarih As Date, ByVal Mesaj As String) Me.Tarih = Tarih Me.Mesaj = Mesaj End Sub End Class 'CustomControl sınıfı Public Class CustomControl Public Delegate Sub MesajDelege(ByVal sender As Object, ByVal e As LogMesajEventArgs) Public Event MesajEvent As MesajDelege Sub New(ByVal Tarih As Date, ByVal Mesaj As String) AddHandler MesajEvent, AddressOf LogMesajYaz RaiseEvent MesajEvent(Me, New LogMesajEventArgs(Tarih, Mesaj)) End Sub Sub LogMesajYaz(ByVal sender As Object, ByVal e As LogMesajEventArgs) Console.WriteLine("Gönderen: " & sender.ToString()) Console.WriteLine("Tarih: " & e.Tarih) Console.WriteLine("Mesaj: " & e.Mesaj) End Sub End Class 'Main Program Module ArgsEventOrnek Sub Main() Dim o1 As New CustomControl(#1/21/2006#, "Tüm joblar çalıştı.") Console.ReadLine() End Sub End Module
//LogMesajEventArgs sınıfı class LogMesajEventArgs : EventArgs { public DateTime Tarih; public string Mesaj; public LogMesajEventArgs(DateTime Tarih, string Mesaj) { this.Tarih = Tarih; this.Mesaj = Mesaj; } }//LogMesajEventArgs //CustomControl sınıfı class CustomControl { public delegate void MesajDelege(object sender, LogMesajEventArgs e); public event MesajDelege MesajEvent; public CustomControl(DateTime Tarih, string Mesaj) { MesajEvent += new MesajDelege(LogMesajYaz); MesajEvent(this, new LogMesajEventArgs(Tarih, Mesaj)); } void LogMesajYaz(object sender, LogMesajEventArgs e) { Console.WriteLine("Gönderen: " + sender.ToString()); Console.WriteLine("Tarih: " + e.Tarih); Console.WriteLine("Mesaj: " + e.Mesaj); } }//CustomControl //Main Program class ArgsEventOrnek { public static void Main() { new CustomControl(DateTime.Parse("21/1/2006"), "Tüm joblar çalıştı."); Console.ReadLine(); } }//ArgsEventOrnek
Gönderen: ArgsEventOrnegi.CustomControl
Tarih: 21.01.2006
Mesaj: Tüm joblar çalıştı.
Dinamik Control Oluşturma
Uygulama geliştirirken event handler mekanizmasını yoğun kullandığımız alanlardan biri de çalışma zamanında dinamik kontroller oluşturup onların event’lerini ilgili metod veya metodlara yönlendirmektir. Örneğin bir web sayfasının veya bir windows formun içerisine birden fazla TextBox kontrolünü tasarım zamanında değil sayfa çağrıldığı zaman ekleyebilir ve onların TextChanged event’ini yönetebiliriz. Bunun için n tane TextBox nesnesi oluşturup ilgili alana eklemek gerekir. Bu bölümde bununla ilgili küçük bir örnek yapacağız. Bir Windows Application projesi yaratıp form üzerine bir panel bırakalım. Örnekte dinamik olarak aşağıdaki şekilde gösterildiği gibi 5’er Button ve TextBox oluşturacağız, kaçıncı buton tıklanırsa onun karşısındaki TextBox’a butonun numarasını yazacak.
Kullanılan Panel Adı : pnlEkran
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Dim X As Integer Dim btn(4) As Button Dim txt(4) As TextBox For X = 0 To 4 'Button oluşturup ekleyelim. btn(X) = New Button btn(X).Text = (X + 1).ToString btn(X).Size = New Size(20, 20) btn(X).Location = New Point(10, (X + 1) * 25) 'her butonun arası 5 px olsun. AddHandler btn(X).Click, AddressOf btn_Click pnlEkran.Controls.Add(btn(X)) 'Textbox oluşturup ekleyelim. txt(X) = New TextBox txt(X).Size = New Size(40, 20) txt(X).Tag = X + 1 txt(X).Location = New Point(50, (X + 1) * 25) pnlEkran.Controls.Add(txt(X)) Next End Sub Sub btn_Click(ByVal sender As Object, ByVal e As EventArgs) Dim btn As Button = CType(sender, Button) Dim HangiTxt As Integer = Convert.ToInt16(btn.Text) 'Tag değeri, tıklanılan butonun textine eşit olan textboxı bulacağız. For X As Integer = 0 To pnlEkran.Controls.Count Try Dim txt As TextBox = CType(pnlEkran.Controls(X), TextBox) If txt.Tag = HangiTxt Then txt.Text = HangiTxt End If Catch 'msgbox(X) End Try Next End Sub
private void Form1_Load(object sender, System.EventArgs e)
{
int X;
Button[] btn=new Button[5];
TextBox[] txt=new TextBox[5];
for (X=0;X
Sizler de aynı yöntemleri kullanarak basit bir hesap makinası (Calculator) örneği yazabilirsiniz.
Faydalı bir yazı olmuş. Teşekkürler. Yazılarınızın devamını bekliyorum/bekliyorlar/bekliyoruz.
Hocam makale için teşekkürler.Zaten aynısı kitabınızda da vardı ama tekrar okudum.Çok güzel olmuş.
Acaba ASP.net kitabınızı önümüzdeki 100 yıl içerisinde çıkma ihtimali var mı?:):)
Bir de hocam .net bilen bir bilgisayar mühendisinin çalışmaya başlayabileceği firmaları tecrübelerinizden faydalanarak sıralayabilir misiniz?(kendimizi geliştirmek adına.)Çünkü bir araştırma yaptım Microsoft dışındaki büyük firmalar(IBM,Oracle..).net kullanmıyor java kullanıyorlar.(Bunlara Tubitak gibi yerler de dahil.)
Hep orta ve küçük ölçekli firmalar ve projeler .net kullanıyor.Aklımın bir köşesinde hep java mı?der gibiyim:)
.net ile çalışabilecek iyi firmalar hangileri olabilir acaba?(Microsoft dışında)benim açımdan sektöre girmeye az bir zaman kalmışken.?Tesekk.