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

问题描述

我有一个带有多个 TextBox TemplateField 的 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>

然后在后面的代码中写入文本

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";
}
}

在 Page_Load 中,无论是否处于回发状态,new RoutesTableAdapter().GetData() 都会给出一个表,其中的值不包含所做的更改。我可以打印出一行并在 SSMS 中查看同一行,并且在刷新页面之前它们不匹配。我认为这可能是有意的行为,但我在网上准备好的任何地方都让它看起来不需要刷新来更新。我见过的与此问题有关的大多数其他问题都与 DataSet TableAdapter 指向不同的数据库有关,但服务器上只有一个 DB 具有此数据,刷新页面后,他们同意。对于其他上下文,sql 语句是:

CREATE PROCEDURE [dbo].UpdateCass2
(
    @Cass2 int,@AtmId int
)
AS
    SET NOCOUNT OFF;
UPDATE forecastroute SET Cass2 = @Cass2 WHERE AtmId = @AtmId

GetDataBy() 是:

SELECT AtmId,Cass2 AS [Cassette 2 $] FROM forecastroute WHERE AtmId = @AtmId

在 SSMS 中回发后,我能够立即看到 Cass2 中的任何更改,使用 GetDataBy() 的确切查询,但调试输出仍写入旧值。我想也许 DataSet 做了一些我不明白的事情,比如使用 SELECT 语句中定义的架构制作一个中间表,但这并不能解释为什么更改会立即反映在 SSMS 中,对吧?

编辑:包括 page_load 在内的最小可重现示例。 表中还有其他列以及它从中提取的其他表,但对于只有两列和一行 AtmId = 148 的 forecastroute 表,我希望能够立即看到更改,但我仍然只是能够在 SSMS 中看到它。

解决方法

看起来 textChanged 事件在 page_load 之后触发,我可能应该知道这一点。它已经回发并正在检查两个值是否不同,然后才能触发事件,所以如果 textChanged 首先发生会很奇怪。我将它简化为一个文本框,并且能够让它落后于数据库,这是我们应该期待的。实际代码中可能有一些东西甚至会覆盖它。感谢您的回复。