C#分页问题 我现在是从数据库循环拿到多张表 的数据 放到一个 dataset中 然后一次性 加载到页面datagridview控件中去 ,由于数据量太大 有上80多W条记录 加载时间可能会有 好几分钟 。要做个分页的 但是 不知道怎么样对dataset的多表 的这种情况进行分页 望有 高手 帮帮我 或是有例子 我参考下,谢谢。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 主要利用DataSet的筛选数据的方法DataAdapter用Fill方法填充DataSet的时候把所取的整个记录加入到DataSet例如: MyAdapter.Fill(DataSet,TableName);有时候并不需要将整个查询数据都导入DataSet,真正需要的只是数据的一部。Fill的另一种方法可以满足这种需要。 MyAdapter.Fill(DataSet,StartRow,RowsCount,TableName);可以看到在这种使用方法中有多出了两个整型参数StartRow与RowCout,他们标识将数据源中从StartRow位置取出RowsCount条记录导入DataSet。得到数据后,程序还将DataSet中的数据显示出来。 代码如下:前台:fenye.aspx <%@ Page Language="C#" AutoEventWireup="true" CodeFile="fenye.aspx.cs" Inherits="fenye" %><!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>DataList分页</title></head><body> <form id="form1" runat="server"> <div> <asp:DataList ID="book" runat="server"> <ItemTemplate> 编号:<%#DataBinder.Eval(Container.DataItem,"book") %> </ItemTemplate> </asp:DataList></div> 共有<asp:Label ID="lblRecordCount" runat="server"></asp:Label>条记录<br /> 当前为<asp:Label ID="lblCurrentPage" runat="server"/>/<asp:Label ID="lblPageCount" runat="server" Text="Label"/>页 <br /> <asp:LinkButton ID="lbnPrevPage" runat="server" CommandName="prev" OnCommand="Page_OnClick">上一页</asp:LinkButton> <asp:LinkButton ID="lbnNextPage" runat="server" CommandName="next" OnCommand="Page_OnClick">下一页</asp:LinkButton> </form></body></html> 后台:fenye.aspx.cs using System;using System.Data;using System.Configuration;using System.Collections;using System.Web;using System.Web.Security;using System.Web.UI;using System.Web.UI.WebControls;using System.Web.UI.WebControls.WebParts;using System.Web.UI.HtmlControls;using System.Data.SqlClient;public partial class fenye : System.Web.UI.Page{ SqlConnection sqlcon; int PageSize, RecordCount, PageCount, CurrentPage; public void Page_Load(object sender, EventArgs e) { PageSize = 3; sqlcon = new SqlConnection(); sqlcon.ConnectionString = "Data Source=localhost;Initial Catalog=test;User Id=sa;Password=guest"; sqlcon.Open(); //第一次请求执行 if (!Page.IsPostBack) { ListBind(); CurrentPage = 0; ViewState["PageIndex"] = 0; //计算总共有多少条记录 RecordCount = CalculateRecord(); lblRecordCount.Text = RecordCount.ToString(); //计算总共多少页 PageCount = RecordCount / PageSize; lblPageCount.Text = PageCount.ToString(); ViewState["PageCount"] = PageCount; } } //计算总共有多少条记录 public int CalculateRecord() { int intCount; string strCount = "select count(*) as co from book"; SqlCommand sqlcmd = new SqlCommand(strCount,sqlcon); SqlDataReader sdr = sqlcmd.ExecuteReader(); if (sdr.Read()) { intCount = Int32.Parse(sdr["co"].ToString()); } else { intCount = 0; } sdr.Close(); return intCount; } ICollection CreateSource() //ICollection为何使用? { int StartIndex; //设定导入的起终地址 StartIndex = CurrentPage * PageSize; string strSel = "select * from book"; DataSet ds = new DataSet(); SqlDataAdapter sda = new SqlDataAdapter(strSel, sqlcon); sda.Fill(ds,StartIndex,PageSize,"book");//分页的关键所在,该句表示将数据源中从StartIndex位置取出PageSize条记录导入DataSet. return ds.Tables["book"].DefaultView; } public void ListBind() { book.DataSource = CreateSource(); book.DataBind(); lbnNextPage.Enabled = true; lbnPrevPage.Enabled = true; if (CurrentPage == (PageCount - 1)) lbnNextPage.Enabled = false; if (CurrentPage == 0) lbnPrevPage.Enabled = false; lblCurrentPage.Text = (CurrentPage + 1).ToString(); } public void Page_OnClick(Object sender, CommandEventArgs e) { CurrentPage=(int)ViewState["PageIndex"]; PageCount=(int)ViewState["PageCount"]; string cmd = e.CommandName; //判断cmd,以判定翻页方向 switch (cmd) { case "next": if(CurrentPage<(PageCount-1)) CurrentPage++; break; case "prev": if (CurrentPage > 0) CurrentPage--; break; } ViewState["PageIndex"]=CurrentPage; ListBind(); } }分页的方式又很多,可以用PagedDataSource类,还可以只用数据库进行分页。 我的是winfrom 不是ASP 也有这些属性? 那就试第一种。MyAdapter.Fill(DataSet,StartRow,RowsCount,TableName); 80多W条记录加载到DataSet已经很慢了如果必须使用DataSet分页的话,可以自己实现分页 从DataSet读取指定页转换新的DataSet再绑定分页自己算很简单,用index就可以。 后台代码:<asp:GridView runat="server" GridLines="Both" AutoGenerateColumns="False" EditRowStyle-Wrap="false" ID="grid1" DataKeyNames="StudentID" RowStyle-Wrap="false" AllowPaging="True" PageSize="8" PagerSettings-Mode="NextPreviousFirstLast" PagerSettings-FirstPageText="首页" PagerSettings-LastPageText="末页" PagerSettings-NextPageText="下一页" PagerSettings-PreviousPageText="上一页" PagerSettings-PageButtonCount="5" PagerStyle-HorizontalAlign="Left" BackColor="White" BorderColor="#CCCCCC" BorderStyle="None" BorderWidth="1px" CellPadding="3" Width="500px" OnPageIndexChanging="OnPageChange">前台代码: private void GetMyTeacher() { DataSet ds = DbHelper.GetMyTeacher(CurrentUser.LoginName); if (ds.Tables.Count > 0 && ds.Tables[0].Rows.Count > 0) { grid1.DataSource = ds.Tables[0].DefaultView; grid1.DataBind(); } else { lbResult.Text = "没有...."; return; } } protected void OnPageChange(object sender, GridViewPageEventArgs e) { grid1.PageIndex = e.NewPageIndex; this.GetMyTeacher(); } 用这东西!!! public System.Data.DataSet GetPageDataSetBySQL(ref int DataCount,StringBuilder sql,int currentPage, int pagesize) { try { this.Open(); SqlDataAdapter mySqlDataAdapter = new SqlDataAdapter(sql.ToString(), this.connection); DataSet ds = new DataSet(); int startRow = (currentPage - 1) * pagesize; mySqlDataAdapter.Fill(ds,startRow,pagesize,"table"); DataCount = GetRowCountRecord(sql.ToString()); return ds; } catch (Exception e) { throw new SQLException(e.Message); } finally { this.Close(); } }currentPage: 当前页索引,pagesize: 每页的记录数!给分页个事件,每次点击都出发,重新去去数据! 利用上面函数取值,然后重新绑定(记的改下 GRID的 分页索引) 忙了两天 还是没法解决 换成 成服务端 将所有数据 传到一个新的Table中 再传入客户端 那样就只要对一个 datatable进行分页了.... 还是谢谢各位了 我也是在头疼这个winfrom的分页,自己写了那么长时间还是没有弄出来,呵呵 网页设计求一段定时切换广告图片的代码,要求广告到期后用新的图片自动替换掉过期的图片!谢谢 怎样将列表的歌曲循环播放 关于C#编写的ActiveX控件的注册问题 Vss 2005 的 Internet访问问题,急待解决 ListView数据绑定问题! 大家看看我的代码错在哪里?谢谢关注。.. 急,报表问题 关于sqlhelper里边connection关闭问题 如何对DataGrid中指定的数据进行处理??? 有谁能说说c#到底是个什么样的编程工具 两个SerialPort.DataReceived事件问题 请教大牛们个问题!
DataAdapter用Fill方法填充DataSet的时候把所取的整个记录加入到DataSet
例如:
MyAdapter.Fill(DataSet,TableName);
有时候并不需要将整个查询数据都导入DataSet,真正需要的只是数据的一部。Fill的另一种方法可以满足这种需要。
MyAdapter.Fill(DataSet,StartRow,RowsCount,TableName);
可以看到在这种使用方法中有多出了两个整型参数StartRow与RowCout,他们标识将数据源中从StartRow位置取出RowsCount条记录导入DataSet。得到数据后,程序还将DataSet中的数据显示出来。
<head runat="server">
<title>DataList分页</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:DataList ID="book" runat="server">
<ItemTemplate>
编号:<%#DataBinder.Eval(Container.DataItem,"book") %>
</ItemTemplate>
</asp:DataList></div>
共有<asp:Label ID="lblRecordCount" runat="server"></asp:Label>条记录<br />
当前为<asp:Label ID="lblCurrentPage" runat="server"/>/<asp:Label ID="lblPageCount" runat="server" Text="Label"/>页
<br />
<asp:LinkButton ID="lbnPrevPage" runat="server" CommandName="prev" OnCommand="Page_OnClick">上一页</asp:LinkButton>
<asp:LinkButton ID="lbnNextPage" runat="server" CommandName="next" OnCommand="Page_OnClick">下一页</asp:LinkButton>
</form>
</body>
</html>
后台:fenye.aspx.cs using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Data.SqlClient;
public partial class fenye : System.Web.UI.Page
{
SqlConnection sqlcon;
int PageSize, RecordCount, PageCount, CurrentPage;
public void Page_Load(object sender, EventArgs e)
{
PageSize = 3;
sqlcon = new SqlConnection();
sqlcon.ConnectionString = "Data Source=localhost;Initial Catalog=test;User Id=sa;Password=guest";
sqlcon.Open();
//第一次请求执行
if (!Page.IsPostBack)
{
ListBind();
CurrentPage = 0;
ViewState["PageIndex"] = 0; //计算总共有多少条记录
RecordCount = CalculateRecord();
lblRecordCount.Text = RecordCount.ToString(); //计算总共多少页
PageCount = RecordCount / PageSize;
lblPageCount.Text = PageCount.ToString();
ViewState["PageCount"] = PageCount; }
}
//计算总共有多少条记录
public int CalculateRecord()
{
int intCount;
string strCount = "select count(*) as co from book";
SqlCommand sqlcmd = new SqlCommand(strCount,sqlcon);
SqlDataReader sdr = sqlcmd.ExecuteReader();
if (sdr.Read())
{
intCount = Int32.Parse(sdr["co"].ToString());
}
else
{
intCount = 0;
}
sdr.Close();
return intCount;
}
ICollection CreateSource() //ICollection为何使用?
{
int StartIndex; //设定导入的起终地址
StartIndex = CurrentPage * PageSize;
string strSel = "select * from book";
DataSet ds = new DataSet();
SqlDataAdapter sda = new SqlDataAdapter(strSel, sqlcon);
sda.Fill(ds,StartIndex,PageSize,"book");//分页的关键所在,该句表示将数据源中从StartIndex位置取出PageSize条记录导入DataSet.
return ds.Tables["book"].DefaultView;
}
public void ListBind()
{
book.DataSource = CreateSource();
book.DataBind();
lbnNextPage.Enabled = true;
lbnPrevPage.Enabled = true;
if (CurrentPage == (PageCount - 1)) lbnNextPage.Enabled = false;
if (CurrentPage == 0) lbnPrevPage.Enabled = false;
lblCurrentPage.Text = (CurrentPage + 1).ToString();
}
public void Page_OnClick(Object sender, CommandEventArgs e)
{
CurrentPage=(int)ViewState["PageIndex"];
PageCount=(int)ViewState["PageCount"];
string cmd = e.CommandName;
//判断cmd,以判定翻页方向
switch (cmd)
{
case "next":
if(CurrentPage<(PageCount-1)) CurrentPage++;
break;
case "prev":
if (CurrentPage > 0) CurrentPage--;
break;
}
ViewState["PageIndex"]=CurrentPage;
ListBind();
}
}
分页的方式又很多,可以用PagedDataSource类,还可以只用数据库进行分页。
那就试第一种。MyAdapter.Fill(DataSet,StartRow,RowsCount,TableName);
如果必须使用DataSet分页的话,可以自己实现分页 从DataSet读取指定页转换新的DataSet再绑定
分页自己算很简单,用index就可以。
<asp:GridView runat="server" GridLines="Both" AutoGenerateColumns="False" EditRowStyle-Wrap="false"
ID="grid1" DataKeyNames="StudentID" RowStyle-Wrap="false" AllowPaging="True"
PageSize="8" PagerSettings-Mode="NextPreviousFirstLast" PagerSettings-FirstPageText="首页"
PagerSettings-LastPageText="末页" PagerSettings-NextPageText="下一页" PagerSettings-PreviousPageText="上一页"
PagerSettings-PageButtonCount="5" PagerStyle-HorizontalAlign="Left" BackColor="White"
BorderColor="#CCCCCC" BorderStyle="None" BorderWidth="1px" CellPadding="3" Width="500px"
OnPageIndexChanging="OnPageChange">
前台代码:
private void GetMyTeacher()
{
DataSet ds = DbHelper.GetMyTeacher(CurrentUser.LoginName);
if (ds.Tables.Count > 0 && ds.Tables[0].Rows.Count > 0)
{
grid1.DataSource = ds.Tables[0].DefaultView;
grid1.DataBind();
}
else
{
lbResult.Text = "没有....";
return;
}
}
protected void OnPageChange(object sender, GridViewPageEventArgs e)
{
grid1.PageIndex = e.NewPageIndex;
this.GetMyTeacher();
}
public System.Data.DataSet GetPageDataSetBySQL(ref int DataCount,StringBuilder sql,int currentPage, int pagesize)
{
try
{ this.Open();
SqlDataAdapter mySqlDataAdapter = new SqlDataAdapter(sql.ToString(), this.connection);
DataSet ds = new DataSet();
int startRow = (currentPage - 1) * pagesize;
mySqlDataAdapter.Fill(ds,startRow,pagesize,"table");
DataCount = GetRowCountRecord(sql.ToString());
return ds;
}
catch (Exception e)
{
throw new SQLException(e.Message);
}
finally
{
this.Close();
} }
currentPage: 当前页索引,
pagesize: 每页的记录数!给分页个事件,每次点击都出发,重新去去数据! 利用上面函数取值,然后重新绑定(记的改下 GRID的 分页索引)