Susah membuat judulnya ternyata... :D
Maksudnya adalah membuat sebuah combobox yang muncul di DataGridView dan combobox tersebut mempunyai event ataupun hal yang dilakukan jika combobox tersebut di change value nya atau indexnya.
Oke langsung saja, implementasinya langsung ke contoh project saja yah, sekarang siapkan database access 2003 new database dan kasih nama latihan.mdb. dan buat beberapa table dengan ketentuan seperti berikut :



  Relasinya jangan lupa ditentukan yah.

Buat tampilan di VB.NET kira-kira seperti ini dengan nama form nya yaitu frm_Transaksi:
 
Dan setiap objek dikasih nama sesuai dengan fungsinya yah..
Setelah itu new item lagi dan buat class baru dengan nama Cls_Induk.vb
Coding ini di dalam class tersebut :

Imports System.Data.OleDb
Imports System.IO
Public Class Cls_Induk
    Private myConnString As String
    Private conn As OleDbConnection

    'constructor
    Public Sub New()
        MyBase.New()
        setConnString()
        conn = New OleDbConnection
        conn.ConnectionString = myConnString
    End Sub

    Private Sub setConnString()
        myConnString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Application.StartupPath & "\latihan.mdb"
    End Sub

    'pembebasan memori
    Private Sub dispose()
        conn = Nothing
        myConnString = Nothing
        GC.SuppressFinalize(Me)
    End Sub

    'destructor
    Protected Overrides Sub Finalize()
        dispose()
    End Sub

    Public ReadOnly Property connString() As String
        Get
            Return myConnString
        End Get
    End Property

    Public Function openDB() As Boolean
        If conn.State = ConnectionState.Open Then
            conn.Close()
        End If
        Try
            conn.Open()
            Return True
        Catch ex As Exception
            Return False
        End Try

    End Function

    Public Sub closeDB()
        If conn.State = ConnectionState.Open Then conn.Close()
    End Sub

    Protected Function getDataTable(ByVal strSQL As String) As DataTable

        Dim myAdapter As OleDbDataAdapter
        Dim myData As New DataTable
        Dim myCommand As OleDbCommand
        openDB()
        myCommand = New OleDbCommand(strSQL, conn)

        myAdapter = New OleDbDataAdapter(myCommand)

        myAdapter.Fill(myData)

        closeDB()

        Return myData

        'pembebasan memori
        myAdapter = Nothing
        myData = Nothing
        myCommand = Nothing

    End Function
    Protected Function getDataSet(ByVal strSQL As String) As DataSet

        Dim myAdapter As OleDbDataAdapter
        Dim myDataSet As New DataSet
        Dim myCommand As OleDbCommand
        openDB()
        myCommand = New OleDbCommand(strSQL, conn)

        myAdapter = New OleDbDataAdapter(myCommand)

        myAdapter.Fill(myDataSet)

        closeDB()

        Return myDataSet

        'pembebasan memori
        myAdapter = Nothing
        myDataSet = Nothing
        myCommand = Nothing

    End Function
    'untuk errors
    Protected Function insert(ByVal strSQL As String) As Boolean
        Return execute(strSQL, "Insert Data")
    End Function

    Protected Function delete(ByVal strSQL As String) As Boolean
        Return execute(strSQL, "Delete Data")
    End Function

    Protected Function update(ByVal strSQL As String) As Boolean
        Return execute(strSQL, "Update Data")
    End Function

    Protected Function search(ByVal strSQL As String) As Boolean
        Dim dt As New DataTable
        dt = getDataTable(strSQL)
        If dt.Rows.Count > 0 Then
            Return True
        Else
            Return False
        End If
    End Function

    Private Function execute(ByVal strSQL As String, ByVal tipePerintah As String) As Boolean
        Try
            Dim myCommand As OleDbCommand
            myCommand = New OleDbCommand(strSQL)

            openDB()
            myCommand.Connection = conn
            myCommand.ExecuteNonQuery()
            closeDB()

            'pembebasan memori
            myCommand = Nothing
            Return True
        Catch ex As Exception
            MessageBox.Show(ex.Message, tipePerintah, MessageBoxButtons.OK)
            Return False
        End Try
    End Function
End Class
Setelah itu buat lagi new item dan tambahkan class baru dengan nama Cls_Transaksi dan coding ini di class tersebut :

Public Class Cls_Transaksi
    Inherits Cls_Induk
    Private strInit As String
    Private KdTransaksi As String
    Private Tanggal As String
    Private Pelanggan As String
    Private KdPetugas As Short
    Private KdProduct As Short
    Private Banyaknya As Integer
    Private SubTotal As Double
    Private Total As Double
    Public Property setStrInit() As String
        Get
            Return strInit
        End Get
        Set(ByVal value As String)
            strInit = value
        End Set
    End Property
    Public Property setKdTransaksi() As String
        Get
            Return KdTransaksi
        End Get
        Set(ByVal value As String)
            KdTransaksi = value
        End Set
    End Property
    Public Property setTanggal() As String
        Get
            Return Tanggal
        End Get
        Set(ByVal value As String)
            Tanggal = value
        End Set
    End Property
    Public Property setPelanggan() As String
        Get
            Return Pelanggan
        End Get
        Set(ByVal value As String)
            Pelanggan = value
        End Set
    End Property
    Public Property setKdPetugas() As Short
        Get
            Return KdPetugas
        End Get
        Set(ByVal value As Short)
            KdPetugas = value
        End Set
    End Property
    Public Property setKdProduct() As Short
        Get
            Return KdProduct
        End Get
        Set(ByVal value As Short)
            KdProduct = value
        End Set
    End Property
    Public Property setBanyaknya() As Integer
        Get
            Return Banyaknya
        End Get
        Set(ByVal value As Integer)
            Banyaknya = value
        End Set
    End Property
    Public Property setSubTotal() As Double
        Get
            Return SubTotal
        End Get
        Set(ByVal value As Double)
            SubTotal = value
        End Set
    End Property
    Public Property setTotal() As Double
        Get
            Return Total
        End Get
        Set(ByVal value As Double)
            Total = value
        End Set
    End Property

    Public Sub New()
        MyBase.New()
        strInit = "SELECT ht.kdTransaksi,ht.Tanggal,p.NmPelanggan,tk.NmToko,pr.NmProduk,pr.Harga,dt.Banyaknya,dt.SubTotal,pt.NmPetugas from tbl_HTransaksi ht,tbl_DTransaksi dt,tbl_Produk pr,tbl_Petugas pt,tbl_Toko tk,tbl_Pelanggan p where ht.KdPelanggan=p.KdPelanggan and dt.KdProduk=pr.KdProduk and ht.KdPetugas=pt.KdPetugas and ht.KdToko=tk.KdToko and ht.KdTransaksi = dt.KdTransaksi"
    End Sub

    Private Sub dispose()
        strInit = Nothing
        GC.SuppressFinalize(Me)
    End Sub

    Protected Overrides Sub Finalize()
        MyBase.Finalize()
        dispose()
    End Sub

    Public Function getAll() As DataTable
        Dim strSQL As String = strInit
        Return MyBase.getDataTable(strSQL)
    End Function

    Public Function getProduk() As DataTable
        Dim strSQL As String
        strSQL = "select NmProduk from tbl_Produk order by KdProduk"
        Return MyBase.getDataTable(strSQL)
    End Function
    Public Function getHargaProduk(ByVal nama As String) As DataTable
        Dim strSQL As String
        strSQL = "select KdProduk,Harga from tbl_Produk where NmProduk='" & nama & "'"
        Return MyBase.getDataTable(strSQL)
    End Function
    Public Function getPetugas() As DataTable
        Dim strSQL As String
        strSQL = "select NmPetugas from tbl_Petugas order by KdPetugas"
        Return MyBase.getDataTable(strSQL)
    End Function
    Public Function getKode(ByVal kode As String, ByVal nama As String, ByVal parNm As String, ByVal tbl As String) As DataTable
        Dim strSQL As String
        strSQL = "select " & kode & " from " & tbl & " where " & nama & " like '" & parNm & "'"
        Return MyBase.getDataTable(strSQL)
    End Function
    Public Function getNoRek() As DataTable
        Dim strSQL As String
        strSQL = "select count(*) from tbl_HTransaksi"
        Return MyBase.getDataTable(strSQL)
    End Function
    Public Overloads Function insertHTransaksi(ByVal obj As Cls_Transaksi) As Boolean
        Dim strSql As String
        strSql = "insert into tbl_HTransaksi values('" & obj.setKdTransaksi _
        & "','" & obj.setTanggal _
        & "','" & obj.setPelanggan _
        & "','" & obj.setKdPetugas _
        & "','" & obj.Total _
        & "')"
        Return MyBase.insert(strSql)
    End Function
    Public Overloads Function insertDTransaksi(ByVal obj As Cls_Transaksi) As Boolean
        Dim strSql As String
        strSql = "insert into tbl_DTransaksi(KdTransaksi,KdProduk,Banyaknya,Subtotal) values('" & obj.setKdTransaksi _
        & "','" & obj.setKdProduct _
        & "','" & obj.setBanyaknya _
        & "','" & obj.setSubTotal _
        & "')"
        Return MyBase.insert(strSql)
    End Function
End Class
Dan terakhir coding ini di dalam form frm_Transaksi

Public Class frm_Transaksi
    Dim listCol As New DataGridViewComboBoxColumn
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        DataGridView1.Rows.Clear()
        bersih()
    End Sub
    Sub bersih()
        txtJumlah.Text = ""
        txtBayar.Text = ""
        txtKembali.Text = ""
        lblTampil.Text = ""
        txtTuan.Text = ""

    End Sub
    Sub Petugas()
        Dim dt As New DataTable
        dt = TR.getPetugas()
        cmbPetugas.DataSource = dt
        cmbPetugas.DisplayMember = "NmPetugas"
    End Sub
    Sub Norek()
        Dim dt2 As New DataTable
        dt2 = TR.getNoRek
        txtNota.Text = "TRASK000" & dt2.Rows(0).Item(0) + 1
    End Sub
    Sub Produk()
        'Produk
        DataGridView1.Columns.Remove("NamaBarang")
        Dim dt As New DataTable
        dt = TR.getProduk
        listCol.DisplayIndex = 1
        listCol.HeaderText = "NAMA BARANG"
        'Masukkan nama field pada table yang akan di buat listcolom
        listCol.DataPropertyName = "NamaBarang"
        'Mengisi list dari Nama Produk table
        listCol.DataSource = dt
        listCol.DisplayMember = "NmProduk"
        listCol.ValueMember = "NmProduk"
        'Tambahkan column
        DataGridView1.Columns.Add(listCol)
        listCol.Width = 283
    End Sub
    Private Sub frm_Transaksi_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Petugas()
        Norek()
        Produk()
        'Membuat Readolny
        DataGridView1.Columns(2).ReadOnly = True
        DataGridView1.Columns(1).ReadOnly = True
    End Sub
    Private Sub DataGridView1_EditingControlShowing(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewEditingControlShowingEventArgs) Handles DataGridView1.EditingControlShowing
        Dim cb As ComboBox = TryCast(e.Control, ComboBox)
        If cb IsNot Nothing Then
            If DataGridView1.Item(0, DataGridView1.CurrentRow.Index).Value <> "" Then
                RemoveHandler cb.SelectedIndexChanged, AddressOf DataGridView1_SelectedIndexChanged
                AddHandler cb.SelectedIndexChanged, AddressOf DataGridView1_SelectedIndexChanged
            Else
                MessageBox.Show("Isi Data Banyaknya Terlebih Dahulu")
            End If
          End If
    End Sub
    Private Sub DataGridView1_SelectedIndexChanged(ByVal sender As Object, ByVal e As EventArgs)
        Try
            'Ketikkan sintaks untuk menampilkan data yang di inginkan
            Dim comboBox1 As ComboBox = CType(sender, ComboBox)
            Dim dt As New DataTable
            dt = TR.getHargaProduk(comboBox1.Text)
            DataGridView1.Rows(DataGridView1.CurrentRow.Index).Cells(1).Value = dt.Rows(0).Item("Harga")
            Hitung()
            Total()
            txtBayar.ReadOnly = False
            btnSimpan.Enabled = True
        Catch
            MessageBox.Show("Pilih produknya yah...!! ", "Informasi", MessageBoxButtons.OK, MessageBoxIcon.Information)
            Exit Try
        End Try
    End Sub
    Sub Hitung()
        DataGridView1.Item(2, DataGridView1.CurrentRow.Index).Value = Format(CInt(DataGridView1.Item(0, DataGridView1.CurrentRow.Index).Value) * CInt(DataGridView1.Item(1, DataGridView1.CurrentRow.Index).Value), "Currency")
    End Sub
    Sub Total()
        Dim Total As Double = 0
        For i As Integer = 0 To DataGridView1.Rows.Count - 2
            Total = Total + CDbl(DataGridView1.Item(2, i).Value)
        Next i
        txtJumlah.Text = Total
        lblTampil.Text = Total
    End Sub
    Dim TR As New Cls_Transaksi
    Sub InsertSet()
        'insert ke Header Transaksi
        Dim dt, dt1, dt2, dt3 As New DataTable
        'mencari kode masing-masing dari table master
        dt1 = TR.getKode("KdPetugas", "NmPetugas", cmbPetugas.Text, "tbl_Petugas")
        TR.setKdPetugas = CInt(dt1.Rows(0).Item("KdPetugas"))
        TR.setPelanggan = txtTuan.Text
        TR.setKdTransaksi = txtNota.Text
        TR.setTanggal = DateTimePicker1.Text
        TR.setTotal = txtJumlah.Text
        TR.insertHTransaksi(TR)
        'insert ke Detail Transaksi sesuai dengan data yang di inputkan ke DATAGRIDVIEW oleh user
        For i As Integer = 0 To DataGridView1.Rows.Count - 2
            dt3 = TR.getKode("KdProduk", "NmProduk", DataGridView1.Item(3, i).Value, "tbl_Produk")
            TR.setKdProduct = CInt(dt3.Rows(0).Item("KdProduk"))
            TR.setBanyaknya = CInt(DataGridView1.Item(0, i).Value)
            TR.setSubTotal = CDbl(DataGridView1.Item(2, i).Value)
            TR.insertDTransaksi(TR)
        Next i
    End Sub
    Private Sub btnSimpan_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSimpan.Click
        If txtTuan.Text = "" Then
            MessageBox.Show("Tentukan atau isi terlebih dahulu nama pelanggan", "Informasi", MessageBoxButtons.OK, MessageBoxIcon.Information)
        Else
            If CDbl(txtBayar.Text) > CDbl(txtJumlah.Text) Then
                btnTRBaru.Enabled = True
                InsertSet()
                MessageBox.Show("Data Tersimpan", "Informasi", MessageBoxButtons.OK, MessageBoxIcon.Information)
                btnSimpan.Enabled = False
            Else
                MessageBox.Show("Anda uangnya kurang", "Informasi", MessageBoxButtons.OK, MessageBoxIcon.Information)
                txtBayar.Text = ""
                txtBayar.Focus()
            End If
        End If
    End Sub

    Private Sub btnTRBaru_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnTRBaru.Click
        DataGridView1.Rows.Clear()
        bersih()
        btnSimpan.Enabled = True
        btnTRBaru.Enabled = False
        Norek()
    End Sub
    Private Sub txtBayar_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles txtBayar.KeyPress
        If e.KeyChar = Chr(13) Then
            txtKembali.Text = CDbl(txtBayar.Text) - CDbl(txtJumlah.Text)
            lblTampil.Text = CDbl(txtBayar.Text) - CDbl(txtJumlah.Text)
        End If
    End Sub

    Private Sub btnKeluar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnKeluar.Click
        If MessageBox.Show("Apakah anda yakin akan keluar dari program ini ..??", "Konfirmasi", MessageBoxButtons.YesNo, MessageBoxIcon.Question) = Windows.Forms.DialogResult.Yes Then
            Me.Close()
        End If
    End Sub
End Class


Untuk lebih jelasnya silahkan download programnya disini

1 Komentar

  1. Anonymous // Friday, August 12, 2011 at 3:23:00 PM GMT+7  

    bos ane mw minta penjelasan tentang kode ini:
    'insert ke Detail Transaksi sesuai dengan data yang di inputkan ke DATAGRIDVIEW oleh user
    For i As Integer = 0 To DataGridView1.Rows.Count - 2
    dt3 = TR.getKode("KdProduk", "NmProduk", DataGridView1.Item(3, i).Value, "tbl_Produk")
    TR.setKdProduct = CInt(dt3.Rows(0).Item("KdProduk")) ---
    TR.setBanyaknya = CInt(DataGridView1.Item(0, i).Value)
    TR.setSubTotal = CDbl(DataGridView1.Item(2, i).Value)
    TR.insertDTransaksi(TR)


    (dt3.Rows(0).Item("KdProduk")) Kdproduct kan g dimunculin di datagridview nya trus rows(0) dari mana?
    thanks