【发布时间】:2014-02-20 19:36:12
【问题描述】:
我有一个 gridview(ASP.NET Web 窗体项目),其中包含 4 列:一个用于编辑行的 CommandField,以及 3 个 TemplateField>EditItemTemplate>Textbox 列,称为 Total_Plan、Mth_1 和 Mth_2。 3 个文本框列绑定到一个 SqlDataSource。
Total_Plan 定义为:
<asp:TemplateField HeaderText="Total Plan">
<EditItemTemplate>
<asp:TextBox ID="txbTotalPlan" runat="server" Text='<%# Bind("Total_Plan") %>'>
</asp:TextBox>
</EditItemTemplate>
<ItemTemplate>
<asp:Label ID="idNotUsedButNeeded0" runat="server" Text='<%# Bind("Total_Plan") %>' />
</ItemTemplate>
</asp:TemplateField>
当用户按下 Edit,改变 Mth_1 或 2 的值,然后按下 Update,以下代码运行:
protected void gridDetail_RowUpdating(object sender, GridViewUpdateEventArgs e)
{
double totPlan =0;
totPlan += double.Parse(((TextBox)gridDetail.Rows[e.RowIndex].FindControl("txbMth_1")).Text);
totPlan += double.Parse(((TextBox)gridDetail.Rows[e.RowIndex].FindControl("txbMth_2")).Text);
((TextBox)gridDetail.Rows[e.RowIndex].FindControl("txbTotalPlan")).Text = totPlan.ToString();
}
Mth_1 和 Mth_2 中输入的值随后会更新为 SQL,但是 Total_Plan 的值不会在数据库中更新。代码行
((TextBox)gridDetail.Rows[e.RowIndex].FindControl("txbTotalPlan")).Text = totPlan.ToString();
确实改变了文本框的值,因为当我检查((TextBox)gridDetail.Rows[e.RowIndex].FindControl("txbTotalPlan")).Text 时,我可以看到分配的新值,但是这个分配似乎没有回发到服务器等更新 SQL 表时,旧值被保留(我检查了 SqlDataSource_Updating 事件的e.Command.Parameters[0].Value,实际上,在对 SQL 进行更新时,我以编程方式对文本框执行的分配没有被拾取。
我尝试在 txbTotalPlan 上添加 AutoPostBack=true 但这不起作用。
如果我在服务器端对网格行中的文本框进行分配,为什么在更新发生时(即不是之后),新值不用于更新操作?我做这个任务太晚了吗?我认为的替代方法是在每个 Mth_1 和 2 的 OnTextChanged 事件中对 Total Plan 列进行分配,但是如果我可以在中心位置并且仅在更新前的时间编写分配,它似乎不那么混乱且不那么频繁.
我停止了protected void Page_Load(object sender, EventArgs e) 事件,并且确实在对 txbTotalPlan 文本框进行分配时,没有调用此方法。
感谢您的帮助。
【问题讨论】:
-
不,我不是。我只是在使用 C# 来完成所有这些服务器端操作。