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