0

我能想到的至少有 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 网格产生任何影响,所以如果还有其他东西可能隐藏在我可能遗漏的其他地方,那么请解释一下那是什么可能是因为我唯一没有包括的是与创建和编辑页面有关的代码,但它们所涉及的只是制作每个简单的记录,然后允许用户更改记录的日期。

4

3 回答 3

1

编辑 3:

当你这样做:

当您执行 _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() : "", } }

x 将是 ObjectFromDB,您不想分配 DTO 的每个属性,您想传递 baseObject(女巫是 x),然后从 x 返回您想要的值。

如果您可以使用 putfile 或其他方式为我提供您的解决方案,如果您愿意,我可以查看它,但现在我不知道如何为您提供更多帮助...

结束编辑 3

你能放一些代码吗?

我会选择解决方案1。

您可以将 css 类添加到使用 ClientTemplate,如果它 > [timespan],我认为您应该添加一个绑定在属性上的列,该属性可以根据时间跨度返回 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>");

                         })
                %>

编辑 :

看一下这段代码,您将对象从数据库传递给您的新对象,并仅在 db 对象上添加属性。

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 } );
    });
}
于 2011-03-11T16:01:01.787 回答
0

对于此代码块,您是否尝试在日期时间中转换字符串?

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

让我知道它是否有帮助!

于 2011-04-08T12:49:32.083 回答
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";
                    }

现在它不必是绿色的,它可以是 true false tom dick 或 jane w/e,但它必须是基于某些独特条件分配的值。

视图-当我意识到这可能很容易时,我捂住了自己的脸,无论如何,是的,所以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";
           }

嘿,你只需将第一行/列单元格变为绿色,这可以扭曲并用于 w/e e.row.cell[?]。可用于,你有一个单一的细胞做所有的魔法耶哈卷成 1。

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

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

于 2011-05-23T15:40:47.200 回答