我能想到的至少有 3 种方法可以做到这一点:-
第一个(理想) - 在一个大约有 8 列的 Telerik 网格中,第一个 col 将列出所有表条目,接下来的 6 个用于显示为每个条目提交的不同日期,但不一定每个条目都有一个值,最终 col 将链接到单独页面上的每个条目,以允许通过日期选择器提交新日期或进行编辑。
主要问题是我需要能够根据每个列以不同颜色显示网格上的每个日期,我的意思是我在第一个列中记录一个日期,该日期每年更新一次,所以如果> 6个月,那么它是颜色 1 , >1month color 2, <1month color 3, 最后如果超过 1 年标记然后颜色 4。
其他 col 也有 2 种不同的可能更新长度。
第 2 - 每个不同的更新长度都会有自己的网格,因此第 1 为 1y,第 2 为第 2 长度,第 3 为第 3 长度。
第 3 个(可能)- 4 个网格来替换它仅显示每个类别的颜色,因此 1 个网格将显示所有超过 6 个月的条目,网格 2 将显示大于 1 个月,网格 3 将显示小于 1 个月,网格 4 将显示过去的时间长度。
我不知道如何最好地以一种可以满足我需要的方式对日期进行排序,但我认为选项 1 是可能的,或者选项 3 是最简单的。
编辑 -
using System
using System.Collections.Generic;
using System.Linq;
using System.Web;
namespace (...).Models.DTO
{
public class ...DTO
{
public int Id { get; set; }
public string Name { get; set; }
//public string C1D
//{
// get
// {
// if (C1D < DateTime.Today.AddDays(-183)) return "Green";
// }
//}
public string C1D
{
get
{
if ((C1D = DateTime.ParseExact(C1D, "yyyy/mm/dd", null)) < DateTime.Today.AddDays(-183)) return "Green";
}
set;
}
public string C2D { get; set; }
在这里,它显示了我如何尝试以两种不同的方式设置 C1D,以及对于 C2D,我通常如何设置进入 Telerik 网格的列。
[GridAction]
public ActionResult _List(int? Id)
{
List<...DTO> ret = new List<...DTO>();
_db.(...).ToList().ForEach(x =>
{
ret.Add(new ...DTO
{
Id = x.Id,
Name = x.(...)Name,
C1D = (x.C1SD.HasValue) ? x.C1SD.Value.ToShortDateString() : "",
C2D = (x.C2SD.HasValue) ? x.C2SD.Value.ToShortDateString() : "",
这就是我在控制器中设置它以在 Telerik 网格中显示数据的方式。
下面是我如何设置视图
<% Html.Telerik().Grid<(...).Models.DTO.(...)DTO>()
.Name("...List")
.DataKeys(dk => dk.Add(x => x.Id))
.Columns(c =>
{
c.Bound(x => x.Name);
c.Bound(x => x.C1D)
.Title("...");
c.Bound(x => x.C2D)
.Title("...");
c.Bound(x => x.C3D)
.Title("...");
c.Bound(x => x.C4D)
.Title("...");
c.Bound(x => x.C5D)
.Title("...");
c.Bound(x => x.C6D)
.Title("...");
c.Bound(x => x.C7D)
.Title("...");
})
.Sortable()
.Filterable()
.DataBinding(db => db.Ajax().Select("_List", "..."))
.Render();
%>
编辑 2 - 我也试过
.ClientEvents(e => e.OnDataBound("onDataBound"))
function onDataBound(e) {
if (e.dataItem.C1D > DateTime.Today.AddDays(183)) {
e.cell.style.backgroundColor = "green";
}
if (e.dataItem.C1D > DateTime.Today.AddDays(30)) {
e.cell.style.backgroundColor = "orange";
}
if (e.dataItem.C1D > DateTime.Today) {
e.cell.style.backgroundColor = "red";
}
if (e.dataItem.C1D <= DateTime.Today) {
e.cell.style.backgroundColor = "purple";
}
}
到达此页面后,它会中断代码并显示“Microsoft JScript 运行时错误:'dataItem.C1D' 为空或不是对象”和“Microsoft JScript 运行时错误:'cell.style' 为空或不是对象”和然后在网格中显示包含所有日期的页面,以便这些项目不为空,但是否还有其他一些我应该用来执行此功能的代码/格式?
并且还查看了关于 .cellaction的http://demos.telerik.com/aspnet-mvc/grid/customformatting ,如下所示
.CellAction(cell =>
{
if (cell.Column.Title == "Title Name")
{
if (cell.DataItem.C1D > DateTime.Today.AddDays(183))
{
//Set the background of this cell only
cell.HtmlAttributes["style"] = "background:red;";
}
}
})
我不得不将.Name更改为.Title,因为它无法识别.Name,但我收到错误消息“错误1运算符'>'不能应用于'string'和'System.DateTime'类型的操作数”所以似乎我将无法在单元格操作中执行这个复杂的任务。
我也在 Telerik 论坛上发布了这个附加到另一个问题但到目前为止没有回复 http://www.telerik.com/community/forums/aspnet-mvc/grid/telerik-grid-row-custom-formatting-on -任意位整数字符串字段.aspx
编辑 3 -
附加控制器代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using (Database Name).Models;
using (Database Name).Models.DTO;
using Telerik.Web.Mvc;
using Telerik.Web.Mvc.UI;
namespace (Database Name).Controllers
{
public class (Controller Name)Controller : Controller
{
(Database Name)Entities _db = new (Database Name)Entities();
public ActionResult List()
{
return View();
}
就是这样,现在我没有什么可以提供的了,因为没有其他东西可以对 Telerik 网格产生任何影响,所以如果还有其他东西可能隐藏在我可能遗漏的其他地方,那么请解释一下那是什么可能是因为我唯一没有包括的是与创建和编辑页面有关的代码,但它们所涉及的只是制作每个简单的记录,然后允许用户更改记录的日期。