• 全部
  • C#综合技术
  • C#互联网桌面应用
  • AppLauncher
  • WinForm&WPF
  • C#开发新技术
  • 问答

用C#做移动程序,当数据量大的时候,如何实现dataGrid分页

zjsyw 2007-12-13 10:34:23
如题,谢谢
...全文
108 点赞 收藏 12
写回复
12 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
kason_j 2007-12-13
存储过程
回复
stning 2007-12-13
up
回复
zahhb 2007-12-13
建议使用存储过程
回复
用存储过程,每次读取对应页的数据显示就可以了。
回复
dmhaifeng 2007-12-13

protected void dgInsideSite_PageIndexChanged(object source, DataGridPageChangedEventArgs e)
{
//进行分页设置
this.dgInsideSite.CurrentPageIndex = e.NewPageIndex;

this.dgInsideSite.DataSource = ViewState["dataInsideSite"] as DataTable;
int CurrentPage = 0;
if (this.dgInsideSite.CurrentPageIndex == this.dgInsideSite.PageCount - 1)
{
if (this.dgInsideSite.CurrentPageIndex == 0)
{
this.dgInsideSite.CurrentPageIndex = this.dgInsideSite.PageCount - 1;
}
else
{
if (this.dgInsideSite.Items.Count % this.dgInsideSite.PageSize == 1)
{
CurrentPage = 2;
}
else
{
CurrentPage = 1;
}
this.dgInsideSite.CurrentPageIndex = this.dgInsideSite.PageCount - CurrentPage;
}
}
this.dgInsideSite.DataBind();
}


其中dgInsideSite是你datagrid的名称
dataInsideSite是一个viewstate,viewstate的设置是在你用datatable绑定datagrid的时候,把此datatable也赋值给此viewstate,这样不用每次都访问数据库,Ex:
this.ViewState["dataInsideSite"] = ds.Tables[0];
回复
cpio 2007-12-13

学习一下网页分页就行,通过存储过程或者直接写SQL读取部分数据

把这部分数据绑定到DataGrid就行了
回复
kbryant 2007-12-13
存储过程代码:

CREATE proc page
@RecordCount int output,
@QueryStr nvarchar(100)='table1',--表名、视图名、查询语句
@PageSize int=20, --每页的大小(行数)
@PageCurrent int=1, --要显示的页
@FdShow nvarchar (1000)='*', --要显示的字段列表
@IdentityStr nvarchar (100)='id', --主键
@WhereStr nvarchar (200)='1=1 and id % 11111 = 0',
@FdOrder nvarchar(100)='id', --排序
@isReturn bit=0

as
declare
@sql nvarchar(2000)
set @sql = ''
if @WhereStr = '' begin
set @WhereStr = '1=1'
end

declare @tsql nvarchar(200)

if(@isReturn=1)begin
set @tsql=N'select @RecordCount = count(*) from ' + @QueryStr + ' where ' + @WhereStr
exec sp_executesql @tsql,N'@RecordCount int output',@RecordCount output
end
else begin
set @RecordCount = @PageSize * @PageCurrent + 1
end

if @PageCurrent = 1 begin
set @sql = 'select top ' + cast(@PageSize as nvarchar(3)) + ' ' + @FdShow + ' from ' + @QueryStr + ' where ' + @WhereStr + ' order by ' + @IdentityStr
end
else begin
set @sql = 'select top ' + cast(@PageSize as nvarchar(3)) + ' ' + @FdShow + ' from ' + @QueryStr + ' where ' + @WhereStr + ' and ' + @IdentityStr + '> ( select max(' + @IdentityStr + ') from (select top ' + cast(@PageSize*(@PageCurrent-1) as nvarchar(10)) + ' ' + @IdentityStr + ' from ' + @QueryStr + ' where ' + @WhereStr + ' order by ' + @IdentityStr + ') as t) order by ' + @IdentityStr
end
if @FdOrder <>'' and @FdOrder<>@IdentityStr begin
set @sql = 'select * from (' + @sql + ') as t4867435348493 order by ' + @FdOrder
end
--print @sql
execute(@sql)
GO


后台代码:

protected System.Web.UI.WebControls.DataGrid DataGrid1;

private void Page_Load(object sender, System.EventArgs e)
{
// 在此处放置用户代码以初始化页面
if(!Page.IsPostBack)
{
DataGrid1DataBind(1);
}
}

private void DataGrid1DataBind(int page)
{
SqlConnection conn = new SqlConnection("server=qq;uid=sa;pwd=***;database=testdb");

SqlCommand cmd = new SqlCommand("page",conn);
cmd.CommandType = CommandType.StoredProcedure;

SqlParameter p1 = cmd.Parameters.Add("@RecordCount",SqlDbType.Int);
p1.Direction = ParameterDirection.Output;
SqlParameter p = cmd.Parameters.Add("@PageCurrent",SqlDbType.Int);
p.Value = page;

SqlDataAdapter da = new SqlDataAdapter();
DataSet ds = new DataSet();
da.SelectCommand = cmd;
da.Fill(ds);
DataGrid1.DataSource = ds.Tables[0].DefaultView;
int count = int.Parse(cmd.Parameters["@RecordCount"].Value.ToString());
if(null == ViewState["page"] || "" == ViewState["page"].ToString())
{
ViewState["page"] = count.ToString();
}
else
{
count = int.Parse(ViewState["page"].ToString());
}


DataGrid1.VirtualItemCount = count;

DataGrid1.DataBind();
}

private void DataGrid1_PageIndexChanged(object source, System.Web.UI.WebControls.DataGridPageChangedEventArgs e)
{
DataGrid1.CurrentPageIndex = e.NewPageIndex;
DataGrid1DataBind(e.NewPageIndex + 1);
}
回复
net_explorer 2007-12-13
dddd
回复
dmhaifeng 2007-12-13
楼主是PageIndexChanged()不是CurrentPageIndex()!
……
我的思路也只是一个简单的分页而已!原理是这样的:
首先获取一个datatable(不论是写存储过程还是直接在程序里写SQL语句)
然后需要给datagrid进行绑定,在绑定的同时,把datatable也赋值给ViewState(this.ViewState["dataInsideSite"] = ds.Tables[0];)下次访问就在viewstate里取数据就可以了,不用再去访问数据库
然后在datagrid的PageIndexChanged()事件下面放上那些代码,就可以达到一个分页的效果!
……
但是,如果数据量过大的话,效率也并不高!
……
"用存储过程,每次读取对应页的数据"这方法是可行,但貌似对楼主不适用!
回复
zjsyw 2007-12-13
谢谢大家,如果用存储过程,对不同的数据库要做相应的修改,有的数据库还不支持。从企业分布应用的角度看,数据的来源可能是多种的,所以用存储过程对我来说不是好办法。dmhaifeng的办法我没看懂,能详细的说说吗?我在编PPC2003、MOBILE5的程序,在vs2005里datagrid控件好象没有CurrentPageIndex方法或属性啊,谢谢
回复
qinhl99 2007-12-13
只有接分的份了
回复
xierfly 2007-12-13
如果数据量比较大的话,还是接受上面好多人的建议吧,用存储过程。如果数据量小,那用自带的分页机制也可以考虑的。
回复
相关推荐
发帖
C#
创建于2007-09-28

10.5w+

社区成员

.NET技术 C#
申请成为版主
帖子事件
创建了帖子
2007-12-13 10:34
社区公告

让您成为最强悍的C#开发者