Column Virtualization Plugin
The Column Virtualization plugin improves performance for grids with many columns.
Installation
Section titled “Installation”import '@toolbox-web/grid/features/column-virtualization';Basic Usage
Section titled “Basic Usage”import { queryGrid } from '@toolbox-web/grid';import '@toolbox-web/grid/features/column-virtualization';
const grid = queryGrid('tbw-grid');grid.gridConfig = { columns: generateManyColumns(100), // Your column generator fitMode: 'fixed', // Required for column virtualization features: { columnVirtualization: true },};grid.rows = data;import '@toolbox-web/grid-react/features/column-virtualization';import { DataGrid } from '@toolbox-web/grid-react';import type { GridConfig } from '@toolbox-web/grid-react';
const gridConfig: GridConfig = { columns: generateManyColumns(100), fitMode: 'fixed', features: { columnVirtualization: true },};
function WideGrid({ data }) { return <DataGrid rows={data} gridConfig={gridConfig} style={{ height: '400px' }} />;}<script setup>import '@toolbox-web/grid-vue/features/column-virtualization';import { TbwGrid } from '@toolbox-web/grid-vue';import type { GridConfig } from '@toolbox-web/grid-vue';
const data = [{ col0: 'Row 1', col1: 'Value 1' }, { col0: 'Row 2', col1: 'Value 2' }];
const gridConfig: GridConfig = { columns: Array.from({ length: 100 }, (_, i) => ({ field: `col${i}`, header: `Column ${i + 1}`, width: 120, })), fitMode: 'fixed', features: { columnVirtualization: true },};</script>
<template> <TbwGrid :rows="data" :grid-config="gridConfig" style="height: 400px" /></template>Define everything inside gridConfig.features, exactly like the other frameworks. The side-effect import registers the feature so the adapter can bridge it.
import '@toolbox-web/grid-angular/features/column-virtualization';import { Component } from '@angular/core';import { Grid } from '@toolbox-web/grid-angular';import type { ColumnConfig, GridConfig } from '@toolbox-web/grid-angular';
@Component({ selector: 'app-wide-grid', imports: [Grid], template: ` <tbw-grid [rows]="rows" [gridConfig]="gridConfig" style="height: 400px; display: block;"> </tbw-grid> `,})export class WideGridComponent { rows = [...];
gridConfig: GridConfig = { columns: this.generateManyColumns(100), fitMode: 'fixed', features: { columnVirtualization: true }, };
generateManyColumns(count: number): ColumnConfig[] { return Array.from({ length: count }, (_, i) => ({ field: `col${i}`, header: `Column ${i + 1}`, width: 120, })); }}Default Column Virtualization
Section titled “Default Column Virtualization”DATA
Column countNumber of columns to generate
VIRTUALIZATION
ThresholdMin columns to enable virtualization
OverscanExtra columns rendered offscreen
Auto-enableAutomatically enable when column count exceeds threshold
<tbw-grid style="height: 400px;"></tbw-grid>import '@toolbox-web/grid';import { queryGrid } from '@toolbox-web/grid';import '@toolbox-web/grid/features/column-virtualization';
const grid = queryGrid('tbw-grid');
function generateColumns(count: number) { const columns = [{ field: 'id', header: 'ID', type: 'number', width: 60 }]; for (let i = 1; i < count; i++) { columns.push({ field: `col${i}`, header: `Column ${i}`, type: 'number', width: 100 }); } return columns;}
function generateRows(rowCount: number, colCount: number) { const rows = []; for (let r = 0; r < rowCount; r++) { const row: Record<string, number> = { id: r + 1 }; for (let c = 1; c < colCount; c++) { row[`col${c}`] = Math.floor(Math.random() * 1000); } rows.push(row); } return rows;}
function rebuild(columnCount = 50, threshold = 30, overscan = 3, autoEnable = true) { const columns = generateColumns(columnCount); const rows = generateRows(100, columnCount); grid.gridConfig = { columns, fitMode: 'fixed', features: { columnVirtualization: { autoEnable, threshold, overscan } }, }; grid.rows = rows;}
rebuild();Use the Column Count slider to add up to 1000 columns, and toggle Auto Enable to compare performance with and without virtualization.
Configuration Options
Section titled “Configuration Options”See ColumnVirtualizationConfig for the full list
of options and defaults. By default the plugin activates itself once a grid exceeds 30 columns;
set autoEnable: false to control activation yourself.
Requirements
Section titled “Requirements”fitMode: 'fixed'— the plugin is designed for fixed-width column layouts- Columns should have explicit widths (columns without widths default to 100px)
Programmatic API
Section titled “Programmatic API”const plugin = grid.getPluginByName('columnVirtualization');
// Check if virtualization is currently activeconst active = plugin.getIsVirtualized();
// Get the visible column index rangeconst { start, end } = plugin.getVisibleColumnRange();
// Scroll a specific column into viewplugin.scrollToColumn(42);See Also
Section titled “See Also”- Performance — Performance optimization tips
- Pinned Columns — Sticky columns (excluded from virtualization)