【问题标题】:gridview update with dynamically created textboxes使用动态创建的文本框更新gridview
【发布时间】:2013-07-23 08:08:23
【问题描述】:

我有一个绑定到 sql 数据源的 gridview。

在 RowBound 方法中,我有这段代码来格式化可编辑的文本框:

protected void gridview_RowDataBound(Object sender, GridViewRowEventArgs e)
{
    //Format the Edit row.
        if (e.Row.RowIndex == gridview.EditIndex && e.Row.RowIndex >= 0)
        {
           //Add Ajax Calendar to Date fields
            TextBox startDate= ((TextBox)e.Row.Cells[7].Controls[0]);
            startDate.ID = "txtStartDate";
            TextBox endDate= ((TextBox)e.Row.Cells[8].Controls[0]);
            endDate.ID = "txtEndDate";
            startDate.Attributes.Add("onchange", "javascript:GridviewAutoCalculateEndDate(this, " + endDate.ClientID + ");");

            AjaxControlToolkit.CalendarExtender startDateCalendar = new AjaxControlToolkit.CalendarExtender();
            startDateCalendar .ID = "startDateCalendar ";
            startDateCalendar .TargetControlID = "txtStartDate";
            startDateCalendar .Format = "dd/MM/yyyy";
            AjaxControlToolkit.CalendarExtender endDateCalendar = new AjaxControlToolkit.CalendarExtender();
            endDateCalendar.ID = "endDateCalendar";
            endDateCalendar .TargetControlID = "txtEndDate";
            endDateCalendar .Format = "dd/MM/yyyy";

            e.Row.Cells[7].Controls.Add(startDate);
            e.Row.Cells[8].Controls.Add(endDate);
            e.Row.Cells[7].Controls.Add(startDateCalendar );
            e.Row.Cells[8].Controls.Add(endDateCalendar );
        }
}

上面只是将动态 AjaxCalendarExtender 添加到两个文本框和 javascript,获取在 startDate 文本框中输入的日期,添加一年并在 endDate 文本框中更新它(因此您不必手动更改它)。

我遇到的问题是,当我单击更新命令字段时,我得到对这两个文本框的空引用,并且其中的文本也被清除(与回发有关?)

这里是更新代码:

protected void gridview_RowUpdating(object sender, GridViewUpdateEventArgs e)
{
    DateTime startDate= new DateTime();
    DateTime.TryParseExact(e.NewValues[6].ToString(), "dd/MM/yyyy", CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal, out startDate);
    DateTime endDate= new DateTime();
    DateTime.TryParseExact(e.NewValues[7].ToString(), "dd/MM/yyyy", CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal, out endDate);

    dataContext.UpdateDates(startDate, endDate);
    PerformDataBind();
}

基本上 startDate 和 endDate 似乎在单击更新后立即清除并变为空。 e.NewValues 似乎没有提取日期字段。 如果我要删除它们更新的动态数据就好了。

我错过了什么?

【问题讨论】:

    标签: c# asp.net gridview


    【解决方案1】:

    发生了什么:

    每次加载页面时都必须创建动态创建的控件。当您按下 Update 按钮时,会发生 PostBack,并且在该 PostBack 中您必须重新创建动态控件才能访问它们。

    意思是,如果发生RowUpdating,而您之前没有经过RowDataBound,则控件不存在。

    我还假设在Updating PostBack 期间,gridview.EditIndex 将具有不同的值,因此您的控件在任何情况下都不存在。

    你应该做什么:

    您应该在您的标记中设计您的编辑模式模板,并让 ASP.NET 处理控件的创建。利用数据绑定功能,让它们为您完成工作。

    【讨论】:

    • 我了解编辑模式模板。我在使用静态 sqldatasource 填充 gridview 之前使用过它们,但在这种情况下,我通过基于用户搜索的存储过程绑定数据源。 gridview.DataSource = dataContext.GetRecords(searchParameter); gridview.DataBind(); 其中 dataContext 是一个 linqtosql 结构。可以为这样的配置启用编辑模式吗?
    • 或者如何将控件 ID 分配给 html 代码中的文本框?
    【解决方案2】:

    变量名称“startDate”和“endDate”仅存在于您的 if 语句中,如果您想用该名称对它们进行寻址,请在更高的范围内定义它们

    【讨论】:

    • 对不起,我忘了把它复制过来。以上更新。但结果是一样的。
    • 我不太确定自己,因为我不太喜欢 asp.net,但它可能与 e.NewValues 有关吗?您是否尝试过使用 e.OldValues 或 gridview.Rows[e.RowIndex]?
    • e.OldValues 出于某种原因是空的,所以它抛出一个空引用,我尝试了 gridview.Rows[e.RowIndex] ,它也返回空,因为动态代码似乎丢失了单击行上的更新时。它会回发然后更新吗?好像错了
    猜你喜欢
    • 1970-01-01
    • 2013-03-14
    • 2012-12-28
    • 2023-04-09
    • 2020-09-02
    • 2012-11-25
    • 1970-01-01
    • 2012-03-18
    • 2013-09-27
    相关资源
    最近更新 更多