0

これを行うことができると私が考えることができる少なくとも3つの方法:-

1 番目 (理想的) - 約 8 列の単一のテレリック グリッドでは、最初の列にはすべてのテーブル エントリがリストされ、次の 6 列は各エントリに送信されたさまざまな日付を表示しますが、必ずしもすべてのエントリに値があるとは限りません。最後の列はリンクします。別のページの各エントリに、datepicker を介して新しい日付を送信したり、編集したりできるようにします。

主な問題は、各列に応じてグリッド上の各日付を異なる色で表示できるようにする必要があることです。つまり、1 列目に毎年更新される日付を記録するので、6 か月以上の場合は色 1 になります。 、>1 か月のカラー 2、<1 か月のカラー 3、そして最後に 1 年以上経過している場合はカラー 4 です。

他の列についても、2 つの異なる更新期間があります。

2nd - それぞれの異なる更新の長さは独自のグリッドを取得するため、1 年目は 1 年目、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; }

ここでは、2 つの異なる方法で C1D をセットアップしようとした方法と、C2D の場合、テレリック グリッドに入る列を通常どのようにセットアップするかを示します。

[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' は null またはオブジェクトではありません」および「Microsoft JScript ランタイム エラー: 'cell.style' は null またはオブジェクトではありません」と表示されます。次に、グリッド内のすべての日付を含むページを表示して、これらの項目が null にならないようにしますが、この機能を実行するために使用する必要がある他のコード/形式はありますか?

また、以下のような .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 を認識しなかったため、.Name を .Title に変更する必要がありましたが、「エラー 1 演算子 '>' はタイプ 'string' および 'System.DateTime' のオペランドに適用できません」というエラー メッセージが表示されます。この複雑なタスクをセル アクションで実行することはできないようです。

別の質問に添付されたテレリック フォーラムにもこれを投稿しましたが、これまでのところ返信はありません http://www.telerik.com/community/forums/aspnet-mvc/grid/telerik-grid-row-custom-formatting-on -どちらか-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();
    }

テレリックグリッドに何らかの影響を与える可能性のあるものは他にないため、私が提供できる可能性があるものは何も残っていません.私が含めていないのは作成ページと編集ページで行うコードだけですが、それらに含まれるのは単純な記録を作成し、ユーザーが記録された日付を変更できるようにすることだけだからです。

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(witchはx)を渡し、xから必要な値を返します。

putfileまたは他の何かを使用してあなたの解決策を私に提供できれば、私はあなたが望むならそれを見ることができますが、今のところ私はそれ以上にあなたを助けることがどのように可能であるかわかりません...

編集終了3

コードを入れてもらえますか?

ソリューション1を使用します。

ClientTemplateを使用してcssクラスを追加できます。>[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オブジェクトに対してのみ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 } );
    });
}
于 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";
                    }

緑色である必要はありません。真の偽トム ディックまたはジェーン 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.row.cell[?] に使用できます。に使用でき、単一のセルですべての魔法を実行できます。

この時点で、緑を次のオブジェクトに影響を与えるオブジェクトにすることができると確信しているため、jscriptコードが無駄であることがわかりました。黄色の場合、背景色コードが黄色に収まります。

質問や jscript のアドバイスがある場合は、お気軽に質問/コメントしてください。

于 2011-05-23T15:40:47.200 に答える