Pada artikel sebelumnya saya telah menuliskan tentang bagaimana caranya menambahkan fitur paging pada control datagrid winforms dengan menggunakan DataAdapter. Sekarang saya akan berikan contoh paging untuk control datagrid winforms tetapi dengan menggunakan TableAdapter.
TableAdapter merupakan component baru yang terdapat didalam Visual Studio 2005 yang digunakan sebagai pengganti alternatif lain untuk penggunaan DataAdapter. Meskipun sebenarnya code behind dari komponen tersebut juga menggunakan DataAdapter...
Untuk membuat fitur tersebut saya akan memanfaatkan fungsi baru yang terdapat di Sql Server 2005 yaitu row_number seperti yang telah saya terangkan di artikel sebelumnya...
Ok...pertama kita buat terlebih dahulu stored procedurenya. Storde procedure ini yang melakukan paging. Disini juga digunakan fitur baru yang ada di Sql Server 2005 yaitu Common Table Expression (CTE) yang bisa kita gunakan untuk membuat virtual table (create table on the fly).
Database yang digunakan yaitu AdventureWorks, tabelnya tabel Production.Product.
stored proc tsb mempunyai dua buah parameter yang digunakan untuk filtering jumlah record yang akan ditampilkan. CTE nya didefinisikan dengan "With cteProduct As"...on the next article i will explain about Common Table Expression...Setelah cte nya dibuat maka kita tinggal lakukan filtering jumlah recordnya lewat cte tsb dengan menggunakan clausa Where pada Select statementnya.
2. Setelah itu buat design form seperti dibawah ini (label, numericupdown, Button, DataGridView)
3. Tambahkan TableAdapter dengan klik menu Data > Add New Data Source, pilih Database sebagai DataSource nya...Setelah itu pilih object Stored Procedure yang sudah dibuat diatas...maka hasilnya akan dibuatkan sebuah Dataset dengan TableAdapter seperti gambar dibawah ini :
4. Sekarang kita mulai membuat code nya. Tamabahkan code ini didalam class Form yang digunakan :
1: Imports System.Data.SqlClient
2:
3: Public Class Form1
4:
5: #Region "Variables Declaration"
6: Private intStartRec, intRecPerPage, _
7: intTotalRec As Integer
8:
9: Private taProduct As _
10: AdventureWorksDataSetTableAdapters.GetProductPagingTableAdapter
11:
12: Private tblProduct As DataTable
13: #End Region
14:
15: #Region "Procedures"
16: '//Prosedur ini digunakan untuk membatasi
17: '//jumlah record yang akan ditampilkan
18: Private Sub GetData(ByVal startRecord As Integer, _
19: ByVal maxRecord As Integer)
20: taProduct = New _
21: AdventureWorksDataSetTableAdapters.GetProductPagingTableAdapter
22: tblProduct = taProduct.GetData(startRecord, maxRecord)
23: DataGridView1.DataSource = tblProduct
24: End Sub
25:
26: Private Sub SetRecordLabel()
27: Label2.Text = "Start Record Number : " + _
28: (intStartRec + 1).ToString + _
29: " From total record : " + intTotalRec.ToString
30: End Sub
31: #End Region
32:
33: #Region "Events"
34: Private Sub Form1_Load(ByVal sender As System.Object, _
35: ByVal e As System.EventArgs) Handles MyBase.Load
36: '//jumlah record per page
37: intRecPerPage = NumericUpDown1.Value
38:
39: '//index record awal
40: intStartRec = 0
41:
42: GetData(intStartRec, intRecPerPage)
43: intTotalRec = taProduct.GetTotalRecord
44: SetRecordLabel()
45: End Sub
46:
47: Private Sub btnFirst_Click(ByVal sender As System.Object, _
48: ByVal e As System.EventArgs) Handles btnFirst.Click
49: intRecPerPage = NumericUpDown1.Value
50: intStartRec = 0
51: GetData(intStartRec, intRecPerPage)
52: SetRecordLabel()
53: End Sub
54:
55: Private Sub btnPrevious_Click(ByVal sender As System.Object, _
56: ByVal e As System.EventArgs) Handles btnPrevious.Click
57: intRecPerPage = NumericUpDown1.Value
58: intStartRec -= intRecPerPage
59:
60: 'cek jika start index recordnya < 0
61: 'maka berarti recordnya sudah tidak ada lagi
62: ' (stop Previous!!)
63: If intStartRec >= 0 Then
64: GetData(intStartRec + 1, intStartRec + intRecPerPage)
65: SetRecordLabel()
66: Else
67: 'reset kembali start record indexnya
68: intStartRec += intRecPerPage
69: End If
70: End Sub
71:
72: Private Sub btnNext_Click(ByVal sender As System.Object, _
73: ByVal e As System.EventArgs) Handles btnNext.Click
74: intRecPerPage = NumericUpDown1.Value
75: intStartRec += intRecPerPage
76:
77: 'cek jika start index recordnya sama dengan
78: 'jumlah record total atau lebih besar dari total record
79: 'maka berarti recordnya sudah tidak ada lagi
80: '(stop Next!!)
81: If intStartRec < taProduct.GetTotalRecord() Then
82: GetData(intStartRec + 1, intStartRec + intRecPerPage)
83: SetRecordLabel()
84: Else
85: 'reset kembali start record indexnya
86: intStartRec -= intRecPerPage
87: End If
88: End Sub
89:
90: Private Sub btnLast_Click(ByVal sender As System.Object, _
91: ByVal e As System.EventArgs) Handles btnLast.Click
92: intRecPerPage = NumericUpDown1.Value
93: intTotalRec = taProduct.GetTotalRecord()
94: intStartRec = intTotalRec - intRecPerPage
95: GetData(intStartRec, intTotalRec)
96: SetRecordLabel()
97: End Sub
98: #End Region
99:
100: End Class
Setelah itu kita akan tambahkan sebuah fungsi untuk menghitung jumlah total record yang ada pada tabel tsb dengan memanfaatkan fitur baru yang terdapat didalam VB 2005 dan juga C# 2005 pada fitur OOP nya yaitu Partial Class...Apa itu Partial Class?? I'll promise to you to explain those on the next article...so kembali ke laptop :)
Ok...yang akan kita extend yaitu Class TableAdapter yang sudah digenerate di atas. Here is the code :
1: Namespace AdventureWorksDataSetTableAdapters
2: Partial Public Class GetProductPagingTableAdapter
3: Private intTotalRec As Integer
4:
5: Public Function GetTotalRecord() As Integer
6: Using sqlCmd As New SqlCommand
7: Using sqlConn As New _
8: SqlConnection( _
9: "Database=AdventureWorks;Server=.\SqlDev2k5;" & _
10: "Integrated Security=SSPI")
11:
12: sqlCmd.CommandType = CommandType.Text
13: sqlCmd.Connection = sqlConn
14: sqlCmd.CommandText = _
15: "Select Count(*) From Production.Product"
16:
17: If sqlConn.State <> ConnectionState.Open _
18: Then sqlConn.Open()
19:
20: intTotalRec = Convert.ToInt32( _
21: sqlCmd.ExecuteScalar)
22: Return intTotalRec
23: End Using
24: End Using
25: End Function
26: End Class
27: End Namespace
Oh ya class ini anda tambahkan setelah "End Class" dari class Form yang digunakan.
Here is the screen shot of the result :