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>

 

转载于:https://www.cnblogs.com/hgx0488/archive/2009/04/25/1443581.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值