DevExtreme v26.1 is now available.

✨ Developing with AI? Leverage the DevExpress MCP Server and our AI Agent Skills.

Your search did not match any results.

Angular Resizable

If you want to enable live resize operations for a UI element, wrap that element into a Resizable widget. In this demo, you can resize the DataGrid. Try to drag the handles on the grid's edges.

Configure the following properties to specify resize operation constraints:

Backend API
<div class="widget-container"> <div class="dx-fieldset"> <div class="dx-fieldset-header">Resizable DataGrid</div> <div class="dx-field"> <dx-resizable [class]="resizableClasses" id="gridContainer" [minWidth]="400" [minHeight]="150" [maxHeight]="370" [keepAspectRatio]="keepAspectRatio" [handles]="handles.join(' ')" area=".widget-container .dx-field" > <dx-data-grid id="grid" [dataSource]="orders" keyExpr="ID" [showBorders]="true" height="100%" > <dxo-data-grid-paging [pageSize]="8"></dxo-data-grid-paging> <dxo-data-grid-scrolling mode="virtual"></dxo-data-grid-scrolling> <dxi-data-grid-column [allowGrouping]="false" dataField="OrderNumber" [width]="130" caption="Invoice Number" ></dxi-data-grid-column> <dxi-data-grid-column dataField="CustomerStoreCity" caption="City" ></dxi-data-grid-column> <dxi-data-grid-column dataField="CustomerStoreState" caption="State" ></dxi-data-grid-column> <dxi-data-grid-column dataField="Employee"></dxi-data-grid-column> <dxi-data-grid-column dataField="OrderDate" dataType="date" ></dxi-data-grid-column> <dxi-data-grid-column dataField="SaleAmount" format="currency" ></dxi-data-grid-column> </dx-data-grid> </dx-resizable> </div> </div> </div> <div class="options"> <div class="caption">Resizable Options</div> <div class="option"> <div>Handles</div> <dx-tag-box [items]="handleValues" [(value)]="handles" [inputAttr]="{ 'aria-label': 'Handle' }" (onValueChanged)="handlesValueChange($event)" ></dx-tag-box> </div> <div class="option"> <dx-check-box text="Keep aspect ratio" [(value)]="keepAspectRatio" ></dx-check-box> </div> </div>
import { bootstrapApplication } from '@angular/platform-browser'; import { Component, enableProdMode, ViewEncapsulation, provideZoneChangeDetection } from '@angular/core'; import { DxResizableModule, DxDataGridModule, DxTagBoxModule, DxCheckBoxModule, } from 'devextreme-angular'; import { Service, Order } from './app.service'; if (!/localhost/.test(document.location.host)) { enableProdMode(); } @Component({ selector: 'demo-app', templateUrl: './app.component.html', styleUrls: ['./app.component.css'], providers: [Service], encapsulation: ViewEncapsulation.None, imports: [ DxResizableModule, DxDataGridModule, DxCheckBoxModule, DxTagBoxModule, ], }) export class AppComponent { handleValues: string[] = ['left', 'top', 'right', 'bottom']; keepAspectRatio = true; handles: string[] = ['left', 'top', 'right', 'bottom']; orders: Order[]; resizableClasses = ''; constructor(service: Service) { this.orders = service.getOrders(); } handlesValueChange({ value }) { this.resizableClasses = this.handleValues.reduce((acc, handle) => { const newClass = value.includes(handle) ? '' : ` no-${handle}-handle`; return acc + newClass; }, 'dx-resizable'); } } bootstrapApplication(AppComponent, { providers: [ provideZoneChangeDetection({ eventCoalescing: true, runCoalescing: true }), ], });
.widget-container { width: calc(100% - 360px); height: 100%; margin-right: 320px; position: absolute; z-index: 1501; } .dx-fieldset, .dx-field { width: 100%; height: calc(100% - 60px); } .options { padding: 20px; background-color: rgba(191, 191, 191, 0.15); position: absolute; right: 0; top: 0; bottom: 0; width: 260px; } .caption { font-weight: 500; font-size: 18px; } .option { margin-top: 10px; } #gridContainer { padding: 10px; height: 300px; } #grid { border: 1px solid black; } .no-left-handle .dx-resizable-handle-top, .no-left-handle .dx-resizable-handle-bottom { left: 10px; width: calc(100% - 10px); } .no-right-handle .dx-resizable-handle-top, .no-right-handle .dx-resizable-handle-bottom { right: 10px; width: calc(100% - 10px); } .no-right-handle.no-left-handle .dx-resizable-handle-top, .no-right-handle.no-left-handle .dx-resizable-handle-bottom { left: 10px; width: calc(100% - 20px); } .no-top-handle .dx-resizable-handle-right, .no-top-handle .dx-resizable-handle-left { top: 10px; height: calc(100% - 10px); } .no-bottom-handle .dx-resizable-handle-right, .no-bottom-handle .dx-resizable-handle-left { bottom: 10px; height: calc(100% - 10px); } .no-top-handle.no-bottom-handle .dx-resizable-handle-left, .no-top-handle.no-bottom-handle .dx-resizable-handle-right { top: 10px; height: calc(100% - 20px); } .dx-resizable-handle-right { border-right: 1px dotted #999; } .dx-resizable-handle-top { border-top: 1px dotted #999; } .dx-resizable-handle-left { border-left: 1px dotted #999; } .dx-resizable-handle-bottom { border-bottom: 1px dotted #999; } .dx-resizable-handle::after { content: ""; position: absolute; width: 9px; height: 9px; border: none; border-radius: 50%; background-color: #fff; box-shadow: 0 2px 6px 0 rgba(0, 0, 0, 0.24); } .dx-resizable-handle-right::after { top: 50%; right: -5px; transform: translateY(-50%); } .dx-resizable-handle-left::after { top: 50%; left: -5px; transform: translateY(-50%); } .dx-resizable-handle-corner-top-left::after { top: -4px; left: -4px; } .dx-resizable-handle-corner-top-right::after { top: -4px; right: -4px; } .dx-resizable-handle-corner-bottom-left::after { bottom: -4px; left: -4px; } .dx-resizable-handle-corner-bottom-right::after { bottom: -4px; right: -4px; } .dx-resizable-handle-top::after { top: -5px; left: 50%; transform: translateX(-50%); } .dx-resizable-handle-bottom::after { bottom: -5px; left: 50%; transform: translateX(-50%); }
import { Injectable } from '@angular/core'; export class Order { ID: number; OrderNumber: number; OrderDate: string; SaleAmount: number; Terms: string; CustomerStoreState: string; CustomerStoreCity: string; Employee: string; } const orders: Order[] = [{ ID: 1, OrderNumber: 35703, OrderDate: '2024/04/10', SaleAmount: 11800, Terms: '15 Days', CustomerStoreState: 'California', CustomerStoreCity: 'Los Angeles', Employee: 'Harv Mudd', }, { ID: 4, OrderNumber: 35711, OrderDate: '2024/01/12', SaleAmount: 16050, Terms: '15 Days', CustomerStoreState: 'California', CustomerStoreCity: 'San Jose', Employee: 'Jim Packard', }, { ID: 5, OrderNumber: 35714, OrderDate: '2024/01/22', SaleAmount: 14750, Terms: '15 Days', CustomerStoreState: 'Nevada', CustomerStoreCity: 'Las Vegas', Employee: 'Harv Mudd', }, { ID: 7, OrderNumber: 35983, OrderDate: '2024/02/07', SaleAmount: 3725, Terms: '15 Days', CustomerStoreState: 'Colorado', CustomerStoreCity: 'Denver', Employee: 'Todd Hoffman', }, { ID: 9, OrderNumber: 36987, OrderDate: '2024/03/11', SaleAmount: 14200, Terms: '15 Days', CustomerStoreState: 'Utah', CustomerStoreCity: 'Salt Lake City', Employee: 'Clark Morgan', }, { ID: 11, OrderNumber: 38466, OrderDate: '2024/03/01', SaleAmount: 7800, Terms: '15 Days', CustomerStoreState: 'California', CustomerStoreCity: 'Los Angeles', Employee: 'Harv Mudd', }, { ID: 14, OrderNumber: 39420, OrderDate: '2024/02/15', SaleAmount: 20500, Terms: '15 Days', CustomerStoreState: 'California', CustomerStoreCity: 'San Jose', Employee: 'Jim Packard', }, { ID: 15, OrderNumber: 39874, OrderDate: '2024/02/04', SaleAmount: 9050, Terms: '30 Days', CustomerStoreState: 'Nevada', CustomerStoreCity: 'Las Vegas', Employee: 'Harv Mudd', }, { ID: 18, OrderNumber: 42847, OrderDate: '2024/02/15', SaleAmount: 20400, Terms: '30 Days', CustomerStoreState: 'Wyoming', CustomerStoreCity: 'Casper', Employee: 'Todd Hoffman', }, { ID: 19, OrderNumber: 43982, OrderDate: '2024/05/29', SaleAmount: 6050, Terms: '30 Days', CustomerStoreState: 'Utah', CustomerStoreCity: 'Salt Lake City', Employee: 'Clark Morgan', }, { ID: 29, OrderNumber: 56272, OrderDate: '2024/02/06', SaleAmount: 15850, Terms: '30 Days', CustomerStoreState: 'Utah', CustomerStoreCity: 'Salt Lake City', Employee: 'Clark Morgan', }, { ID: 30, OrderNumber: 57429, OrderDate: '2023/12/31', SaleAmount: 11050, Terms: '30 Days', CustomerStoreState: 'Arizona', CustomerStoreCity: 'Phoenix', Employee: 'Clark Morgan', }, { ID: 32, OrderNumber: 58292, OrderDate: '2024/05/13', SaleAmount: 13500, Terms: '15 Days', CustomerStoreState: 'California', CustomerStoreCity: 'Los Angeles', Employee: 'Harv Mudd', }, { ID: 36, OrderNumber: 62427, OrderDate: '2024/01/27', SaleAmount: 23500, Terms: '15 Days', CustomerStoreState: 'Nevada', CustomerStoreCity: 'Las Vegas', Employee: 'Harv Mudd', }, { ID: 39, OrderNumber: 65977, OrderDate: '2024/02/05', SaleAmount: 2550, Terms: '15 Days', CustomerStoreState: 'Wyoming', CustomerStoreCity: 'Casper', Employee: 'Todd Hoffman', }, { ID: 40, OrderNumber: 66947, OrderDate: '2024/03/23', SaleAmount: 3500, Terms: '15 Days', CustomerStoreState: 'Utah', CustomerStoreCity: 'Salt Lake City', Employee: 'Clark Morgan', }, { ID: 42, OrderNumber: 68428, OrderDate: '2024/04/10', SaleAmount: 10500, Terms: '15 Days', CustomerStoreState: 'California', CustomerStoreCity: 'Los Angeles', Employee: 'Harv Mudd', }, { ID: 43, OrderNumber: 69477, OrderDate: '2024/03/09', SaleAmount: 14200, Terms: '15 Days', CustomerStoreState: 'California', CustomerStoreCity: 'Anaheim', Employee: 'Harv Mudd', }, { ID: 46, OrderNumber: 72947, OrderDate: '2024/01/14', SaleAmount: 13350, Terms: '30 Days', CustomerStoreState: 'Nevada', CustomerStoreCity: 'Las Vegas', Employee: 'Harv Mudd', }, { ID: 47, OrderNumber: 73088, OrderDate: '2024/03/25', SaleAmount: 8600, Terms: '30 Days', CustomerStoreState: 'Nevada', CustomerStoreCity: 'Reno', Employee: 'Clark Morgan', }, { ID: 50, OrderNumber: 76927, OrderDate: '2024/04/27', SaleAmount: 9800, Terms: '30 Days', CustomerStoreState: 'Utah', CustomerStoreCity: 'Salt Lake City', Employee: 'Clark Morgan', }, { ID: 51, OrderNumber: 77297, OrderDate: '2024/04/30', SaleAmount: 10850, Terms: '30 Days', CustomerStoreState: 'Arizona', CustomerStoreCity: 'Phoenix', Employee: 'Clark Morgan', }, { ID: 56, OrderNumber: 84744, OrderDate: '2024/02/10', SaleAmount: 4650, Terms: '30 Days', CustomerStoreState: 'Nevada', CustomerStoreCity: 'Las Vegas', Employee: 'Harv Mudd', }, { ID: 57, OrderNumber: 85028, OrderDate: '2024/05/17', SaleAmount: 2575, Terms: '30 Days', CustomerStoreState: 'Nevada', CustomerStoreCity: 'Reno', Employee: 'Clark Morgan', }, { ID: 59, OrderNumber: 87297, OrderDate: '2024/04/21', SaleAmount: 14200, Terms: '30 Days', CustomerStoreState: 'Wyoming', CustomerStoreCity: 'Casper', Employee: 'Todd Hoffman', }, { ID: 60, OrderNumber: 88027, OrderDate: '2024/02/14', SaleAmount: 13650, Terms: '30 Days', CustomerStoreState: 'Utah', CustomerStoreCity: 'Salt Lake City', Employee: 'Clark Morgan', }, { ID: 65, OrderNumber: 94726, OrderDate: '2024/05/22', SaleAmount: 20500, Terms: '15 Days', CustomerStoreState: 'California', CustomerStoreCity: 'San Jose', Employee: 'Jim Packard', }, { ID: 66, OrderNumber: 95266, OrderDate: '2024/03/10', SaleAmount: 9050, Terms: '15 Days', CustomerStoreState: 'Nevada', CustomerStoreCity: 'Las Vegas', Employee: 'Harv Mudd', }, { ID: 69, OrderNumber: 98477, OrderDate: '2024/01/01', SaleAmount: 23500, Terms: '15 Days', CustomerStoreState: 'Wyoming', CustomerStoreCity: 'Casper', Employee: 'Todd Hoffman', }, { ID: 70, OrderNumber: 99247, OrderDate: '2024/02/08', SaleAmount: 2100, Terms: '15 Days', CustomerStoreState: 'Utah', CustomerStoreCity: 'Salt Lake City', Employee: 'Clark Morgan', }, { ID: 78, OrderNumber: 174884, OrderDate: '2024/04/10', SaleAmount: 7200, Terms: '30 Days', CustomerStoreState: 'Colorado', CustomerStoreCity: 'Denver', Employee: 'Todd Hoffman', }, { ID: 81, OrderNumber: 188877, OrderDate: '2024/02/11', SaleAmount: 8750, Terms: '30 Days', CustomerStoreState: 'Arizona', CustomerStoreCity: 'Phoenix', Employee: 'Clark Morgan', }, { ID: 82, OrderNumber: 191883, OrderDate: '2024/02/05', SaleAmount: 9900, Terms: '30 Days', CustomerStoreState: 'California', CustomerStoreCity: 'Los Angeles', Employee: 'Harv Mudd', }, { ID: 83, OrderNumber: 192474, OrderDate: '2024/01/21', SaleAmount: 12800, Terms: '30 Days', CustomerStoreState: 'California', CustomerStoreCity: 'Anaheim', Employee: 'Harv Mudd', }, { ID: 84, OrderNumber: 193847, OrderDate: '2024/03/21', SaleAmount: 14100, Terms: '30 Days', CustomerStoreState: 'California', CustomerStoreCity: 'San Diego', Employee: 'Harv Mudd', }, { ID: 85, OrderNumber: 194877, OrderDate: '2024/03/06', SaleAmount: 4750, Terms: '30 Days', CustomerStoreState: 'California', CustomerStoreCity: 'San Jose', Employee: 'Jim Packard', }, { ID: 86, OrderNumber: 195746, OrderDate: '2024/05/26', SaleAmount: 9050, Terms: '30 Days', CustomerStoreState: 'Nevada', CustomerStoreCity: 'Las Vegas', Employee: 'Harv Mudd', }, { ID: 87, OrderNumber: 197474, OrderDate: '2024/03/02', SaleAmount: 6400, Terms: '30 Days', CustomerStoreState: 'Nevada', CustomerStoreCity: 'Reno', Employee: 'Clark Morgan', }, { ID: 88, OrderNumber: 198746, OrderDate: '2024/05/09', SaleAmount: 15700, Terms: '30 Days', CustomerStoreState: 'Colorado', CustomerStoreCity: 'Denver', Employee: 'Todd Hoffman', }, { ID: 91, OrderNumber: 214222, OrderDate: '2024/02/08', SaleAmount: 11050, Terms: '30 Days', CustomerStoreState: 'Arizona', CustomerStoreCity: 'Phoenix', Employee: 'Clark Morgan', }]; @Injectable() export class Service { getOrders() { return orders; } }
<!DOCTYPE html> <html lang="en"> <head> <title>DevExtreme Demo</title> <meta http-equiv="X-UA-Compatible" content="IE=edge" /> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=5.0" /> <link rel="stylesheet" type="text/css" href="https://cdn3.devexpress.com/jslib/26.1.5/css/dx.light.css" /> </head> <body class="dx-viewport"> <div class="demo-container"> <demo-app>Loading...</demo-app> </div> <script src="https://cdn.jsdelivr.net/npm/zone.js@0.16.2/bundles/zone.umd.js"></script> <script src="./bundle.js" type="module"></script> </body> </html>

You can display resize handles on edges or corners. Use the following keywords to set up the handles property: top, bottom, left, and right. If you specify two adjacent sides (for example, "bottom right"), the control displays a handle in the corner.

The keepAspectRatio property specifies whether a corner handle resizes content proportionally. Set this property to false to allow free-form resize operations.