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