我最近刚学C#和ASP.NET,今天编写的最简单datagrid的分页程序.
开始按照书上给的代码写的,完成后发现要点两次下一页才会跳到下一页,后来问其他人改了下,可以了.
可是我觉得很不明白为什么每次分页都要重新加载一次数据?这样的话不是相当于我每次要读取整个表
到内存,然后只取其中的几条数据查看而已,这样的效率太差了吧.是不是大家都不用DATAGrid做分页?
或者还有什么更好的改法?private void Page_Load(object sender, System.EventArgs e)
{
// 在此处放置用户代码以初始化页面
string strConn="server=10.0.0.59;uid=test;pwd=test;database=test";
SqlConnection myConnection=new SqlConnection();
myConnection.ConnectionString=strConn;
string strCommand="select * from Ex06_01";
SqlDataAdapter da=new SqlDataAdapter(strCommand,myConnection);
DataSet ds=new DataSet();
da.Fill(ds,"scores");
DataGrid1.DataSource=ds.Tables["scores"].DefaultView;
DataGrid1.DataBind();
}


private void DataGrid1_PageIndexChanged(object source, System.Web.UI.WebControls.DataGridPageChangedEventArgs e)
{
DataGrid1.CurrentPageIndex=e.NewPageIndex;

}-------------------------
后来问其他人改的
private void Page_Load(object sender, System.EventArgs e)
{
// 在此处放置用户代码以初始化页面
if(!IsPostBack)
{
this.BindGrid();


}
}

private void BindGrid(){
string strConn="server=10.0.0.59;uid=test;pwd=test;database=test";
SqlConnection myConnection=new SqlConnection();
myConnection.ConnectionString=strConn;
string strCommand="select * from Ex06_01";
SqlDataAdapter da=new SqlDataAdapter(strCommand,myConnection);
DataSet ds=new DataSet();
da.Fill(ds,"scores");
DataGrid1.DataSource=ds.Tables["scores"].DefaultView;
DataGrid1.DataBind();
}
private void DataGrid1_PageIndexChanged(object source, System.Web.UI.WebControls.DataGridPageChangedEventArgs e)
{
DataGrid1.CurrentPageIndex=e.NewPageIndex;
this.BindGrid();
}

解决方案 »

  1.   

    因为页面刷新了之后,dataset的内容就被清空了,需要重新填充数据。
    你也可以把dataset的内容放到viewstate中,就避免了每次都要读取数据库
      

  2.   

    分页是必然的。
    分页取数据的解决方法有很多种:
    1.像楼主说的,每次变换页,重新查询DB,绑定(但是比较耗费DB连接资源)。
       一般有采用分页存储过程来解决矛盾,即:每次只取出想要的分页行,绑定2.将要绑定的数据存储到Session中,数据库资源不耗费了,但增加了服务器的负担。而且容易超时3.保存在客户端,如:ViewState 或者隐含字段中,PostBack再取值。这样会加大网络流量,页面性能不是很好楼主看看用什么方法适合你吧~
      

  3.   

    存放:
    ViewState["orgds"]=ds;
    取出:
    ds=(DataSet)ViewState["orgds"];
      

  4.   

    我也是刚用ASP.NET
    还不太懂
      

  5.   

    首先,楼主要明白这个过程是如何发生的:在服务器段连接数据库、查询、装载到DataSet,绑定的过程实际上是根据DataSet里的数据和DataGrid的页码生成HTML,最后将生成的HTML页通过internet传送到客户端浏览器,服务器端不保留DataSet的内容,所以每次翻页都需要重新查询和加载DataSet
    为什么服务器端不保留DataSet? 道理很简单,在并发用户很多的情况下,每个人都在服务器占用一大片内存,服务器是吃不消的~楼主的担心是有道理的,这确实有点浪费,假如查询出来的是1000条数据,而每页只显示10条,那么其余的990条数据从数据库读取出来是没有意义的,所以有不少人都喜欢用分页存储过程来解决这个问题,也就是仅仅从数据库读取当前页需要显示的10条数据
      

  6.   

    private void DataGrid1_PageIndexChanged(object source, System.Web.UI.WebControls.DataGridPageChangedEventArgs e)
    {
    DataGrid1.CurrentPageIndex=e.NewPageIndex;
    this.DataGrid1.SelectedIndex = -1;
    BindGrid()
    }
    这样试试
      

  7.   

    把DataSet保存在Session里一般是不可取的,虽然这样翻页的时候至少就省略了读数据库这个过程,但是并发用户一多,服务器就受不了了~
      

  8.   

    多谢各位,和开发WINDOWNS程序一样,看来还是用存储过程好.
      

  9.   

    @ cxqhust1() 
    >>把dataset的内容放到viewstate中
    严重避免这种做法!除非dataset的内容非常少。
    ViewState的内容是存入在输出的HTML中(<input type="hidden" name="__VIEWSTATE" value="……">),如果ViewState大小有几百KB,甚至上MB,而页面实际要显示的内容才几KB,后果是怎样呢?!
    建议改用Cache来缓存,Cache是保存在服务器内存的。
    如果记录太多,上千条,就最好使用分页存储过程取出到DataSet。另外参考一下:
    ASP.NET ViewState 初探
    http://www.microsoft.com/china/msdn/archives/library/dnaspnet/html/Asp11222001.asp