【问题标题】:changing textbox value in code behind does not post back new value在后面的代码中更改文本框值不会回发新值
【发布时间】: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# 来完成所有这些服务器端操作。

标签: asp.net gridview textbox


【解决方案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();           

        }

【讨论】:

    【解决方案2】:

    您正在使用 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
    }
    

    【讨论】:

    • 感谢您抽出宝贵时间回复 afzalulh。您的解决方案对我不起作用,因为我的 UpdateParameters 集合没有参数,因此我无法以这种方式分配值。但是,我能够在 SqlDataSource 的 OnUpdating 事件中执行此分配并且它可以工作,但问题仍然存在:为什么,在按下编辑后,如果用户手动更改 Mth_1 和 2 之类的文本框,更改将传递给数据源参数,但如果我在 RowUpdating 事件中以编程方式更改值,则不会传递更改,而在服务器端执行所有这些操作?
    • 我想答案是 RowUpdating 对于这样的分配来说可能是一个为时已晚的事件,在这种情况下,如果分配的输入是在行的文本框中输入的值,我应该什么时候进行分配正在编辑?
    • @leoinlios 你解决了这个问题吗?我一直在试图弄清楚完全相同的事情?
    • @Doreen 我发布了我最终所做的作为答案。
    • @leoinlios 谢谢!通过您的示例,我终于能够更好地理解需要发生的事情。第 2 部分是我需要从 checkboxlist 控件构建一个字符串并将新字符串传递给参数。我似乎无法使用 FindControl 来获取 SqlDataSource_Updating() 事件中的选定复选框。我必须以某种方式抓住它....但是我已经准备好参数,以便在我这样做时接收值!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-11-03
    • 2014-01-15
    • 2018-12-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-18
    • 1970-01-01
    相关资源
    最近更新 更多