【问题标题】:Retain expanded rows after databinding Kendo UI grid数据绑定 Kendo UI 网格后保留展开的行
【发布时间】:2014-07-30 06:07:17
【问题描述】:

这是我第一次使用 Kendo UI。我有一个带有子节点的 Kendo UI 网格。我想在数据绑定后保留展开的行。现在在子元素中添加一行后它会被折叠

我已经尝试过here的建议

dataBound: function() {
    this.expandRow(this.tbody.find("tr.k-master-row").first());
}

但这只会扩展第一行。

如何保留行?我错过了什么?

Codepen

【问题讨论】:

  • 您想在读取之间保存状态,对吗?然后,您需要先存储对您展开的行的引用,然后再执行任何可能导致该行折叠的操作。然后在网格数据绑定后扩展行时,它就变成了学术 - 你将它的引用存储在一个变量中。
  • @Brett 我尝试在打开的行中添加一个类并尝试将它们保留在dataBoud 中,但是在触发 dataBound 之前我的所有行都被折叠了。
  • 我知道这很令人沮丧,这让您想知道为什么更改主行的详细信息行应该重新绑定整个网格是我无法理解的。但是这个策略是合理的 - 你连接到dataBound 以重新扩展行数据绑定到网格之后。他们解决这个问题的主要障碍是弄清楚如何存储对行的引用......
  • 在底部看我的解决方案。我存储了一些唯一的 id,它是我行中数据项的 ID。然后,我只需在数据绑定上再次查找该行并再次展开该行。

标签: kendo-ui nested kendo-grid


【解决方案1】:

在 CodePen 中大量使用您的代码示例后,我相信我已经想出了一个有效的优雅解决方案。

使用 Kendo UI 已经三年多了,我已经非常熟悉它的一些内部工作原理。因此,我将利用其中之一 - data-uid 属性。 Kendo UI 将这些放在其网格中的所有<tr> 元素上。我选择了这个属性,因为我知道当我们调用grid.expandRow() 时,我们需要设计一个有效的jQuery 选择器来作为参数传入。这消除了我们添加自己的属性或类以及处理它们的代码的需要。

首先,我们需要定义一个变量来保存我们的行引用。我们称之为expandedRowUid。为了设置它的值,我们挂钩到网格的detailExpand 事件。因此,当用户展开一行时,我们存储其data-uid 编号。

var expandedRowUid;

var grid = $('#grid').kendoGird({
  // ...
  detailExpand: function(e) {
    expandedRowUid = e.masterRow.data('uid');
  }
});

然后,每当发生导致主网格重新绑定到其数据的更改时,我们都会连接到网格的 dataBound 事件并重新展开具有等于 1 的 data-uid 的行存储在expandedRowUid

var grid = $('#grid').kendoGird({
  // ...
  detailExpand: function(e) {
    expandedRowUid = e.masterRow.data('uid');
  },
  dataBound: function() {
    this.expandRow($('tr[data-uid=' + expandedRowUid + ']'));
  }
});

Here 是 CodePen 的工作示例。

注意:这只会重新展开在触发数据绑定之前展开的最后一行。因此,如果您按该顺序展开第 4、5 和 2 行,然后触发数据绑定,则只会重新展开第 2 行。不过,您显然可以扩展此功能来处理此类用例。

【讨论】:

  • 非常感谢。我没有想到这一点。我曾尝试为扩展行添加一个类并为折叠行删除一个类,但它没有用。太棒了。再次感谢
【解决方案2】:
GridDetailExpand: function (e) {
   var gridId = e.sender.element[0].id;
   var grid = $("#" + gridId).data("kendoGrid");
   var data = grid.dataItem(e.masterRow);
   addToArray(expandedRows, data.UniqueIdOfYourDataInGrid);
  },
  GridDetailCollapse: function (e) {
   var gridId = e.sender.element[0].id;
   var grid = $("#" + gridId).data("kendoGrid");
   var data = grid.dataItem(e.masterRow);
   removeFromArray(expandedRows, data.UniqueIdOfYourDataInGrid);
  }

然后是数据绑定

var gridId = e.sender.element[0].id;
var grid = $("#" + gridId).data("kendoGrid");
$.each(grid.tbody.find('tr.k-master-row'), function () {
 var data = grid.dataItem(this);
 if (isInArray(expandedRows, data.UniqueIdOfYourDataInGrid)) {
   grid.expandRow(this);
 }
});

所需功能:

var expandedRows = [];

function addToArray(arr, value) {
    for (var i = 0; i < arr.length; i++) {
        if (arr[i] === value) return;
    }

    arr.push(value);
}

function removeFromArray(arr, value) {
    for (var i = 0; i < arr.length; i++) {
        if (arr[i] === value) {
            delete arr[i];
            return;
        }
    }
}

function isInArray(arr, value) {
    for (var i = 0; i < arr.length; i++) {
        if (arr[i] === value) return true;
    }

    return false;
}

希望这会有所帮助……我花了一段时间才弄清楚……

【讨论】:

    【解决方案3】:

    在子网格中添加的记录被刷新后保留父网格中最后一个扩展行的解决方案。

     detailInit: function (e) {
       
        //Get Parent Grid Last expanded Row index
        lastRowIndex = $(e.masterRow).index(".k-master-row");
       
     },
     dataBound: function () {
       
        //Check any parent grid row is expanded based on row index
        if (lastRowIndex != null && lastRowIndex != undefined){
          
          //find the Grid row details based on row index
          var row = $(this.tbody).find("tr.k-master-row:eq(" + lastRowIndex + ")");
          
          //If expand Row exists then it will expanded
          this.expandRow(row);
        }
        else {
          
          //None of the Parent Grid row is expanded then,default First row is expanded
          this.expandRow(this.tbody.find("tr.k-master-row").first());
          
        }
    }

    【讨论】:

    • 我正在考虑使用类似的东西,但如果您的网格上有任何排序,则行索引将在数据刷新后发生变化。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多