2011-03-11 81 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