KMRT BSRN

"Hiç kimsenin ilgisine ihtiyaç duymadığın gün olgunlaşırsın. Hiç kimseden beklentiye girmediğin gün yara almazsın. Ve hiç kimseye bağımlı kalmazsan kazanırsın." OSHO

Tüm İşler Tek Metodta.. (Single Method For All Jobs)

Yorum bırakın


Bazı durumlarda yapılması gereken işlerin hepsini tek metod içinde yapmamız gerekebilir. Tabii bu biraz üzeri kapalı bir giriş oldu. 🙂 Nedir bu işler? Neden bir metod içinde hepsini yapalım ki? diye sorular sorabilirsiniz. Bende bu sorular üzerinden basit bir senaryo ile olayı anlatmaya çalışacağım. Fakat kısacası şunu belirteyim. Böyle olması gereken bir durum oldu ve bende bunun üzerinde olaya yaklaşarak bu konuda biraz uğraştım. Öncelikle “Tüm İşler” dediğimiz nedir? Benim burada tüm işlerden kastım: bir metodun içinde olay tanımlama ve o olaya kod yazmak ve yazılan kodu bağlamak.. Şimdi diyebilirsiniz ne var ki bunda zaten bunu yapıyoruz.. Doğru ama yaptığımız şeyler olaylar, metotlar herzaman tek metod içinde olmuyor.. Buna şöyle bir örnek verelim.

image

Resimde gördüğünüz form’da sağ tarafta bulunan GroupBox’ı bir Usercontrol olarak düşünün yada normal form üzerinde bir kontrol olarak da düşünebilirsiniz. Buradaki problem şu; “Olay Bağla !” butonunu kullanarak “Mesaj Ver !” butonuna bir olay set etmek ve bu olayda çalışacak koduda bu olayı tanımlarken geliştirmek istiyorum.. Bunu çözmenin iki yolu var. Genelde ilk yolu tercih ederiz..

C#
private void btnOlayBagla_Click(object sender, EventArgs e)
{
    this.btnMesajVer.Click += new EventHandler(btnMesajVer_Click);
}

void btnMesajVer_Click(object sender, EventArgs e)
{
    MessageBox.Show("?lk y?ntem ile olu?turuldu..");
}

 

Fakat burada dikkat’i çekmek istediğim ve problemin oluşmasına sebep olan, ilk tercihi gerçekleyemememize sebep olan şöyle bir durum oluşursa ne yapacağız !?

1) İstenilen şu; “btnOlayBagla” butonuna tıklandığında “btnMesajVer” butonuna “Click” olayı tanımlamak ve bu olay da çalışacak kodu da burada(“btnMesajVer_Click” olayında değil) tanımlamak istiyorsam. Bunu nasıl yaparım. Yani tüm işleri tek bir metod içinde(örneğimizde; “btnOlayBagla_Click” içinde) yapmak istiyorum.

Aslında şöyle bir durumla da karşı karşıya kalmış olabilirdik..

2) Yularıdaki kodlarda da görüldüğü gibi “btnMesajVer” butonuna erişebiliyorum ve Click olayını yakalayabiliyorum. Peki ya bu buton(“btnMesajVer”) yukarıdaki paragraflarda da belirttiğim gibi bir UserControl içinde olsaydı. Hemen dediğinizi duyar gibiyim. “Modifiers” özelliğini “Public” yapardım, sonrada erişir olayımı yine yazardım diyorsunuz.. Peki ya “Modifiers” özelliğini “Public” yapmanıza izin yoksa, ya da şöyle söyleyeyim. Yapmamanız gereken sebepler varsa ve yapamıyorsanız. Daha da zorlaştıralım. Bunu gene (1) no’lu durumla aynı şekilde çözmemiz isteniyorsa yani “Tek metod içinde Tüm işlemleri Bağla”..

İşte bunu nasıl yapabiliriz ona bakalım. Öncelikle (1) no’lu senaryomuzu çözelim. (Basitten karmaşığa..)

C#
private void btnOlayBagla_Click(object sender, EventArgs e)
{
    // ?ncelikle EventHandler nesnemi olu?turuyorum.
    // Bu nesne "btnMesajVer" butonunun yapaca?? kodu i?erecektir.
    EventHandler handler = delegate
        {
            MessageBox.Show("btnMesajVer t?kland?..");
        };

    // Olu?tudu?um Delegate 'i(Olay ve olay?n ?al??t?raca?? kodu)
    // ilgili nesneye ba?l?yorum.
    this.btnMesajVer.Click += handler;
}

Evet yukarıda da gördüğünüz gibi gayet basit ve net bir şekilde tek metot içinde olayımızı oluşturduk. İlgili nesnenin istediğimiz olayına bağladık. Gelelim (2) no’lu durumda ne yapabileceğimize. Yukarıdaki kodda gördüğünüz gibi nesnemize çok rahat güzel bir biçimde erişiyoruz. Peki ya UserControl içinde olsaydı ve “Modifers” özelliğini de “Public” veremiyorsak, işte o durumda da kodumuz şu hale geliyor. (Kodu yazarken UserControl kullanmadım. Yaptığımdan farkı yok. Zaten farkedeceksinizdir ilgili kontrolü direkt kullanmıyorum.)

C#
private void btnOlayBagla_Click(object sender, EventArgs e)
{
    // ?ncelikle EventHandler nesnemi olu?turuyorum.
    // Bu nesne "btnMesajVer" butonunun yapaca?? kodu i?erecektir.
    EventHandler handler = delegate
        {
            MessageBox.Show("btnMesajVer t?kland?..");
        };

    // Kontrol?m? ad? ile ar?yorum.(Burada form i?inde arad?m, siz UserControl
    // i?inde de arayabilirsiniz..)
    Control[] ctrl = this.Controls.Find("btnMesajVer", true);

    if (ctrl.Length > 0)
    {
        Button btn = ctrl.First() as Button;

        if (btn != null)
        {
            // Olu?tudu?um Delegate 'i(Olay ve olay?n ?al??t?raca?? kodu)
            // ilgili nesneye ba?l?yorum.
            btn.Click += handler;
        }
    }
}

İşte bu işlemi de bu şekilde halledebiliriz. Çıtayı son bir kez daha yükseltiyoruz. İki durum içinde (1)(2) şöyle bir gereksinim olsa bunu nasıl yaparız !? Yukarıda hepsi çok güzel, kontrolümüzü yakaladık. Kontrolümüze olayımızı oluşturduk ve bağladık. Olayımızın içindeki kodu geliştirdik. Hepsi çalışıyor fakat bizden, olayı bağladığımız kontrolün(“btnMesajVer”) bu bağladığımız olayı ilk olarak buradan(olayı bağladığımız yerden) çalıştırmamız istense, bunu nasıl yaparız? Yani “btnOlayBagla” butonuna tıklandığında hem “btnMesajVer” butonuna olay bağlayacağız hem de bu olayı 1 veya kaç kere istenirse buradan tetikleyeceğiz(fırlatacağız). Bunun içinde sadece 1 satırlık bir ekleme ile işimizi görebiliriz..

C#
private void btnOlayBagla_Click(object sender, EventArgs e)
{
    // ?ncelikle EventHandler nesnemi olu?turuyorum.
    // Bu nesne "btnMesajVer" butonunun yapaca?? kodu i?erecektir.
    EventHandler handler = delegate
        {
            MessageBox.Show("btnMesajVer t?kland?..");
        };

    // Kontrol?m? ad? ile ar?yorum.(Burada form i?inde arad?m, siz UserControl
    // i?inde de arayabilirsiniz..)
    Control[] ctrl = this.Controls.Find("btnMesajVer", true);

    if (ctrl.Length > 0)
    {
        Button btn = ctrl.First() as Button;

        if (btn != null)
        {
            // Tabii burada olay?n tekrar tekrar ba?lanmamas?
            // i?in kontrol yapmay? unutmay?n !!
            if (btn.GetType().GetEvent("Click") != null)
                btn.GetType().GetEvent("Click").RemoveEventHandler(btn, handler);

            // Olu?tudu?um Delegate 'i(Olay ve olay?n ?al??t?raca?? kodu)
            // ilgili nesneye ba?l?yorum.
            btn.Click += handler;

            // Olay? ilk defa tetikliyorum(f?rlat?yorum)..
            handler.Invoke(btn, null);
        }
    }
}

İşte böylece tüm durumlarımızı çözdük. İşinize yaraması ve kullanmanız umuduyla..

Reklamlar

Yazar: K. Murat BAŞEREN, MBA, MCP

I am a senior software developer, MCP, consultant, blogger, former chemist and software trainer. My interests range from software developer to technology. I am also interested in web development, education, and coffee.

Bir Cevap Yazın

Aşağıya bilgilerinizi girin veya oturum açmak için bir simgeye tıklayın:

WordPress.com Logosu

WordPress.com hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap / Değiştir )

Twitter resmi

Twitter hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap / Değiştir )

Facebook fotoğrafı

Facebook hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap / Değiştir )

Google+ fotoğrafı

Google+ hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap / Değiştir )

Connecting to %s