问题描述
我有一个带有多个 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 首先发生会很奇怪。我将它简化为一个文本框,并且能够让它落后于数据库,这是我们应该期待的。实际代码中可能有一些东西甚至会覆盖它。感谢您的回复。