Optimasi setting 1 event yang sama untuk banyak kontrol


Terkadang Anda akan berada di suatu kondisi dimana anda harus melakukan 1 event yang sama untuk banyak kontrol dalam 1 form. Misalnya pada form yang Anda buat, terdapat 20 textbox yang boleh hanya diisi huruf saja. Normalnya anda akan melakukan hal ini pada form tersebut.

Form1.vb
Private Sub Text1_KeyPress(sender As Object, e As KeyPressEventArgs) Handles Text1.KeyPress
	If Not Char.IsLetter(e.KeyChar) Then
		e.Handled = False
	Else
		e.Handled = True
	End If
End Sub

Private Sub Text2_KeyPress(sender As Object, e As KeyPressEventArgs) Handles Text2.KeyPress
	If Not Char.IsLetter(e.KeyChar) Then
		e.Handled = False
	Else
		e.Handled = True
	End If
End Sub

Private Sub Text3_KeyPress(sender As Object, e As KeyPressEventArgs) Handles Text3.KeyPress
	If Not Char.IsLetter(e.KeyChar) Then
		e.Handled = False
	Else
		e.Handled = True
	End If
End Sub

...

Private Sub Text20_KeyPress(sender As Object, e As KeyPressEventArgs) Handles Text20.KeyPress
	If Not Char.IsLetter(e.KeyChar) Then
		e.Handled = False
	Else
		e.Handled = True
	End If
End Sub



Tidak ada yang salah dengan cara ini, hanya saja Anda melakukan banyak pengulangan script yang sama dalam form tersebut. Akan lebih baik jika script yang sama tersebut dikumpulkan dalam 1 fungsi, dan Anda hanya tinggal memanggil fungsi tersebut. Sehingga hasilnya menjadi seperti berikut.

Form1.vb
Private Sub Text_KeyPress(sender As Object, e As KeyPressEventArgs)
	If Not Char.IsLetter(e.KeyChar) Then
		e.Handled = False
	Else
		e.Handled = True
	End If
End Sub

Private Sub Text1_KeyPress(sender As Object, e As KeyPressEventArgs) Handles Text1.KeyPress
	Text_KeyPress(Me, e)
End Sub

Private Sub Text2_KeyPress(sender As Object, e As KeyPressEventArgs) Handles Text2.KeyPress
	Text_KeyPress(Me, e)
End Sub

Private Sub Text3_KeyPress(sender As Object, e As KeyPressEventArgs) Handles Text3.KeyPress
	Text_KeyPress(Me, e)
End Sub

...

Private Sub Text20_KeyPress(sender As Object, e As KeyPressEventArgs) Handles Text20.KeyPress
	Text_KeyPress(Me, e)
End Sub



Script diatas sudah bagus. Lalu bagaimana jika Anda memiliki 5 form dengan jumlah kontrol dan nama yang berbeda? Maka Anda akan menggunakan script diatas pada setiap form yang ada. Tentunya hal ini merupakan pengulangan script yang sama dan sangat tidak praktis untuk dilakukan. Akan lebih baik jika event KeyPress ini dapat diletakkan ke dalam sebuah modul, dan Anda dapat memanggilnya dalam setiap form. Sehingga hasilnya seperti ini

Module1.vb
Private Sub Text_KeyPress(sender As Object, e As KeyPressEventArgs)
	If Not Char.IsLetter(e.KeyChar) Then
		e.Handled = False
	Else
		e.Handled = True
	End If
End Sub

Form1.vb
Imports Module1.vb

Private Sub Text1_KeyPress(sender As Object, e As KeyPressEventArgs) Handles Text1.KeyPress
	Text_KeyPress(Me, e)
End Sub

Private Sub Text2_KeyPress(sender As Object, e As KeyPressEventArgs) Handles Text2.KeyPress
	Text_KeyPress(Me, e)
End Sub

Private Sub Text3_KeyPress(sender As Object, e As KeyPressEventArgs) Handles Text3.KeyPress
	Text_KeyPress(Me, e)
End Sub

...

Private Sub Text20_KeyPress(sender As Object, e As KeyPressEventArgs) Handles Text20.KeyPress
	Text_KeyPress(Me, e)
End Sub

Form2.vb
Imports Module1.vb

Private Sub TextNama_KeyPress(sender As Object, e As KeyPressEventArgs) Handles TextNama.KeyPress
	Text_KeyPress(Me, e)
End Sub

Private Sub TextAlamat_KeyPress(sender As Object, e As KeyPressEventArgs) Handles TextAlamat.KeyPress
	Text_KeyPress(Me, e)
End Sub

Private Sub TextTelp_KeyPress(sender As Object, e As KeyPressEventArgs) Handles TextTelp.KeyPress
	Text_KeyPress(Me, e)
End Sub



Cara ini masih dapat dioptimasi lagi. Bagaimana caranya agar Anda dapat memberikan event Keypress tanpa melakukan kopi script ini secara manual?

Private Sub Text1_KeyPress(sender As Object, e As KeyPressEventArgs) Handles Text1.KeyPress
	Text_KeyPress(Me, e)
End Sub

Jawabannya adalah Anda memberikan event KeyPress tersebut pada saat runtime. Anda hanya menambahkan script untuk menambahkan handle KeyPress untuk setiap kontrol tersebut pada modul, dan Anda tinggal memanggil fungsi tersebut pada saat form dibuka. Maka hasil akhir scriptnya adalah sebagai berikut.

Module1.vb
Public Sub KeyPressLetterOnly(sender As Object, e As KeyPressEventArgs)
	If Not Char.IsLetter(e.KeyChar) Then
		e.Handled = False
	Else
		e.Handled = True
	End If
End Sub

Public Sub SetAddHandler(ByVal oControl As Control, ByVal sCommand As String, ByVal sEvent As String)
	If sCommand = "KeyPress" Then
		If sEvent = "KeyPressLetterOnly" Then
			RemoveHandler oControl.KeyPress, AddressOf KeyPressLetterOnly
			AddHandler oControl.KeyPress, AddressOf KeyPressLetterOnly
		End If
	End If
End Sub

Form1.vb
Imports Module1.vb

Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
	SetAddHandler(Text1, "KeyPress", "KeyPressLetterOnly")
	SetAddHandler(Text2, "KeyPress", "KeyPressLetterOnly")
	SetAddHandler(Text3, "KeyPress", "KeyPressLetterOnly")
	...
	SetAddHandler(Text20, "KeyPress", "KeyPressLetterOnly")
End Sub

Form2.vb
Imports Module1.vb

Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
	SetAddHandler(TextNama, "KeyPress", "KeyPressLetterOnly")
	SetAddHandler(TextAlamat, "KeyPress", "KeyPressLetterOnly")
	SetAddHandler(TextTelp, "KeyPress", "KeyPressLetterOnly")
End Sub



Dengan cara ini, Anda dapat dengan mudah menambahkan / mengurangi sebuah event untuk tiap kontrolnya. Anda hanya cukup menambahkan 1 baris script dibandingkan dengan sebelumnya yang harus menambahkan 3 baris script. Sehingga tidak lagi ditemukan pengulangan script pada semua form yang digunakan.
Seandainya pun ada event baru, misalnya KeyPress yang hanya berisi angka saja, maka Anda tinggal memodifikasi sedikit script diatas, sehingga hasil nya sebagai berikut.

Module1.vb
Public Sub KeyPressLetterOnly(sender As Object, e As KeyPressEventArgs)
	If Not Char.IsLetter(e.KeyChar) Then
		e.Handled = False
	Else
		e.Handled = True
	End If
End Sub

Public Sub KeyPressDigitOnly(sender As Object, e As KeyPressEventArgs)
	If Not Char.IsDigit(e.KeyChar) Then
		e.Handled = False
	Else
		e.Handled = True
	End If
End Sub

Public Sub SetAddHandler(ByVal oControl As Control, ByVal sCommand As String, ByVal sEvent As String)
	If sCommand = "KeyPress" Then
		If sEvent = "KeyPressLetterOnly" Then
			RemoveHandler oControl.KeyPress, AddressOf KeyPressLetterOnly
			AddHandler oControl.KeyPress, AddressOf KeyPressLetterOnly
		ElseIf sEvent = "KeyPressDigitOnly" Then
			RemoveHandler oControl.KeyPress, AddressOf KeyPressDigitOnly
			AddHandler oControl.KeyPress, AddressOf KeyPressDigitOnly
		End If
	End If
End Sub

Form1.vb
Imports Module1.vb

Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
	SetAddHandler(Text1, "KeyPress", "KeyPressDigitOnly")
	SetAddHandler(Text2, "KeyPress", "KeyPressDigitOnly")
	SetAddHandler(Text3, "KeyPress", "KeyPressLetterOnly")
	...
	SetAddHandler(Text20, "KeyPress", "KeyPressLetterOnly")
End Sub

Form2.vb
Imports Module1.vb

Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
	SetAddHandler(TextNama, "KeyPress", "KeyPressLetterOnly")
	SetAddHandler(TextAlamat, "KeyPress", "KeyPressLetterOnly")
	SetAddHandler(TextTelp, "KeyPress", "KeyPressDigitOnly")
End Sub



Script tersebut tidak terbatas pada kontrol TextBox dan Event KeyPress saja. Anda bisa menggunakan kontrol lain misalnya ComboBox, dengan event lain, misalnya GotFocus. Anda tinggal memodifikasi script tersebut sehingga sesuai dengan keinginan Anda.
Selamat mencoba!

Tinggalkan sebuah komentar

Alamat email Anda tidak akan dipublikasikan. Ruas yang wajib ditandai *