使用动态创建的文本框进行gridview更新

时间:2013-07-23 08:08:23

标签: c# asp.net gridview

我有一个绑定到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似乎清除并在单击Update后立即变为null。 e.NewValues似乎没有拉日期字段。 如果我要删除动态数据,他们就更新了。

我错过了什么?

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

发生了什么:

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

意思是,如果RowUpdating正在发生,而您之前没有通过RowDataBound,则控件不在那里。

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

你应该做什么:

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