データ列の1つが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>
を。
コードビハインドに少なくとも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
プロパティを設定するのに対し、私はテーブルのセルに一部のビューをレンダリングしたいと思います。これまでのところ私は追加されました。それは可能ですか?