关于实现搜索、排序问题


今天在调试系统的时候才发现,在实现搜索功能的时候,你若将搜索结果放到一个DataGrid中,若DataGrid出现了分页的情况,而你还是按照一般情况(从数据库中或XML中检索出数据,再对DataGrid进行绑定),那结果就会和你自己想象的不一样。

原因:在你触发DataGrid的PageIndexChanged事件时,DataGrid的数据源还是重新从数据库中检索出来的,而实际上呢,DataGrid的数据源因该是你搜索出来的结果集。

解决办法呢,就是在搜索出结果的时候,你需要把数据源存放到一个Session里面,然后在对DataGrid绑定的时候,你就需要将DataGrid的数据源设置成搜索出来的结果集的数据源,这样的话,你在触发分页事件后,他的结果才会和你想象的一样。

在这还有一个问题就是,如何处理对不是搜索结果的结果集,即你没有搜索的时候,需要将数据绑定到DataGrid中。
这样可按如下办法解决:你把数据集直接都存放在一个Session中,即在页面加载的时候,你就将数据集存放在Session中,而在搜索的时候,你就简单得修改Session值,这样的话,在DataGrid绑定的时候,你就可以统一用该Session作为数据源。

// 该方法就是实现了DataGrid的绑定,其中Session["SearchSource"]就是DataGrid的数据源
   //
Session值只有在Session为空和搜索的时候改变,若你还实现了对数据源的添加,修改,删除
   //那你还需再从新设置Session值,可直接将该Session值设为空,然后调用BindClassGrid函数;
private   void  BindClassGrid ()
{
    
if ( Session["SearchSource"!= null )
    
{
    }

    
else
    
{
           
// this.CreateDataSource()实现了从数据库中检索数据
        Session["SearchSource"= this.CreateDataSource(); 
    }

    
this.DataGrid1.DataSource = Session["SearchSource"];
    
this.DataGrid1.DataBind ();
}
 

在搜索的时候,你需要将Session值,重新赋值,即搜索出来的结果集,这样的话,在你PageIndexChanged的时候才不会出现结果不一致的问题;

对于对DataGrid排序问题,也是因为数据源不一致的问题,即搜索结果和排序结果集不一致问题,解决办法还是按照上面的方法,将结果集统一存放到一个Session中。
// Session[“SearchSource”]就是存放结果集的,该方法实现的就是DataGrid的排序
private   void  DataGrid1_SortCommand( object  source, System.Web.UI.WebControls.DataGridSortCommandEventArgs e)
{
    
//DataView dv = new DataView ( this.CreateDataGridDatasource() );

    DataTable dt 
= ( DataTable ) Session["SearchSource"] ;
    DataView dv 
= new DataView ( dt );
            
    
if ( ViewState["OrderBy"== null )
    
{
        ViewState[
"OrderBy"= "desc";
    }

    
else
    
{
        
if ( (string) ViewState["OrderBy"== "asc" )
            ViewState[
"OrderBy"= "desc";
        
else
            ViewState[
"OrderBy"= "asc";
    }

    dv.Sort 
= e.SortExpression.ToString() + " " + ViewState["OrderBy"].ToString();
    
this.DataGrid1.DataSource = dv;
    
this.DataGrid1.DataBind ();
}

用这样的办法,就可以解决数据源的不一致问题。

鉴于个人语言表达能力局限,不清楚处,还望大家多多指教。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值