0

グリッドビューがあり、状態を維持しようとしています。現在、ユーザーがインラインで(グリッドビュー内から)編集できる場所にあります。定期的に私はこれを機能させました:

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 つの機能があることです。これら 3 つのモードのいずれかでインライン編集を行うと、グリッドビューの状態を制御できません。グリッドビュー タグ内で、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;

}
4

1 に答える 1

1

Sessionまたはにテーブル全体を格納する必要はありませんViewState。SortExpression、SortOrder などの値を保存するだけです。これを行う方法の例を次に示します。

私のコードでは、sortorder と sortexpression を格納するために 2 つのプライベート プロパティを追加しました。

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

LoadData() メソッドは、データを GridView にロードするたびに、多くの場所から呼び出されます。だから私はこれに変更しました:

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

テスト プロジェクトは、こちらからダウンロードできます。

于 2013-12-08T03:41:49.417 に答える