صفحه بندی، مرتب سازی و جستجوی پویای اطلاعات به کمک Kendo UI Grid
نویسنده: وحید نصیری
تاریخ: ۱۳۹۳/۰۸/۱۶ ۱۶:۳۰
آدرس: www.dntips.ir
| مطالب | ۳۶۹۴ |
| نویسندگان | ۲۷۶ |
| گروههای مطالب | ۱۰۲۴ |
| نقشههای راه | ۱۱۹ |
| دورهها | ۱۴ |
| اشتراکها | ۱۷۹۱۴ |
namespace KendoUI03.Models
{
public class Product
{
public int Id { set; get; }
public string Name { set; get; }
public decimal Price { set; get; }
public bool IsAvailable { set; get; }
}
} /api/products?{"take":10,"skip":0,"page":1,"pageSize":10,"sort":[{"field":"Id","dir":"desc"}]} {
"Data":
[
{"Id":1500,"Name":"نام 1500","Price":2499.0,"IsAvailable":false},
{"Id":1499,"Name":"نام 1499","Price":2498.0,"IsAvailable":true}
],
"Total":1500,
"Aggregates":null
} PM> Install-Package Kendo.DynamicLinq
using System.Linq;
using System.Net.Http;
using System.Web.Http;
using Kendo.DynamicLinq;
using KendoUI03.Models;
using Newtonsoft.Json;
namespace KendoUI03.Controllers
{
public class ProductsController : ApiController
{
public DataSourceResult Get(HttpRequestMessage requestMessage)
{
var request = JsonConvert.DeserializeObject<DataSourceRequest>(
requestMessage.RequestUri.ParseQueryString().GetKey(0)
);
var list = ProductDataSource.LatestProducts;
return list.AsQueryable()
.ToDataSourceResult(request.Take, request.Skip, request.Sort, request.Filter);
}
}
} <head>
<meta charset="utf-8" />
<meta http-equiv="Content-Language" content="fa" />
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Kendo UI: Implemeting the Grid</title>
<link href="styles/kendo.common.min.css" rel="stylesheet" type="text/css" />
<!--شیوه نامهی مخصوص راست به چپ سازی-->
<link href="styles/kendo.rtl.min.css" rel="stylesheet" />
<link href="styles/kendo.default.min.css" rel="stylesheet" type="text/css" />
<script src="js/jquery.min.js" type="text/javascript"></script>
<script src="js/kendo.all.min.js" type="text/javascript"></script>
<!--محل سفارشی سازی پیامها و مسایل بومی-->
<script src="js/cultures/kendo.culture.fa-IR.js" type="text/javascript"></script>
<script src="js/cultures/kendo.culture.fa.js" type="text/javascript"></script>
<script src="js/messages/kendo.messages.en-US.js" type="text/javascript"></script>
<style type="text/css">
body {
font-family: tahoma;
font-size: 9pt;
}
</style>
<script type="text/javascript">
// جهت استفاده از فایل: kendo.culture.fa-IR.js
kendo.culture("fa-IR");
</script>
</head> <div class="k-rtl">
<div id="report-grid"></div>
</div> <script type="text/javascript">
$(function () {
var productsDataSource = new kendo.data.DataSource({
transport: {
read: {
url: "api/products",
dataType: "json",
contentType: 'application/json; charset=utf-8',
type: 'GET'
},
parameterMap: function (options) {
return kendo.stringify(options);
}
},
schema: {
data: "Data",
total: "Total",
model: {
fields: {
"Id": { type: "number" }, //تعیین نوع فیلد برای جستجوی پویا مهم است
"Name": { type: "string" },
"IsAvailable": { type: "boolean" },
"Price": { type: "number" }
}
}
},
error: function (e) {
alert(e.errorThrown);
},
pageSize: 10,
sort: { field: "Id", dir: "desc" },
serverPaging: true,
serverFiltering: true,
serverSorting: true
});
$("#report-grid").kendoGrid({
dataSource: productsDataSource,
autoBind: true,
scrollable: false,
pageable: true,
sortable: true,
filterable: true,
reorderable: true,
columnMenu: true,
columns: [
{ field: "Id", title: "شماره", width: "130px" },
{ field: "Name", title: "نام محصول" },
{
field: "IsAvailable", title: "موجود است",
template: '<input type="checkbox" #= IsAvailable ? checked="checked" : "" # disabled="disabled" ></input>'
},
{ field: "Price", title: "قیمت", format: "{0:c}" }
]
});
});
</script> @(Html.Kendo().Grid(Model)
.Name("gridKendo")
.Columns(columns =>
{
columns.Bound(c => c.Name).Width(50);
columns.Bound(c => c.Family).Width(100);
columns.Bound(c => c.Tel);
})
.Pageable(pager => pager
.Input(true)
.Numeric(true)
.Info(true)
.PreviousNext(true)
.Refresh(true)
.PageSizes(true)
)
) SELECT *
FROM (
SELECT
FROM table a
)
WHERE ROWNUM <= :TAKE SELECT *
FROM (
SELECT
a.*,
ROWNUM OA_ROWNUM
FROM (
FROM table a
) a
WHERE ROWNUM <= :TAKE
)
WHERE OA_ROWNUM > :SKIP var list = ProductDataSource.LatestProducts;
public class EFController : Controller {
//
// GET: /EF/
public ActionResult AjaxConnected([DataSourceRequest] DataSourceRequest request )
{
using (var dbef=new dbTestEntities())
{
IQueryable<Person> persons = dbef.People;
DataSourceResult result = persons.ToDataSourceResult(request);
return Json(result.Data,JsonRequestBehavior.AllowGet);
}
}
} @{ ViewBag.Title = "AjaxConnected";
}
<h2>AjaxConnected</h2>
@(Html.Kendo().Grid<TelerikMvcApp2.Models.Person>( )
.Name("Grid")
.DataSource(builder => builder
.Ajax()
.Read(operationBuilder => operationBuilder.Action("AjaxConnected", "EF"))
)
.Columns(factory =>
{
factory.Bound(person => person.personId);
factory.Bound(person => person.Name);
factory.Bound(person => person.LastName);
})
.Pageable()
.Sortable()) [{"personId":1,"Name":"Amin","LastName":"Saadati"}, {"personId":2,"Name":"Fariba","LastName":"Ghochani "},{"personId":4,"Name":"Milad","LastName":"Rahman i"},{"personId":5,"Name":"rima","LastName":"rad"}, {"personId":6,"Name":"ali","LastName":"kiva"},{"pe rsonId":7,"Name":"sahel","LastName":"abasi"},{"per sonId":8,"Name":"medi","LastName":"ghaem"},{"perso nId":9,"Name":"mino","LastName":"kafash"},{"person Id":10,"Name":"behzad","LastName":"tizro"},{"perso nId":11,"Name":"toti","LastName":"saadati"},{"pers onId":12,"Name":"parinaz","LastName":"karami"},{"p ersonId":13,"Name":"sadegh","LastName":"hojati"},{ "personId":14,"Name":"milad","LastName":"ebadipor" },{"personId":15,"Name":"farid","LastName":"riazi" },{"personId":16,"Name":"said","LastName":"abdoli" },{"personId":17,"Name":"behzad","LastName":"ariaf ar"},{"personId":18,"Name":"jamshid","LastName":"k otahi"}] public class Field
{
public string Type { get; set; }
} public class Fields : System.Collections.ObjectModel.Collection<Field>
{
public System.Collections.IEnumerable ToList()
{
return System.Linq.Enumerable.ToList( System.Linq.Enumerable.Select( this ,
field => new { field.Type } ) );
}
} return new InitializeInfo
{
...
Model = GetModel()
}; private Model GetModel ()
{
return new Model{ Fields = GetFields().ToList() };
} private Fields GetFields()
{
var fields = new Fields();
foreach ( var column in GetColumns() )
{
fields.Add( new Field { Type = column.DataType } );
}
return fields;
} "model": {
"fields": [
{
"type": "string"
},
{
"type": "string"
},
{
"type": "datetime"
}
]
} new Field { Type = column.DataType } model: {
fields: {
"Id": { type: "number" }, //تعیین نوع فیلد برای جستجوی پویا مهم است
"Name": { type: "string" },
"IsAvailable": { type: "boolean" },
"Price": { type: "number" }
}
}
}
public class Field
{
[JsonExtensionData]
public Dictionary<string, object> Property { get; set; }
}
public class FieldType
{
public string Type { get; set; }
} var data = new
{
model = new
{
fields = new List<Field>
{
new Field
{
Property = new Dictionary<string, object>
{
{"Id", new FieldType { Type = "number" }},
{"Name", new FieldType { Type = "string" }}
}
}
}
}
};
var dataJson = JsonConvert.SerializeObject(data, Formatting.Indented); {
"model": {
"fields": [
{
"Id": {
"Type": "number"
},
"Name": {
"Type": "string"
}
}
]
}
} Request.Url.ParseQueryString().GetKey(0)
{"take":10,"skip":0,"page":1,"pageSize":10,"sort":[{"field":"Id","dir":"desc"}]} -Request.Url{http://localhost:10912/Slider/ReadSlider1?take=10&skip=0&page=1&pageSize=10&sort[0][field]=Id&sort[0][dir]=desc}System.Uri -Request.Url{http://localhost:27061/Home/GetProducts?{"take":10,"skip":0,"page":1,"pageSize":10,"sort":[{"field":"Id","dir":"desc"}]}}System.Uri dataSource : {
// ....
requestStart: function () {
kendo.ui.progress($("#grid"), true);
},
requestEnd : function () {
kendo.ui.progress($("#grid"), false);
}
}, {"Data":[{"id":1,"Title":"گوشی موبایل تی پی-لینک مدل Neffos C5 دو سیمکارت","categories":[{"Name":"م وبایل","Id":1}, var request = JsonConvert.DeserializeObject<DataSourceRequest>(
requestMessage.RequestUri.ParseQueryString().GetKey(0)
); var rawQueryString = this.HttpContext.Request.QueryString.ToString(); // PM> Install-Package Microsoft.AspNetCore.WebUtilities var rawQueryStringKeyValue = QueryHelpers.ParseQuery(rawQueryString).FirstOrDefault(); var dataString = Uri.UnescapeDataString(rawQueryStringKeyValue.Key); var request = JsonConvert.DeserializeObject<DataSourceRequest>(dataString);
var gridDataSource = $("#grid").data("kendoGrid").dataSource;
var gridListFilter = { filters: [] };
gridListFilter.logic = "and";
gridListFilter.filters.push({ field: "Prices", operator: "lte", value: maxVal });
gridDataSource.filter(gridListFilter);
gridDataSource.read(); function customSearch() {
var filters = [];
var grid = $("#grid").data("kendoGrid");
filters.push({ field: "f1", operator: "eq", value: 1 });
filters.push({ field: "f2", operator: "eq", value: "xyz" });
grid.dataSource.filter({
logic: "and",
filters: filters
});
grid.dataSource.read();
grid.refresh();
} var initialLoad = true;
var ds = new kendo.data.DataSource({
//...
requestStart: function () {
if (initialLoad)
kendo.ui.progress($("#myGrid"), true);
},
requestEnd: function () {
if(initialLoad)
kendo.ui.progress($("#myGrid"), false);
initialLoad = false;
},
//... {"take":10,"skip":0,"page":1,"pageSize":10,"sort":[{"field":"Id","dir":"desc"}],"filter":{"logic":"or","filters":[{"field":"Name","operator":"contains","value":"ا"},{"field":"Description","operator":"contains","value":"ا"}]}}: public enum RequestStatus : byte
{
Checking,
Accepted,
Rejected
} var query = _context.Products.Select(x => new { x.Status.ToString(), ... }); "Status": { type: "string" }, filter: [
{ field: "Status", operator: "eq", value: "Checking" },
],
field: "Status",
values: [
{ text: "در حال بررسی", value: "Checking" },
{ text: "تایید شده", value: "Accepted" },
{ text: "رد شده", value: "Rejected" },
],
title: 'وضعیت' $("#report-grid").data("kendoGrid").options.editable.mode = "popup";
$("#report-grid").data("kendoGrid").options.editable.mode = "inline";
$("#report-grid").data("kendoGrid").options.editable.mode = "incell"; // https://docs.telerik.com/kendo-ui/api/javascript/ui/grid/events/edit
$("#grid").data("kendoGrid").bind("edit", function(e){
if(e.model.isNew()) {
//create
} else {
//edit
}
});