【发布时间】:2012-06-17 16:06:06
【问题描述】:
我有一个带有动态数据源的 Telerik 网格(该网格最多可以使用大约 10 个完全不同的模型来存储它的数据),所以我也必须动态地构建列(显然)。网格中的一列(对于某些型号)是一个以毫秒为单位的时间跨度的双精度。 我想做的是将这个双精度设置为时间跨度。telerik 代码如下所示:
<% Html.Telerik()
.Grid(Model.DynamicGridDataSource)
.Name("statisticalGrid")
.Columns(a => GridHelper.GenerateColumns(a, Model.SelectedReport))
.DataBinding(dataBinding => dataBinding.Ajax().Select("_SelectGrid", "Reports", new { reportId = Model.ReportId, dateFrom = Model.DateFrom, dateTo = Model.DateTo, date = Model.Date, AvailablePlans = Model.AvailablePlans }))
.Sortable(GridSortSettingsBuilder => GridHelper.SortColumns(GridSortSettingsBuilder,
Model.DynamicGridDataSource.GetType(),
Model.SelectedReport))
.Filterable()
.Pageable(page => page.PageSize(25))
.Reorderable(reorder => reorder.Columns(true))
.Groupable
(
groupingSettingsBuilder => GridHelper.GroupColumns(groupingSettingsBuilder,
Model.DynamicGridDataSource.GetType(),
Model.SelectedReport)
)
.ClientEvents(events => events
.OnColumnReorder("onReorder"))
.Render();
GridHelper.GenerateColumns 看起来像这样:
public static void GenerateColumns(GridColumnFactory<dynamic> columnFactory, Company.Product.Data.Entity.Report reportStructure)
{
foreach (var columnLayout in reportStructure.ReportCols.OrderBy(o => o.ColumnSequence))
{
var columnBuilder = columnFactory.Bound(columnLayout.ColumnType);
if (columnLayout.ColumnType.Equals("SessionLength") ||
columnLayout.ColumnType.Equals("AverageTime") ||
columnLayout.ColumnType.Equals("TotalTime") ||
columnLayout.ColumnType.Equals("CallTime"))
{
// disable grouping
columnBuilder.Groupable(false);
string dataBindProperty = columnLayout.ColumnType;
if (columnLayout.DataFormat == "{0:T}")
{
//Even though the format looks like time ({0:T}), its actually a double which needs to be formatted here to look like a TimeSpan
}
}
if (!string.IsNullOrEmpty(columnLayout.Label))
{
columnBuilder.Title(columnLayout.Label);
}
if (columnLayout.DataFormat != null && columnLayout.DataFormat == "{0:P}")
{
columnBuilder.Format("{0:P}");
}
if (columnLayout.SumIndicator)
{
if (columnLayout.DataFormat == "{0:T}")
{
AddAggregateToColumnTimeSpan(columnBuilder, Aggregate.Sum);
}
else
{
AddAggregateToColumn(columnBuilder, Aggregate.Sum);
}
}
if (columnLayout.HideIndicator)
{
columnBuilder.Column.Hidden = true;
}
}
}
我能够正确格式化页脚,但我不知道如何格式化列的其余部分,因为在 Telerik 代码的上下文之外,我无法访问 item 迭代器或任何东西.有什么建议/想法吗?也许columnFactory.Bound(columnType).Format(/*something*/)?
【问题讨论】:
-
我不知道你是否可以只使用格式。有没有办法使用像 Telerik 网格这样的模板?这样,您可以保留双精度,以便您可以求和,同时仍然可以通过在模板中转换将双精度显示为 TimeSpan。
-
@Daniel 好吧,我不确定! Theres GridColumnFactory.Template 但那将适用于整个网格,对吗?还有columnBuilder.Template(),看起来更接近我想要的。不过,不确定我将如何编写模板。也许这就是你可以提供帮助的地方。
-
还有clientTemplate。不知道有什么区别
-
columnBuilder.Template() 听起来很有希望。我认为,如果您使用的是 ajax,ClientTemplate 将是。今晚我会试着多看这个。
-
@Daniel 谢谢!我只是不确定,因为实际上没有办法从 GridHelper 类内部访问数据,并且模板需要引用列中的项目,对吧?
标签: c# asp.net-mvc telerik telerik-grid