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(); }
感謝分享!
回覆刪除不客氣...跟大家結緣囉
回覆刪除哈哈~真受用!鞋長~
回覆刪除你該不會跳入寫程式的火坑了吧?
刪除