如题,谢谢

解决方案 »

  1.   

    存储过程代码: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=0as
    declare
    @sql nvarchar(2000)
    set @sql = ''
    if @WhereStr = '' begin
     set @WhereStr = '1=1'
    enddeclare @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
    endif @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);
      }
      

  2.   


    学习一下网页分页就行,通过存储过程或者直接写SQL读取部分数据把这部分数据绑定到DataGrid就行了
      

  3.   


    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];
      

  4.   

    谢谢大家,如果用存储过程,对不同的数据库要做相应的修改,有的数据库还不支持。从企业分布应用的角度看,数据的来源可能是多种的,所以用存储过程对我来说不是好办法。dmhaifeng的办法我没看懂,能详细的说说吗?我在编PPC2003、MOBILE5的程序,在vs2005里datagrid控件好象没有CurrentPageIndex方法或属性啊,谢谢
      

  5.   

    楼主是PageIndexChanged()不是CurrentPageIndex()!
    ……
    我的思路也只是一个简单的分页而已!原理是这样的:
    首先获取一个datatable(不论是写存储过程还是直接在程序里写SQL语句)
    然后需要给datagrid进行绑定,在绑定的同时,把datatable也赋值给ViewState(this.ViewState["dataInsideSite"] = ds.Tables[0];)下次访问就在viewstate里取数据就可以了,不用再去访问数据库
    然后在datagrid的PageIndexChanged()事件下面放上那些代码,就可以达到一个分页的效果!
    ……
    但是,如果数据量过大的话,效率也并不高!
    ……
    "用存储过程,每次读取对应页的数据"这方法是可行,但貌似对楼主不适用!