Please note that this control has been deprecated and replaced with the Grid component, and as such, we recommend migrating to that control. This will not be receiving any new features, bug fixes will be deprioritized. For help or questions on migrating your codebase to the Data Grid, please contact support.
Web Components Grid Column Resizing
The Ignite UI for Web Components Data Grid supports the ability to resize columns, giving you flexibility over how you wish to display your columns with respect to the width of each.
Web Components Grid Column Resizing Example
export class DataGridSharedData {
public static getEmployees(count?: number ): any [] {
if (count === undefined ) {
count = 250 ;
}
const employees: any [] = [];
let maleCount: number = 0 ;
let femaleCount: number = 0 ;
for (let i = 0 ; i < count; i++) {
const age: number = Math .round(this .getRandomNumber(20 , 40 ));
const gender: string = this .getRandomGender();
const firstName: string = this .getRandomNameFirst(gender);
const lastName: string = this .getRandomNameLast();
const street: string = this .getRandomStreet();
const country: string = this .getRandomItem(this .countries);
const city: string = this .getRandomCity(country);
const generation = Math .floor(age / 10 ) * 10 + "s" ;
const email: string = firstName.toLowerCase() + "@" + this .getRandomItem(this .emails);
const website: string = firstName.toLowerCase() + "-" + this .getRandomItem(this .websites);
let photoPath: any ;
if (gender === "male" ) {
maleCount++;
if (maleCount > 26 ) {
maleCount = 1 ;
}
photoPath = this .getPhotoMale(maleCount);
}
else {
femaleCount++;
if (femaleCount > 24 ) {
femaleCount = 1 ;
}
photoPath = this .getPhotoFemale(femaleCount);
}
let person: any = {};
person.Address = street + "," + city;
person.Age = age;
person.Birthday = this .getBirthday(age);
person.City = city;
person.Country = country;
person.CountryFlag = this .getCountryFlag(country);
person.Email = email;
person.FirstName = firstName;
person.Gender = this .getGenderPhoto(gender);
person.Generation = generation;
person.ID = this .pad(i + 1 , 5 );
person.LastName = lastName;
person.Name = firstName + " " + lastName;
person.Phone = this .getRandomPhone();
person.Photo = photoPath;
person.Street = street;
person.Salary = this .getRandomNumber(40 , 200 ) * 1000 ;
person.Sales = this .getRandomNumber(200 , 980 ) * 1000 ;
person.Website = website;
person.Productivity = this .getProductivity();
if (person.Salary < 50000 ) {
person.Income = "Low" ;
} else if (person.Salary < 100000 ) {
person.Income = "Average" ;
} else {
person.Income = "High" ;
}
employees.push(person);
}
return employees;
}
public static getProductivity(weekCount?: number ): any [] {
if (weekCount === undefined ) {
weekCount = 52 ;
}
const productivity: any [] = [];
for (let w = 0 ; w < weekCount; w++) {
const value = this .getRandomNumber(-50 , 50 );
productivity.push({Value : value, Week : w});
}
return productivity;
}
public static getSales(count?: number ): any [] {
if (count === undefined ) {
count = 250 ;
}
const names: string [] = [
"Intel CPU" , "AMD CPU" ,
"Intel Motherboard" , "AMD Motherboard" , "NVIDIA Motherboard" ,
"NVIDIA GPU" , "GIGABYTE GPU" , "Asus GPU" , "AMD GPU" , "MSI GPU" ,
"Corsair Memory" , "Patriot Memory" , "Skill Memory" ,
"Samsung HDD" , "WD HDD" , "Seagate HDD" , "Intel HDD" ,
"Samsung SSD" , "WD SSD" , "Seagate SSD" , "Intel SSD" ,
"Samsung Monitor" , "Asus Monitor" , "LG Monitor" , "HP Monitor" ];
const countries: string [] = ["USA" , "UK" , "France" , "Canada" , "Poland" , "Japan" , "Germany" ];
const status: string [] = ["Packing" , "Shipped" , "Delivered" ];
const sales: any [] = [];
for (let i = 0 ; i < count; i++) {
const price = this .getRandomNumber(100 , 900 );
const items = this .getRandomNumber(10 , 80 );
const value = price * items;
const margin = this .getRandomNumber(3 , 10 );
const profit = Math .round((price * margin / 100 ) * items);
const country = this .getRandomItem(countries);
sales.push({
BundlePrice : price,
ProductPrice : price,
Margin : margin,
OrderDate : this .getRandomDate(new Date (2012 , 0 , 1 ), new Date ()),
OrderItems : items,
OrderValue : value,
ProductID : 1001 + i,
ProductName : this .getRandomItem(names),
Profit : profit,
Countries : country,
CountryFlag : this .getCountryFlag(country),
Status : this .getRandomItem(status)
});
}
return sales;
}
public static getHouses(count?: number ): any [] {
if (count === undefined ) {
count = 250 ;
}
const houses: any [] = [];
const property: string [] = [ "Townhouse" , "Single" , "Condo" , "Villa" ];
const emails: string [] = [ "estates.com" , "remax.com" , "zillow.com" , "realtor.com" , "coldwell.com" ];
const countries: string [] = ["USA" , "UK" , "France" , "Canada" , "Poland" , "Japan" , "Germany" ];
for (let i = 0 ; i < count; i++) {
const year: number = this .getRandomNumber(1950 , 2015 );
const age: number = 2020 - year;
const gender: string = this .getRandomGender();
const firstName: string = this .getRandomNameFirst(gender);
const lastName: string = this .getRandomNameLast();
const initials = firstName.substr(0 , 1 ).toLowerCase();
const email: string = initials + lastName.toLowerCase() + "@" + this .getRandomItem(emails);
const street: string = this .getRandomStreet();
const country: string = this .getRandomItem(countries);
const city: string = this .getRandomCity(country);
houses.push({
Address : street + "," + city,
Age : age,
Agent : firstName + " " + lastName,
Area : this .getRandomNumber(50 , 300 ),
Baths : this .getRandomNumber(1 , 3 ),
Built : year,
City : city,
Country : country,
CountryFlag : this .getCountryFlag(country),
Email : email,
ID : this .pad(i + 1 , 5 ),
Phone : this .getRandomPhone(),
Price : this .getRandomNumber(210 , 900 ) * 1000 ,
Property : this .getRandomItem(property),
Rooms : this .getRandomNumber(2 , 5 ),
SaleDate : this .getRandomDate(new Date (2015 , 0 , 1 ), new Date ()),
Street : street,
});
}
return houses;
}
private static websites: string [] = [ ".com" , ".gov" , ".edu" , ".org" ];
private static emails: string [] = [ "gmail.com" , "yahoo.com" , "twitter.com" ];
private static genders: string [] = ["male" , "female" ];
private static maleNames: string [] = ["Kyle" , "Oscar" , "Ralph" , "Mike" , "Bill" , "Frank" , "Howard" , "Jack" , "Larry" , "Pete" , "Steve" , "Vince" , "Mark" , "Alex" , "Max" , "Brian" , "Chris" , "Andrew" , "Martin" , "Mike" , "Steve" , "Glenn" , "Bruce" ];
private static femaleNames: string [] = ["Gina" , "Irene" , "Katie" , "Brenda" , "Casey" , "Fiona" , "Holly" , "Kate" , "Liz" , "Pamela" , "Nelly" , "Marisa" , "Monica" , "Anna" , "Jessica" , "Sofia" , "Isabella" , "Margo" , "Jane" , "Audrey" , "Sally" , "Melanie" , "Greta" , "Aurora" , "Sally" ];
private static lastNames: string [] = ["Adams" , "Crowley" , "Ellis" , "Martinez" , "Irvine" , "Maxwell" , "Clark" , "Owens" , "Rooney" , "Lincoln" , "Thomas" , "Spacey" , "MOrgan" , "King" , "Newton" , "Fitzgerald" , "Holmes" , "Jefferson" , "Landry" , "Berry" , "Perez" , "Spencer" , "Starr" , "Carter" , "Edwards" , "Stark" , "Johnson" , "Fitz" , "Chief" , "Blanc" , "Perry" , "Stone" , "Williams" , "Lane" , "Jobs" , "Adams" , "Power" , "Tesla" ];
private static countries: string [] = ["USA" , "UK" , "France" , "Canada" , "Poland" ];
private static citiesUS: string [] = ["New York" , "Los Angeles" , "Miami" , "San Francisco" , "San Diego" , "Las Vegas" ];
private static citiesUK: string [] = ["London" , "Liverpool" , "Manchester" ];
private static citiesFR: string [] = ["Paris" , "Marseille" , "Lyon" ];
private static citiesCA: string [] = ["Toronto" , "Vancouver" , "Montreal" ];
private static citiesPL: string [] = ["Krakow" , "Warsaw" , "Wroclaw" , "Gdansk" ];
private static citiesJP: string [] = ["Tokyo" , "Osaka" , "Kyoto" , "Yokohama" ];
private static citiesGR: string [] = ["Berlin" , "Bonn" , "Cologne" , "Munich" , "Hamburg" ];
private static roadSuffixes: string [] = ["Road" , "Street" , "Way" ];
private static roadNames: string [] = ["Main" , "Garden" , "Broad" , "Oak" , "Cedar" , "Park" , "Pine" , "Elm" , "Market" , "Hill" ];
private static getRandomNumber(min: number , max : number ): number {
return Math .round(min + Math .random() * (max - min));
}
private static getRandomItem(array: any []): any {
const index = Math .round(this .getRandomNumber(0 , array.length - 1 ));
return array[index];
}
private static getRandomDate (start: Date , end: Date ) {
return new Date (start.getTime() + Math .random() * (end.getTime() - start.getTime()));
}
private static getRandomPhone(): string {
const phoneCode = this .getRandomNumber(100 , 900 );
const phoneNum1 = this .getRandomNumber(100 , 900 );
const phoneNum2 = this .getRandomNumber(1000 , 9000 );
const phone = phoneCode + "-" + phoneNum1 + "-" + phoneNum2;
return phone;
}
private static getRandomGender(): string {
return this .getRandomItem(this .genders);
}
private static getRandomNameLast(): string {
return this .getRandomItem(this .lastNames);
}
private static getRandomNameFirst(gender: string ): string {
if (gender === "male" ) {
return this .getRandomItem(this .maleNames);
}
else {
return this .getRandomItem(this .femaleNames);
}
}
private static getRandomCity(country: string ): string {
if (country === "Canada" ) {
return this .getRandomItem(this .citiesCA);
} else if (country === "France" ) {
return this .getRandomItem(this .citiesFR);
} else if (country === "Poland" ) {
return this .getRandomItem(this .citiesPL);
} else if (country === "USA" ) {
return this .getRandomItem(this .citiesUS);
} else if (country === "Japan" ) {
return this .getRandomItem(this .citiesJP);
} else if (country === "Germany" ) {
return this .getRandomItem(this .citiesGR);
} else {
return this .getRandomItem(this .citiesUK);
}
}
private static getRandomStreet(): string {
const num = Math .round(this .getRandomNumber(100 , 300 )).toString();
const road = this .getRandomItem(this .roadNames);
const suffix = this .getRandomItem(this .roadSuffixes);
return num + " " + road + " " + suffix;
}
private static getBirthday(age: number ): Date {
const today: Date = new Date ();
const year: number = today.getFullYear() - age;
const month: number = this .getRandomNumber(0 , 8 );
const day: number = this .getRandomNumber(10 , 27 );
return new Date (year, month, day);
}
private static getPhotoMale(id: number ): string {
return 'https://static.infragistics.com/xplatform/images/people//GUY' + this .pad(id, 2 ) + '.png' ;
}
private static getPhotoFemale(id: number ): string {
return 'https://static.infragistics.com/xplatform/images/people/GIRL' + this .pad(id, 2 ) + '.png' ;
}
private static getGenderPhoto(gender: string ): string {
return 'https://static.infragistics.com/xplatform/images/genders/' + gender + '.png' ;
}
private static getCountryFlag(country: string ): string {
return 'https://static.infragistics.com/xplatform/images/flags/' + country + '.png' ;
}
private static pad (num: number , size: number ) {
let s = num + "" ;
while (s.length < size) {
s = "0" + s;
}
return s;
}
}
ts コピー import { IgcDataGridModule } from 'igniteui-webcomponents-grids' ;
import { IgcGridColumnOptionsModule } from 'igniteui-webcomponents-grids' ;
import { IgcDataGridComponent } from 'igniteui-webcomponents-grids' ;
import { ModuleManager } from 'igniteui-webcomponents-core' ;
import { DataGridSharedData } from './DataGridSharedData' ;
import { ColumnResizingMode } from 'igniteui-webcomponents-grids' ;
import { ColumnResizingAnimationMode } from 'igniteui-webcomponents-grids' ;
ModuleManager.register(
IgcDataGridModule,
IgcGridColumnOptionsModule
);
export class DataGridColumnResizing {
private grid: IgcDataGridComponent;
constructor ( ) {
this .onColumnResizingAnimationModeValueChanged = this .onColumnResizingAnimationModeValueChanged.bind(this );
this .onColumnResizingModeValueChanged = this .onColumnResizingModeValueChanged.bind(this );
this .onSeparatorWidthRangeValueChanged = this .onSeparatorWidthRangeValueChanged.bind(this );
this .grid = document .getElementById('grid' ) as IgcDataGridComponent;
this .grid.dataSource = DataGridSharedData.getEmployees();
document .getElementById('columnResizingAnimationModeDropDown' )!.addEventListener('change' , this .onColumnResizingAnimationModeValueChanged);
document .getElementById('separatorWidthRange' )!.addEventListener('change' , this .onSeparatorWidthRangeValueChanged);
document .getElementById('columnResizingModeDropDown' )!.addEventListener('change' , this .onColumnResizingModeValueChanged);
}
onColumnResizingAnimationModeValueChanged (e: any ) {
let value = e.target.value;
switch (value) {
case 'Auto' : {
this .grid.columnResizingAnimationMode = ColumnResizingAnimationMode.Auto;
break ;
}
case 'Interpolate' : {
this .grid.columnResizingAnimationMode = ColumnResizingAnimationMode.Interpolate;
break ;
}
case 'None' : {
this .grid.columnResizingAnimationMode = ColumnResizingAnimationMode.None;
break ;
}
}
}
onSeparatorWidthRangeValueChanged (e: any ) {
this .grid.columnResizingSeparatorWidth = e.target.value;
}
onColumnResizingModeValueChanged (e: any ) {
let value = e.target.value;
switch (value) {
case 'Deferred' : {
this .grid.columnResizingMode = ColumnResizingMode.Deferred;
break ;
}
case 'Immediate' : {
this .grid.columnResizingMode = ColumnResizingMode.Immediate;
break ;
}
case 'None' : {
this .grid.columnResizingMode = ColumnResizingMode.None;
break ;
}
}
}
}
new DataGridColumnResizing();
ts コピー <!DOCTYPE html >
<html >
<head >
<title > DataGridColumnResizing</title >
<meta charset ="UTF-8" />
<link rel ="shortcut icon" href ="https://static.infragistics.com/xplatform/images/browsers/wc.png" >
<link rel ="stylesheet" href ="https://fonts.googleapis.com/icon?family=Material+Icons" />
<link rel ="stylesheet" href ="https://fonts.googleapis.com/css?family=Kanit&display=swap" />
<link rel ="stylesheet" href ="https://fonts.googleapis.com/css?family=Titillium Web" />
<link rel ="stylesheet" href ="https://static.infragistics.com/xplatform/css/samples/shared.v8.css" type ="text/css" />
</head >
<body >
<div id ="root" >
<div class ="container sample" >
<div class ="options horizontal" >
<span class ="options-label" style ="width: 160px" > Resizing Mode:</span >
<select id ="columnResizingModeDropDown" class ="options-label" style ="width: 135px" >
<option > Deferred</option >
<option > Immediate</option >
<option > None</option >
</select >
<span class ="options-label" > Separator Width: </span >
<input id ="separatorWidthRange" type ="range" min =1 max =5 step ="1" />
</div >
<div class ="options horizontal" >
<span class ="options-label" style ="width: 160px" > Resizing Animation:</span >
<select id ="columnResizingAnimationModeDropDown" class ="options-label" style ="width: 135px" >
<option > Auto</option >
<option > Interpolate</option >
<option > None</option >
</select >
</div >
<igc-data-grid
id ="grid"
height ="calc(100% - 6rem)"
width ="100%"
column-resizing-mode ="Deferred"
column-resizing-animation-mode ="Auto"
column-resizing-separator-width ="1"
default-column-min-width ="100"
is-column-options-enabled ="true"
auto-generate-columns ="false" >
<igc-text-column field ="Name" width ="*>150" > </igc-text-column >
<igc-text-column field ="Street" header-text ="Address" width ="*>165" > </igc-text-column >
<igc-text-column field ="City" width ="*>140" > </igc-text-column >
<igc-numeric-column field ="Salary" positive-prefix ="$" show-grouping-separator ="true" width ="*>140" > </igc-numeric-column >
<igc-date-time-column field ="Birthday" > </igc-date-time-column >
</igc-data-grid >
</div >
</div >
<% if (false) { %><script src ="src/index.ts" > </script > <% } %>
</body >
</html >
html コピー
Like this sample? Get access to our complete Ignite UI for Web Components toolkit and start building your own apps in minutes. Download it for free.
Column resizing in the Ignite UI for Web Components DataGrid is on by default, and can be controlled by using the columnResizingMode
property of the grid. This property has three options. Each option is explained below:
Deferred
: The default option. When resizing, a separator will appear showing how large or small the column will become when resized.
Immediate
: When resizing, there will be no separator. The column's width will follow the pointer as you drag the edge of the column and resize accordingly.
None
: Columns cannot be resized.
When column resizing is set to Deferred
, the separator that shows up can be modified in color and width by using the columnResizingSeparatorBackground
and columnResizingSeparatorWidth
properties of the grid, respectively.
You can also animate the columns as they resize when the resizing mode is set to Deferred
only. This is done by setting the columnResizingAnimationMode
property to Interpolate
.
Each column in the grid can be determined whether or not it can resize individually. If you want to enable or disable resizing on a particular column, you can set the IsResizingEnabled property of that column.
When resizing a star-width column, it will change that column to a fixed column.
Code Snippet
The following code snippet demonstrates how to implement column resizing in the Web Components data grid, where the Street column in this case will not be resizable. In this case, the column resizing separator will be 5 pixels wide and the columns that are resizable would animate when resized as well:
import { ColumnResizingMode } from 'igniteui-webcomponents-grids' ;
import { ColumnResizingAnimationMode } from 'igniteui-webcomponents-grids' ;
ts
<igc-data-grid id ="grid"
auto-generate-columns ="false"
height ="500px"
width ="500px"
column-resizing-mode ="Deferred"
column-resizing-animation-mode ="Interpolate"
column-moving-separator-width ="5" >
<igc-text-column field ="FirstName" > </igc-text-column >
<igc-text-column field ="LastName" > </igc-text-column >
<igc-text-column field ="Street" is-resizing-enabled =false > </igc-text-column >
<igc-text-column field ="City" > </igc-text-column >
</igc-data-grid >
html
let grid1 = (document .getElementById("grid" ) as IgcDataGridComponent);
grid1.dataSource = data;
ts
API References