2011-03-11 51 views
0

至少3种方式我能想到的,可以这样做: -Telerik的网格自定义格式范围

1日(理想) - 其中有大约8列一个Telerik的网格,第一个关口会列出下一个6的所有表格条目,用于显示为每个条目提交的不同日期,但并非每个条目都必须具有值,最后的col将链接到单独页面上的每个条目以允许通过日期选择器提交新日期或将编辑。

主要问题是我需要能够根据每个列以不同的颜色显示网格上的每个日期,我的意思是我在每年更新的第一列中记录一个日期,因此如果> 6个月然后是颜色1,> 1个月的颜色2,< 1个月的颜色3,最后如果过去1年,则标记颜色4.

另外还有两种不同的续订长度。

第二个 - 每个不同的更新长度都会得到自己的网格,所以第一个为1y,第二个为第二个长度,第三个为第三个长度。

第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; } 

这说明我如何在两种不同的方式和C2D试图建立C1D如何我通常设置,其中进入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() : "", 

这是我将如何去设置它在控制器中显示数据在电网中。

下面是如何设置我的观点

<% 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'为空或不是对象”,然后显示页面的机智h网格中的所有日期,以便这些项目不为空,但是否有其他代码/格式我应该用来执行此功能?

而且还看着http://demos.telerik.com/aspnet-mvc/grid/customformatting在问候.cellaction像下面

.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-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(); 
    } 

这就是它现在有我可以提供任何东西,因为没有任何东西可以对电子网格产生任何影响,所以如果还有别的东西可能会隐藏在我可能会出现的其他地方那么请解释一下这可能是什么,因为我没有包括的唯一东西就是用于创建和编辑页面的代码,但它们涉及到的只是制作每个简单记录,然后允许用户更改记录的日期。

+0

想知道标题是否不够准确,或者这太复杂了,难以快速解决问题 – Myzifer 2011-03-11 13:02:24

回答

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() : "", 

关键是要做到在控制器中的所有计算和离开模型和视图很基本的事情。

型号 - 留下他们所有的字符串,基本上每个日期山坳做public string blah { get; set;},然后为每个山坳,你想做些什么复杂的像我的日期计算,你将成为一个额外的关口,这将是颜色/不管功能你甚至可以设置一个管理员功能,所以如果他们没有win auth或者没有正确的角色等等,那么它会把数据泼掉或者去链接url链接。

控制器 - 以及你可以在上面看到,这是我怎么能跟显示出来的日期和现在的非常简单的方式来理清颜色或W/e,以(例如东西blahDTO bdt = new blahDTO();

if (x.TestVal1 != null) 
       { 
        if ((x.TestVal1) > (DateTime.Today.AddMonths(6))) 
        { 
         bdt.Colourflag1 = "green"; 
        } 

现在它不一定是绿色的,它可能是真正的假汤姆迪克或珍妮瓦特/但它只是一个基于某些特定条件分配的值。

查看 - 当我意识到这可能是这个简单的我facepalmed自己,反正叶所以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"; 
      } 

和变戏法似的,你只是把第1行/列单元格的绿色,这可以被扭曲和用于w/e e.row.cell [?]。可以用于和你有一个单元格做所有的魔法你们哈哈卷入1.

现在我知道我的jscript代码是浪费,因为我确信在这一点上,你可以使绿色是一个对象,然后会影响下一个对象,所以如果黄色,那么它会使背景颜色代码适合黄色。

如果任何人有任何问题或jscript建议随时问/评论。

1

编辑3:

当你这样做:。

当你_db(...)ToList()的ForEach(X => { ret.Add(新... DTO { 编号= 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或其他东西给我提供你的解决方案,我可以看看它,如果你想,但现在我不知道怎么可能帮助你更多的比......

End Edit 3

你可以放一些代码吗?

我会去解决1

你可以一个CSS类添加到使用ClientTemplate,如果它> [时间跨度],我认为你应该添加一条属性绑定一个科拉姆可能根据时间跨度,返回一个css类的名字或一个空字符串。让我们说你有一个DateCol1属性女巫是可以添加一个是这样的一个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>"); 

         }) 
       %> 

编辑:

看看这个代码,您通过从数据库中的对象到新的对象,并得到仅在数据库对象添加属性。

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 }); 
    }); 
} 
+0

我还没有编码,因为我不知道从哪里开始取决于什么 - 能够通过我在这里得到的帮助,关于你的管理人员,我还需要能够设置任何记录在每个字段中的日期,然后记录相关列的3个附加日期,然后有人得到该管理者在telerik网格中工作,并查看从过期的每个日期到哪个颜色显示的日期?如果像那样的话,我仍然需要知道如何去做,反正周末如此。 – Myzifer 2011-03-11 16:40:13

+0

那么没有更多的帮助,或者你忘了这个话题? – Myzifer 2011-03-17 15:22:03

+0

我不太清楚你想做什么...你有什么问题,也许你可以尝试做,然后带上一些代码,这样我就可以帮助你,但我还是添加了一些代码,我希望它会帮助你,让我知道。 – VinnyG 2011-03-18 15:28:54

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;"; 
     } 
    } 
}) 

而你的...DTO属性为CssColor应该是这样的:

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(); 
... 

让我知道这是否有助于!

+0

编码的CellAction位没有问题,唯一的问题是http://www.telerik.com/community/forums/aspnet-mvc/grid/cellaction-doesn-t-seem-to-work.aspx它发布于2009年12月并表示它只适用于服务器端,无论这种情况仍然是我不知道的,但是从我的代码中可以看出它是ajax,bk和其余部分,并且DTO中的所有东西都或多或少都是cept,因为_list动作如果(!C1SD.HasValue)与(C1SD == null)有问题,但是我认为这是由于_list与我不知道我应该如何处理ToList()之后的所有内容。 – Myzifer 2011-04-08 14:19:38

+0

错误无法将类型'System.Collections.Generic.List <(Database Name).Models。(Table Name)>'隐式转换为'System.Collections.Generic.List <(Database Name).Models.DTO“。 (DTO名称)DTO>是我得到的错误,如果我完全按照您的方式将它放入实际名称 – Myzifer 2011-04-08 14:22:45

+0

@VinnyG其他任何想法或解决方案?还有以防万一它帮助我使用Visual Studio 2010编程所有这 – Myzifer 2011-04-13 08:49:11