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.