Ismail Hamzah

.NET
See also: Other Geeks@INDC

Event Handling ASP.NET 2.0 Part 2

  

Pada bagian satu telah dibahas pola fikir dari konsep Event Handling ini. Pembahasan dimulai dari penjelasan apa itu event dan diakhiri dengan bagaimana cara mengkonsumsi event tersebut. Karena delegate memiliki peranan yang sangat penting bagi event handling maka pada bagian satu dibahas juga sedikit mengenai delegate. Proses pelemparan event oleh event sender dan proses penggunaan event oleh event receiver telah digambarkan juga pada bagian satu secara sederhana dan menggunakan contoh.

 

Sekarang, pada bagian dua ini, akan dicoba untuk memaparkan sedikit konsep yang masih tertinggal di bagian satu. Konsep yang tertinggal itu adalah mengenai transfer data melalui event. Yes, event dapat membawa data.


 

 Sedikit Teori 

 

.NET telah menyediakan sebuah event delegate standar untuk digunakan yaitu delegate System.EventHandler. Delegate System.EventHandler ini menggunakan kelas System.EventArgs sebagai parameter yang akan membawa data.

 
delegate void EventHandler(object sender, EventArgs e);
 

Karena data yang dilewatkan melalui event ini akan sangat bervariasi maka pada kasus khusus kelas System.EventArgs tidak digunakan secara langsung. Tetapi, digunakan sebagai base class untuk sebuah kelas sesungguhnya yang sangat merepresentasikan data yang dibutuhkan. Sehingga dapat dikatakan, untuk kebutuhan data tertentu maka diperlukan sebuah kelas custom yang diturunkan langsung dari kelas System.EventArgs.

 

Jadi pada bab ini ada dua hal yang akan dilakukan:

  1. Membuat kelas custom yang merupakan kelas turunan dari kelas System.EventArgs. Kelas custom inilah yang akan membawa data via si event. Konvensi penamaan dari kelas custom ini adalah NamaEventEventArgs. Kelas custom ini kemudian akan digunakan menjadi parameter untuk event delegate.
  2. Membuat event delegate baru dengan menggunakan kelas dari point satu. Event delegate yang baru ini akan mengikuti konvensi penamaan sebagai berikut: “NamaEventEventHandler”. Event delegate yang baru ini akan digunakan untuk membuat sebuah event sehingga event yang terbuat dapat membawa data dari objek kelas custom dari point satu diatas.   

 

  Let’s See How “Rubber Meets the Road” 

 

Contoh yang digunakan masih sama seperti contoh pada bagian satu. Method Rename akan memanggil method yang akan membangkitkan event. Hal yang baru dari bagian dua ini adalah definisi kelas custom yang akan diturunkan langsung dari kelas System.EventArgs. Kelas baru tersebut akan menampung data Boolean yang akan mengindikasikan persetujuan untuk merubah nama atau tidak. Sebuah event akan dideklarasikan dengan menggunakan event delegate yang baru.

 

Berikut adalah kerangka source code yang akan dikembangkan:

using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
 
public partial class EventHandlerWithData : System.Web.UI.Page
{
 
}
// custom EventArgs class
public class GantiNamaEventArgs : EventArgs
{
 
}
// custom event delegate
public delegate void GantiNamaEventHandler(object sender, GantiNamaEventArgs e);
 
public class KelasSumber
{
    
}

 

 

Kelas GantiNamaEventArgs

 

Kelas ini diturunkan dari kelas System.EventArgs. Kelas GantiNamaEventArgs merupakan kelas custom yang akan membawa data tertentu. Pada contoh kali ini, kelas ini hanya akan membawa data Boolean yang akan mengindikasikan tentang persetujuan perubahan nama.

// custom EventArgs class
public class GantiNamaEventArgs : EventArgs
{
    private bool _approved = true;
    // constructor
    public GantiNamaEventArgs(bool approved)
    {
        _approved = approved;
    }
 
    public bool Approved
    {
        get
        {
            return _approved;
        }
    }
}
 

Delegate GantiNamaEventHandler

 

Agar event yang dibuat dapat membawa data yang dibungkus oleh kelas GantiNamaEventArgs, maka harus dibuat sebuah delegate dengan menggunakan kelas GantiNamaEventArgs sebagai parameternya. (Note: kemampuan sebuah event ditentukan oleh delegate pembentuknya. Sedangkan delegate ditentukan oleh parameter EventArgs nya.)

// custom event delegate

public delegate void GantiNamaEventHandler(object sender, GantiNamaEventArgs e);

 

Kemudian, event GantiNama akan dibuat dengan menggunakan  event delegate diatas.

 
// deklarasi event

    public event GantiNamaEventHandler GantiNama;

 

Karena event GantiNama didesain untuk membawa data maka method yang akan membangkitkan event ini sedikit dimodifikasi dengan menambahkan parameter. Parameter tersebut kemudian digunakan untuk meng-invoke delegate.

 
// method yang akan membangkitkan si event
    protected void OnGantiNama(GantiNamaEventArgs e)
    {
        GantiNamaEventHandler eh = GantiNama;
        if (eh != null)
        {
            // invokes the delegate
            eh(this, e);
        }

    }

 

Dalam contoh ini, data yang dibawa oleh si event akan digunakan oleh method handler. Pada method tersebut akan dilakukan pemeriksaan terhadap data persetujuan yang dibawa oleh event melalui kelas GantiNamaEventArgs.

 
// handler
    protected void test(object sender, GantiNamaEventArgs e)
    {
        // ekspresi e.Approved merupakan contoh penggunaan
        // data yang dibawa dari si event
        if (e.Approved)
        {
            Label1.Text = "Perubahan disetujui";
        }
        else
        {
            Label1.Text = "Perubahan TIDAK disetujui";
        }

    }

 

Adapun source code lengkapnya adalah sebagai berikut:

using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
 
public partial class EventHandlerWithData : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
 
    }
    // handler
    protected void test(object sender, GantiNamaEventArgs e)
    {
        // ekspresi e.Approved merupakan contoh penggunaan
        // data yang dibawa dari si event
        if (e.Approved)
        {
            Label1.Text = "Perubahan disetujui";
        }
        else
        {
            Label1.Text = "Perubahan TIDAK disetujui";
        }
    }
 
    protected void Button1_Click(object sender, EventArgs e)
    {
        KelasSumber TestClass = new KelasSumber();
        // handler registration
        TestClass.GantiNama +=new GantiNamaEventHandler(test);
        TestClass.ApprovedPerubahan = false;
        Label2.Text = "Nama Default:" + TestClass.Nama;
        TestClass.Rename("Muhammad Irfan");
        Label3.Text = "Nama Baru:" + TestClass.Nama;
        
        
    }
}
// custom EventArgs class
public class GantiNamaEventArgs : EventArgs
{
    private bool _approved = true;
    // constructor
    public GantiNamaEventArgs(bool approved)
    {
        _approved = approved;
    }
 
    public bool Approved
    {
        get
        {
            return _approved;
        }
    }
}
// custom event delegate
public delegate void GantiNamaEventHandler(object sender, GantiNamaEventArgs e);
 
public class KelasSumber
{
    // data private
    private string _nama = "Ismail Hamzah";
    // properties untuk mengakses data private
    public string Nama
    {
        get
        {
            return _nama;
        }
    }
    // data private
    private bool _approvedPerubahan = true;
    // properties untuk mengakses data private
    public bool ApprovedPerubahan
    {
        set
        {
            _approvedPerubahan = value;
        }
    }
    // deklarasi event
    public event GantiNamaEventHandler GantiNama;
 
    // method yang akan membangkitkan si event
    protected void OnGantiNama(GantiNamaEventArgs e)
    {
        GantiNamaEventHandler eh = GantiNama;
        if (eh != null)
        {
            // invokes the delegate
            eh(this, e);
        }
    }
    // konsumsi
    public void Rename(string NewName)
    {
        GantiNamaEventArgs e = new GantiNamaEventArgs(_approvedPerubahan);
 
        if (_approvedPerubahan)
        {
            _nama = NewName;
            OnGantiNama(e);
        }
        else
        {
            OnGantiNama(e);
        }
       
    }
}
  

 

Share this post: | | | |
Posted: Dec 08 2007, 11:30 AM by go2ismail | with no comments
Filed under:

Comments

No Comments

Leave a Comment

(required) 

(required) 

(optional)

(required) 
Are you human?:  


Enter the numbers above: