Kendo Grid C# - Select 当前页面没有再次刷新数据源
Kendo Grid C# - Select current page without refresh datasource again
我一直在努力解决这个问题,我想做的是:
我有一个从服务器获取数据的数据源,当我转到服务器时,我得到项目列表,然后我必须搜索我必须 select 的项目(这个项目可以在任何页),在我有了项目和项目所在的页面之后(假设每个页面有 30 个项目),然后我调用 LINQ 表达式来跳过所需的数据量并取 30。最后我 return 这个列表到客户端。
当数据到达客户端时,我需要 "auto-select" selected 项目并更改页面以将用户定位到 selected 项目所在的正确页面。我有新页面,跳过,selected 值和客户端的所有内容。
在不调用新刷新并再次访问服务器的情况下将页面更改为 kendo 网格数据源,你有什么建议?
数据源是这样的:
return new kendo.data.DataSource({
serverPaging: true,
transport: {
read: {
url: URLController.Current().getURL('MyURL'),
contentType: 'application/json',
accepts: 'application/json',
type: 'POST'
},
parameterMap: function(data, type) {
if (data) {
return JSON.stringify(
{
data: jsonData,
pageSize: data.pageSize,
skip: data.skip,
take: data.take
});
}
}
},
schema: {
data: function (data) {
var dropDownData = JSON.parse(data);
gridElement.attr('data-model', JSON.stringify({ data: data }));
return dropDownData.Data;
},
total: function (data) {
var dropDownData = JSON.parse(data);
return dropDownData.total;
},
model: {
id: 'ID'
}
},
pageable: true,
pageSize: 30,
error: function(e) {
alert('Error ' + e);
}
});
当网格数据有界时,我必须将页面更改为当前页码,然后 select 当前项目。
grid.one('dataBound', function (e) {
var currentGridElement = this.element;
var currentModel = currentGridElement.attr('data-model');
var currentJsonData = parseDropDownDataJSONString(currentModel).data;
var gridDataSource = this.dataSource;
var selection = gridDataSource.get(currentJsonData.selectedValue);
if (selection != undefined) {
var row = currentGridElement.find('tbody>tr[data-uid=' + selection.uid + ']');
if (row != undefined) {
currentGridElement.attr('data-closeByChange', false);
gridDataSource.page(currentJsonData.pageNumber);
this.select(row);
dexonDropDownGrid.combobox().text(selection.DISPLAY);
}
}
var aaaa = 0;
});
这就是我的数据绑定事件侦听器的样子,当我尝试设置页面时它再次调用服务器并且加载正确数据时我有更多延迟。
有什么办法可以解决吗?
谢谢
遇到同样的问题
我是如何解决这个问题的(不是有史以来最好的解决方案,但它有效):
var forcedPageChange = false;
var cachedResult;
var dataSource = new kendo.data.DataSource({
transport: {
read: function (options) {
if (forcedPageChange) { // prevent data request after manual page change
forcedPageChange = false;
options.success(cachedResult);
cachedResult = null;
return;
}
gridDataProvider.getData() // promise of data
.then(function (result) {
// check if current page number was changed
if ($scope.gridConfig.dataSource.page() !== result.pageNumber ||
$scope.gridConfig.dataSource.pageSize() !== result.rowsPerPage) {
cachedResult = _.clone(result);
forcedPageChange = true;
options.page = result.pageNumber;
options.pageSize = result.rowsPerPage;
$scope.gridConfig.dataSource.query(options);
}
options.success(result);
}, function () {
options.error();
});
}
},
schema: {
data: function (response) {
return response.items;
},
total: function (response) {
return response.totalCount;
}
},
//...
serverPaging: true,
serverSorting: true,
serverFiltering: true
});
我发现 dataSource.page(newPageNumber)
在这种情况下不起作用。它只是将页码降为 1。
此解决方案有效,但我仍然遇到 dataSource.query(options)
...
后缺少排序图标的错误
我一直在努力解决这个问题,我想做的是:
我有一个从服务器获取数据的数据源,当我转到服务器时,我得到项目列表,然后我必须搜索我必须 select 的项目(这个项目可以在任何页),在我有了项目和项目所在的页面之后(假设每个页面有 30 个项目),然后我调用 LINQ 表达式来跳过所需的数据量并取 30。最后我 return 这个列表到客户端。
当数据到达客户端时,我需要 "auto-select" selected 项目并更改页面以将用户定位到 selected 项目所在的正确页面。我有新页面,跳过,selected 值和客户端的所有内容。
在不调用新刷新并再次访问服务器的情况下将页面更改为 kendo 网格数据源,你有什么建议?
数据源是这样的:
return new kendo.data.DataSource({
serverPaging: true,
transport: {
read: {
url: URLController.Current().getURL('MyURL'),
contentType: 'application/json',
accepts: 'application/json',
type: 'POST'
},
parameterMap: function(data, type) {
if (data) {
return JSON.stringify(
{
data: jsonData,
pageSize: data.pageSize,
skip: data.skip,
take: data.take
});
}
}
},
schema: {
data: function (data) {
var dropDownData = JSON.parse(data);
gridElement.attr('data-model', JSON.stringify({ data: data }));
return dropDownData.Data;
},
total: function (data) {
var dropDownData = JSON.parse(data);
return dropDownData.total;
},
model: {
id: 'ID'
}
},
pageable: true,
pageSize: 30,
error: function(e) {
alert('Error ' + e);
}
});
当网格数据有界时,我必须将页面更改为当前页码,然后 select 当前项目。
grid.one('dataBound', function (e) {
var currentGridElement = this.element;
var currentModel = currentGridElement.attr('data-model');
var currentJsonData = parseDropDownDataJSONString(currentModel).data;
var gridDataSource = this.dataSource;
var selection = gridDataSource.get(currentJsonData.selectedValue);
if (selection != undefined) {
var row = currentGridElement.find('tbody>tr[data-uid=' + selection.uid + ']');
if (row != undefined) {
currentGridElement.attr('data-closeByChange', false);
gridDataSource.page(currentJsonData.pageNumber);
this.select(row);
dexonDropDownGrid.combobox().text(selection.DISPLAY);
}
}
var aaaa = 0;
});
这就是我的数据绑定事件侦听器的样子,当我尝试设置页面时它再次调用服务器并且加载正确数据时我有更多延迟。
有什么办法可以解决吗?
谢谢
遇到同样的问题
我是如何解决这个问题的(不是有史以来最好的解决方案,但它有效):
var forcedPageChange = false;
var cachedResult;
var dataSource = new kendo.data.DataSource({
transport: {
read: function (options) {
if (forcedPageChange) { // prevent data request after manual page change
forcedPageChange = false;
options.success(cachedResult);
cachedResult = null;
return;
}
gridDataProvider.getData() // promise of data
.then(function (result) {
// check if current page number was changed
if ($scope.gridConfig.dataSource.page() !== result.pageNumber ||
$scope.gridConfig.dataSource.pageSize() !== result.rowsPerPage) {
cachedResult = _.clone(result);
forcedPageChange = true;
options.page = result.pageNumber;
options.pageSize = result.rowsPerPage;
$scope.gridConfig.dataSource.query(options);
}
options.success(result);
}, function () {
options.error();
});
}
},
schema: {
data: function (response) {
return response.items;
},
total: function (response) {
return response.totalCount;
}
},
//...
serverPaging: true,
serverSorting: true,
serverFiltering: true
});
我发现 dataSource.page(newPageNumber)
在这种情况下不起作用。它只是将页码降为 1。
此解决方案有效,但我仍然遇到 dataSource.query(options)
...