我过去处理这类事情的方式也是在 EditItemTemplate 中使用 Eval。让用户在本地时间编辑项目。然后为 gridview 添加 OnItemUpdating 处理程序并添加提取关联文本框的值,将其转换为全局时间,并将其添加到新的值字典中。将(全球时间)中的原始值绑定到同一模板中的隐藏字段,这将使用正确的旧时间填充旧值字典。尽管您显然不需要旧值(因为没有旧值),但您会希望在 OnItemInserting 中插入时执行相同的操作。
编辑:通常我在DetailsView而不是GridView上进行更新,因此是ItemUpdating/Inserting而不是RowUpdating/Inserting。下面的示例代码——此示例使用一对下拉列表,允许用户指定位置(选择建筑物和建筑物中的位置,但它实际上只映射数据库中的位置)。在后端,它将初始值分配给 OnPreRender 中的下拉列表(未显示),并从 ItemUpdating/Inserting 上的位置下拉列表中提取 LocationID 数据库字段值(显示更新)。DetailsView 包装在 UpdatePanel 中,并且在建筑物下拉选择更改时完成 Location 下拉列表的填充。请注意,由于我正在更新项目(无论如何都会导致更新声明),所以我不会
<asp:TemplateField HeaderText="Location:" SortExpression="LocationId">
<EditItemTemplate>
<asp:DropDownList runat="server" ID="buildingDropDownList"
DataSourceID="buildingDataSource"
DataTextField="name"
DataValueField="abbreviation"
OnSelectedIndexChanged=
"buildingDropDownList_SelectedIndexChanged"
AutoPostBack="true" />
<asp:DropDownList runat="server" ID="locationDropDownList"
DataSourceID="locationsDataSource"
DataTextField="Name"
DataValueField="ID">
</asp:DropDownList>
</EditItemTemplate>
<InsertItemTemplate>
<asp:DropDownList runat="server" ID="buildingDropDownList"
DataSourceID="buildingDataSource"
DataTextField="name"
DataValueField="abbreviation"
OnSelectedIndexChanged=
"buildingDropDownList_SelectedIndexChanged"
AutoPostBack="true"
AppendDataBoundItems="true">
<asp:ListItem Text="Select Building" Value="" />
</asp:DropDownList>
<asp:DropDownList runat="server" ID="locationDropDownList"
DataSourceID="locationsDataSource"
DataTextField="Name"
DataValueField="ID"
AppendDataBoundItems="true">
<asp:ListItem Text="Not installed" Value="" />
</asp:DropDownList>
</InsertItemTemplate>
<ItemTemplate>
<asp:Label ID="locationLabel" runat="server"\
Text='<%# Eval("LocationID") == null
? ""
: Eval("Location.Name") %>'>
</asp:Label>
</ItemTemplate>
</asp:TemplateField>
代码隐藏:
void editPrinterDetailsView_ItemUpdating( object sender,
DetailsViewUpdateEventArgs e )
{
// Use a helper method to find the dropdown inside the details view
// and get the selected value.
string locationID = ControlHelper
.GetDropDownValue( editPrinterDetailsView,
"locationDropDownList" );
if (locationID == string.Empty)
{
locationID = null;
}
if (e.NewValues.Contains( "LocationID" ))
{
e.NewValues["LocationID"] = locationID;
}
else
{
e.NewValues.Add( "LocationID", locationID );
}
e.OldValues["LocationID"] = -1;
}