Senin, 19 Juli 2010

TextBox Yang Hanya menerima Angka

Salah satu component yang paling sering digunakan dalam membuat program aplikasi database adalah Component TextBox, hampir bisa dipastikan component ini akan selalu ada dan digunakan. TextBox dapat menerima inputan text maupun numeric, oleh karenanya untuk mengurangi terjadinya kesalahan entri dari user adakalnya kita ingin menentukan bahwa TextBox tertentu hanya bisa menerima inputan angka saja dari user. Berikut ini adalah artikel yang diadaptasi dari "How to Create a Numeric Only TextBox Control yang ditulis oleh William Ryan " Tentang bagaimana cara membuat agar sebuah TextBox hanya menerima inputan angka saja, dengan sedikit modifikasi * tambahan fungsi untuk mendeteksi Backspace*.

Di artikel yang ditulis William Ryan, dia memilih untuk meng-Overloads event _TextChanged * saya tidak tau alasan kenapa event ini yg dipilih* akan tetapi menurut saya pemilihan untuk mengoverload event ini agak sedikit membingungkan karena Handle yang dipakai ternyata adalah event KeyPress, oleh karenanya pada artikel ini saya modifikasi untuk mengoverload event _KeyPress biar sesuai fungsinya. sebagaimana dapat dilihat pada kode program di bawah ini,


Private Overloads Sub TextBox1_KeyPress( _
        ByVal sender As System.Object, ByVal e As _
        System.Windows.Forms.KeyPressEventArgs) _
        Handles TextBox1.KeyPress


        Dim isKey As Boolean = Char.IsDigit(e.KeyChar)
        Dim isDecimal As Boolean = e.KeyChar.ToString = "."
        Dim isKoma As Boolean = e.KeyChar.ToString = ","
        If (Not isKey) And (Not isDecimal) And _
           (Not isKoma) Then
            e.Handled = True
        End If
        isBackSpace = False
End Sub


Kode program di atas mampu menghandle TextBox1 yang hanya bisa menerima angka, koma dan titik. Dimana koma dan titik biasanya diperlukan untuk format input uang atau bilangan pecahan. Dengan kode program di atas fungsi tombol delete dapat berjalan dengan baik, artinya anda bisa menghapus apa yang anda masukan menggunkan tombol delete, akan tetapi tidak dengan tombol BackSpace. Solusi untuk masalah ini, cukup dengan menambahkan variable global isBackSpace dengan tipe data Boolean, sehingga kode programnya akan nampak seperti di bawah ini,


    Dim isBackSpace As Boolean


    Private Overloads Sub TextBox1_KeyDown( _
            ByVal sender As ObjectByVal e As _
            System.Windows.Forms.KeyEventArgs) _
            Handles TextBox1.KeyDown
        If e.KeyCode = Keys.Back Then isBackSpace = True
    End Sub


    Private Overloads Sub TextBox1_KeyPress( _
            ByVal sender As System.Object, _
            ByVal e As System.Windows.Forms.KeyPressEventArgs) _
            Handles TextBox1.KeyPress


        Dim isKey As Boolean = Char.IsDigit(e.KeyChar)
        Dim isDecimal As Boolean = e.KeyChar.ToString = "."
        Dim isKoma As Boolean = e.KeyChar.ToString = ","
        If (Not isKey) And (Not isDecimal) And _
            (Not isBackSpace) And (Not isKoma) Then
            e.Handled = True
        End If
        isBackSpace = False
    End Sub


Pada suatu form adakalanya terdapat lebih dari satu TextBox yang kita harapkan hanya bisa menerima inputan angka, lalu bagaimana caranya? apakah kita mesti menulis kode yang sama untuk masing-masing TextBox tersebut * bukan pilihan yang bagus *. untungnya di VB7/VB.Net ada sahabat yang baik hati yang bernama "Handles" dengan memanfaatkan kemampuan yang dimiliki olehnya kita cukup menuliskan kode pada satu TextBox,  kemudian yang lainnya kita tambahkan di Handle-nya. Misal di form terdapat 3 buah TextBox yaitu TextBox1, TextBox2 dan TextBox3, dimana ke-tiga TextBox tersebut direncanakan hanya bisa menerima inputan angka. Maka dengan memanfaat kemampuan yang dimiliki oleh Handle, hal tersebut bisa di atasi, sebagaimana terlihat pada kode di bawah ini,


    Dim isBackSpace As Boolean

    Private Overloads Sub TextBox1_KeyDown(_
            ByVal sender As ObjectByVal e As _
            System.Windows.Forms.KeyEventArgs) _
            Handles TextBox1.KeyPress, TextBox2.KeyPress, _
                    TextBox3.KeyPress
        If e.KeyCode = Keys.Back Then isBackSpace = True
    End Sub

    Private Overloads Sub TextBox1_KeyPress( _
            ByVal sender As System.Object, _
            ByVal e As System.Windows.Forms.KeyPressEventArgs) _
            Handles TextBox1.KeyPress, TextBox2.KeyPress, _
                    TextBox3.KeyPress

        Dim isKey As Boolean = Char.IsDigit(e.KeyChar)
        Dim isDecimal As Boolean = e.KeyChar.ToString = "."
        Dim isKoma As Boolean = e.KeyChar.ToString = ","
        If (Not isKey) And (Not isDecimal) And _
            (Not isBackSpace) And (Not isKoma) Then
            e.Handled = True
        End If
        isBackSpace = False
    End Sub


Alhamdulillah akhirnya selesai juga penulisan artikel ini, selamat mencoba semoga bermanfaat. Thank's To William Ryan.

Tidak ada komentar: