devextreme-vue的DxDataGrid如何显示行号列

devextreme-vue我使用的是23.2版本,其DxDataGrid如何显示行号列,官方一直没有方案。

DataGrid - How to display a row number in data rows in Angular | DevExpress Support

dxDataGrid - provide capability to display a column with row numbers | DevExpress Support

因为涉及到分页、分组、统计,等等,其row.rowType有:“data”、"detail"、"detailAdaptive"、groupFooter"、"header"、"filter"、"totalFooter"、“group”这很多种,我们想要的是计算“data”类型的行的行号。rowInfo的rowIndex,dataIndex,loadIndex都不能真实的反映“资料行号”,用pageIndex*pageSize+rowIndex+1计算都是错误的。

看起来自己在dataSource中为每个row计算一个rowNumber值可能比较靠谱。要考虑几个问题:

(1)计算的时机:

  1. 点击column排序,
  2. 拖动column分组,
  3. filter栏打入文字,
  4. 搜索框打入文字,
  5. 增加、删除一行资料
  6. dataSouce改变
  7. ...

前面5个,可以监听option-changed事件:

<template>
<DxDataGrid ref="gridBackend" @option-changed="onOptionChanged" />
</template><script setup>
import { ref, nextTick, onMounted, onUnmounted, watch } from 'vue';
import {DxDataGrid, DxColumn, DxPager, DxPaging, DxGroupPanel,DxSearchPanel, DxSearch, DxLoadPanel, DxEditing,DxColumnChooser, DxSelection, DxColumnFixing,DxFilterRow, DxFilterPanel, DxHeaderFilter, DxSorting,DxScrolling, DxSummary, DxTotalItem
} from 'devextreme-vue/data-grid';
import { DxTabPanel, DxItem as DxTabPanelItem } from 'devextreme-vue/tab-panel';
import ArrayStore from 'devextreme/data/array_store';
import DataSource from 'devextreme/data/data_source'
let gridBackend = ref();const onOptionChanged = function (e) {//console.log(e);if (e.fullName.includes('filter') ||e.fullName.includes('sort') ||e.fullName.includes('group') ||e.fullName.includes('search') ||e.fullName == 'editing.changes') {nextTick(function () {recomputeRowNumber(gridBackend.value, dataSourceBackendMonitors.value);});}
}
</script>

第6个是你改变数据集的时候。

(2)如何对数据集排序过滤;

DxDataGrid在排序过滤时,不会改变原始数据集,我想找到它处理后的数据集,然后计算一个rowNumber,但是翻了源码,它没有保存这个完整的排序过滤后的数据集。但找到一些方法来计算,不用自己写计算逻辑。

function recomputeRowNumber(dxGrid, dataSet) {let dc = dxGrid.instance.getController('data');let ds = dxGrid.instance.getDataSource();/*** 不能通过ds.loadOptions();获取参数,获取到的ops是store中的,赋值filter后,它会存起来,* 过滤行的filtervalue清掉后,dc.getCombinedFilter还是会从store返回之前的。*///let ops = ds.loadOptions();//ops.filter = dc.getCombinedFilter();// console.log('参数:',ds.filter(),dc.getCombinedFilter());let ops = {requireTotalCount: false,filter: dc.getCombinedFilter(),group: ds.group(),sort: ds.sort()}//console.log('参数:',ops);//ds.store().load(ops)new ArrayStore(dataSet).load(ops).done(function (items) {//console.log('买', ops, items);let rowNumber = 0;let groupLevels = -1;if (ops.group) groupLevels = ops.group.length;function modifyRecords(items, groupLevel) {items.forEach(function (item) {if (groupLevel < groupLevels) {modifyRecords(item.items, groupLevel + 1);}else {rowNumber++;item.rowNumber = rowNumber;}});}modifyRecords(items, 0);});
}

(3)如何显示

想显示在最左边,不要受分组列影响,需要把分组列放在第2列,设定一个type="groupExpand"的列:

<DxColumn data-field="OID" width="50" :visible="false" :fixed="true" :allow-filtering="false":allow-sorting="false" :allow-grouping="false" :allowEditing="false" :allowAdding="false" /><DxColumn caption="#" data-field="rowNumber" width="50" alignment="center" :fixed="true":allow-filtering="false" :allow-sorting="false" :allow-grouping="false" :allowEditing="false":allowAdding="false" /><DxColumn type="groupExpand" />

 (4)优化

  1. 因为是在nextTick之中,即渲染后再修改,因此rowNumber列会有个闪烁,不知如何避免。
  2. optionChanges事件,在打入过滤值时可能会触发3次,如何防抖?用一个timer:
    let recomputeRowNumberTimer;
    const onOptionChanged = function (e) {...nextTick(function () {if (recomputeRowNumberTimer) clearTimeout(recomputeRowNumberTimer);recomputeRowNumberTimer=setTimeout(function(){recomputeRowNumber(gridBackend.value, dataSourceBackendMonitors.value);},0);});

效果为:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/89534.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/89534.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【设计模式06】建造者模式

前言 没什么用&#xff0c;类似于builder.build UML类图 代码示例 package com.sw.learn.pattern.B_create.e_builder;import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner sc new Scanner(System.in);int n sc.nextInt();for …

datax-web报错:连接数据库失败. 请检查您的 账号、密码、数据库名称、IP、Port或者向 DBA 寻求帮助(注意网络环境)

文章目录 一、报错内容二、解决方法 一、报错内容 背景描述&#xff1a; 在linux安装了datax202309版本及datax-web2.1.2版本&#xff0c;datax与datax-web默认都是mysql5.x版本的。我的数据库是mysql8.x版本的。 在datax中执行json脚本从一个mysql导入mysql没问题&#xff0…

C#调用C++导出的dll怎么调试进入C++ DLL源码

第一步&#xff1a;首先需要打开C源码&#xff0c;不需要任何设置&#xff0c;直接下断点&#xff0c;然后将生成DLL目录改成到C# exe生成目录里面 第二步&#xff1a;打开winform项目&#xff0c;然后在C#项目属性->启用本地代码调试勾选后即可 最后在C#下断点F10或者F11…

Skyeye 云智能制造办公系统 - Saas v3.16.10 发布

Skyeye 云智能制造&#xff0c;采用 Springboot (微服务) Layui UNI-APP Ant Design Vue 的低代码平台。包含 30 多个应用模块、50 多种电子流程&#xff0c;CRM、PM、ERP、MES、ADM、EHR、笔记、知识库、项目、门店、商城、财务、多班次考勤、薪资、招聘、云售后、论坛、公…

pdf 合并 python实现(已解决)

在Python中&#xff0c;可以使用多种库来合并PDF文件&#xff0c;其中最常用的是PyPDF2和PyMuPDF&#xff08;又名fitz&#xff09;。下面我将分别介绍如何使用这两个库来合并PDF文件。 使用PyPDF2 首先&#xff0c;你需要安装PyPDF2。可以使用pip来安装&#xff1a; 先按照库…

VCenter SSL过期,登录提示HTTP 500错误解决办法

报错图&#xff1a; 1. 开启 VCenter ssh远程连接 登录vmware esxi&#xff0c;双击打开VCenter 控制台黑窗口&#xff0c;根据提示按F2键 两次&#xff0c;打开系统设置&#xff08;有fn键使用fnF2键&#xff09; 输入root密码&#xff0c;按回车登录 选择“Troubleshooting …

Linux 下安装Oracle 11gR2 x64 netca启动不了

前言 Oracle Network Configuration Assistant (netca) 是 Oracle 提供的图形化网络配置工具&#xff0c;用于简化 Oracle 数据库网络组件的配置和管理。 核心功能 1、配置监听器 (LISTENER)创建、修改或删除数据库监听器&#xff08;默认端口 1521&#xff09;定义监听协议…

Pytorch1线性代数实现

Pytorch --线性代数实现 矩阵 正如向量将标量从零阶推广到一阶&#xff0c;矩阵将向量从一阶推广到二阶。 矩阵&#xff0c;我们通常用粗体、大写字母来表示 &#xff08;例如&#xff0c;&#x1d44b;、&#x1d44c;和&#x1d44d;&#xff09;&#xff0c; 在代码中表示…

行业分享丨泛亚汽车数字化转型实践:虚拟仿真技术如何赋能汽车研发的创新实践?

随着汽车行业向智能化、电动化快速转型&#xff0c;虚拟仿真技术正成为推动产品研发变革的核心驱动力。作为行业技术先锋&#xff0c;泛亚汽车通过系统性布局&#xff0c;构建了完整的虚拟仿真技术体系&#xff0c;并总结出三个关键方向&#xff1a;打造数字化研发体系、探索精…

【硬核数学】4. AI的“寻路”艺术:优化理论如何找到模型的最优解《从零构建机器学习、深度学习到LLM的数学认知》

欢迎来到本系列的第四篇文章。我们已经知道&#xff0c;训练一个AI模型&#xff0c;本质上是在寻找一组参数&#xff0c;使得描述模型“有多差”的损失函数 L ( θ ) L(\theta) L(θ) 达到最小值。微积分给了我们强大的工具——梯度下降&#xff0c;告诉我们如何一步步地向着最…

springboot切面编程

SpringBoot切面编程 众所周知&#xff0c;spring最核心的两个功能是aop和ioc&#xff0c;即面向切面和控制反转。本文会讲一讲SpringBoot如何使用AOP实现面向切面的过程原理。 何为AOP AOP&#xff08;Aspect OrientedProgramming&#xff09;&#xff1a;面向切面编程&…

【Redis#4】Redis 数据结构 -- String类型

一、前言 1. 基本概念 理解&#xff1a;字符串对象是 Redis 中最基本的数据类型,也是我们工作中最常用的数据类型。redis中的键都是字符串对象&#xff0c;而且其他几种数据结构都是在字符串对象基础上构建的。字符串对象的值实际可以是字符串、数字、甚至是二进制&#xff0…

Spring Boot 集成 Dufs 通过 WebDAV 实现文件管理

Spring Boot 集成 Dufs 通过 WebDAV 实现文件管理 引言 在现代应用开发中&#xff0c;文件存储和管理是一个常见需求。Dufs 是一个轻量级的文件服务器&#xff0c;支持 WebDAV 协议&#xff0c;可以方便地集成到 Spring Boot 应用中。本文将详细介绍如何使用 WebDAV 协议在 Sp…

Unity打包时编码错误解决方案:NotSupportedException Encoding 437

问题描述 在Unity项目开发过程中&#xff0c;经常会遇到这样的情况&#xff1a;项目在编辑器模式下运行完全正常&#xff0c;但是打包后运行时却出现以下错误&#xff1a; NotSupportedException: Encoding 437 data could not be found. Make sure you have correct interna…

Spring Bean的生命周期与作用域详解

一、Spring Bean的生命周期 Spring Bean的生命周期指的是Bean从创建到销毁的整个过程。理解这个生命周期对于正确使用Spring框架至关重要&#xff0c;它可以帮助我们在适当的时机执行自定义逻辑。 1. 完整的Bean生命周期阶段 Spring Bean的生命周期可以分为以下几个主要阶段…

如何将Excel表的内容转化为json格式呢?

文章目录 一、前言二、具体操作步骤 一、前言 先说一下我使用Excel表的内容转为json的应用场景&#xff0c;我们是用来处理国际化的时候用到的。 二、具体操作步骤 第一步&#xff1a;选择要转化Excel表的内容&#xff08;必须是key&#xff0c;value形式的&#xff09; 第二…

内存堆栈管理(Linux)

以问题形式讲解 1.每一个进程都有一个堆空间吗&#xff1f;还是多个进程共用一个堆空间&#xff1f; 在操作系统中&#xff0c;​​每个进程都有自己独立的虚拟地址空间&#xff0c;其中包括自己独占的堆空间。堆空间是进程私有的&#xff0c;不与其他进程共享。 进程之间的内…

ThreatLabz 2025 年人工智能安全报告

AI 应用趋势&#xff1a;爆发式增长与风险并存 2024 年&#xff0c;全球企业的 AI/ML 工具使用量呈指数级增长。Zscaler 云平台数据显示&#xff0c;2024 年 2 月至 12 月期间&#xff0c;AI/ML 交易总量达 5365 亿次&#xff0c;同比激增 3464.6%&#xff0c;涉及 800 多个应…

【Oracle学习笔记】7.存储过程(Stored Procedure)

Oracle中的存储过程是一组为了完成特定功能而预先编译并存储在数据库中的SQL语句和PL/SQL代码块。它可以接受参数、执行操作&#xff08;如查询、插入、更新、删除数据等&#xff09;&#xff0c;并返回结果。以下从多个方面详细讲解&#xff1a; 1. 存储过程的创建 创建存储过…

tc工具-corrupt 比 delay/loss 更影响性能

1. netem corrupt 5% 的作用 功能说明 corrupt 5% 表示 随机修改 5% 的数据包内容&#xff08;如翻转比特位&#xff09;&#xff0c;模拟数据损坏。它本身不会直接丢弃或延迟数据包&#xff0c;而是让接收端收到错误的数据&#xff08;可能触发校验和失败、协议层重传等&…