GridView Paging width LINQ To DataSet

GridView Paging에 대해 얘기를 할가 합니다. 개발을 하다 보면 저같은 경우에는 페이징 하는 부분이 많이 마음에 걸립니다. 그리하여 어떻게 하면 적은 코드로 효율적인 페이징 기능을 구현할까에 대하여 적지 않게 생각을 했었습니다.
ASP.NET 2.0 에서  GridView Control은 이미 자체 페이징 기능을 가지고 있었습니다. 하지만 이 페이징 기능의 동작 원리를 보면 먼저 모든 데이터를 읽어와서 페이징 하는 원리 였기에 데이터가 많을 경우에는 속도 상에서 느려지는 것을 인식할수 있습니다. 하여 종종 고민하곤 했었는데 C# 3.0이 발표 되면서 가장 큰 주목을 모은 LINQ에서 효율적인 코드를 발견 했습니다. 바로 ().skip().Take() 입니다.  아래 이 기능을 이용하여 페이징 한 코드를 적어 보겠습니다.

Result:

==========================================================================================

사용할 DATABASE는 Northwind 이고 사용할 테이블은 Products 입니다.
ObjectDataSource 를 사용하기에 App_Code폴더 밑에 "CustomersDataObject"라는 이름으로 Class를 추가 하세요.
웹 사이트에 "PagingUsingLINQ"라는 이름으로 웹폼을 추가 하세요.
===========================================================================================

CustomersDataObject Class에 구현할 메서드:

public DataSet GetProduct(int maximumRows, int startRowIndex)
    {
        NorthwindClassesDataContext db = new NorthwindClassesDataContext();
        var result = (from p in db.Products
                      select new
                      {
                          productid = p.ProductID,
                          productname = p.ProductName,
                          unitprice = p.UnitPrice
                      }).Skip(startRowIndex).Take(maximumRows);
        DataTable dt = new DataTable();
        dt.Columns.Add("productid", typeof(string));
        dt.Columns.Add("productname", typeof(string));
        dt.Columns.Add("unitprice", typeof(decimal));

        foreach (var product in result)
        {
            dt.Rows.Add(new object[] {product.productid,product.productname,product.unitprice });
        }

        DataSet ds = new DataSet();
        ds.Tables.Add(dt);
        return ds;
    }

public int GetProductCount()
    {
        NorthwindClassesDataContext db = new NorthwindClassesDataContext();
        int productCount = db.Products.Count();
        db = null;
        return productCount;
    }

===========================================================================================
PagingUsingLINQ.aspx
=======================

<%@ Page Language="C#" %>
<%@ Import Namespace="System.Data" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<script runat="server">

    protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
    {
        if (e.Row.RowType == DataControlRowType.DataRow)
        {
            e.Row.Attributes.Add("onmouseover","this.style.backgroundColor='#999999'");
            e.Row.Attributes.Add("onmouseout", "this.style.backgroundColor='#FFFFFF'");
        }
    }
</script>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title>PagingUsingLINQ</title>
    <link type="text/css" href="StyleSheet.css" rel="Stylesheet" />
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <asp:ScriptManager ID="ScriptManager1" runat="server">
        </asp:ScriptManager>
        <asp:UpdatePanel ID="UpdatePanel1" runat="server">
        <ContentTemplate>
       
        <asp:GridView ID="GridView1" runat="server" AllowPaging="True" PageSize="10" AutoGenerateColumns="false"
            DataSourceID="ObjectDataSource1" onrowdatabound="GridView1_RowDataBound" GridLines="Vertical">
            <PagerSettings FirstPageText="처음" LastPageText="마지막"
                Mode="NextPreviousFirstLast" NextPageText="다음" PreviousPageText="이전" />
            <PagerStyle CssClass="pager" />
            <Columns>
                <asp:TemplateField>
                    <HeaderTemplate>
                        <table>
                            <tr align="center">
                                <td style="width:100px">ProductID</td>
                                <td style="width:300px">ProductName</td>
                                <td style="width:100px">UnitPrice</td>
                            </tr>
                        </table>
                    </HeaderTemplate>
                    <HeaderStyle BackColor="AliceBlue" Font-Size="9pt" />
                    <ItemTemplate>
                        <table>                          
                            <tr align="center">
                                <td style="width:100px">
                                    <asp:Label ID="lblProductID" runat="server" Text='<%#Eval("productid") %>'/>
                                </td>
                                <td style="width:300px">
                                    <asp:Label ID="lblProductName" runat="server" Text='<%#Eval("productname") %>' />
                                </td>
                                <td style="width:100px">
                                    <%#Eval("unitprice","{0:0.00}")%>
                                </td>
                            </tr>
                        </table>
                    </ItemTemplate>
                    <ItemStyle Font-Size="9pt" />
                </asp:TemplateField>
            </Columns>
        </asp:GridView>
       
        <asp:ObjectDataSource ID="ObjectDataSource1" runat="server" TypeName="CustomersDataObject"
         SelectCountMethod="GetProductCount" SelectMethod="GetProduct" EnablePaging="true">
        </asp:ObjectDataSource>
       
        </ContentTemplate>
        </asp:UpdatePanel>
    </div>
    </form>
</body>
</html>

 

posted @ 2009-04-25 20:06  OOK  阅读(416)  评论(0编辑  收藏  举报