我正在使用GridView
來顯示其中一個數據列的類型爲DateTimeOffset
的數據。爲了在用戶的時區顯示日期&次,我將用戶的時區首選項保存到他或她的配置文件(屬性值鍵「TimezoneOffset」),並且在格式化日期&次時需要訪問它。如何編寫自定義模板字段的DataControlField
如果我是用模板列,然後我需要寫:
<abbr class="datetimeoffset">
<%#
((DateTimeOffset)Eval("CreatedDate"))
.ToOffset(new TimeSpan(-((Int32)Profile.GetPropertyValue("TimezoneOffset"))
.ToRepresentativeInRange(-12, 24), 0, 0)).ToString("f") %>
</abbr>
這也太複雜,不能重複使用。
我試着給代碼隱藏添加一個TimeSpan
屬性(至少將它移出數據綁定表達式),但顯然在<%# ... %>
內無法訪問視圖的代碼隱藏屬性。
因此,我認爲我需要編寫一個自定義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
財產,我想呈現的局部視圖到表格單元格。那可能嗎?