使用动态创建的文本框更新gridview
本文关键字:更新 gridview 文本 动态 创建 | 更新日期: 2023-09-27 18:24:17
我有一个绑定到sql数据源的网格视图。
在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文本框中将其更新(因此不必手动更改)。
我遇到的问题是,当我单击"更新"命令字段时,我得到了对这两个文本框的空引用,其中的文本也会清除(与回发有关?)
这是更新代码:
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似乎不会拉取日期字段。如果我要删除动态数据,它们更新得很好。
我错过了什么?
发生了什么:
每次加载页面时都必须创建动态创建的控件。当您按下"更新"按钮时,会出现PostBack,在该PostBack中,您必须重新创建动态控件才能访问它们。
也就是说,如果RowUpdating
正在发生,而您以前没有经历RowDataBound
,那么控件就不存在。
我还推测,在Updating
PostBack期间,gridview.EditIndex
将具有不同的值,因此在任何情况下都不会存在您的控件。
你应该做什么:
您应该在标记中设计编辑模式模板,并让ASP.NET处理控件创建。利用数据绑定功能,让它们为您完成工作。
变量名"startDate"answers"endDate"只存在于if语句中,如果您想用该名称寻址它们,请在更高范围的中定义它们