C# 使用动态创建的文本框更新gridview

C# 使用动态创建的文本框更新gridview,c#,asp.net,gridview,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)

我有一个绑定到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 );
        }
}
上面只是在两个文本框和javascript中添加了一个动态AjaxCalendarExtender,获取startDate文本框中输入的日期,添加一年并在endDate文本框中更新它(因此您不必手动更改它)

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

以下是更新代码:

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似乎不会提取日期字段。 如果我要删除动态数据,它们会很好地更新

我遗漏了什么?

变量名“startDate”和“endDate”仅存在于if语句中,如果要使用该名称对它们进行寻址,请在更高的范围内定义它们发生了什么: 每次加载页面时都必须创建动态创建的控件。当您按下更新按钮时,会发生回发,在回发过程中,您必须重新创建动态控件才能访问它们

也就是说,如果发生了
行更新
,并且您以前没有通过
行数据绑定
,那么控件就不存在了

我还假设在
更新过程中,
gridview.EditIndex
将具有不同的值,因此您的控件在任何情况下都不会存在

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

对不起,我忘了复制。以上更新。但结果是一样的,我自己也不太确定,因为我对asp.net不太了解,但这可能与e.NewValues有关吗?您是否尝试过使用e.OldValues或gridview.Rows[e.RowIndex]?e.OldValues由于某种原因为空,因此它会抛出一个null引用,我尝试过gridview.Rows[e.RowIndex],它也会返回null,因为在单击行上的更新时,动态代码似乎会丢失。它会回发然后更新吗?似乎不对,我理解编辑模式模板。我以前使用过它们,在这里我使用了一个静态sqldatasource来填充gridview,但是在这个例子中,我通过基于用户搜索的存储过程绑定数据源
gridview.DataSource=dataContext.GetRecords(searchParameter);gridview.DataBind()其中dataContext是linqtosql结构。可以为这种配置启用编辑模式吗?或者如何将控件ID分配给html代码中的文本框?