我有一个gridview(ASP.NET Web Form项目),里面有4列:一个用于编辑行的CommandField,以及一个名为Total_Plan,Mth_1和Mth_2的3个TemplateField> EditItemTemplate> Textbox列。 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
,实际上,在执行Update to SQL时,我没有选择以编程方式对文本框进行的赋值。
我尝试在txbTotalPlan上添加AutoPostBack=true
,但这不起作用。
为什么我在更新发生时(即不是After)对网格行中的文本框进行分配,服务器端,新值不用于更新操作?我做这个任务太晚了吗?我想的另一种选择是在每个Mth_1和2的OnTextChanged事件中对Total Plan列进行分配,但是如果我可以在一个中心位置编写赋值,并且只在更新之前的那个时间,那么它似乎不那么混乱而且不那么频繁。
我在protected void Page_Load(object sender, EventArgs e)
事件中停止,实际上在对txbTotalPlan文本框进行分配时,不会调用此方法。
感谢您的帮助。
答案 0 :(得分:1)
我仍然不知道为什么它在网格的RowUpdating事件中不起作用,但我使用的替代解决方案是通过订阅SqlDataSource的OnUpdating事件并分配如下所示来进行分配。
protected void SqlData_Updating(object sender, SqlDataSourceCommandEventArgs e)
{
//calculate Total Plan (sum of all mth columns)
double mth_AddedUp = 0;
foreach(System.Data.Common.DbParameter p in e.Command.Parameters)
if(p.ParameterName.Length > 5 &&
p.ParameterName.Substring(0,5)=="@Mth_" &&
p.Value != null)
mth_AddedUp += double.Parse(p.Value.ToString());
// set Plan parameter value
e.Command.Parameters["@Plan"].Value = (mth_AddedUp).ToString();
}
答案 1 :(得分:0)
您正在使用SqlDataSource更新数据。您需要更新它的参数而不是文本框值。这样做:
protected void gridDetail_RowUpdating(object sender, GridViewUpdateEventArgs e)
{
double mth1=0;
double mth2=0;
mth1 = double.Parse(((TextBox)gridDetail.Rows[e.RowIndex].FindControl("txbMth_1")).Text);
mth2 = double.Parse(((TextBox)gridDetail.Rows[e.RowIndex].FindControl("txbMth_2")).Text);
yourDataSource.UpdateParameters["Mth_1"].DefaultValue = mth1;
yourDataSource.UpdateParameters["Mth_2"].DefaultValue = mth2;
yourDataSource.UpdateParameters["Total_Plan"].DefaultValue = mth1 + mth2;
yourDataSource.Update();//yourDataSource is your SqlDataSource
}