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
英文地址,請注明出處:http://en.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;可能觸發校驗和失敗、協議層重傳等&…