GridView失去ViewState" SortExpression"在DataBind之后

时间:2018-03-15 22:45:07

标签: c# asp.net viewstate

我有一个允许排序列的页面以及一个过滤GridView数据的搜索选项。我遇到的问题是当通过“搜索”选项过滤数据表时,GridView的ViewState SortExpression会丢失。

我的问题是如何在DataBind 之后保留ViewState以确保SortExpression保留在新绑定的dataTable上?

protected void Page_Load(object sender, EventArgs e)
{                
try{
    if (IsPostBack)
    {
        Control control = null;         
        string controlName = Request.Params["__EVENTTARGET"];
        if (!String.IsNullOrEmpty(controlName))
        {
            control = FindControl(controlName);
            GridViewRow gvRow1 = (GridViewRow)control.Parent.Parent;
            string controlID = control.ID.ToString();
        }
    }
    if(!IsPostBack)
    {
            DataGrid_Load(DAL.reg(HeadText.Text, OrgText.Text), "reg");
    }
}
catch{}
}

private void DataGrid_Load(DataTable command, string type)
{   
    DataTable dataTable = new DataTable();
    dataTable = command;

    string sortDir = ViewState["SortDirection"] as string;
    string sortExp = ViewState["SortExpression"] as string;

    if(ViewState["SortExpression"] != null)
    {                   
        dataTable = resort(dataTable, sortExp, sortDir);
    }
    string myStatus = HeadText.Text;
    DataRow[] dr = dataTable.Select("status = '" + myStatus + "'");         
    DataTable filteredDataTable = dataTable.Clone();
    foreach (DataRow sourceRow in dr)
    {
       filteredDataTable.ImportRow(sourceRow);
    }
    GridView1.DataSource = filteredDataTable;
    GridView1.DataBind();       
}

public class dal
{
    public DataTable reg(string head, string org = null)
    {
    if (head == "all")
        return Data_Load(String.Format("SELECT * from reg"), "reg");
    }
}

1 个答案:

答案 0 :(得分:0)

我解决了这个问题,这只是我的加载数据程序的一个问题,它没有考虑GridView中是否有已经过滤的东西,并且新加载的过滤器丢失了。

为了解决这个问题,我创建了一个静态searchFilter变量,并在每个调用将数据加载到GridView中的方法中添加了一个检查:

  • 列排序后
  • "每页行数"已更改
  • 该页面中需要在该页面上加载数据的任何其他功能。

代码在每个加载数据的函数中都看到了这一点:

if(searchFilter != "")
    loadDataWithFilter();
else 
    loadDataWithoutFilter();

我没有对Page_Load PostBack做任何事情。