2013-11-09 135 views
0

我有一個gridview,我試圖保持狀態。目前我有它在哪裏用戶可以內聯編輯(從gridview內)。經常我得到這個工作:保持Gridview狀態

protected void GridViewTower_RowEditing(object sender, GridViewEditEventArgs e) 
{ 
    //Set the edit index. 
    GridViewTower.EditIndex = e.NewEditIndex; 

    //Bind/Re-LoadData data to the GridView control. 
    LoadData(); 
    Populate(); 
} 

protected void GridViewTower_CancelEditRow(object sender, GridViewCancelEditEventArgs e) 
{ 
    //Reset the edit index. 
    GridViewTower.EditIndex = -1; 

    //Bind/Re-LoadData data to the GridView control. 
    LoadData(); 
    Populate(); 
} 

問題是,我還有其他3個特徵,分類,可以過濾GridView的下拉菜單和一個按鈕搜索也過濾girdview。當在這三種模式中進行內聯編輯時,我無法控制gridview所處的狀態。在我的gridview標籤中,我將EnableViewState和ViewStateMode都設置爲true。

如何在這些模式下保持gridview的狀態?


public void LoadData() 
{ 

    if (Session["GridView"] != null) 
    { 

     GridViewTower.DataSource = Session["GridView"]; 

     GridViewTower.DataBind(); 

     //Response.Redirect("TowerManagement.aspx"); // 

     //Session["GridView"] = null; 
    } 
    else 
    { 

     WISSModel.WISSEntities context = new WISSModel.WISSEntities(); 

     var tower = (from t in context.Towers 
        where t.isDeleted == false 
        select new 
        { 
         t.TowerId, 
         t.TowerName, 
         RangeName = t.Range.RangeName 

        }).ToList(); 

     GridViewTower.DataSource = tower; 
     GridViewTower.DataBind(); 

     ViewState["Sort"] = 0; 
    } 
} 

protected void Gridview_Sort(object sender, GridViewSortEventArgs e) 
{ 


    WISSModel.WISSEntities context = new WISSModel.WISSEntities(); 

    var towers = (from t in context.Towers 
        where t.isDeleted == false 
        select new 
        { 
         t.TowerId, 
         t.TowerName, 
         rangeName = t.Range.RangeName 
        }).ToList(); 

    DataTable gridviewTable = towers.CopyToDataTable(); 

    gridviewTable.DefaultView.Sort = e.SortExpression + " " + ConvertSortDirectionToSql(e.SortDirection); 

    GridViewTower.DataSource = gridviewTable; 

    GridViewTower.DataBind(); 

    Session["GridView"] = GridViewTower.DataSource; 

} 
+0

我會建議保留排序,篩選和搜索的三個隱藏字段以外的gridview值。在LoadData()中檢查這個值並在綁定gridview之前優化數據源。 – afzalulh

+0

只是一個想法,但可以將數據源存儲在viewstate對象中嗎?像這樣:** ViewState [Gridview.Datasource,「currentGridView」]; ** – Neo84

+0

這是可能的,但我不建議在視圖狀態保存數據源。每次回發都會將巨大的視圖狀態數據發送到服務器。 1)我會使用hiddenfield來存儲一些值並在每個回發中重新查詢數據源。 2)在最壞的情況下,我會將源保存到Session而不是視圖狀態。 – afzalulh

回答

0

你並不需要整個表存儲在SessionViewState。只需存儲SortExpression,SortOrder等的值。下面是一個例子,你可以做到這一點。

在我的代碼我增加了兩個私有屬性來存儲排序順序和的SortExpression:

private string SortOrder 
{ 
    get 
    { 
     // Toggle order after sorting 
     string _order = "ASC";//Default 
     if(ViewState["SortOrder"] != null && ViewState["SortOrder"].ToString() =="DESC") 
     { 
      _order = "DESC"; 
      ViewState["SortOrder"] = "ASC"; 
     } 
     else 
     { 
      ViewState["SortOrder"] = "DESC"; 
     } 
     return _order; 
    } 
    set 
    { 
     string _order = value.ToLower() == "descending"? "DESC" : "ASC"; 
     ViewState["SortOrder"] = _order; 
    } 
} 


private string SortExpression 
{ 
    get 
    { 
     return ViewState["SortExpression"] != null ? ViewState["SortExpression"].ToString() : ""; 
    } 
    set 
    { 
     ViewState["SortExpression"] = value; 
    } 
} 

我已經改變了你的GridView_Sort方法來存儲排序表達式和排序在新添加的屬性秩序,並呼籲LoadData()方法:

protected void Gridview_Sort(object sender, GridViewSortEventArgs e) 
{ 
    SortExpression = e.SortExpression; 
    //Disabled sort direction to enable toggling 
    //SortOrder = e.SortDirection.ToString(); 

    LoadData(); 
} 

無論何時我們想要將數據加載到GridView中,LoadData()方法都會在很多地方被調用。所以我把它改成這樣:

public void LoadData() 
{ 
    WISSModel.WISSEntities context = new WISSModel.WISSEntities(); 

    var towers = (from t in context.Towers 
        where t.isDeleted == false 
        select new 
        { 
         t.TowerId, 
         t.TowerName, 
         rangeName = t.Range.RangeName 
        }).ToList(); 



    DataTable gridviewTable = new DataTable(); 
    gridviewTable.Columns.Add("TowerId"); 
    gridviewTable.Columns.Add("TowerName"); 
    gridviewTable.Columns.Add("rangeName"); 

    foreach (var t in towers) 
    { 
     gridviewTable.Rows.Add(new object[] { t.TowerId, t.TowerName, t.rangeName }); 
    } 

    if (!String.IsNullOrEmpty(SortExpression)) 
    { 
     gridviewTable.DefaultView.Sort = String.Format("{0} {1}", SortExpression, SortOrder); 
     gridviewTable = gridviewTable.DefaultView.ToTable(); 
    } 

    GridViewTower.DataSource = gridviewTable; 
    GridViewTower.DataBind(); 
} 

起初我稱之爲LoadData()方法的Page_Load():

protected void Page_Load(object sender, EventArgs e) 
{ 
     if (!IsPostBack) 
     { 
      LoadData(); 
     } 
} 

您也可以下載測試項目here