Home > Visual Basic .NET > Property Builder

Property Builder

December 18, 2010

Apapun bahasanya klo lagi ngoding di dot NET, biasanya enggak bakalan jauh-jauh dari aktivitas pembuatan kelas.

Kita ambil contoh pembuatan kelas sederhana yang hanya mempunyai 2 property (id dan keterangan), hasil kodenya (Visual Basic .NET) akan terlihat seperti berikut :

Public Class Pekerjaan

    Private mPekerjaanID As Short ' deklarasi instance variable
    Public Property PekerjaanID() As Short
        Get
            Return mPekerjaanID ' mengembalikan id pekerjaan
        End Get

        Set(ByVal value As Short)
            mPekerjaanID = value ' mengeset id pekerjaan
        End Set
    End Property

    Private mKeterangan As String ' deklarasi instace variabel
    Public Property Keterangan() As String
        Get
            Return mKeterangan ' mengembalikan nama pekerjaan
        End Get

        Set(ByVal value As String)
            mKeterangan = value ' mengeset nilai pekerjaan
        End Set
    End Property

End Class

Jadi untuk membuat sebuah property kita hanya membutuhkan instance variabel dan blok property seperti terlihat pada kode diatas, sederhana bukan ?🙂.

Tapi membuat property kelas akan sedikit menakutkan😀 jika yang kita ambil contohnya adalah kelas Mahasiswa, biasanya kelas Mahasiswa mempunyai puluhan property bahkan nyampe ratusan (swear saya pernah melihatnya loh :lol:).

Jadi gimana solusinya ? Klo kita punya waktu luang mungkin bisa coba googling trus mencoba satu per satu plugin property builder yang ada.

Atau solusi yang lain kita buat sendiri, gampang kok🙂. Untuk desainnya yang sederhana aja seperti gambar berikut :

jangan lupa diatur juga properties Tab Ordernya

kita mulai dulu dengan kode tombol Add

Private Sub btnAdd_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnAdd.Click
        Const TEMPLATE_READ_ONLY As String = "Private m<name> As <type>" & vbCrLf & _
                                             "Public ReadOnly Property <name>() As <type>" & vbCrLf & _
                                             "    Get" & vbCrLf & _
                                             "        Return m<name>" & vbCrLf & _
                                             "    End Get" & vbCrLf & _
                                             "End Property" & vbCrLf

        Const TEMPLATE_WRITE_ONLY As String = "Private m<name> As <type>" & vbCrLf & _
                                              "Public WriteOnly Property <name>() As <type>" & vbCrLf & _
                                              "    Set(ByVal value AS <type>)" & vbCrLf & _
                                              "        m<name> = value" & vbCrLf & _
                                              "    End Set" & vbCrLf & _
                                              "End Property" & vbCrLf

        Const TEMPLATE_BOTH As String = "Private m<name> As <type>" & vbCrLf & _
                                        "Public Property <name>() As <type>" & vbCrLf & _
                                        "    Get" & vbCrLf & _
                                        "        Return m<name>" & vbCrLf & _
                                        "    End Get" & vbCrLf & vbCrLf & _
                                        "    Set(ByVal value AS <type>)" & vbCrLf & _
                                        "        m<name> = value" & vbCrLf & _
                                        "    End Set" & vbCrLf & _
                                        "End Property" & vbCrLf

        Dim result As String = String.Empty

        If rdoReadOnly.Checked Then
            result = TEMPLATE_READ_ONLY

        ElseIf rdoWriteOnly.Checked Then
            result = TEMPLATE_WRITE_ONLY

        Else
            result = TEMPLATE_BOTH
        End If

        result = result.Replace("<name>", txtPropertyName.Text)
        result = result.Replace("<type>", Strings.StrConv(txtPropertyType.Text, VbStrConv.ProperCase))

        mProperties.Add(result & vbCrLf)
        ListBox1.Items.Add(txtPropertyName.Text & " -> " & txtPropertyType.Text)

        txtPropertyName.Clear()
        txtPropertyName.Focus()

    End Sub

Pada kode diatas terlihat variabel mProperties yang saya deklarsikan menggunakan perintah berikut :

Private mProperties As New System.Collections.ArrayList

Jadi variabel mProperties bisa digunakan untuk menampung data lebih dari satu (array) dalam hal ini adalah instance variabel + blok property.

Kode berikutnya adalah tombol Copy :

Private Sub btnCopy_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnCopy.Click
        Dim result As String = String.Empty

        If mProperties.Count = 0 Then
            MessageBox.Show("Belum ada property yang diinputkan !", "Peringatan", MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
            Return
        End If

        For Each itm As String In mProperties
            result += itm
        Next

        Clipboard.Clear()
        Clipboard.SetText(result) ' copy ke memory

        mProperties.Clear()
        txtPropertyType.Clear()
        ListBox1.Items.Clear()

        MessageBox.Show("Property berhasil di generate, selanjutnya tinggal copas ke editor code Anda", "Info", MessageBoxButtons.OK, MessageBoxIcon.Information)
    End Sub

Intinya kode diatas mengcopy data yang ada di variabel mProperties ke Clipboard.

Setelah itu coba jalankan programnya kemudian coba diinputkan nama Property berikut tipe datanya.

Klik tombol Copy selanjutnya copas ke editor code Anda.

Public Class Mahasiswa

    Private mNpm As String
    Public Property Npm() As String
        Get
            Return mNpm
        End Get

        Set(ByVal value As String)
            mNpm = value
        End Set
    End Property

    Private mNama As String
    Public Property Nama() As String
        Get
            Return mNama
        End Get

        Set(ByVal value As String)
            mNama = value
        End Set
    End Property

    Private mTempatLahir As String
    Public Property TempatLahir() As String
        Get
            Return mTempatLahir
        End Get

        Set(ByVal value As String)
            mTempatLahir = value
        End Set
    End Property

    Private mTanggalLahir As Date
    Public Property TanggalLahir() As Date
        Get
            Return mTanggalLahir
        End Get

        Set(ByVal value As Date)
            mTanggalLahir = value
        End Set
    End Property

    Private mAlamat As String
    Public Property Alamat() As String
        Get
            Return mAlamat
        End Get

        Set(ByVal value As String)
            mAlamat = value
        End Set
    End Property

End Class

Dan… postingan kali ini pun selesai.

Referensi : Generate code for standard property procedures in VB .NET

Selamat MENCOBA🙂

  1. jani
    December 28, 2010 at 3:37 pm

    kom ajarin ana juga ya, soale yg ini ana lumayan bingung e

    • December 29, 2010 at 2:19 am

      Ya udah akhi, belajar sendiri dulu aja klo udah mahir baru mampir ke sini ya😛

      Jangan lupa sering2x mampir ke kamar sebelah plus bawa gorengan ya😀

  2. January 12, 2011 at 7:04 am

    Mantap om paparannya. Saya sudah mencobanya dan berhasil🙂

    Malah saya mencoba memodifikasi di bagian desain form nya, saya mengganti kontrol untuk “Property Name” dari semula TextBox menjadi ComboBox dan sekaligus mengubah properti “DropDownList” dari ComboBox tersebut, menjadi: “DropDownList”

    • January 12, 2011 at 8:21 am

      Halah si om kayax kurang kerjaan aja😛

  3. March 24, 2012 at 12:34 pm

    Mas, agak OOT sedikit gak papa ya ane tanya.
    Saya baru saja belajar vb.net jadi masih sangat2 awam tentang ini, saya mau tanya untuk property dengan tipe variable integer atau date itu tidak boleh menerima data null yak ?

    jika field memiliki null value langsung muncul pesan error “Conversion from string “” to type integer is not valid”

    property yang saya gunakan seperti dibawah ini :

    Private v_suplier As Nullable(Of Integer)
    Public Property SupplierID() As Nullable(Of Integer)
    Get
    If v_suplier.HasValue Then
    Return v_suplier
    Else
    Return Nothing
    End If
    End Get
    Set(ByVal value As Nullable(Of Integer))
    v_suplier = value
    End Set
    End Property

    saya juga mengalami hal yang sama ketika menggunakan tipe data date untuk tanggal. Saya tidak bisa me-load data yang ada di database ketika data tanggalnya null.

    Apa mas ada saran buat kasus saya, sebelum dan sesudahnya Terima Kasih…

    • March 24, 2012 at 1:58 pm

      Klo sy jarang sekali (kayaxnya sih belum pernah :D) menggunakan tipe Nullable, solusinya sy selalu mengecek apakah fieldnya null atw tidak klo null sy set menggunakan nilai default. Contoh :

      Using cmd As New SqlClient.SqlCommand(strsql, conn)
          Using dtr As SqlClient.SqlDataReader = cmd.ExecuteReader()
              If dtr.Read() Then
                  SupplierID = Convert.ToInt32(IIf(IsDBNull(dtr.Item("supplier_id")), 0, dtr.Item("supplier_id")))
                  Tanggal = Convert.ToDateTime(IIf(IsDBNull(dtr.Item("tanggal")), DateTime.MinValue, dtr.Item("tanggal")))
                  Nama = Convert.ToString(IIf(IsDBNull(dtr.Item("nama")), String.Empty, dtr.Item("nama")))
              End If
          End Using
      End Using
      
  4. March 24, 2012 at 3:34 pm

    Thanks Mas atas jawabannya, akan tetapi jika menggunakan MinValue tanggalnya menjadi 1/1/0001, tidak bisakah kita menjadikannya null agar nanti saat tampil di field datepicker menjadi kosong dan bukan 1/1/0001 ?

    • March 24, 2012 at 5:03 pm

      Nah skrg gini aja om, kira2x perintah berikut bisa dijalankan enggak ?

      DateTimePicker1.Value = Nothing
      

      Pasti enggak bisa kan ? Itu artinya DateTimePicker juga harus ada nilai yg diset

  5. March 25, 2012 at 9:15 am

    wah, iya ya berarti field untuk date memang tidak boleh kosong yak.

    satu hal lagi mas, untuk property yang kita deklarasikan menggunakan type integer kok tidak boleh kosong juga yak? ini pada saat proses input.

    misalkan saya mempunyai 1 form input dan dan saya menggunakan property untuk memparsing datanya. ketika tombol save di klik

    Private Sub btnSave_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSave.Click

    Dim Supplier As New Entity.Supplier With {.Qty = txtQty.Text}

    OpsSupplier.AddNewSupp(Supplier)

    end sub

    kemudian property saya seperti ini

    Private v_qty As Integer
    Public Property Qty() As Integer
    Get
    Return v_qty
    End Get
    Set(ByVal value As Integer)
    v_qty = value
    End Set
    End Property

    dan Class Database saya seperti ini

    Public Function AddNewSupp(ByVal Supplier As Entity.Supplier) As MySqlDataReader
    Try
    Dim StoreProcedure As String = “sp_add_supplier”
    Dim cmd As MySqlCommand = New MySqlCommand(StoreProcedure, Connection.Open)
    cmd.CommandType = CommandType.StoredProcedure

    With cmd.Parameters
    .Add(“@p_qty”, MySqlDbType.Int32).Value = Supplier.Qty
    End With

    Dim hasil As MySqlDataReader = cmd.ExecuteReader(CommandBehavior.CloseConnection)
    Return hasil

    Catch ex As MySqlException
    Throw New Exception(ex.Message)
    Finally
    Connection.Close()
    End Try
    End Function

    tetapi form dengan field txtQty kok tidak boleh kosong juga yak, jadi harus terisi dengan variable juga. kalau tidak tersisi errornya sama “Conversion from string “” to type integer is not valid” tetapi jika type pada property saya ganti string baru dia bisa nge-save dengan value null.

    Ada saran mas… Thanks sebelumnya

    • March 25, 2012 at 10:06 am

      Ya sesuai dg pesan errornya, untuk tipe integer memang tdk bisa menampung string kosong, jadi tinggal pake aja fungsi built-in vb .net yg otomatis mengkonversi string kosong (“”) menjadi nol (0).

      Dim Supplier As New Entity.Supplier With {.Qty = Val(txtQty.Text)}
      
  6. March 25, 2012 at 6:46 pm

    Oke, Mas thanks alot, atas semua bantuannya.

    • March 25, 2012 at 9:56 pm

      Sama2x om

  7. om3n
    August 28, 2012 at 3:41 pm

    Om admin, saya coba d sql server 2005 utk tipe data integer dia boleh diisi dengan “NULL”.

    klo berdasarkan pendapat om admin :
    Ya sesuai dg pesan errornya, untuk tipe integer memang tdk bisa menampung string kosong, jadi tinggal pake aja fungsi built-in vb .net yg otomatis mengkonversi string kosong (“”) menjadi nol (0).

    Permasalahannya, sy harus memasukkan nilai NULL kedalam field yang bertipe data integer dengan syarat tidak boleh diisi dengan numerik, lalu bagaimana cara / perintah untuk memasukkannya nullable type ke sql server 2005 menggunakan visual studio 2010? mohon pencerahannya. thanks b4

  8. dwaji
    October 3, 2012 at 12:16 pm

    sam mo tanya klo tipe data saya di acces itu pake date/time kok pas mo ngeload di active report kuk muncul peringatan tipe data missmatch yaaa tp klo tipe datanya saya ganti text nggk .tolong di kasih pencerahan gan

  1. April 16, 2014 at 9:13 am
Comments are closed.
%d bloggers like this: