asp.net
  • gridview
  • timezone
  • linqdatasource
  • 2009-02-06 52 views 2 likes 
    2

    我头痛的时间值和多个时区。 我以UTC时间存储新的DateTime值,但当我尝试使用LinqDataSource和GridView修改它们时,我遇到了问题。如何修改asp.net中的绑定(“MyValue”)

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

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

    目前这1小时添加到存储在数据库UTC时间。

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

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

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

    如果我有办法在gridview的所有状态下显示本地时间,那么我可以很容易地使用LinqDataSource的OnUpdating。

    请分享你的想法...

    回答

    3

    你有没有考虑进行更改到你的模型?假设您要绑定的对象的名称是CustomerOrder。你可以在下面的类添加到您的项目(在同一个命名空间为您的LINQ的对象):

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

    现在不是结合订购日期,结合LocalOrderDate。这会自动将UTC /本地时间转换为OrderDate。

    (注:我假设你有TimeManager.ToLocalTime()和TimeManager ToUTCTime()正确定义。)

    2

    我已经处理这种过去的事情的方式是在EditItemTemplate中使用eval为好。让用户在当地时间编辑项目。然后为GridView添加OnItemUpdating处理程序,并添加提取相关文本框的值,将其转换为全局时间,并将其添加到新值字典中。将原始值(全局时间)绑定到同一模板中的隐藏字段,该字段将使用正确的旧时间填充旧值字典。你会想在插入OnItemInserting时做同样的事情,虽然你显然不需要旧值(因为没有一个)。

    编辑:通常我在DetailsView而不是GridView上进行更新,因此ItemUpdating/Inserting代替RowUpdating/Inserting。下面的示例代码 - 此示例使用一对下拉列表,允许用户指定一个位置(在建筑物中选择建筑物和位置,但实际上只映射数据库中的位置)。在后端将初始值分配给OnPreRender中的下拉列表(未显示),并从ItemUpdating/Inserting(更新显示)的位置下拉菜单中提取LocationID数据库字段值。 DetailsView封装在UpdatePanel中,当建筑物下拉选择更改时,位置下拉列表的填充完成。请注意,因为我正在更新项目(无论如何都导致更新语句),所以我不在乎LocationID字段是否在更新中被相同的值覆盖,所以我不打算在页面上保留旧值。

    <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; 
    } 
    
    +0

    你能分享一些代码?通过ItemUpdating你的意思RowUpdating? – Milan 2009-02-06 12:20:27

    相关问题