【问题标题】:Keep State of Gridview保持 Gridview 的状态
【发布时间】:2013-11-09 21:56:21
【问题描述】:

我有一个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 的按钮搜索。在其中任何 3 种模式中进行内联编辑时,我无法控制 gridview 所处的状态。在我的 gridview 标记中,我将 EnableViewState 和 ViewStateMode 都设置为 true。

如何在这些模式下保持网格视图的状态?


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;

}

【问题讨论】:

  • 我建议将用于排序、过滤和搜索的值保留在 gridview 之外的三个隐藏字段中。在 LoadData() 中检查这些值并在绑定 gridview 之前优化数据源。
  • 只是一个想法,但是否可以将数据源存储在视图状态对象中?类似于:ViewState[Gridview.Datasource,"currentGridView"];
  • 有可能,但我不建议将数据源保存在视图状态中。每个回发都会向服务器发送大量视图状态数据。 1)我会使用 hiddenfield 来存储一些值并在每个回发中重新查询数据源。 2)在最坏的情况下,我会将源保存到 Session 而不是视图状态。
  • @afzalulh 我不太确定如何做 1),但我正在尝试 2)。所以它似乎保持了gridview的状态,但是当我尝试编辑时,它不会更新db。我不确定为什么。我在三个功能的底部都有会话变量。 Session["GridView"] = GridViewTower.DataSource; 然后在 LoadData 方法中检查会话是否为空。如果没有,我使用 gridview 会话来绑定。
  • 您必须将底层源(例如数据表、数据视图)保存到会话,而不是 GridVew.DataSource。发布 LoadData() 的代码;填充();和排序/过滤数据,建议任何东西都会更容易。

标签: c# asp.net gridview viewstate


【解决方案1】:

您不需要将整个表存储在SessionViewState 中。只需存储 SortExpression、SortOrder 等的值。下面是一个示例。

在我的代码中,我添加了两个私有属性来存储排序顺序和排序表达式:

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();
}

最初我在 Page_Load() 中调用LoadData() 方法:

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

您可以下载测试项目here

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-02
    相关资源
    最近更新 更多