UpdatePanel内的Gridview删除记录,更新错误的行

时间:2018-11-15 19:37:45

标签: c# asp.net ajax gridview updatepanel

我在自己的UpdatePanels中都有几个gridview。我有一些用于过滤数据的按钮,但是在我无法检测到其来源的时候注意到了异常的更新和删除。我孤立的一件事是,当我在一个UpdatePanel中对gridviews数据进行排序,然后尝试更新另一个UpdatePanel时,会发生这种情况。

(我的所有网格视图都从同一DataLoad过程获取数据,该过程基于不同的Linq查询填充每个网格视图。)

我通过在排序函数之后在所有UpdatePanel上调用.Update()解决了大多数异常更新,因此所有“网格视图”都被“刷新”了。但是,仍然有一些实例正在更新数据,我无法隔离源。

看起来一个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的人,并且希望获得解决这种情况的任何指导。

2 个答案:

答案 0 :(得分:4)

您发布的代码没有错。问题不在那个片段中,与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();
}

答案 1 :(得分:3)

为ViewState使用属性,这可能是由PostBack的Post Process引起的。

ul.sidenav {
    list-style-type: none;
    margin: 0;
    padding: 0;
    width: 25%;
    background-color: #f1f1f1;
    position: fixed;
    height: 100%;
    overflow: auto;
}

ul.sidenav li a {
    display: block;
    color: #000;
    padding: 8px 16px;
    text-decoration: none;
}

ul.sidenav li a.active {
    background-color: #4CAF50;
    color: white;
}

ul.sidenav li a:hover:not(.active) {
    background-color: #555;
    color: white;
}

div.content {
    margin-left: 25%;
    padding: 1px 16px;
    height: 1000px;
}

@media screen and (max-width: 900px) {
    ul.sidenav {
        width: 100%;
        height: auto;
        position: relative;
    }
    ul.sidenav li a {
        float: left;
        padding: 15px;
    }
    div.content {margin-left: 0;}
}

@media screen and (max-width: 400px) {
    ul.sidenav li a {
        text-align: center;
        float: none;
        }
    }

然后在您的函数中尝试调用属性,并记住将它们设置在正确的函数上以提高可用性