您的位置:首页 > 数据库

linq to sql 学习(6)linq的分页实例

2010-07-15 11:10 447 查看
前面我们学习完了LINQ to SQL 的增删改查,对LINQ应该有比较熟悉的了解,这节我们接之前的 linq to sql 学习(4)增删改查实例 来继续学习关于LINQ的分页。

①,我们首先来改造下List.aspx页面的代码:(主要是增加了分页的几个按钮)

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="List.aspx.cs" Inherits="LinqDemo.List" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title>无标题页</title>

<script type="text/javascript" src="/jquery/jquery-1.4.1.js"></script>

</head>
<body>
<form id="form1" runat="server">
<div>
<asp:ScriptManager ID="ScriptManager1" runat="server" EnablePartialRendering="true">
</asp:ScriptManager>
<table width="70%" border="1">
<tr>
<td>
id:<asp:TextBox ID="txt_id" runat="server"></asp:TextBox>
</td>
<td>
名称<asp:TextBox ID="txt_proname" runat="server"></asp:TextBox>
</td>
<td>
数量:<asp:TextBox ID="txt_insertcount" runat="server"></asp:TextBox>
</td>
<td>
<asp:Button ID="btnQuery" runat="server" OnClick="btnQuery_Click" Text="查询" />
<asp:Button ID="btndelete" runat="server" Text="删除" OnClick="btndelete_Click" />
<asp:Button ID="btnAdd" runat="server" Text="添加" OnClick="btnAdd_Click" />
<asp:Button ID="btnUpdate" runat="server" Text="修改" OnClick="btnUpdate_Click" />
</td>
</tr>
<tr>
<td colspan="4">
<asp:UpdatePanel runat="server" ID="up">
<ContentTemplate>
<asp:GridView ID="GridView1" runat="server" Width="100%" AutoGenerateColumns="False">
<Columns>
<asp:TemplateField>
<HeaderTemplate>
<asp:CheckBox runat="server" ID="chkall" AutoPostBack="true" OnCheckedChanged="chkall_CheckedChanged" />
</HeaderTemplate>
<ItemTemplate>
<input type="checkbox" id="chk" runat="server" value='<%# Eval("id") %>' />
</ItemTemplate>
<ItemStyle Width="1px" />
</asp:TemplateField>
<asp:BoundField DataField="id" HeaderText="id" />
<asp:BoundField DataField="proname" HeaderText="名称" />
<asp:BoundField DataField="insertday" HeaderText="入货时间" />
<asp:BoundField DataField="insertcount" HeaderText="入货数量" />
</Columns>
<RowStyle HorizontalAlign="Center" />
</asp:GridView>
<asp:LinkButton runat="server" ID="lbFirstPage" OnClick="lbFirstPage_Click">第一页</asp:LinkButton>
<asp:LinkButton runat="server" ID="lbFrontPage" OnClick="lbFrontPage_Click">上一页</asp:LinkButton>
<asp:LinkButton runat="server" ID="lbNextPage" OnClick="lbNextPage_Click">下一页</asp:LinkButton>
<asp:LinkButton runat="server" ID="lbEndPage" OnClick="lbEndPage_Click">最后一页</asp:LinkButton>
总条数:<asp:Label ID="lblAllCount" runat="server" Text=""></asp:Label>
当前页:<asp:Label ID="lblCurrentPage" runat="server" Text=""></asp:Label>
总页数:<asp:Label ID="lblEndPage" runat="server" Text=""></asp:Label>
</ContentTemplate>
<Triggers>
<asp:AsyncPostBackTrigger ControlID="btnQuery" EventName="Click" />
<asp:AsyncPostBackTrigger ControlID="btndelete" EventName="Click" />
<asp:AsyncPostBackTrigger ControlID="btnAdd" EventName="Click" />
</Triggers>
</asp:UpdatePanel>
</td>
</tr>
</table>
</div>
</form>
</body>
</html>

②,改造下List.aspx.cs 代码:

using System;

using System.Collections;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;

namespace LinqDemo
{
public partial class List : System.Web.UI.Page
{
//页数
public int pagesize = 5;
//当前页
public int pageindex = 0;
protected void Page_Load(object sender, EventArgs e)
{
btndelete.Attributes.Add("onclick", "javascript:return window.confirm('确定删除吗?')");
btnAdd.Attributes.Add("onclick", "javascript:return window.confirm('确定添加吗?')");
if (!IsPostBack)
{
Bind();
}
}
protected void btnQuery_Click(object sender, EventArgs e)
{
ViewState["pageindex"] = 0;
Bind();
}

public IQueryable<InStore> I_store
{
get
{
var predicate = PredicateBuilder.True<InStore>();
if (!string.IsNullOrEmpty(txt_proname.Text))
{
predicate = predicate.And(p => p.ProName.Contains(txt_proname.Text));
}
if (!string.IsNullOrEmpty(txt_insertcount.Text))
{
predicate = predicate.And(p => p.InsertCount.Equals(txt_insertcount.Text));
}
InStoreDataContext db = new InStoreDataContext();
if (ViewState["pageindex"] != null)
{
pageindex = Convert.ToInt32(ViewState["pageindex"]);
}
//总条数
lblAllCount.Text = db.InStore.Where(predicate).Count().ToString();
//当前页
lblCurrentPage.Text = (pageindex+1).ToString();
//总页数
lblEndPage.Text = (GetEndPage+1).ToString();
return db.InStore.Where(predicate).Skip(pageindex * pagesize).Take(pagesize);
}
}
/// <summary>
/// 最后一页
/// </summary>
public int GetEndPage
{
get
{
if (Convert.ToInt32(lblAllCount.Text) % pagesize == 0)
{
return Convert.ToInt32(lblAllCount.Text) / pagesize-1;
}
else
{
return Convert.ToInt32(lblAllCount.Text) / pagesize ;
}
}
}
/// <summary>
/// 判断按钮页的显示和隐藏
/// </summary>
public void SetLbEnable()
{
if (lblCurrentPage.Text == "1")
{
lbFirstPage.Enabled = false;
lbFrontPage.Enabled = false;
}
else
{
lbFirstPage.Enabled = true;
lbFrontPage.Enabled = true;
}
if (lblCurrentPage.Text == lblEndPage.Text)
{
lbEndPage.Enabled = false;
lbNextPage.Enabled = false;
}
else
{
lbEndPage.Enabled = true;
lbNextPage.Enabled = true;
}
}

/// <summary>
/// 查询函数
/// </summary>
private void Bind()
{
GridView1.DataSource = I_store;
GridView1.DataBind();
SetLbEnable();
}

/// <summary>
/// 添加函数
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
protected void btnAdd_Click(object sender, EventArgs e)
{
InStoreDataContext db = new InStoreDataContext();
InStore store = new InStore();
store.Id = int.Parse(txt_id.Text);
store.InsertCount = int.Parse(txt_insertcount.Text);
store.InsertDay = DateTime.Now;
store.ProName = txt_proname.Text;
db.InStore.InsertOnSubmit(store);
db.SubmitChanges();
txt_insertcount.Text = "";
txt_proname.Text = "";
txt_id.Text = "";
Bind();
}
/// <summary>
/// 删除函数
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
protected void btndelete_Click(object sender, EventArgs e)
{
InStoreDataContext db = new InStoreDataContext();
for (int i = 0; i < GridView1.Rows.Count; i++)
{
HtmlInputCheckBox chk = (HtmlInputCheckBox)GridView1.Rows[i].FindControl("chk");
if (chk.Checked)
{
InStore store = db.InStore.First(p => p.Id.Equals(int.Parse(chk.Value)));
db.InStore.DeleteOnSubmit(store);
db.SubmitChanges();
}
}
Bind();
}
/// <summary>
/// 修改函数
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
protected void btnUpdate_Click(object sender, EventArgs e)
{
InStoreDataContext db = new InStoreDataContext();
for (int i = 0; i < GridView1.Rows.Count; i++)
{
HtmlInputCheckBox chk = (HtmlInputCheckBox)GridView1.Rows[i].FindControl("chk");
if (chk.Checked)
{
InStore store = db.InStore.First(p => p.Id.Equals(int.Parse(chk.Value)));
Response.Redirect("edit.aspx?id=" + chk.Value + "");
}
}
}

/// <summary>
/// 首页
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
protected void lbFirstPage_Click(object sender, EventArgs e)
{
ViewState["pageindex"] = 0;
Bind();
}
/// <summary>
/// 下一页
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
protected void lbNextPage_Click(object sender, EventArgs e)
{
ViewState["pageindex"] = Convert.ToInt32(ViewState["pageindex"]) + 1;
Bind();
}
/// <summary>
/// 上一页
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
protected void lbFrontPage_Click(object sender, EventArgs e)
{
ViewState["pageindex"] = Convert.ToInt32(ViewState["pageindex"]) - 1;
Bind();
}
/// <summary>
/// 最后一页
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
protected void lbEndPage_Click(object sender, EventArgs e)
{
ViewState["pageindex"] = GetEndPage;
Bind();
}
//全选
protected void chkall_CheckedChanged(object sender, EventArgs e)
{
for (int i = 0; i < GridView1.Rows.Count; i++)
{
CheckBox chkall = (CheckBox)GridView1.HeaderRow.FindControl("chkall");
HtmlInputCheckBox chk = (HtmlInputCheckBox)GridView1.Rows[i].FindControl("chk");

if (chkall.Checked == true)
{
chk.Checked = true;
}
else
{
chk.Checked = false;
}
}
}

}
}

运行后效果图如下:



备注:LINQ的分页功能,主要是两个属性,Skip,代表的是从第几条数据开始算起,Take代表的是每页的产生的条数。

例如:

db.InStore.Where(predicate).Skip(0).Take(5); 代表的是从第1条数据开始,产生5条数据,

db.InStore.Where(predicate).Skip(5).Take(5); 代表的是从第6条数据开始,产生5条数据。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息