2

我对时间值和多个时区感到头疼。我以 UTC 时间存储新的 DateTime 值,但是当我尝试使用 LinqDataSource 和 GridView 修改它们时遇到问题。

我可以很容易地显示正确的时间

<ItemTemplate>
    <asp:Label ID="Label1" runat="server" Text='<%# TimeManager.ToLocalTime((DateTime)Eval("OrderDate")) %>' />
</ItemTemplate>

目前,这将为存储在 DB 中的 UTC 时间增加 1 小时。

但是,绑定回源并不容易。Bind("OrderDate") 不能像 TimeManager.ToGlobalTime((DateTime)Bind("OrderDate")) 那样修改。

我正在考虑使用 LinqDataSource 的 OnUpdating 事件将值更新为全球时间,但是如果用户修改了其他字段而不是日期字段怎么办?他每次更新记录的时间值都会小一小时。

比较新旧值也不是很好,因为用户可以修改日期时间的日期部分而不是时间,这受时区的影响?

如果我有办法在 gridview 的所有状态中显示当地时间,那么我可以轻松地使用 LinqDataSource 的 OnUpdating。

请分享你的想法...

4

2 回答 2

3

您是否考虑过对模型进行更改?假设您要绑定的对象的名称是 CustomerOrder。您可以将以下类添加到您的项目中(在与 Linq 对象相同的命名空间中):

public partial class CustomerOrder
{
    public DateTime LocalOrderDate
    {
        get { return TimeManager.ToLocalTime(OrderDate); }
        set { OrderDate = TimeManager.ToUTCTime(value); }
    }
}

现在不是绑定到 OrderDate,而是绑定到 LocalOrderDate。这将自动将 UTC/本地时间转换为 OrderDate。

(注意:我假设您正确定义了 TimeManager.ToLocalTime() 和 TimeManager.ToUTCTime())

于 2009-02-06T19:48:13.733 回答
2

我过去处理这类事情的方式也是在 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;
}
于 2009-02-06T11:56:04.110 回答