Reputation: 1585
I want to be able to use the result of the ajax call to make a decision which Kendo Grid I will populate. If I receive only one item in the array I want to populate a grid, otherwise I have another grid for multiple items.
My jQuery
$.ajax({
type: "POST",
dataType: "json",
url: 'Item/GetItems/',
data: { number: number },
success: function (data) {
if (data.length == 1) {
var sGrid = $("#SingleGrid").data("kendoGrid").dataSource.data(data);
//I´ve also tried this
//sGrid.refresh();
}
else {
var mGrid = $("#MultipleGrid").data("kendoGrid").dataSource.data(data);
//I´ve also tried this
//mGrid .refresh();
}
},
error: function () {
}
});
My Controller Action
public ActionResult GetItems([DataSourceRequest] DataSourceRequest request, string number)
{
var items = _idg.GetItems(number);
return Json(items.ToDataSourceResult(request, ModelState));
}
I´ve been monitoring Firebug and it shows no errors. I´m trying to prevent the second call to the server by making the decision to populate one of the grids. Is there a way force dataSource refresh like this client-side? (without calling the read function on the dataSource which would call the server the second time)
###### EDITED ########
function TestGrid() {
var dataSource = new kendo.data.DataSource({
transport: {
read: {
type: "POST",
dataType: "json",
url: 'Item/GetItems/'
}
},
schema: {
data: function (response) {
// Here the Total is always correct
return response.Total;
}
}
});
dataSource.fetch(function () {
var kendoGrid;
var data = this.data();
//Here the data does not include my Total
alert(data);
if (data.length == 1) {
kendoGrid = $("#SingleGrid").data("kendoGrid");
} else {
kendoGrid = $("#MultipleGrid").data("kendoGrid");
}
kendoGrid.setDataSource(dataSource);
kendoGrid.refresh();
});
}
From my example above I can´t seem to reach the total number from this.data(). When I debug with Firebug I can see that the Total number is always correct. Any ideas?
Upvotes: 1
Views: 21709
Reputation: 636
You can try such a variant:
var grid = $('#SingleGrid').getKendoGrid();
grid.dataSource.data(data);
grid.refresh();
Upvotes: 0
Reputation: 9383
You can also do this things.
$("#grid").kendoGrid({
dataSource: {
transport: {
read: {
url: "http://localhost:13073/home/KendoGriddata",
dataType: "json",
type: "Post",
data: function () {
var dt = { MultipleSearchText: 'rikin' };
return dt;
}
}
},
pageSize: 5
});
Upvotes: 0
Reputation: 707
You could populate a new instance of a kendo datasource, load the data, then acting on the results, set the datasource of the grid. Maybe something like this:
var dataSource = new kendo.data.DataSource({
transport: {
read: {
type: "POST",
dataType: "json",
url: 'Item/GetItems/',
data: { number: number },
}
}
});
Then fetch the data from the server and act on the result:
dataSource.fetch(function() {
var data = this.data();
var kendoGrid;
if (data.length == 1) {
kendoGrid = $("#SingleGrid").data("kendoGrid");
} else {
kendoGrid = $("#MultipleGrid").data("kendoGrid");
}
// Replace the grids data source with our new populated data source
kendoGrid.setDataSource(dataSource);
kendoGrid.refresh();
});
Upvotes: 5