Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/75.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
Sql AspNet DataSet TableAdapter似乎在回发之间不刷新数据,直到页面刷新_Sql_Asp.net_Gridview_Postback_Page Refresh - Fatal编程技术网

Sql AspNet DataSet TableAdapter似乎在回发之间不刷新数据,直到页面刷新

Sql AspNet DataSet TableAdapter似乎在回发之间不刷新数据,直到页面刷新,sql,asp.net,gridview,postback,page-refresh,Sql,Asp.net,Gridview,Postback,Page Refresh,我有一个带有几个文本框模板字段的GridView。当在其中一个表中输入一个值时,我想回发,更新它从中提取数据的一个SQL表,然后在回发后将新值拉入GridView。在标记中,我有: <asp:BoundField DataField = "AtmId" HeaderText ="Atm Id"/> <asp:TemplateField HeaderText ="Cassette 2 $"> <

我有一个带有几个文本框模板字段的GridView。当在其中一个表中输入一个值时,我想回发,更新它从中提取数据的一个SQL表,然后在回发后将新值拉入GridView。在标记中,我有:

<asp:BoundField DataField = "AtmId" HeaderText ="Atm Id"/>
<asp:TemplateField HeaderText ="Cassette 2 $">
        <ItemTemplate>
                 <asp:TextBox ID="Cassette2" OnTextChanged="Cassette2_TextChanged" runat="server" Text="" AutoPostBack ="true"></asp:TextBox>
        </ItemTemplate>
</asp:TemplateField>
GetDataBy()是:

使用GetDataBy()的精确查询,我能够在SSMS中回发后立即看到Cass2中的任何更改,但调试输出仍然写入旧值。我想DataSet可能做了一些我不理解的事情,比如用SELECT语句中定义的模式创建一个中间表,但这并不能解释为什么更改会立即反映在SSM中,对吗

编辑:最小可复制示例,包括页面加载。
表中还有其他列以及它从中提取的其他表,但是对于一个只有两列和一行且AtmId=148的ForecastRoute表,我希望能够立即看到更改,但我仍然只能在SSMS中看到它。

看起来像是在页面加载后触发textChanged事件,我可能早该知道。它已经发回并正在检查这两个值是否不同,然后才能触发一个事件,因此,如果文本更改首先发生,那将很奇怪。我把它简化为一个文本框,使它落后于数据库,这是我们应该期待的。在实际的代码中可能有一些东西甚至覆盖了它。感谢您的回复。

您需要提供一个完整的答案。仅仅描述如何调用GetData是不够的,但实际上必须提供一个示例来显示调用它的情况,显示在何处执行数据绑定等。感谢您的响应,我在我的页面中编辑了加载,从SQL中提取数据,然后进行绑定。GetDataBy与前面发布的GetData相同,在WHERE子句中附加了
和AtmId=@AtmId
。您将重新绑定并重新加载网格,然后再取出任何更新的值。重新绑定和重新加载gv将破坏您所做的更改。在重新加载网格之前,您需要获取/获取/保存并处理对磁带2所做的更改。您不能简单地重新绑定,从而重新加载网格,然后希望在重新绑定后提取值。您必须首先更新表,然后再重新绑定和加载网格。因此,在表更改之后,您必须重新加载网格,但在这样做之前,您必须抓取并保存更改。因此,理论上,您可以在循环之后移动datasource+bind。因此,数据不会被保存回表中,但在将该表绑定到网格之前,您至少会从网格中获取值并将其推入表中。我很困惑,据我所知,没有重新绑定的情况发生。我们只在第一次加载时将任何内容绑定到GridView,之后的所有内容都不会在回发时执行。我们知道已经进行了更改,因为我们可以在SSMS中查看数据库。理论上,我们应该有
Cass2.Text=dt.Rows[0][“CASE 2$”].ToString()
在回发之外,以实际反映GridView中数据库中的更改,但问题是datatable中CASE 2$的值不等于查询后立即在数据库中的值。我不担心GridView。只要将网格的第一次加载放在内部的页面加载事件中-如果postback=False。对于加载控件/网格的所有页面都应执行此操作。然后,附加按钮、背面贴等将不会重新加载网格。如前所述,您可以将数据绑定移动到循环下方,将网格值拉入表中,进行更新,然后重新绑定。但是,同样地,这个代码存根应该是分开的——并且在else中用于由您的设计运行的回发代码。因此,作为一般规则,仅在第一页加载时加载网格、组合框等(回发=false)。
protected void Page_Load(object sender, EventArgs e) 
{  
RoutesTableAdapter adapter = new RoutesTableAdapter(); 
DataTable dt = adapter.GetDataBy(148);  
System.Diagnostics.Debug.WriteLine(adapter.GetDataBy(148).Rows[0]["Cassette 2  $"]);  
if (!IsPostBack) 
{ 
GridView1.DataSource = dt; 
GridView1.DataBind(); 
for (int j = 0; j < GridView1.Rows.Count; j++) { 
GridViewRow row = GridView1.Rows[j]; 
TextBox Cass2 = row.FindControl("Cassette2") as TextBox; 
Cass2.Text = dt.Rows[j]["Cassette 2 $"].ToString(); 
Cass2.ReadOnly = false; 
} }
protected void Cassette2_TextChanged(object sender, EventArgs e)
{
try
{
    TextBox txt = sender as TextBox;
    GridViewRow row = txt.NamingContainer as GridViewRow;
    RoutesTableAdapter adapter = new RoutesTableAdapter();
    int AtmId = int.Parse(row.Cells[0].Text);
    adapter.UpdateCass2(int.Parse(txt.Text), AtmId);
}catch(Exception exc)
{
     txt.Text = "0";
}
}
CREATE PROCEDURE [dbo].UpdateCass2
(
    @Cass2 int,
    @AtmId int
)
AS
    SET NOCOUNT OFF;
UPDATE ForecastRoute SET Cass2 = @Cass2 WHERE AtmId = @AtmId
SELECT AtmId, Cass2 AS [Cassette 2 $] FROM ForecastRoute WHERE AtmId = @AtmId