Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/35.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net 在UpdatePanel内使用GridView时数据不同步_Asp.net_Gridview_Updatepanel - Fatal编程技术网

Asp.net 在UpdatePanel内使用GridView时数据不同步

Asp.net 在UpdatePanel内使用GridView时数据不同步,asp.net,gridview,updatepanel,Asp.net,Gridview,Updatepanel,UpdatePanel中GridView中的数据与数据库不同步,我不知道为什么。这导致数据库更新不正确,我必须迅速修复!有人能帮忙吗 我有多个UpdatePanel,其中包含用户可以编辑的GridView。有一个搜索功能和过滤器按钮,用于从数据库中选择查询的数据并显示在GridView中。已启用排序,并且“不同步”主要发生在排序然后编辑字段时 数据来自SQL数据库。我可以通过TemplateField的OnTextChange选项直接更新数据,如下所示: <asp:GridView

UpdatePanel中GridView中的数据与数据库不同步,我不知道为什么。这导致数据库更新不正确,我必须迅速修复!有人能帮忙吗

我有多个UpdatePanel,其中包含用户可以编辑的GridView。有一个搜索功能和过滤器按钮,用于从数据库中选择查询的数据并显示在GridView中。已启用排序,并且“不同步”主要发生在排序然后编辑字段时

数据来自SQL数据库。我可以通过TemplateField的OnTextChange选项直接更新数据,如下所示:

<asp:GridView 
    ID="GridView4" 
    runat="server" 
    OnSorting="TaskGridView_Sorting" 
    AllowSorting="True" 
    Width="100%" >
    <Columns>
    <asp:TemplateField SortExpression="name" HeaderText="Name">
    <HeaderStyle HorizontalAlign="Left" CssClass="col_name" />
    <ItemTemplate>
        <asp:TextBox ID="name" AutoPostBack="True" CssClass="col_name" runat="server" Text='<%# Eval("name") %>' Width=180 OnTextChanged="text_change" />
    </ItemTemplate>                 
    </asp:TemplateField> 
    ...
    <ajaxToolKit:ToolkitScriptManager EnablePartialRendering="true" runat="server" />
DataGrid_Load(DAL.Search_reg_log(OrgText.Text, searchText, searchCol), "reg");
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);
    }

    try 
    {
        var query = from c in dataTable.AsEnumerable() 
                   where c.Field<string>("status") == "Invoiced" && c.Field<string>("reg_cat_id") != "Archive"
                      || c.Field<string>("status") == "Confirmed" && c.Field<string>("reg_cat_id") != "Archive" 
                  select c ;    

        if(query.Any()){
            DataTable t2 = query.CopyToDataTable();
            GridView4.DataSource = t2;
            GridView4.DataBind();
        } else {
            GridView4.DataSource = new DataTable();
            GridView4.DataBind();
        }
    }           
    catch(Exception e) {
        ErrorText.Text = "Caught Exception: " + e;              
    }

...
gridview以如下方式加载其数据:

<asp:GridView 
    ID="GridView4" 
    runat="server" 
    OnSorting="TaskGridView_Sorting" 
    AllowSorting="True" 
    Width="100%" >
    <Columns>
    <asp:TemplateField SortExpression="name" HeaderText="Name">
    <HeaderStyle HorizontalAlign="Left" CssClass="col_name" />
    <ItemTemplate>
        <asp:TextBox ID="name" AutoPostBack="True" CssClass="col_name" runat="server" Text='<%# Eval("name") %>' Width=180 OnTextChanged="text_change" />
    </ItemTemplate>                 
    </asp:TemplateField> 
    ...
    <ajaxToolKit:ToolkitScriptManager EnablePartialRendering="true" runat="server" />
DataGrid_Load(DAL.Search_reg_log(OrgText.Text, searchText, searchCol), "reg");
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);
    }

    try 
    {
        var query = from c in dataTable.AsEnumerable() 
                   where c.Field<string>("status") == "Invoiced" && c.Field<string>("reg_cat_id") != "Archive"
                      || c.Field<string>("status") == "Confirmed" && c.Field<string>("reg_cat_id") != "Archive" 
                  select c ;    

        if(query.Any()){
            DataTable t2 = query.CopyToDataTable();
            GridView4.DataSource = t2;
            GridView4.DataBind();
        } else {
            GridView4.DataSource = new DataTable();
            GridView4.DataBind();
        }
    }           
    catch(Exception e) {
        ErrorText.Text = "Caught Exception: " + e;              
    }

...
以下是度假区的功能:

public static DataTable resort(DataTable dt, string colName, string direction)
{
    dt.DefaultView.Sort = colName + " " + direction;
    dt = dt.DefaultView.ToTable();
    return dt;
}

请提供一些可能导致这种情况的原因

看起来您在使用GridView和更新它们时遇到了一些问题。我将在下面发布一个完整的工作示例。从这一点开始,逐步更新代码以满足您自己的需要,比如使用dataTable.AsEnumerable()中的c获取数据。重要的是每次(重新)绑定GridView数据时都要对数据进行排序。我不确定度假村内发生了什么,但您必须使用
dt.DefaultView.ToTable()
将排序保存在数据表中

<asp:UpdatePanel ID="UpdatePanel1" runat="server">
    <ContentTemplate>

        <asp:GridView ID="GridView1" runat="server"
            DataKeyNames="ID" AllowSorting="true" 
            OnSorting="GridView1_Sorting"
            AutoGenerateColumns="false" 
            AutoGenerateEditButton="true"
            OnRowEditing="GridView1_RowEditing"
            OnRowCancelingEdit="GridView1_RowCancelingEdit"
            OnRowUpdating="GridView1_RowUpdating">
            <Columns>

                <asp:TemplateField HeaderText="ID" SortExpression="ID">
                    <ItemTemplate>
                        <%# Eval("ID") %>
                    </ItemTemplate>
                </asp:TemplateField>

                <asp:TemplateField HeaderText="Name" SortExpression="name">
                    <ItemTemplate>
                        <%# Eval("name") %>
                    </ItemTemplate>
                    <EditItemTemplate>
                        <asp:TextBox ID="TextBox1" runat="server" Text=' <%# Eval("name") %>'></asp:TextBox>
                    </EditItemTemplate>
                </asp:TemplateField>

            </Columns>
        </asp:GridView>

        <asp:Literal ID="Literal1" runat="server"></asp:Literal>

    </ContentTemplate>
</asp:UpdatePanel>

代码隐藏

protected void Page_Load(object sender, EventArgs e)
{
    //bind data in an ispostback check
    if (!IsPostBack)
    {
        DataGrid_Load();
    }
}


private void DataGrid_Load()
{
    //load the datatable data
    DataTable dt = source;

    //check if the viewsstate existst
    if (ViewState["SortExpression"] != null && ViewState["SortDirection"] != null)
    {
        //sort the datatable before binding it to the gridview
        dt.DefaultView.Sort = ViewState["SortExpression"] + " " + ViewState["SortDirection"];
        dt.DefaultView.ToTable();
    }

    //bind the sorted datatable to the gridvidw
    GridView1.DataSource = dt;
    GridView1.DataBind();
}


protected void GridView1_Sorting(object sender, GridViewSortEventArgs e)
{
    //load the previous sorting settigns
    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();

    //rebind data
    DataGrid_Load();
}


protected void GridView1_RowEditing(object sender, GridViewEditEventArgs e)
{
    //set the edit index and rebind data
    GridView1.EditIndex = e.NewEditIndex;
    DataGrid_Load();
}


protected void GridView1_RowCancelingEdit(object sender, GridViewCancelEditEventArgs e)
{
    //reset the edit index and rebind data
    GridView1.EditIndex = -1;
    DataGrid_Load();
}


protected void GridView1_RowUpdating(object sender, GridViewUpdateEventArgs e)
{
    //use findcontrol to locate the textbox in the edit template
    TextBox tb = (TextBox)GridView1.Rows[e.RowIndex].FindControl("TextBox1");

    //get the id of the row from the datakeys
    int id = Convert.ToInt32(GridView1.DataKeys[e.RowIndex].Values[0]);

    //show result for testing
    Literal1.Text = "ID: " + id + "<br>Name: " + tb.Text;

    //reset the edit index and rebind data
    GridView1_RowCancelingEdit(null, null);
}
受保护的无效页面加载(对象发送方,事件参数e)
{
//在ispostback检查中绑定数据
如果(!IsPostBack)
{
DataGrid_Load();
}
}
私有void DataGrid_Load()
{
//加载数据表数据
数据表dt=源;
//检查viewsstate是否存在
if(ViewState[“SortExpression”]!=null和&ViewState[“SortDirection”]!=null)
{
//在将数据表绑定到gridview之前对其进行排序
dt.DefaultView.Sort=ViewState[“SortExpression”]+“”+ViewState[“SortDirection”];
dt.DefaultView.ToTable();
}
//将排序后的数据表绑定到gridvidw
GridView1.DataSource=dt;
GridView1.DataBind();
}
受保护的无效GridView1_排序(对象发送器,GridViewSortEventArgs e)
{
//加载以前的排序设置
字符串sortExp=ViewState[“SortExpression”]作为字符串;
字符串sortDir=ViewState[“SortDirection”]作为字符串;
//如果列与上一个排序相同,则反转方向
if(sortDir==“asc”&sortExp==e.SortExpression.ToString())
视图状态[“排序方向”]=“描述”;
其他的
视图状态[“排序方向”]=“asc”;
//将当前排序列置于视图状态
ViewState[“SortExpression”]=e.SortExpression.ToString();
//重新绑定数据
DataGrid_Load();
}
受保护的无效GridView1_行编辑(对象发送方,GridViewEditEventArgs e)
{
//设置编辑索引并重新绑定数据
GridView1.EditIndex=e.NewEditIndex;
DataGrid_Load();
}
受保护的无效GridView1\u行取消编辑(对象发件人,GridViewCancelEditEventArgs e)
{
//重置编辑索引并重新绑定数据
GridView1.EditIndex=-1;
DataGrid_Load();
}
受保护的无效GridView1_行更新(对象发送方,GridViewUpdateEventArgs e)
{
//使用findcontrol在编辑模板中定位文本框
TextBox tb=(TextBox)GridView1.Rows[e.RowIndex].FindControl(“TextBox 1”);
//从数据键获取行的id
int id=Convert.ToInt32(GridView1.DataKeys[e.RowIndex].Values[0]);
//显示测试结果
Literal1.Text=“ID:+ID+”
名称:“+tb.Text; //重置编辑索引并重新绑定数据 GridView1_行取消编辑(null,null); }
有人对赏金感兴趣吗?谢谢你的详细回答。如果我有几个GridView,那么从DataGrid\u load函数中加载所有GridView是否正确?或者它们都应该有单独的加载功能?最好是单独加载,这样可以节省一些开销。根据您获取数据的方式,它可以保存一些数据库查询。好的,最好是单独的dataGrid1\u Load、dataGrid2\u Load l等。是的,如果需要,您也可以从其他地方调用该方法。如果您没有在
OnTextChanged=“text\u change”
事件中将更新的数据重新绑定到网格视图,这可能就是问题所在。尽管文本框和数据库中的值发生了更改,但页面可能仍保留了ViewState中的旧值。这将还原到页面,而不是新值。