我至少可以想到3种方法可以做到这一点: -
1st(理想) - 在一个具有大约8列的telerik网格中,1st col将列出所有表条目,其中6个用于显示为每个条目提交的不同日期,但并非所有条目都必须具有每个条目的值,final col将链接到单独页面上的每个条目,以允许通过datepicker提交新日期或进行编辑。
主要问题是我需要能够根据每个col显示不同颜色的网格上的每个日期,我的意思是我在第一个col中记录一个年度更新的日期,所以如果> 6个月然后它的颜色为1,> 1个月颜色2,<1个月颜色3,最后如果过去1年标记则颜色为4。
另一个col也有2种不同的续约长度。
第二 - 每个不同的更新长度将获得自己的网格,因此1y为1,第2长度为2nd,第3长度为3rd。
第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网格的cols。
[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操作员'&gt;'不能应用于'string'和'System.DateTime'类型的操作数“,所以我似乎无法在单元格操作中执行这个复杂的任务。
我也在附加到另一个问题的telerik论坛上发布了这个,但到目前为止还没有回复 http://www.telerik.com/community/forums/aspnet-mvc/grid/telerik-grid-row-custom-formatting-on-either-bit-int-string-field.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网格产生任何影响,所以如果还有其他东西可能隐藏在其他地方我可能会丢失那么请解释可能是什么,因为我没有包括的唯一的事情是创建和编辑页面的代码,但他们所涉及的只是制作每个简单的记录,然后允许用户更改记录的日期。
答案 0 :(得分:1)
编辑3:
当你这样做时:
当你做_db。(...)。ToList()。ForEach(x =&gt; { ret.Add(新... DTO { Id = x.Id, 名称= x。(...)姓名, C1D =(x.C1SD.HasValue)? x.C1SD.Value.ToShortDateString():“”, C2D =(x.C2SD.HasValue)? x.C2SD.Value.ToShortDateString():“”, } }
x将是ObjectFromDB,你不想分配DTO的每个属性,你想传递baseObject(巫婆是x),然后从x返回你想要的值。
如果你可以使用putfile或其他东西为我提供解决方案,我可以看看它,如果你想但是现在我不知道怎样才能帮助你更多... < / p>
结束编辑3
你能放一些代码吗?
我会选择解决方案1.
您可以使用ClientTemplate添加css类,如果它是&gt; [timespan],我认为你应该添加一个绑定在属性上的colum,该属性可以返回css类的名称或空字符串,具体取决于时间跨度。假设你有一个DateCol1属性,这是一个DateTime你可以添加一个DateCol1Css属性,如下所示:
public string DateCol1Css
{
get
{
if(DateCol1 < DateTime.Now.AddMonths(-1)) return "Color1"; //witch is less than a month
if(DateCol1 < DateTime.Now.AddMonths(-3)) return "Color2"; //witch is less than 3 months
if(DateCol1 < DateTime.Now.AddMonths(-6)) return "Color3"; //witch is less than 6 months
return "";
}
}
public string DateCol2Css
{
get
{
if (DateCol2 < DateTime.Now.AddDays(-10)) return "Color1"; //witch is less than 10 days
if (DateCol2 < DateTime.Now.AddDays(-30)) return "Color2"; //witch is less than 30 days
return "";
}
}
public string DateCol3Css
{
get
{
if (DateCol3 < DateTime.Now.AddMonths(-1)) return "Color1"; //witch is less than a month
if (DateCol3 < DateTime.Now.AddMonths(-3)) return "Color2"; //witch is less than 3 months
if (DateCol3 < DateTime.Now.AddMonths(-6)) return "Color3"; //witch is less than 6 months
return "";
}
}
网格应该是这样的:
<%= Html.Telerik().Grid<SerializableAdmin>()
.Name("Grid")
.Columns(colums =>
{
colums.Bound(c => c.FirstName);
colums.Bound(c => c.Id);
colums.Bound(c => c.Id).ClientTemplate("<span class=\"<#=DateCol1Css#>\"<#=DateCol1#></span>");
colums.Bound(c => c.Id).ClientTemplate("<span class=\"<#=DateCol2Css#>\"<#=DateCol2#></span>");
colums.Bound(c => c.Id).ClientTemplate("<span class=\"<#=DateCol3Css#>\"<#=DateCol3#></span>");
})
%>
修改:
看看这段代码,将对象从数据库传递给新对象,并使用get对象添加属性。
public class ObjectDTO
{
public ObjectFromDB BaseObject { get; set; }
public int Id
{
get { return BaseObject.Id; }
}
public string Name
{
get { return BaseObject.Name; }
}
public string C1D
{
get
{
if (BaseObject.C1SC.HasValue && BaseObject.C1SC < DateTime.Now.AddDays(-183)) return "Green";
return string.Empty;
}
}
public string C2D
{
get
{
if (BaseObject.C2SC.HasValue && BaseObject.C2SC < DateTime.Now.AddDays(-183)) return "Green";
return string.Empty;
}
}
}
[GridAction]
public ActionResult _List(int? Id)
{
List<ObjectDTO> ret = new List<ObjectDTO>();
_db.GetObjectFromDB().ToList().ForEach(x =>
{
ret.Add(new ObjectDTO { ObjectFromDB = x } );
});
}
答案 1 :(得分:0)
对于此代码块,您是否尝试在datetime中转换字符串?
.CellAction(cell =>
{
if (cell.Column.Title == "Title Name")
{
if (!string.IsNullOrEmpty(cell.DataItem.C1D) && DateTime.ParseExact(cell.DataItem.C1D, "yyyy/mm/dd", null) > DateTime.Today.AddDays(183))
{
//Set the background of this cell only
cell.HtmlAttributes["style"] = "background:red;";
}
}
})
你的...... CssColor的Dto属性应该是这样的:
public class ...DTO
{
public int Id { get; set; }
public string Name { get; set; }
public string C1D
{
get
{
if (!C1SD.HasValue) return string.Empty;
return (DateTime.ParseExact(C1SD, "yyyy/mm/dd", null) < DateTime.Today.AddDays(-183)) ? "Green" : "";
}
}
}
所以你的GridAction会是这样的:
[GridAction]
public ActionResult _List(int? Id)
{
List<...DTO> ret = _db.(...).ToList();
...
让我知道它是否有帮助!
答案 2 :(得分:0)
这是我从一开始就尝试做的事情
[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() : "",
Trick是在控制器中进行所有计算,并保持模型和视图非常基本。
模型 - 将它们全部作为字符串,并且基本上为每个日期col执行public string blah { get; set;}
,然后对于每个col,你想做一些复杂的事情,比如我的日期计算,你会做一个额外的col,这将是颜色/无论你想要什么功能,你甚至可以设置一个管理功能,所以如果他们没有win auth或者没有正确的角色等,那么它会使数据splarf或取消链接url链接。
控制器 - 正如您在上面看到的那样,我如何整理出现的日期,现在是一种非常简单的方法来整理颜色或w / e,(例如blahDTO bdt = new blahDTO();
}
if (x.TestVal1 != null)
{
if ((x.TestVal1) > (DateTime.Today.AddMonths(6)))
{
bdt.Colourflag1 = "green";
}
现在它不一定是绿色,它可能是真正的假汤姆迪克或简,但它只需要根据某些独特的条件分配一个值。
观看 - 当我意识到这可能很容易让我自己面对面时,无论如何,c.Bound(x => x.Colourflag1).Hidden(true);
下一步
.ClientEvents(events => events.OnRowDataBound("onRowDataBound"))
<script type="text/javascript">
function onRowDataBound(e) {
if (e.dataItem.TestVal1 == "green") {
e.row.cells[1].style.backgroundColor = "green";
}
并且嘿presto你只需将第1行/ col单元格变为绿色,这可以扭曲并用于w / e.row.cell [?]。可以用来和你有一个单一的单元格做所有魔法你们都可以卷入1。
现在我知道我的jscript代码很浪费,因为我确信此时你可以让绿色成为一个会影响下一个对象的对象,所以如果是黄色则会使背景颜色代码适合黄色。 / p>
如果有人有任何问题或jscript建议随时提出/评论。