2010年3月2日 星期二

GridView 的 Sorting (排序) 、Paging(分頁) 與 DataSourceID 的關係

在 VS2005 提供了 GridView 控制項,一般的工具書都會介紹 GridView 控制項搭配 SqlDataSource 來介紹,一派輕鬆地告訴你,只要使用 GridView 的 DataSourceID ,之後如果要排序或分頁,只需將 GridView 的 AllowSorting 或 AllowPaging 設為 True,就可以自動完成排序或分頁的功能,不需要寫一行程式喔。

GridView 資料來源的取得,有兩種方式:一種是透過 DataSourceID, 另一種則是 DataSource。而這兩種方式,你只能選擇一種,不能太貪心。DataSourceID,他只能指定給 SqlDataSouce,AccessDataSource, ObjectDataSource, XmlDataSource 等使用。至於 DataSource,你可以給他 DataSet , DataView , DataTable...,或是任何有實作 IEnumerable, IListSource, IDataSource,  IHierarchicalDatasource介面的都可以。

可是,也許是我們太過於期待 GridView 不需寫程式的特色,所以會舉一反三地將另一種狀況也希望 GridView 幫我們完成。如果今天我的 GridView 資料來源是使用 DataSource 而不是 DataSourceID,那 GridView 是否也可以自動幫我們完成排序或分頁工作呢?

很不幸的,不可以,雖然你可以看到 GridView 標頭出現可供排序的超連結符號,但你壓下去會出現:由 GridView 'gvtest' 引發但尚未處理的事件 Sorting。















你也可以看到出現了分頁的頁碼超連結,但當你壓下去,會出現:由 GridView 'gvtest' 引發但尚未處理的事件 PageIndexChanging。















這也沒得商量餘地,只得乖乖去寫幾段控制分頁或排序的程式了。

針對排序的功能:

你需要去撰寫 gv_Sorting( ) 的功能。
擷取一段 code 以便日後參考:

protected void Page_Load(object sender, EventArgs e)
{
  if (!IsPostBack)
  {
    ViewState["SortExpression"] = "gp_orgcdname"; //設定預設的排序欄位
    ViewState["SortDirection"] = SortDirection.Ascending;//設定預設的排序方式    
  }
}


protected override void OnPreRender(EventArgs e)
{
  BindData();
  base.OnPreRender(e);
}


private void BindData()
{
  //取得資料來源
  DataView dv= ds.Select(new DataSourceSelectArguments() ) as DataView;
  if (dv != null)
  {
      //設定 排序方式
      dv.Sort = string.Format("{0} {1}", ViewState["SortExpression"].ToString(), (SortDirection)ViewState["SortDirection"]==SortDirection.Ascending?"ASC":"DESC");        
      gv.DataSource = dv;            
      gv.DataBind();        
  }
}

protected void gv_Sorting(object sender, GridViewSortEventArgs e)
{
  ViewState["SortExpression"] = e.SortExpression;

  if (ViewState["SortExpression"].ToString() == e.SortExpression)          
      ViewState["SortDirection"] = (SortDirection)ViewState["SortDirection"] == SortDirection.Ascending ? SortDirection.Descending : SortDirection.Ascending;
  else
      ViewState["SortDirection"] = SortDirection.Ascending;

}


針對分頁的功能:
則需要撰寫 gv_PageIndexChanging( )功能

protected void gv_PageIndexChanging(object sender, GridViewPageEventArgs e)
{
  gv.PageIndex = e.NewPageIndex;
  gv.DataBind();
}

4 則留言: