[英]Gridview inside UpdatePanel Deleting Records, Updating Wrong Rows
我在他们自己的UpdatePanels中有几个gridview。 我有按钮过滤数据,但有时发现不正常的更新和删除,我无法检测到的来源。 我已经分离出的一件事是,当我在一个UpdatePanel中对gridviews数据进行排序然后尝试更新另一个UpdatePanel时会发生这种情况。
(我的网格视图都从相同的DataLoad过程中获取数据,这些过程根据不同的Linq查询填充每个网格视图。)
我通过在排序函数之后在所有UpdatePanel上调用.Update()来解决大多数不寻常的更新,因此所有gridview都被“刷新”。 但是仍然有一些实例数据正在更新,我无法隔离源。
看起来一个UpdatePanel外部的数据实际上正在“幕后”更新,只有缓存的数据在屏幕上,然后当我编辑屏幕上的内容时,错误的数据会因为没有刷新而更新。
我猜我的排序策略是不正确的,因为当我点击列标题时,我正在排序所有的网格视图,而不仅仅是那个特定的网格视图。
这是我的每个gridview调用的排序过程:
protected void TaskGridView_Sorting(object sender, GridViewSortEventArgs e)
{
string sortExp = ViewState["SortExpression"] as string;
string sortDir = ViewState["SortDirection"] as string;
if(sortDir == "asc" & sortExp == e.SortExpression.ToString())
ViewState["SortDirection"] = "desc";
else
ViewState["SortDirection"] = "asc";
ViewState["SortExpression"] = e.SortExpression.ToString();
if(searchCol != "" && searchText != "")
DataGrid_Load(DAL.Search_reg_log(OrgText.Text, searchText, searchCol), "reg");
else
DataGrid_Load(DAL.reg_log(HeadText.Text, OrgText.Text), "reg");
UpdatePanels();
}
我是使用Ajax和UpdatePanels的新手,并希望有任何方向来解决这种情况。
您发布的代码没有任何问题。 该问题不在该片段中,与ViewState或UpdatePanel无关。 如果您不确定发生了什么,那么可视化它会有所帮助。 通过调试或只在Label中显示结果,看看它是否符合您的预期。
protected void TaskGridView_Sorting(object sender, GridViewSortEventArgs e)
{
//load the previous sorting settings
string sortExp = ViewState["SortExpression"] as string;
string sortDir = ViewState["SortDirection"] as string;
//reverse the direction if the column is the same as the previous sort
if (sortDir == "asc" & sortExp == e.SortExpression.ToString())
ViewState["SortDirection"] = "desc";
else
ViewState["SortDirection"] = "asc";
//put the current sort column in the viewstate
ViewState["SortExpression"] = e.SortExpression.ToString();
//show sorting result in a literal for testing
Literal1.Text = ViewState["SortExpression"] + " " + ViewState["SortDirection"];
//rebind data
if (searchCol != "" && searchText != "")
DataGrid_Load(DAL.Search_reg_log(OrgText.Text, searchText, searchCol), "reg");
else
DataGrid_Load(DAL.reg_log(HeadText.Text, OrgText.Text), "reg");
//update the updatepanels
UpdatePanels();
}
使用ViewState的属性可能是由PostBack的Post Process引起的
private string p_SortExp
{
get
{
if (ViewState["p_SortExp"] != null)
{
return ViewState["dtSupplierList"] as string;
}
else
{
return null;
}
}
set
{
ViewState["p_SortExp"] = value;
}
}
然后在你的函数中尝试调用属性并记住将它们设置在正确的函数中以获得更好的可用性
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.