I have a gridview which datasouce is a datatable. Everytime I load data for display and then clear all diapayed data in the GridView, it works fine. But if I load the data, and do a sorting or paging operation, then clear all the data displyed, there comes the error:
Invalid postback or callback argument. Event validation is enabled using <pages enableeventvalidation="true"> in configuration or <%@ Page EnableEventValidation="true" %> in a page. For security purposes, this feature verifies that arguments to postback or callback events originate from the server control that originally rendered them. If the data is valid and expected, use the ClientScriptManager.RegisterForEventValidation method in order to register the postback or callback data for validation.
The page load event is
protected void Page_Load(object sender, EventArgs e)
{
if(!IsPostBack)
{
GridView_QueryResult.DataSource = dataTable_QueryResult;
GridView_QueryResult.DataBind();
}
}
The datatable is a SQL result and inserted to cache, the code is:
Cache.Insert("dataTable_QueryResult", dataTable_QueryResult, null, DateTime.MaxValue, TimeSpan.FromMinutes(10));
The datatable is bound to the gridview using such code:
DataTable dataTable_QueryResult = new DataTable();
dataTable_QueryResult = (DataTable)Cache["dataTable_QueryResult"]; GridView_QueryResult.DataSource = dataTable_QueryResult;
GridView_QueryResult.DataBind();
The code of the Button even for clearing the gridview is:
protected void Button_DataClear_Click(object sender, EventArgs e)
{
dataTable_QueryResult.Clear();
GridView_QueryResult.DataSource = dataTable_QueryResult;
GridView_QueryResult.DataBind();
List<string> keys = new List<string>();
IDictionaryEnumerator enumerator = Cache.GetEnumerator();
while (enumerator.MoveNext())
{
keys.Add(enumerator.Key.ToString());
}
for (int i = 0; i < keys.Count; i++)
{
if (keys[i] == "dataTable_QueryResult")
Cache.Remove(keys[i]);
}
}
Gridview's sorting event code is:
protected void GridView_QueryResult_Sorting(object sender, GridViewSortEventArgs e)
{
if (Cache["dataTable_QueryResult"] != null)
{
dataTable_QueryResult = new DataTable();
dataTable_QueryResult = (DataTable)Cache["dataTable_QueryResult"];
DataView dv = new DataView(dataTable_QueryResult);
string sortDirection = GetSortDirection();
sortOrder = e.SortExpression + " " + sortDirection;
dv.Sort = sortOrder;
GridView_QueryResult.DataSource = dv;
GridView_QueryResult.DataBind();
}
}
private string GVSortDirection
{
get
{
return ViewState["SortDirection"] as string ?? "DESC";
}
set
{
ViewState["SortDirection"] = value;
}
}
private string GetSortDirection()
{
switch (GVSortDirection)
{
case "ASC":
GVSortDirection = "DESC";
break;
case "DESC":
GVSortDirection = "ASC";
break;
}
return GVSortDirection;
}
The pageing event's code is
protected void GridView_QueryResult_PageIndexChanging(object sender, GridViewPageEventArgs e)
{
GridView_QueryResult.PageIndex = e.NewPageIndex;
int recordCount = 0;
if (Cache["dataTable_QueryResult"] != null)
{
DataTable dataTable_QueryResult = new DataTable();
dataTable_QueryResult = (DataTable)Cache["dataTable_QueryResult"];
DataView dv = new DataView(dataTable_QueryResult);
dv.Sort = sortOrder;
GridView_QueryResult.DataSource = dv;
GridView_QueryResult.DataBind();
recordCount = dataTable_QueryResult.Rows.Count;
}
int pageCount = (int)Math.Ceiling(recordCount * 1.0 / GridView_QueryResult.PageSize);
if (recordCount == 0)
{
GridView_QueryResult.PageIndex = 0;
}
else if (GridView_QueryResult.PageIndex >= pageCount)
{
GridView_QueryResult.PageIndex = pageCount - 1;
}
}
Now, I want to know why and a solution other than the following seting, Thanks!
EnableEventValidation="false" .