asp.net
  • gridview
  • timezone
  • linqdatasource
  • 2009-02-06 54 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

    相關問題