我有一个使用detailInit方法在网格中实现网格的场景。在这里,当用户进行编辑时,我进行了一些计算,这些计算将更改父元素和子元素中的数据。然后为了刷新数据,我将调用datasource.read来呈现数据。这是工作和数据显示,但任何细节网格是展开将被折叠,有没有任何方法,我可以防止这种情况发生。
发布于 2014-02-19 17:57:28
要回答这个和另一个问题:
“我想出了如何从子元素中设置主表中的数据,但是,当任何内容更新时,整个表会折叠子表网格,这是一个非常恼人的行为,我可以只更新主表中的一个字段,而不折叠所有的子元素吗?(基本上是更新列,而不是大量更新表)”
在另一个线程中:telerik
这是Kendo Grid极其恼人的行为,也是一个主要的bug。从什么时候开始,一个人希望子网格消失并隐藏刚刚所做的更改!但这并不是唯一的问题;change函数会被调用斐波纳契数次,这会在大量点击后冻结浏览器。话虽如此,以下是我提出的解决方案:
在主网格中
$('#' + grid_id).kendoGrid({
width: 800,
...
detailExpand: function (e) {
var grid = $('#' + grid_id).data("kendoGrid");
var selItem = grid.select();
var eid = $(selItem).closest("tr.k-master-row").attr('data-uid')
if (contains(expandedItemIDs, eid) == false)
expandedItemIDs.push(eid);
},
detailCollapse: function (e) {
var grid = $('#' + grid_id).data("kendoGrid");
var selItem = grid.select();
var eid = $(selItem).closest("tr.k-master-row").attr('data-uid')
for (var i = 0; i < expandedItemIDs.length; i++)
if (expandedItemIDs[i] == eid)
gridDataMap.expandedItemIDs.splice(i, 1);
},
不幸的是,在全球范围内,我们有:
function subgridChange() {
var grid = $('#' + grid_id).data("kendoGrid");
for (var i = 0; i < expandedItemIDs.length; i++)
grid.expandRow("tr[data-uid='" + expandedItemIDs[i] + "']");
}
function contains(a, obj) {
for (var i = 0; i < a.length; i++)
if (a[i] === obj) return true;
return false;
}
expandedItemIDs = [];
现在,每次对子网格进行更改时,都需要调用'subgridChange()‘函数。
问题是,每次调用change时,子网格中的change函数被调用的次数呈指数增长。Kendo网格应该能够调用停止传播函数来防止这种情况,或者至少允许程序员访问事件对象,以便程序员可以阻止传播。在完全恼火之后,我们所要做的就是将'subgridChange()‘函数放在子网格的’数据源‘中,如下所示:
dataSource: function (e) {
var ds = new kendo.data.DataSource({
...
create: false,
schema: {
model: {
...
}
},
change: function (e) {
subgridChange();
}
});
return ds;
}
我还必须将'subgridChange()‘函数放在Add按钮函数中,如下所示
$('<div id="' + gridID + '" data-bind="source: prodRegs" />').appendTo(e.detailCell).kendoGrid({
selectable: true,
...
toolbar: [{ template: "<a class='k-button addBtn' href='javascript://'><span class='k-icon k-add' ></span> Add Product and Region</a>" }]
});
$('.addBtn').click(function (event) {
...
subgridChange();
});
发布于 2012-08-28 02:10:38
当用户选择一行时,记录所选行的索引。然后,在数据刷新之后,使用以下代码展开行
// get a reference to the grid widget
var grid = $("#grid").data("kendoGrid");
// expands first master row
grid.expandRow(grid.tbody.find(">tr.k-master-row:nth-child(1)"));
要展开不同的行,只需将nth-child()
选择器中的数字更改为要展开的行的索引即可。
发布于 2014-02-19 19:08:27
实际上,所需要的只是主网格'dataBound‘函数中的'subgridChange()’函数:
$('#' + grid_id).kendoGrid({
...
dataBound: function (e) {
gridDataMap.subgridChange();
}
});
https://stackoverflow.com/questions/12095392
复制