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 :
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 ClassDan 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 ClassUntuk lebih jelasnya silahkan download programnya disini
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