更改后面代码中的文本框值不会回发新值

时间:2013-12-06 17:14:30

标签: asp.net gridview textbox

我有一个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文本框进行分配时,不会调用此方法。

感谢您的帮助。

2 个答案:

答案 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
}