2011-01-22 7 views
2

데이터 열 중 하나가 DateTimeOffset 인 데이터를 표시하려면 GridView을 사용하고 있습니다. 사용자의 시간대에 날짜 & 번을 표시하기 위해 사용자의 시간대 환경 설정을 자신의 프로필 (속성 값 키 "TimezoneOffset")에 저장하고 날짜를 & 번 포맷 할 때이 설정에 액세스해야합니다. 내가 templatefield 사용한다면사용자 정의 템플릿과 같은 DataControlField를 작성하는 방법

, 나는 쓸 필요가 : 너무 복잡하고 재사용하지

<abbr class="datetimeoffset"> 
<%# 
    ((DateTimeOffset)Eval("CreatedDate")) 
    .ToOffset(new TimeSpan(-((Int32)Profile.GetPropertyValue("TimezoneOffset")) 
          .ToRepresentativeInRange(-12, 24), 0, 0)).ToString("f") %> 
</abbr> 

합니다.

코드 숨김에 (적어도 데이터 바인딩 식 밖으로 이동하기 위해) 속성을 추가하려고 시도했지만 분명히보기의 코드 숨김의 속성에 <%# ... %> 내에서 액세스 할 수 없습니다.

따라서 사용자 정의 시간대에 & 번을 서식 지정하려면 사용자 지정 DataControlField을 작성해야한다고 생각합니다.

나는 시작했다 :

public class DateTimeOffsetField : DataControlField 
{ 
    private TimeSpan userOffsetTimeSpan; 

    protected override DataControlField CreateField() 
    { 
     return new DateTimeOffsetField(); 
    } 

    protected override void CopyProperties(DataControlField newField) 
    { 
     base.CopyProperties(newField); 
     ((DateTimeOffsetField)newField).userOffsetTimeSpan = userOffsetTimeSpan; 
    } 

    public override bool Initialize(bool sortingEnabled, System.Web.UI.Control control) 
    { 
     bool ret = base.Initialize(sortingEnabled, control); 
     int timezoneOffset = ((Int32)HttpContext.Current.Profile.GetPropertyValue("TimezoneOffset")).ToRepresentativeInRange(-12, 24); 
     userOffsetTimeSpan = new TimeSpan(-timezoneOffset, 0, 0); 
     return ret; 
    } 
} 

하지만 지금은 붙어입니다. 각 셀에 대해 HTML <abbr class="datetimeoffset"><%# ((DateTimeOffset)Eval("CreatedDate")).ToOffset(userOffsetTimeSpan).ToString("f") %></abbr>을 출력하려면 어떻게합니까?

편집 : 나는 Cutting Edge: Custom Data Control Fields이라는 제목의 기사를 읽었습니다.

public override void InitializeCell(DataControlFieldCell cell, DataControlCellType cellType, DataControlRowState rowState, int rowIndex) 
    { 
     base.InitializeCell(cell, cellType, rowState, rowIndex); 

     if (cellType == DataControlCellType.DataCell) 
     { 
      InitializeDataCell(cell, rowState, rowIndex); 
     } 
    } 

    protected virtual void InitializeDataCell(DataControlFieldCell cell, DataControlRowState rowState, int rowIndex) 
    { 
     System.Web.UI.Control control = cell; 

     if (control != null && Visible) 
     { 
      control.DataBinding += new EventHandler(OnBindingField); 
     } 
    } 

    protected virtual void OnBindingField(object sender, EventArgs e) 
    { 
     var target = (System.Web.UI.Control)sender; 

     if (target is TableCell) 
     { 
      TableCell tc = (TableCell)target; 
     } 
    } 

을하지만 기사가 TableCell 인스턴스의 Text 속성을 설정하는 반면, 나는 테이블 셀에 부분 뷰를 렌더링하는 싶습니다 지금까지 나는 추가했습니다. 그게 가능하니?

답변

1

나는 그것을 알아 냈다.

// DateTimeOffsetField.cs 
public class DateTimeOffsetField : BoundField 
{ 
    private TimeSpan userOffsetTimeSpan; 

    protected override DataControlField CreateField() 
    { 
     return new DateTimeOffsetField(); 
    } 

    protected override void CopyProperties(DataControlField newField) 
    { 
     base.CopyProperties(newField); 
     ((DateTimeOffsetField)newField).userOffsetTimeSpan = userOffsetTimeSpan; 
    } 

    public override bool Initialize(bool sortingEnabled, System.Web.UI.Control control) 
    { 
     bool ret = base.Initialize(sortingEnabled, control); 
     int timezoneOffset = ((Int32)HttpContext.Current.Profile.GetPropertyValue("TimezoneOffset")).ToRepresentativeInRange(-12, 24); 
     userOffsetTimeSpan = new TimeSpan(-timezoneOffset, 0, 0); 
     return ret; 
    } 

    protected override void OnDataBindField(object sender, EventArgs e) 
    { 
     base.OnDataBindField(sender, e); 

     var target = (Control)sender; 

     if (target is TableCell) 
     { 
      var tc = (TableCell)target; 
      var dataItem = DataBinder.GetDataItem(target.NamingContainer); 
      var dateTimeOffset = (DateTimeOffset)DataBinder.GetPropertyValue(dataItem, DataField); 
      tc.Controls.Add(new TimeagoDateTimeOffset { DateTimeOffset = dateTimeOffset.ToOffset(userOffsetTimeSpan) }); 
     } 
    } 
} 

TimeagoDateTimeOffset.cs : : 여기에 결국 무엇

[DefaultProperty("DateTimeOffset")] 
[ToolboxData("<{0}:TimeagoDateTimeOffset runat=server></{0}:TimeagoDateTimeOffset>")] 
public class TimeagoDateTimeOffset : WebControl 
{ 
    [Bindable(true)] 
    [Category("Appearance")] 
    [DefaultValue("")] 
    [Localizable(true)] 
    public DateTimeOffset DateTimeOffset 
    { 
     get { return (DateTimeOffset)ViewState["DateTimeOffset"]; } 
     set { ViewState["DateTimeOffset"] = value; } 
    } 

    protected override void RenderContents(HtmlTextWriter writer) 
    { 
     writer.BeginRender(); 
     writer.AddAttribute(HtmlTextWriterAttribute.Class, "timeago", false); 
     writer.AddAttribute(HtmlTextWriterAttribute.Title, DateTimeOffset.ToString("o")); 
     writer.RenderBeginTag("abbr"); 
     writer.Write(DateTimeOffset.ToString("d")); 
     writer.RenderEndTag(); 
     writer.EndRender(); 
    } 
} 
관련 문제