【发布时间】:2021-07-07 22:13:15
【问题描述】:
我有一个带有多个 TextBox 模板字段的 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 TableAdapters 有关,但是服务器上只有一个数据库具有此数据,并且一旦刷新页面,他们就会同意。对于其他上下文,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
使用 GetDataBy() 的确切查询,在 SSMS 中回发后,我能够立即看到 Cass2 中的任何更改,但调试输出仍会写入旧值。我想也许 DataSet 做了一些我不理解的事情,比如使用 SELECT 语句中定义的架构创建一个中间表,但这并不能解释为什么更改会立即反映在 SSMS 中,对吧?
编辑:最小可重现示例,包括 page_load。 表中还有其他列以及它从中提取的其他表,但对于只有两列和一行 AtmId = 148 的 ForecastRoute 表,我希望能够立即看到更改,但我仍然只是可以在 SSMS 中看到它。
【问题讨论】:
-
您需要提供minimal reproducible example。仅仅描述如何调用 GetData 是不够的,但您必须实际提供一个显示它被调用的示例,显示您执行数据绑定的位置等。
-
感谢您的回复,我在 page_load 中进行了编辑,其中数据是从 SQL 中提取然后绑定的。 GetDataBy 与之前发布的 GetData 相同,在 WHERE 子句中添加了
AND AtmId = @AtmId。 -
您正在重新绑定并再次重新加载网格,并且在拉出任何更新的值之前这样做。重新绑定并重新加载 gv 会破坏您所做的更改。在重新加载网格之前,您需要获取/抓取/保存并处理对 Cassette2 所做的更改。您根本无法重新绑定并因此重新加载网格,然后希望在重新绑定后提取值。您必须先更新表格,然后再重新绑定并重新加载网格。因此,您必须在表格更改后重新加载网格,但您必须先抓取并保存更改,然后再执行此操作。
-
因此理论上您可以在该循环之后移动数据源 + 绑定。因此,数据不会被保存回表中,但您至少会在将该表绑定到网格之前从网格中获取值并将它们推入表中。
-
我很困惑,据我所知,没有发生重新绑定。我们只在第一次加载时将任何内容绑定到 GridView,之后的所有内容都不会在回发时执行。我们知道已经进行了更改,因为我们可以在 SSMS 中查看数据库。理论上我们应该在回发之外有
Cass2.Text = dt.Rows[0]["Cassette 2 $"].ToString();才能真正反映GridView中数据库的变化,但问题是数据表中的Cassette 2 $的值不等于查询后立即在数据库中的值它。我不担心 GridView。
标签: sql asp.net gridview postback page-refresh