2009-02-06 2 views
2

나는 시간 값과 여러 시간대에 골머리를 앓고있다. 새 DateTime 값을 UTC 시간으로 저장하고 있지만 LinqDataSource 및 GridView를 사용하여 수정하려고하면 문제가 발생합니다.asp.net에서 바인딩 ("MyValue")을 수정하는 방법

난 쉽게 현재이 DB에 저장 UTC 시간 1 시간을 추가합니다

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

에 정확한 시간을 표시 할 수 있습니다.

그러나 소스로 다시 바인딩하는 것은 쉽지 않습니다. Bind ("OrderDate")는 TimeManager.ToGlobalTime ((DateTime) Bind ("OrderDate")처럼 수정할 수 없습니다.)

LinqDataSource의 OnUpdating 이벤트를 사용하여 값을 전역 시간으로 업데이트하려고 생각했지만 사용자가 날짜 필드가 아닌 다른 필드를 수정하면 어떻게 될까요? 그는 기록 시간 값을 업데이트 할 때마다 한 시간 동안 더 작을 것입니다.

시간대의 영향을받는 시간이 아닌 datetime의 날짜 부분을 수정할 수 있기 때문에 이전 값과 새 값을 비교하는 것도 좋지 않습니까?

Gridview의 모든 주에서 현지 시간을 표시 할 수 있다면 LinqDataSource의 OnUpdating을 쉽게 사용할 수 있습니다.

의견을 공유하세요 ...

답변

3

당신이 당신의 모델에 변경을 생각 해 봤나? 바인딩 할 객체의 이름이 CustomerOrder라고 가정 해 봅시다. 대신 주문일 바인딩의 지금

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

을 LocalOrderDate에 결합 : 당신은 (당신의 Linq는 객체와 같은 네임 스페이스) 프로젝트에 다음 클래스를 추가 할 수 있습니다. 그러면 자동으로 UTC/현지 시간 변환이 OrderDate로 전환됩니다.

:

2

내가 과거에 이런 종류의 물건을 처리 한 방식뿐만 아니라 EditItemTemplate에 평가를 사용하는 것입니다. 사용자가 현지 시간으로 항목을 편집하게합니다. 그런 다음 gridview에 대해 OnItemUpdating 처리기를 추가하고 추가로 연결된 텍스트 상자의 값을 추출하고 전역 시간으로 변환 한 다음 새 값 사전에 추가합니다. 같은 시간대의 원래 값을 동일한 템플릿의 숨겨진 필드에 바인딩하면 이전 값 사전에 올바른 이전 시간이 채워집니다. OnItemInserting에 삽입 할 때 이전 값이 필요하지 않지만 (동일한 값이 없으므로) 동일한 작업을 수행해야합니다.

EDIT : 보통 GridView가 아니라 DetailsView에서 내 업데이트를 수행하므로 RowUpdating/Inserting 대신 ItemUpdating/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> 

Codebehind가 :

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

당신이 몇 가지 코드를 공유 할 수 (참고. 내가 있으리라 믿고있어 당신은 TimeManager.ToLocalTime()와 제대로 정의 TimeManager ToUTCTime은()가)? ItemUpdating이란 RowUpdating을 의미합니까? – Milan

+0

나는 DetailsView와 ItemUpdating을 생각하고 있었다. GridView에서 일반적으로 DetailsView에 대한 드릴 다운을 통해 직접 업데이트하지는 않지만 아이디어는 같습니다. 내 게시물에 샘플을 추가하겠습니다. – tvanfosson

관련 문제