Memang asp.net 3.5 ini betul-betul memanjakan para programmer :) Betapa tidak beberapa fitur-fitur terbaru banyak sekali ditujukan untuk lebih mempermudah pekerjaan programmer agar lebih terfokus pada business process dari aplikasi yang akan dibuat (ya memang seharusnya dari dulu harus sepert itu...).
Kali ini saya benar-benar merasakannya dikala saya ingin menampilkan data yang di kelompokkan berdasarkan kolom / categori tertentu. Sebelum adanya asp.net versi 3.5 ini saya melakukannya dengan menggunakan beberapa teknik yaitu diantaranya penggunaan row_number() function yang digabungkan dengan CTE (Common Table Expression) yang terdapat di sql server 2005, kemudian penggunaan perintah GroupBy di sql statementnya yang digabungkan dengan pemanfaatan event RowDataBound di data controlnya dimana code yang terdapat pada event ini benar-benar sangat tricky :). Anda dapat melihat penggunaan teknik grouping tersebut pada posting artikel saya sebelumnya disini :
1. Grouping Data In DataGridView
2. DataList Control Paging dengan memanfaatkan fungsi baru row_number() di Sql Server 2005
Nah pada posting kali ini saya akan memperlihatkan bagaimana caranya mengelompokkan data dengan menggunakan LinqDataSource control yang sumber datanya diambil dari LinqToSql classes (.dbml), kemudian data tersebut ditampilkan pada control ListView dan GridView yang tentunya kita gabungkan dengan UpdatePanel ajax control dan DataPager untuk melakukan paging.
Mengenai penggunaan ListView dan DataPager control dapat anda lihat di posting saya sebelumnya ini :
1. Using GroupTemplate in ListView ASP.NET 3.5 control
2. Using the new ListView and DataPager control in ASP.NET 3.5
Jadi kali ini pembahasannya akan difokuskan pada fitur grouping data dengan menggunakan LinqDataSource control...kita lihat terlebih dahulu screen shot web preview nya :


Pada gambar petama di atas saya menggunakan ListView control sedangkan pada gambar yang kedua saya gunakan GridView control sebagai container control dan ListView control sebagai Template control untuk menampilkan detail record hasil grouping. Disini saya menggunakan Visual Web Developer 2008 Express Edition dan database Northwind. Source code nya dapat anda download. Untuk menggunakannya anda harus rubah terlebih dahulu connection string yang terdapat di web.config file dan disesuaikan dengan konfigurasi database server yang digunakan.
Mari kita lihat langkah-langkahnya :
1. Buat web site project template. Tambahkan item baru berupa LinqToSql class ke dalam project tsb. Kemudian pada O/RM designer drag and drop tabel Customer database Northwind dari server explorer yang sudah terkoneksi ke database.
2. Tambahkan ScriptManager, LinqDataSource, UpdatePanel, ListView control ke web form.
3. Configure LinqDataSource control seperti yang tampak pada gambar dibawah ini :


html markup code yang dihasilkan :
1: <asp:LinqDataSource ID="LinqDataSource1" runat="server"
2: ContextTypeName="NorthwindDataContext"
3: GroupBy="Country"
4: Select="new(Key, Count() as Total,It as Items)"
5: TableName="Customers">
6: </asp:LinqDataSource>
GroupBy attribut digunakan sebagai kolom untuk kategori grouping, jadi nanti datanya akan dikelompokkan berdasarkan kolom Country. Dengan LinqDataSource kita dapat mendifinisikan property name baru / nama kolom baru yang akan di tampilkan, hal itu dilakukan dengan menggunakan atribut Select. "new" keyword untuk mendifinisikan kolom-kolom baru tersebut.
Pada perintah Select terdapat perintah "Key" yang secara internal digunakan sebagai pengganti kolom grouping yaitu Country. Selain itu kita juga dapat menggunakan aggregate function seperti Avg, Count, Sum, Min, Max. Sedangkan perintah "It" digunakan sebagai "placeholder" yang nantinya kita definisikan sendiri kolom-kolom mana yang akan ditampilkan dari DataContext / LinqDataSource tersebut pada data control yang digunakan.
Perintah "as" digunakan sebagai alias name kolom yang baru, anda bisa bebas memberi nama alias tersebut.
4. Langkah berikutnya yaitu lakukan databinding control ListView ke LinqDataSource. Pada ItemTemplate nya kita akan gunakan ListView sebagai control untuk menampilkan Details dari kolom-kolom yang akan ditampilkan sebagai hasil dari grouping. Berikut potongan code html nya :
1: <ItemTemplate>
2: <tr style="">
3: <td colspan="4" style="font-style: italic;">
4: <asp:Label ID="CountryLabel" runat="server"
5: Text='<%# Eval("Key") %>' Font-Bold="true"
6: ForeColor="Red" />
7: </td>
8: </tr>
9: <asp:ListView ID="lvCustomers" runat="server"
10: DataSource='<%# Eval("Items") %>'>
11: <LayoutTemplate>
12: <tr id="itemPlaceholder" runat="server">
13: </tr>
14: </LayoutTemplate>
15: <ItemTemplate>
16: <tr id="row" runat="server">
17: <td align="right">
18: <asp:Image ID="img" runat="server"
19: ImageUrl="~/images/person2.ico" />
20: </td>
21: <td style="border-bottom: solid thin Silver;">
22: <%#Eval("CustomerID")%>
23: </td>
24: <td style="border-bottom: solid thin Silver;">
25: <%#Eval("CompanyName")%>
26: </td>
27: <td style="border-bottom: solid thin Silver;">
28: <%#Eval("Phone")%>
29: </td>
30: </tr>
31: </ItemTemplate>
32: </asp:ListView>
33: <tr style="">
34: <td colspan="4"
35: style="font-style: italic;text-align:right;>
36: color:Green;font-weight:bold"
37: Total Customer : <%# Eval("Total") %>
38: </td>
39: </tr>
40: </ItemTemplate>
DataBinding syntax Expression <%# Eval("Key") %> digunakan untuk menampilkan kolom Country sebagai "kunci" pengelompokkan data. Perhatikan kode pada line-10, disitu terdapat atribut "DataSource" bukan "DataSourceID" yang diisi dengan syntax expression dari "Items" yang merupakan alias dari perintah "It" pada perintah Select yang terdapat di LinqDataSource. Untuk menampilkan kolom-kolom hasil grouping anda bisa menggunakan control apapun, disini saya gunakan table...cukup dengan menuliskan databinding syntax expression dari kolom-kolom yang akan ditampilkan...wow relatif lebih mudah kalau kita bandingkan dengan asp.net versi sebelumnya :)...O ya untuk menampilkan jumlah record per kategori anda cukup gunakan kolom "Total" sebagai hasil dari perhitungan aggregate function "Count()"..
Sekarang mari kita gunakan control lainnya, yaitu GridView seperti yang anda lihat pada gambar diatas. Sebenarnya intinya sama, namun disini saya gunakan alias name yang berbeda sebagai perbandingan. Didalam GridView tersebut saya gunakan satu TemplateField untuk menampilkan detail dari record hasil grouping. TemplateField tersebut saya isi dengan ListView control.
Berikut potongan kode hasil konfigurasi pada LinqDataSource control :
1: <asp:LinqDataSource ID="lds" runat="server"
2: ContextTypeName="NorthwindDataContext"
3: GroupBy="Country"
4: Select="new (key as Country, Count() as Total, it as Customers)"
5: TableName="Customers">
6: </asp:LinqDataSource>
dapat anda lihat kita bisa bebas memberikan nama alias baru pada item yang akan ditampilkan.
Berikut potongan kode pada TemplateField yang terdapat di GridView control :
1: <asp:TemplateField HeaderText="Details"
2: ItemStyle-VerticalAlign="Top">
3: <ItemTemplate>
4: <asp:ListView ID="ListView1" runat="server"
5: DataSource='<%# Eval("Customers") %>'>
6: <LayoutTemplate>
7: <table runat="server"
8: id="itemPlaceholderContainer"
9: cellpadding="2" cellspacing="5">
10: <tr>
11: <th align="left">
12:
13: </th>
14: <th align="left">
15: ID
16: </th>
17: <th align="left">
18: Name
19: </th>
20: <th align="left">
21: Phone
22: </th>
23: </tr>
24: <tr id="itemPlaceholder">
25: </tr>
26: </table>
27: </LayoutTemplate>
28: <ItemTemplate>
29: <tr>
30: <td align="right" style="width:50px">
31: <asp:Image ID="img" runat="server"
32: ImageUrl="~/images/person2.ico" />
33: </td>
34: <td align="left"
35: style="border-bottom: solid thin Silver;>
36: width:100px"
37: <%#Eval("CustomerID")%>
38: </td>
39: <td align="left"
40: style="border-bottom: solid thin Silver;>
41: width:200px"
42: <%#Eval("CompanyName")%>
43: </td>
44: <td align="left"
45: style="border-bottom: solid thin Silver;>
46: width:150px"
47: <%#Eval("Phone")%>
48: </td>
49: </tr>
50: </ItemTemplate>
51: </asp:ListView>
52: </ItemTemplate>
53: <ItemStyle HorizontalAlign="Left" VerticalAlign="Top" />
54: </asp:TemplateField>
That's it...no imperative code...all code is built by declarative markup code :) ...source code lengkapnya dapat anda download pada link di atas...see u (dah ngantuk nih...sekarang udah jam 10:51 malam).