You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

DevExtreme dxDatagrid使用store.push插入行到索引0失效问题

dxDataGrid store.push插入行index设置不生效问题

我用store.push方法向dxDataGrid插入行,代码如下:

store.push([
  {
    type: "insert",
    data: data,
    key: data.id,
    index: 0
  }
]);

设置index:0后,新插入的行却直接跑到了表格底部,换成CustomStore也存在同样问题。目前临时方案是直接修改ArrayStore的数据源数组,再调用dataSource.reload(),但这个方法有局限性,还会带来一些弊端。

根据官方文档对ArrayStore.push方法的说明,insert类型的操作参数中,index字段用于指定插入的位置索引,设置为0应该将新数据插入到数据集的首位。

问题原因

出现这个问题的核心原因通常是dxDataGrid开启了排序功能(默认可能会按某个字段自动排序,比如主键id升序),即便通过push指定了插入位置,网格也会自动触发重新排序,把新行排到符合排序规则的位置(比如id更大的话就会跑到底部)。

解决方案

1. 插入时临时关闭排序

先保存当前网格的排序状态,关闭排序后执行插入,再恢复排序(如果需要):

// 获取网格实例
const grid = $("#yourGridId").dxDataGrid("instance");
// 保存当前排序配置
const originalSort = grid.option("sorting");
// 临时关闭排序
grid.option("sorting", { mode: "none" });
// 执行插入操作
store.push([
  {
    type: "insert",
    data: data,
    key: data.id,
    index: 0
  }
]);
// 恢复原排序配置
setTimeout(() => {
  grid.option("sorting", originalSort);
}, 0);

2. 直接操作数据源数组并通知store更新

如果使用的是ArrayStore,可以直接操作数据源数组,再通过notify方法通知store更新,避免调用reload():

// 获取ArrayStore的数据源数组(注意:_array是内部属性,版本更新可能变化,谨慎使用)
const sourceArray = store._array;
// 插入到数组首位
sourceArray.unshift(data);
// 通知store数据已插入
store.notify({
  type: "insert",
  data: data,
  index: 0
});

3. 关闭不必要的排序

如果业务上不需要排序功能,可以直接关闭dxDataGrid的排序:

$("#yourGridId").dxDataGrid({
  // ...其他配置
  sorting: { mode: "none" },
  // 或者针对单个列关闭排序
  columns: [
    { dataField: "id", allowSorting: false },
    // ...其他列配置
  ]
});

临时方案的弊端

直接修改数组后调用dataSource.reload()会重新加载整个数据集,不仅会影响性能,还会丢失当前网格的状态(比如分页位置、选中的行、展开的分组等),非必要不建议使用。

内容的提问来源于stack exchange,提问作者ilius33

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 11:00:42