По крайней мере, 3 способа, которыми я могу представить, что это можно сделать: -
1-й (идеальный вариант) - в одной сетке Telerik, которая имеет около 8 столбцов, 1-й столбец будет перечислять все записи таблицы со следующими 6 для отображения разных дат, представленных для каждой записи, но не обязательно обязательно иметь значение для каждой записи, окончательный col будет ссылаться на каждую запись на отдельной странице, чтобы новые даты могли быть отправлены через средство выбора даты или отредактированы.
Основная проблема в том, что мне нужно иметь возможность отображать каждую из дат на сетке разными цветами в зависимости от каждого столбца, под этим я подразумеваю, что я записываю дату в 1-й столбец, который имеет ежегодное обновление, поэтому, если> 6 месяцев, то это цвет 1,> 1 месяц, цвет 2, <1 месяц, цвет 3 и, наконец, если отметка за прошлый год, то цвет 4. </p>
Есть также 2 различных возможных продолжительности обновления для других col.
2-й - Каждая отдельная длина обновления получит свою собственную сетку, поэтому 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; }
Здесь показано, как я пытался настроить 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 »является нулевым или нет object ", а затем отобразите страницу со всеми датами в сетке, чтобы эти элементы не были нулевыми, но есть ли какой-то другой код / формат, который я должен использовать для выполнения этой функции?
А также посмотрел на 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 Оператор»> не может быть применена к операндам типа «строка» и «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();
}
Вот теперь ничего не осталось, что я могу предоставить, поскольку нет ничего другого, что могло бы оказать какое-либо влияние на сетку телерика, поэтому, если есть еще что-то, что может быть спрятано в другом месте, которое я могу пропустить, тогда, пожалуйста, пожалуйста объясните, что это может быть, поскольку единственное, что я не включил, - это код, который нужно сделать со страницами «Создание» и «Редактировать», но все, что от них требуется, - это сделать каждую простую запись, а затем позволить пользователю изменять записанные даты.