Resúmenes de cuadrículas Angular
La cuadrícula de la interfaz de usuario de Angular en Ignite UI for Angular tiene una característica de resúmenes que funciona en un nivel por columna como pie de página de grupo. Angular resúmenes de cuadrícula es una característica poderosa que permite al usuario ver la información de la columna en un contenedor separado con un conjunto predefinido de elementos de resumen predeterminados, según el tipo de datos dentro de la columna o mediante la implementación de una plantilla angular personalizada en la cuadrícula.
Ejemplo de descripción general de resúmenes de cuadrícula Angular
import { Component, ViewChild } from '@angular/core' ;
import { ColumnType, IgxGridComponent, IgxNumberSummaryOperand, IgxSummaryResult, IgxPaginatorComponent, IgxColumnComponent, IgxCellTemplateDirective, IgxCellHeaderTemplateDirective, IgxIconComponent } from 'igniteui-angular' ;
import { DATA } from '../../data/nwindData' ;
import { IgxPreventDocumentScrollDirective } from '../../directives/prevent-scroll.directive' ;
import { DatePipe } from '@angular/common' ;
class MySummary {
public operate(data?: any []): IgxSummaryResult[] {
const result = new IgxNumberSummaryOperand().operate(data);
result.push({
key : 'test' ,
label : 'Test' ,
summaryResult : data.filter((rec ) => rec > 10 && rec < 30 ).length
});
return result;
}
}
@Component ({
selector : 'app-grid-sample-3' ,
styleUrls : ['./grid-sample-3.component.scss' ],
templateUrl : './grid-sample-3.component.html' ,
imports : [IgxGridComponent, IgxPreventDocumentScrollDirective, IgxPaginatorComponent, IgxColumnComponent, IgxCellTemplateDirective, IgxCellHeaderTemplateDirective, IgxIconComponent, DatePipe]
})
export class GridSample3Component {
@ViewChild ('grid1' , { read : IgxGridComponent, static : true })
public grid1: IgxGridComponent;
public mySummary = MySummary;
public data;
public productId = 0 ;
constructor ( ) {
this .data = DATA;
this .productId = DATA.length;
}
public toggleSummary (column: ColumnType ) {
column.hasSummary = !column.hasSummary;
}
}
ts コピー <div class ="grid__wrapper" >
<igx-grid [igxPreventDocumentScroll ]="true" #grid1 [data ]="data" [autoGenerate ]="false" height ="600px" width ="100%" >
<igx-paginator > </igx-paginator >
<igx-column #col field ="ProductID" header ="Product ID" width ="17%" [headerClasses ]="'prodId'" >
</igx-column >
<igx-column #col field ="ProductName" header ="Product Name" width ="17%" [headerClasses ]="'prodId'" [hasSummary ]="true" >
<ng-template igxCell let-cell ="cell" let-val >
{{val}}
</ng-template >
<ng-template igxHeader let-col >
<div class ="header-text" > {{col.field}}</div >
<igx-icon class ="header-icon" style.color ="{{ col.hasSummary ? '#e41c77' : '' }}" (click )="toggleSummary(col)" > functions</igx-icon >
</ng-template >
</igx-column >
<igx-column #col field ="UnitPrice" header ="Price" [filterable ]="false" width ="17%" [editable ]="true" dataType ="number"
[hasSummary ]="true" >
<ng-template igxCell let-cell ="cell" let-val let-row >
${{val}}
</ng-template >
<ng-template igxHeader let-col >
<div class ="header-text" > {{col.field}}</div >
<igx-icon class ="header-icon" style.color ="{{ col.hasSummary ? '#e41c77' : '' }}" (click )="toggleSummary(col)" > functions</igx-icon >
</ng-template >
</igx-column >
<igx-column #col field ="UnitsInStock" header ="Units In Stock" width ="17%" dataType ="number" [editable ]="true"
[hasSummary ]="false" [summaries ]="mySummary" >
<ng-template igxCell let-cell ="cell" let-val let-row >
{{val}}
</ng-template >
<ng-template igxHeader let-col >
<div class ="header-text" > {{col.field}}</div >
<igx-icon class ="header-icon" style.color ="{{ col.hasSummary ? '#e41c77' : '' }}" (click )="toggleSummary(col)" > functions</igx-icon >
</ng-template >
</igx-column >
<igx-column #col field ="Discontinued" header ="Discontinued" width ="17%" [hasSummary ]="true" [dataType ]="'boolean'" >
<ng-template igxCell let-cell ="cell" let-val >
@if (val) {
<img src ="https://www.infragistics.com/angular-demos-lob/assets/images/grid/active.png" title ="Continued" alt ="Continued" />
}
@if (!val) {
<img src ="https://www.infragistics.com/angular-demos-lob/assets/images/grid/expired.png" title ="Discontinued" alt ="Discontinued" />
}
</ng-template >
<ng-template igxHeader let-col >
<div class ="header-text" > {{col.field}}</div >
<igx-icon class ="header-icon" style.color ="{{ col.hasSummary ? '#e41c77' : '' }}" (click )="toggleSummary(col)" > functions</igx-icon >
</ng-template >
</igx-column >
<igx-column #col field ="OrderDate" width ="15%" [dataType ]="'date'" [hasSummary ]="true" >
<ng-template igxCell let-cell ="cell" let-val let-row >
{{ val | date: 'MMM d, yyyy' }}
</ng-template >
<ng-template igxHeader let-col >
<div class ="header-text" > {{col.field}}</div >
<igx-icon class ="header-icon" style.color ="{{ col.hasSummary ? '#e41c77' : '' }}" (click )="toggleSummary(col)" > functions</igx-icon >
</ng-template >
</igx-column >
</igx-grid >
</div >
html コピー .grid-controls {
display : flex;
flex-flow : column nowrap;
justify-content : space-between;
margin : 0 16px 24px ;
igx-switch {
margin-top : 24px ;
}
}
.grid__wrapper {
margin : 0 auto;
padding : 16px ;
}
.header {
height : 100% ;
}
:host ::ng-deep{
.igx-grid__th .title{
width: 100% ;
cursor : auto;
}
@media screen and (max-width : 677px ){
.header-icon {
padding-bottom : 17px ;
padding-top : 17px ;
font-size : 1.4em ;
width : 1.1em ;
height : 1.1em ;
float : right;
}
.header-text {
float :left ;
white-space : nowrap;
overflow : hidden;
text-overflow : ellipsis;
width : 50% ;
}
}
@media screen and (min-width : 677px ){
.header-icon {
padding-top : 17px ;
font-size : 1.4em ;
width : 1.1em ;
height : 1.1em ;
float : right;
}
.header-text {
float :left ;
white-space : nowrap;
overflow : hidden;
text-overflow : ellipsis;
width : 50% ;
}
}
@media screen and (min-width : 992px ){
.header-icon {
padding-top : 17px ;
font-size : 1.4em ;
width : 1.1em ;
height : 1.1em ;
float : right;
margin-right : 10px ;
cursor : pointer;
}
.header-text {
float :left ;
white-space : nowrap;
width : 50% ;
cursor : auto;
}
}
}
scss コピー
¿Te gusta esta muestra? Obtenga acceso a nuestro kit de herramientas de Ignite UI for Angular completo y comience a crear sus propias aplicaciones en minutos. Descárgalo gratis.
El resumen de la columna es una función de todos los valores de la columna ; a menos que se aplique un filtrado, el resumen de la columna será función de los valores de los resultados filtrados.
Los resúmenes de cuadrícula también se pueden habilitar a nivel de columna en Ignite UI for Angular, lo que significa que solo puede activarlos para las columnas que necesite. Resúmenes de cuadrícula le proporciona un conjunto predefinido de resúmenes predeterminados, en función del tipo de datos de la columna, para que pueda ahorrar algo de tiempo:
Para string
y boolean
data types
, está disponible la siguiente función:
Para los tipos de datos number
, currency
y percent
, están disponibles las siguientes funciones:
contar
mín.
máximo
promedio
suma
Para el tipo de datos date
, están disponibles las siguientes funciones:
contar
más temprano
el último
Todos los tipos de datos de columna disponibles se pueden encontrar en el tema oficial Tipos de columna .
Los resúmenes de cuadrícula se habilitan por columna estableciendo la propiedad hasSummary
en true
. También es importante tener en cuenta que los resúmenes de cada columna se resuelven según el tipo de datos de la columna. En igx-grid
el tipo de datos de columna predeterminado es string
, por lo que si desea resúmenes específicos number
o date
, debe especificar la propiedad dataType
como number
o date
. Tenga en cuenta que los valores de resumen se mostrarán localizados, según la locale
de la cuadrícula y la columna pipeArgs
.
<igx-grid #grid1 [data ]="data" [autoGenerate ]="false" height ="800px" width ="800px" (columnInit )="initColumn($event)" >
<igx-column field ="ProductID" header ="Product ID" width ="200px" [sortable ]="true" > </igx-column >
<igx-column field ="ProductName" header ="Product Name" width ="200px" [sortable ]="true" [hasSummary ]="true" > </igx-column >
<igx-column field ="ReorderLevel" width ="200px" [editable ]="true" [dataType ]="'number'" [hasSummary ]="true" > </igx-column >
</igx-grid >
html
La otra forma de habilitar/deshabilitar resúmenes para una columna específica o una lista de columnas es usar el método público enableSummaries
/ disableSummaries
del igx-grid .
<igx-grid #grid1 [data ]="data" [autoGenerate ]="false" height ="800px" width ="800px" (columnInit )="initColumn($event)" >
<igx-column field ="ProductID" header ="Product ID" width ="200px" [sortable ]="true" > </igx-column >
<igx-column field ="ProductName" header ="Product Name" width ="200px" [sortable ]="true" [hasSummary ]="true" > </igx-column >
<igx-column field ="ReorderLevel" width ="200px" [editable ]="true" [dataType ]="'number'" [hasSummary ]="false" > </igx-column >
</igx-grid >
<button (click )="enableSummary()" > Enable Summary</button >
<button (click )="disableSummary()" > Disable Summary </button >
html
public enableSummary ( ) {
this .grid1.enableSummaries([
{fieldName : 'ReorderLevel' , customSummary : this .mySummary},
{fieldName : 'ProductID' }
]);
}
public disableSummary ( ) {
this .grid1.disableSummaries('ProductName' );
}
typescript
Resúmenes de cuadrícula personalizados
Si estas funciones no cumplen con sus requisitos, puede proporcionar un resumen personalizado para las columnas específicas. Para lograr esto, debe anular una de las clases base IgxSummaryOperand
, IgxNumberSummaryOperand
o IgxDateSummaryOperand
según el tipo de datos de la columna y sus necesidades. De esta manera puede redefinir la función existente o puede agregar nuevas funciones. La clase IgxSummaryOperand
proporciona la implementación predeterminada solo para el método count
. IgxNumberSummaryOperand
extiende IgxSummaryOperand
y proporciona implementación para min
, max
, sum
y average
. IgxDateSummaryOperand
amplía IgxSummaryOperand
y, además, le ofrece las versiones earliest
y latest
.
import { IgxSummaryResult, IgxSummaryOperand, IgxNumberSummaryOperand, IgxDateSummaryOperand } from 'igniteui-angular' ;
class MySummary extends IgxNumberSummaryOperand {
constructor ( ) {
super ();
}
operate(data?: any []): IgxSummaryResult[] {
const result = super .operate(data);
result.push({
key : 'test' ,
label : 'Test' ,
summaryResult : data.filter(rec => rec > 10 && rec < 30 ).length
});
return result;
}
}
typescript
Como se ve en los ejemplos, las clases base exponen el método operate
, por lo que puede elegir obtener todos los resúmenes predeterminados y modificar el resultado, o calcular resultados resumidos completamente nuevos. El método devuelve una lista de IgxSummaryResult
.
interface IgxSummaryResult {
key : string ;
label: string ;
summaryResult: any ;
}
typescript
y tomar parámetros opcionales para calcular los resúmenes. Consulte Resúmenes personalizados, que acceden a toda la sección de datos a continuación.
Para calcular correctamente la altura de la fila de resumen, Grid necesita que el método operate
devuelva siempre una matriz de IgxSummaryResult
con la longitud adecuada incluso cuando los datos están vacíos.
Y ahora agreguemos nuestro resumen personalizado a la columna UnitsInStock
. Lo lograremos estableciendo la propiedad summaries
en la clase que creamos a continuación.
<igx-grid #grid1 [data ]="data" [autoGenerate ]="false" height ="800px" width ="800px" (columnInit )="initColumn($event)" >
<igx-column field ="ProductID" width ="200px" [sortable ]="true" >
</igx-column >
<igx-column field ="ProductName" width ="200px" [sortable ]="true" [hasSummary ]="true" >
</igx-column >
<igx-column field ="UnitsInStock" width ="200px" [dataType ]="'number'" [hasSummary ]="true" [summaries ]="mySummary" [sortable ]="true" >
</igx-column >
<igx-column field ="ReorderLevel" width ="200px" [editable ]="true" [dataType ]="'number'" [hasSummary ]="true" >
</igx-column >
</igx-grid >
html
...
export class GridComponent implements OnInit {
mySummary = MySummary;
....
}
typescript
Resúmenes personalizados, que acceden a todos los datos
Ahora puede acceder a todos los datos de la cuadrícula dentro del resumen de la columna personalizada. Se introducen dos parámetros opcionales adicionales en el método operate
IgxSummaryOperand. Como puede ver en el fragmento de código a continuación, el método de operación tiene los siguientes tres parámetros:
columnData: le proporciona una matriz que contiene los valores solo para la columna actual
allGridData: le brinda toda la fuente de datos de la cuadrícula
fieldName - campo de columna actual
class MySummary extends IgxNumberSummaryOperand {
constructor ( ) {
super ();
}
operate(columnData: any [], allGridData = [], fieldName?): IgxSummaryResult[] {
const result = super .operate(allData.map(r => r[fieldName]));
result.push({ key : 'test' , label : 'Total Discontinued' , summaryResult : allData.filter((rec ) => rec.Discontinued).length });
return result;
}
}
typescript
import { Component, ViewChild } from '@angular/core' ;
import { IgxGridComponent, IgxNumberSummaryOperand, IgxSummaryResult, IgxPaginatorComponent, IgxColumnComponent } from 'igniteui-angular' ;
import { DATA } from '../../data/nwindData' ;
import { IgxPreventDocumentScrollDirective } from '../../directives/prevent-scroll.directive' ;
class DiscontinuedSummary {
public operate(data?: any [], allData = [], fieldName = '' ): IgxSummaryResult[] {
const result = [];
result.push({
key : 'products' ,
label : 'Products' ,
summaryResult : data.length
});
result.push({
key : 'total' ,
label : 'Total Items' ,
summaryResult : IgxNumberSummaryOperand.sum(data)
});
result.push({
key : 'discontinued' ,
label : 'Discontinued Products' ,
summaryResult : allData.map(r => r['Discontinued' ]).filter((rec ) => rec).length
});
result.push({
key : 'totalDiscontinued' ,
label : 'Total Discontinued Items' ,
summaryResult : IgxNumberSummaryOperand.sum(allData.filter((rec ) => rec['Discontinued' ]).map(r => r[fieldName]))
});
return result;
}
}
@Component ({
selector : 'app-grid-all-data-summary' ,
styleUrls : ['./grid-allData-summary.component.scss' ],
templateUrl : './grid-allData-summary.component.html' ,
imports : [IgxGridComponent, IgxPreventDocumentScrollDirective, IgxPaginatorComponent, IgxColumnComponent]
})
export class GridAllDataSummaryComponent {
@ViewChild ('grid1' , { read : IgxGridComponent, static : true })
public grid1: IgxGridComponent;
public discontinuedSummary = DiscontinuedSummary;
public data;
constructor ( ) {
this .data = DATA;
}
}
ts コピー <div class ="grid__wrapper" >
<igx-grid [igxPreventDocumentScroll ]="true" #grid1 [data ]="data" [autoGenerate ]="false" height ="600px" width ="100%" >
@if (false) {
<igx-paginator > </igx-paginator >
}
<igx-column field ="ProductID" header ="Product ID" width ="17%" [headerClasses ]="'prodId'" >
</igx-column >
<igx-column field ="ProductName" header ="Product Name" width ="17%" [headerClasses ]="'prodId'" >
</igx-column >
<igx-column field ="UnitPrice" header ="Price" [filterable ]="false" width ="17%" [editable ]="true" dataType ="number" >
</igx-column >
<igx-column field ="UnitsInStock" header ="Units In Stock" width ="17%" dataType ="number" [editable ]="true"
[hasSummary ]="true" [summaries ]="discontinuedSummary" >
</igx-column >
<igx-column field ="Discontinued" header ="Discontinued" [editable ]="true" width ="17%" [dataType ]="'boolean'" >
</igx-column >
<igx-column field ="OrderDate" width ="15%" [dataType ]="'date'" [hasSummary ]="true" >
</igx-column >
</igx-grid >
</div >
html コピー .grid__wrapper {
margin : 0 auto;
padding : 16px ;
}
scss コピー
Plantilla de resumen
igxSummary
apunta al resumen de la columna proporcionando como contexto los resultados del resumen de la columna.
<igx-column ... [hasSummary ]="true" >
<ng-template igxSummary let-summaryResults >
<span > My custom summary template</span >
<span > {{ summaryResults[0].label }} - {{ summaryResults[0].summaryResult }}</span >
</ng-template >
</igx-column >
html
Cuando se define un resumen predeterminado, la altura del área de resumen se calcula por diseño en función de la columna con el mayor número de resúmenes y el tamaño de la cuadrícula. Use la propiedad de entrada summaryRowHeight para invalidar el valor predeterminado. Como argumento, espera un valor numérico y, al establecer un valor falso, se activará el comportamiento de tamaño predeterminado del pie de página de la cuadrícula.
La plantilla de resumen de columna se puede definir a través de API estableciendo la propiedad SummaryTemplate de la columna en el TemplateRef requerido.
import { Component, HostBinding, OnInit } from '@angular/core' ;
import { IgxNumberSummaryOperand, IgxSummaryResult, IgxInputGroupComponent, IgxLabelDirective, IgxInputDirective, IgxSwitchComponent, IgxButtonGroupComponent, IgxGridComponent, IgxColumnComponent, IgxSummaryTemplateDirective } from 'igniteui-angular' ;
import { DATA } from '../../data/nwindData' ;
import { FormsModule } from '@angular/forms' ;
import { IgxPreventDocumentScrollDirective } from '../../directives/prevent-scroll.directive' ;
class DiscontinuedSummary {
public operate(data?: any [], allData = [], fieldName = '' ): IgxSummaryResult[] {
const result = [];
result.push({
key : 'products' ,
label : 'Products' ,
summaryResult : data.length
});
result.push({
key : 'total' ,
label : 'Total Items' ,
summaryResult : IgxNumberSummaryOperand.sum(data)
});
result.push({
key : 'discontinued' ,
label : 'Discontinued Products' ,
summaryResult : allData.map(r => r['Discontinued' ]).filter((rec ) => rec).length
});
result.push({
key : 'totalDiscontinued' ,
label : 'Total Discontinued Items' ,
summaryResult : IgxNumberSummaryOperand.sum(allData.filter((rec ) => rec['Discontinued' ]).map(r => r[fieldName]))
});
return result;
}
}
@Component ({
selector : 'app-grid-summary-template' ,
styleUrls : ['./grid-summary-template.component.scss' ],
templateUrl : './grid-summary-template.component.html' ,
imports : [IgxInputGroupComponent, IgxLabelDirective, FormsModule, IgxInputDirective, IgxSwitchComponent, IgxButtonGroupComponent, IgxGridComponent, IgxPreventDocumentScrollDirective, IgxColumnComponent, IgxSummaryTemplateDirective]
})
export class GridSummaryTemplateComponent implements OnInit {
public discontinuedSummary = DiscontinuedSummary;
public data;
public summaryHeight = 135 ;
public size = 'medium' ;
public sizes;
public hasSummary = true ;
constructor ( ) {
this .data = DATA;
}
public ngOnInit(): void {
this .sizes = [
{ label : 'small' , selected : this .size === 'small' , togglable : true },
{ label : 'medium' , selected : this .size === 'medium' , togglable : true },
{ label : 'large' , selected : this .size === 'large' , togglable : true }
];
}
public selectSize(event): void {
this .size = this .sizes[event.index].label;
}
@HostBinding ('style.--ig-size' )
protected get sizeStyle () {
return `var(--ig-size-${this .size} )` ;
}
}
ts コピー <div class ="sample__wrapper" >
<div class ="controls-wrapper" >
<igx-input-group >
<label igxLabel for ="height" > Summary Row Height</label >
<input igxInput name ="height" type ="number" [(ngModel )]="summaryHeight" >
</igx-input-group >
<igx-switch [(ngModel )]="hasSummary" > Toggle Summaries</igx-switch >
<igx-buttongroup [values ]="sizes" (selected )="selectSize($event)" >
</igx-buttongroup >
</div >
<igx-grid [igxPreventDocumentScroll ]="true" #grid1 [data ]="data"
[summaryRowHeight ]="summaryHeight" [autoGenerate ]="false" height ="550px" width ="100%" >
<igx-column field ="ProductID" header ="Product ID" width ="10%" [headerClasses ]="'prodId'" [groupable ]="true" >
</igx-column >
<igx-column field ="ProductName" header ="Product Name" width ="17%" [headerClasses ]="'prodId'" [groupable ]="true" >
</igx-column >
<igx-column field ="UnitPrice" header ="Price" [filterable ]="false" width ="17%" [editable ]="true" dataType ="number" [groupable ]="true" >
</igx-column >
<igx-column field ="UnitsInStock" header ="Units In Stock" width ="21%" dataType ="number" [editable ]="true"
[hasSummary ]="hasSummary" [summaries ]="discontinuedSummary" [groupable ]="true" >
</igx-column >
<igx-column field ="Discontinued" header ="Discontinued" [editable ]="true" width ="17%" [dataType ]="'boolean'" [groupable ]="true" >
</igx-column >
<igx-column field ="OrderDate" width ="18%" [dataType ]="'date'" [hasSummary ]="hasSummary" [groupable ]="true" >
<ng-template igxSummary let-summaryResults >
<div class ="summary-temp" >
<span > <strong > {{ summaryResults[0].label }}</strong > <span > {{ summaryResults[0].summaryResult }}</span > </span >
<span > <strong > {{ summaryResults[1].label }}</strong > <span > {{ summaryResults[1].summaryResult }}</span > </span >
</div >
</ng-template >
</igx-column >
</igx-grid >
</div >
html コピー .sample__wrapper {
display : flex;
flex-direction : column;
gap: 16px ;
padding : 16px ;
height : 100% ;
overflow-y : auto;
}
igx-buttongroup {
max-width : 450px ;
flex : 1 ;
}
.summary-temp {
display : flex;
flex-direction : column;
margin : 0 1px ;
font-size : 14px ;
line-height : 24px ;
height : 100% ;
overflow-y : auto;
overflow-x : hidden;
span {
display : flex;
flex-wrap : wrap;
align-items : center;
gap: 4px ;
justify-content : space-between;
color : hsla(var(--igx-gray-900 ));
span {
user-select: all;
max-width : 300px ;
padding-right : 8px ;
}
strong {
font-size : 12px ;
text-transform : uppercase;
min-width : 70px ;
justify-self: flex-start;
text-align : left;
color : var(--ig-secondary-600 );
user-select: none;
}
}
> * {
padding : 8px 0 ;
line-height : 18px ;
border-bottom : 1px dashed hsla(var(--igx-gray-400 ));
&:last-child {
border-bottom : none;
}
}
}
::-webkit-scrollbar {
width: 5px !important ;
height : 5px !important ;
}
.controls-wrapper {
display : flex;
align-items : center;
flex-direction : row;
gap: 16px ;
}
scss コピー
Desactivar resúmenes
La disabledSummaries
propiedad proporciona un control preciso por columna sobre la característica de resumen de cuadrícula Ignite UI for Angular. Esta propiedad permite a los usuarios personalizar los resúmenes que se muestran para cada columna de la cuadrícula, lo que garantiza que solo se muestren los datos más relevantes y significativos. Por ejemplo, puede excluir tipos de resumen específicos, por ejemplo ['count', 'min', 'max']
, especificando sus claves de resumen en una matriz.
Esta propiedad también se puede modificar dinámicamente en tiempo de ejecución a través del código, lo que proporciona flexibilidad para adaptar los resúmenes de la cuadrícula a los cambios en los estados de la aplicación o las acciones del usuario.
En los ejemplos siguientes se muestra cómo utilizar la disabledSummaries
propiedad para administrar resúmenes de diferentes columnas y excluir tipos de resumen predeterminados y personalizados específicos en la cuadrícula Ignite UI for Angular:
<igx-column
field ="UnitPrice"
header ="Unit Price"
dataType ="number"
[hasSummary ]="true"
[disabledSummaries ]="['count', 'sum', 'average']"
>
</igx-column >
<igx-column
field ="UnitsInStock"
header ="Units In Stock"
dataType ="number"
[hasSummary ]="true"
[summaries ]="discontinuedSummary"
[disabledSummaries ]="['discontinued', 'totalDiscontinued']"
>
</igx-column >
html
Para UnitPrice
, los resúmenes predeterminados como count
, sum
, y average
están deshabilitados, dejando otros como y min
max
activos.
En el caso UnitsInStock
de los resúmenes personalizados, como total
y totalDiscontinued
se excluyen mediante la disabledSummaries
propiedad.
En tiempo de ejecución, los resúmenes también se pueden deshabilitar dinámicamente mediante la disabledSummaries
propiedad. Por ejemplo, puede establecer o actualizar la propiedad en columnas específicas mediante programación para adaptar los resúmenes mostrados en función de las acciones del usuario o los cambios de estado de la aplicación.
De forma predeterminada, los resultados de resumen, producidos por los operandos de resumen integrados, se localizan y se formatean según la locale
de la cuadrícula y la columna pipeArgs
. Cuando se utilizan operandos personalizados, la locale
y pipeArgs
no se aplican. Si desea cambiar la apariencia predeterminada de los resultados del resumen, puede formatearlos usando la propiedad summaryFormatter
.
public dateSummaryFormat(summary: IgxSummaryResult, summaryOperand : IgxSummaryOperand): string {
const result = summary.summaryResult;
if (summaryOperand instanceof IgxDateSummaryOperand && summary.key !== 'count'
&& result !== null && result !== undefined ) {
const pipe = new DatePipe('en-US' );
return pipe.transform(result,'MMM YYYY' );
}
return result;
}
typescript
<igx-column ... [summaryFormatter ]="dateSummaryFormat" > </igx-column >
html
import { DatePipe } from '@angular/common' ;
import { Component, OnInit, ViewChild } from '@angular/core' ;
import { IgxDateSummaryOperand, IgxGridComponent, IgxSummaryOperand, IgxSummaryResult, IgxColumnComponent, IgxCellTemplateDirective } from 'igniteui-angular' ;
import { DATA } from '../../data/nwindData' ;
import { IgxPreventDocumentScrollDirective } from '../../directives/prevent-scroll.directive' ;
@Component ({
selector : 'app-grid-summary-formatter' ,
styleUrls : ['./grid-summary-formatter.component.scss' ],
templateUrl : './grid-summary-formatter.component.html' ,
imports : [IgxGridComponent, IgxPreventDocumentScrollDirective, IgxColumnComponent, IgxCellTemplateDirective]
})
export class GridSummaryFormatterComponent implements OnInit {
@ViewChild ('grid1' , { read : IgxGridComponent, static : true })
public grid1: IgxGridComponent;
public data: any [];
public ngOnInit(): void {
this .data = DATA;
}
public dateSummaryFormat(summary: IgxSummaryResult, summaryOperand : IgxSummaryOperand): string {
const result = summary.summaryResult;
if (summaryOperand instanceof IgxDateSummaryOperand && summary.key !== 'count'
&& result !== null && result !== undefined ) {
const pipe = new DatePipe('en-US' );
return pipe.transform(result, 'MMM YYYY' );
}
return result;
}
}
ts コピー <div class ="grid__wrapper" >
<igx-grid [igxPreventDocumentScroll ]="true" #grid1 [data ]="data" [autoGenerate ]="false" height ="600px" width ="100%"
[allowFiltering ]='true' filterMode ="excelStyleFilter" >
<igx-column field ="ProductName" header ="Product Name" [sortable ]="true" [disableHiding ]="true" [dataType ]="'string'" >
</igx-column >
<igx-column field ="QuantityPerUnit" header ="Quantity Per Unit" [sortable ]="true" [disableHiding ]="true" [dataType ]="'string'" >
</igx-column >
<igx-column field ="UnitPrice" header ="Unit Price Category" [sortable ]="true" [disableHiding ]="true" dataType ="string" >
</igx-column >
<igx-column field ="OrderDate" header ="Order Date" [sortable ]="true" [disableHiding ]="true" [dataType ]="'date'" [hasSummary ]="true"
[summaryFormatter ]="dateSummaryFormat" >
</igx-column >
<igx-column field ="Discontinued" header ="Discontinued" [sortable ]="true" [disableHiding ]="true" [dataType ]="'boolean'" >
<ng-template igxCell let-cell ="cell" let-val >
@if (val) {
<img src ="https://www.infragistics.com/angular-demos-lob/assets/images/grid/active.png" title ="Continued" alt ="Continued" />
}
@if (!val) {
<img src ="https://www.infragistics.com/angular-demos-lob/assets/images/grid/expired.png" title ="Discontinued" alt ="Discontinued" />
}
</ng-template >
</igx-column >
</igx-grid >
</div >
html コピー .grid__wrapper {
margin : 16px ;
}
scss コピー
Resúmenes con Agrupar por
Cuando haya agrupado por columnas, Grid le permite cambiar la posición del resumen y el modo de cálculo utilizando las propiedades summaryCalculationMode
y summaryPosition
. Junto con estas dos propiedades, IgxGrid expone la propiedad showSummaryOnCollapse
que le permite determinar si la fila de resumen permanece visible cuando la fila del grupo al que hace referencia está colapsada.
Los valores disponibles de la propiedad summaryCalculationMode
son:
rootLevelOnly: los resúmenes se calculan solo para el nivel raíz.
childLevelsOnly: los resúmenes se calculan solo para los niveles secundarios.
rootAndChildLevels: los resúmenes se calculan tanto para el nivel raíz como para el nivel secundario. Este es el valor predeterminado.
Los valores disponibles de la propiedad summaryPosition
son:
arriba: la fila de resumen aparece antes del grupo por fila secundaria.
abajo: la fila de resumen aparece después del grupo por fila secundaria. Este es el valor predeterminado.
La propiedad showSummaryOnCollapse
es booleana. Su valor predeterminado está establecido en false , lo que significa que la fila de resumen se ocultará cuando se contraiga la fila del grupo. Si la propiedad se establece en verdadero , la fila de resumen permanece visible cuando se contrae la fila del grupo.
La propiedad summaryPosition
se aplica solo a los resúmenes de nivel secundario. Los resúmenes de nivel raíz aparecen siempre fijos en la parte inferior del Grid.
Manifestación
import { Component, OnInit, ViewChild, ViewEncapsulation } from '@angular/core' ;
import { DefaultSortingStrategy, GridSelectionMode, GridSummaryCalculationMode, GridSummaryPosition, IgxGridComponent, IgxNumberSummaryOperand, IgxSummaryOperand, IgxSummaryResult, ISortingExpression, SortingDirection, IgxButtonGroupComponent, IgxSwitchComponent, IgxColumnComponent } from 'igniteui-angular' ;
import { INVOICE_DATA } from '../../data/invoiceData' ;
import { IgxPreventDocumentScrollDirective } from '../../directives/prevent-scroll.directive' ;
class AvgSummary {
public operate(data?: any []): IgxSummaryResult[] {
const result = [];
const avg = IgxNumberSummaryOperand.average(data);
result.push({
key : 'avg' ,
label : 'Average' ,
summaryResult : data.length ? '$' + avg.toFixed(2 ) : ''
});
return result;
}
}
class SumSummary {
public operate(data?: any []): IgxSummaryResult[] {
const result = [];
result.push({
key : 'sum' ,
label : 'Sum' ,
summaryResult : IgxNumberSummaryOperand.sum(data)
});
return result;
}
}
@Component ({
selector : 'app-grid-groupby-summary-sample' ,
styleUrls : ['./grid-groupby-summary-sample.component.scss' ],
templateUrl : './grid-groupby-summary-sample.component.html' ,
imports : [IgxButtonGroupComponent, IgxSwitchComponent, IgxGridComponent, IgxPreventDocumentScrollDirective, IgxColumnComponent]
})
export class GridGroupBySummarySampleComponent {
@ViewChild ('grid1' , { read : IgxGridComponent, static : true })
public grid1: IgxGridComponent;
public data;
public expr: ISortingExpression[];
public avgSummary = AvgSummary;
public sumSummary = SumSummary;
public summaryPositions;
public summaryPosition: GridSummaryPosition = GridSummaryPosition.bottom;
public summaryCalcModes;
public summaryCalculationMode: GridSummaryCalculationMode = GridSummaryCalculationMode.rootAndChildLevels;
public selectionMode: GridSelectionMode = 'multiple' ;
constructor ( ) {
this .data = INVOICE_DATA;
this .expr = [
{ dir : SortingDirection.Asc, fieldName : 'ShipCountry' , ignoreCase : false ,
strategy : DefaultSortingStrategy.instance() }
];
this .summaryPositions = [
{
label : GridSummaryPosition.top,
selected : this .summaryPosition === GridSummaryPosition.top,
togglable : true
},
{
label : GridSummaryPosition.bottom,
selected : this .summaryPosition === GridSummaryPosition.bottom,
togglable : true
}
];
this .summaryCalcModes = [
{
label : 'Root Level Only' ,
selected : this .summaryCalculationMode === GridSummaryCalculationMode.rootLevelOnly,
togglable : true ,
value : GridSummaryCalculationMode.rootLevelOnly
},
{
label : 'Child Levels Only' ,
selected : this .summaryCalculationMode === GridSummaryCalculationMode.childLevelsOnly,
togglable : true ,
value : GridSummaryCalculationMode.childLevelsOnly
},
{
label : 'Root And Child Levels' ,
selected : this .summaryCalculationMode === GridSummaryCalculationMode.rootAndChildLevels,
togglable : true ,
value : GridSummaryCalculationMode.rootAndChildLevels
}
];
}
public selectSummaryPosition (event ) {
this .summaryPosition = this .summaryPositions[event.index].label;
this .grid1.summaryPosition = this .summaryPosition;
}
public selectSummaryCalcMode (event ) {
this .summaryCalculationMode = this .summaryCalcModes[event.index].value;
this .grid1.summaryCalculationMode = this .summaryCalculationMode;
}
public toggle (event ) {
this .grid1.showSummaryOnCollapse = !this .grid1.showSummaryOnCollapse;
}
public formatDate (val: Date ) {
return new Intl .DateTimeFormat('en-US' ).format(val);
}
public formatCurrency (value: number ) {
return '$' + value.toFixed(2 );
}
public isDate (value: any ) {
if (value instanceof Date ) {
return true ;
} else {
return false ;
}
}
}
ts コピー
<div class ="summary-chooser" >
<igx-buttongroup [values ]="summaryCalcModes" (selected )="selectSummaryCalcMode($event)" > </igx-buttongroup >
</div >
<div class ="summary-chooser" >
<igx-buttongroup [values ]="summaryPositions" (selected )="selectSummaryPosition($event)" > </igx-buttongroup >
</div >
<div class ="summary-chooser" >
<igx-switch labelPosition ="before" [checked ]='grid1.showSummaryOnCollapse' (change )='toggle($event)' > Show summary row when group row is collapsed:</igx-switch >
</div >
<igx-grid [igxPreventDocumentScroll ]="true" #grid1 [data ]="data" [width ]="'100%'" [height ]="'540px'" [rowSelection ]="selectionMode" [groupingExpressions ]="expr" >
<igx-column field ="ShipCountry" header ="Ship Country" width ="200px" [groupable ]="true" >
</igx-column >
<igx-column field ="ShipCity" header ="Ship City" width ="250px" [groupable ]="true" >
</igx-column >
<igx-column field ="UnitPrice" header ="Unit Price" width ="150px" [formatter ]="formatCurrency" dataType ="number" [groupable ]="true" [hasSummary ]="true" [summaries ]="avgSummary" >
</igx-column >
<igx-column field ="Quantity" header ="Quantity" width ="150px" dataType ="number" [groupable ]="true" [hasSummary ]="true" [summaries ]="sumSummary" >
</igx-column >
</igx-grid >
html コピー :host {
display : block;
padding : 16px ;
}
.summary-chooser {
margin-bottom : 16px ;
}
igx-buttongroup{
display : block;
width : 600px ;
}
scss コピー
Exportación de resúmenes
Existe una opción exportSummaries
en IgxExcelExporterOptions
que especifica si los datos exportados deben incluir los resúmenes del grid. El valor predeterminado exportSummaries
es falso .
IgxExcelExporterService
exportará los resúmenes predeterminados para todos los tipos de columnas como sus funciones de Excel equivalentes para que sigan funcionando correctamente cuando se modifique la hoja. Pruébelo usted mismo en el siguiente ejemplo:
import { Component, ViewChild } from '@angular/core' ;
import { ColumnType, IgxExcelExporterOptions, IgxExcelExporterService, IgxGridComponent, IgxNumberSummaryOperand, IgxSummaryResult, IgxButtonDirective, IgxColumnComponent, IgxCellTemplateDirective, IgxCellHeaderTemplateDirective, IgxIconComponent } from 'igniteui-angular' ;
import { DATA } from '../../data/nwindData' ;
import { IgxPreventDocumentScrollDirective } from '../../directives/prevent-scroll.directive' ;
import { DatePipe } from '@angular/common' ;
class MySummary {
public operate(data?: any []): IgxSummaryResult[] {
const result = new IgxNumberSummaryOperand().operate(data);
result.push({
key : 'test' ,
label : 'Test' ,
summaryResult : data.filter((rec ) => rec > 10 && rec < 30 ).length
});
return result;
}
}
@Component ({
selector : 'app-grid-summary-export' ,
styleUrls : ['./grid-summary-export.component.scss' ],
templateUrl : './grid-summary-export.component.html' ,
imports : [IgxButtonDirective, IgxGridComponent, IgxPreventDocumentScrollDirective, IgxColumnComponent, IgxCellTemplateDirective, IgxCellHeaderTemplateDirective, IgxIconComponent, DatePipe]
})
export class GridSummaryExportComponent {
@ViewChild ('grid' , { read : IgxGridComponent, static : true })
public grid: IgxGridComponent;
public mySummary = MySummary;
public data;
public productId = 0 ;
constructor (private excelExportService: IgxExcelExporterService ) {
this .data = DATA;
this .productId = DATA.length;
}
public toggleSummary (column: ColumnType ) {
column.hasSummary = !column.hasSummary;
}
public exportButtonHandler ( ) {
this .excelExportService.export(this .grid, new IgxExcelExporterOptions('ExportedFile' ));
}
}
ts コピー <div class ="grid__wrapper" >
<div class ="button-container" >
<button igxButton ="contained" (click )="exportButtonHandler()" > Export To Excel</button >
Press the button to export the Grid as a .xlsx file.
</div >
<igx-grid [igxPreventDocumentScroll ]="true" #grid [data ]="data" [autoGenerate ]="false" height ="650px" width ="100%" >
<igx-column #col field ="ProductID" header ="Product ID" [headerClasses ]="'prodId'" >
</igx-column >
<igx-column #col field ="ProductName" header ="Product Name" [headerClasses ]="'prodId'" [hasSummary ]="true" >
<ng-template igxCell let-cell ="cell" let-val >
{{val}}
</ng-template >
<ng-template igxHeader let-col >
<div class ="header-text" > {{col.field}}</div >
<igx-icon class ="header-icon" style.color ="{{ col.hasSummary ? '#e41c77' : '' }}" (click )="toggleSummary(col)" > functions</igx-icon >
</ng-template >
</igx-column >
<igx-column #col field ="UnitPrice" header ="Price" [filterable ]="false" [editable ]="true" dataType ="number"
[hasSummary ]="true" >
<ng-template igxCell let-cell ="cell" let-val let-row >
${{val}}
</ng-template >
<ng-template igxHeader let-col >
<div class ="header-text" > {{col.field}}</div >
<igx-icon class ="header-icon" style.color ="{{ col.hasSummary ? '#e41c77' : '' }}" (click )="toggleSummary(col)" > functions</igx-icon >
</ng-template >
</igx-column >
<igx-column #col field ="UnitsInStock" header ="Units In Stock" dataType ="number" [editable ]="true"
[hasSummary ]="false" [summaries ]="mySummary" >
<ng-template igxCell let-cell ="cell" let-val let-row >
{{val}}
</ng-template >
<ng-template igxHeader let-col >
<div class ="header-text" > {{col.field}}</div >
<igx-icon class ="header-icon" style.color ="{{ col.hasSummary ? '#e41c77' : '' }}" (click )="toggleSummary(col)" > functions</igx-icon >
</ng-template >
</igx-column >
<igx-column #col field ="Discontinued" header ="Discontinued" [hasSummary ]="true" [dataType ]="'boolean'" >
<ng-template igxCell let-cell ="cell" let-val >
@if (val) {
<img src ="https://www.infragistics.com/angular-demos-lob/assets/images/grid/active.png" title ="Continued" alt ="Continued" />
}
@if (!val) {
<img src ="https://www.infragistics.com/angular-demos-lob/assets/images/grid/expired.png" title ="Discontinued" alt ="Discontinued" />
}
</ng-template >
<ng-template igxHeader let-col >
<div class ="header-text" > {{col.field}}</div >
<igx-icon class ="header-icon" style.color ="{{ col.hasSummary ? '#e41c77' : '' }}" (click )="toggleSummary(col)" > functions</igx-icon >
</ng-template >
</igx-column >
<igx-column #col field ="OrderDate" [dataType ]="'date'" [hasSummary ]="true" >
<ng-template igxCell let-cell ="cell" let-val let-row >
{{ val | date: 'MMM d, yyyy' }}
</ng-template >
<ng-template igxHeader let-col >
<div class ="header-text" > {{col.field}}</div >
<igx-icon class ="header-icon" style.color ="{{ col.hasSummary ? '#e41c77' : '' }}" (click )="toggleSummary(col)" > functions</igx-icon >
</ng-template >
</igx-column >
</igx-grid >
</div >
html コピー .grid-controls {
display : flex;
flex-flow : column nowrap;
justify-content : space-between;
margin : 0 16px 24px ;
igx-switch {
margin-top : 24px ;
}
}
.grid__wrapper {
margin : 0 auto;
padding : 16px ;
}
.header {
height : 100% ;
}
:host ::ng-deep{
.igx-grid__th .title{
width: 100% ;
cursor : auto;
}
@media screen and (max-width : 677px ){
.header-icon {
padding-bottom : 17px ;
padding-top : 17px ;
font-size : 1.4em ;
width : 1.1em ;
height : 1.1em ;
float : right;
}
.header-text {
float :left ;
white-space : nowrap;
overflow : hidden;
text-overflow : ellipsis;
width : 50% ;
}
}
@media screen and (min-width : 677px ){
.header-icon {
padding-top : 17px ;
font-size : 1.4em ;
width : 1.1em ;
height : 1.1em ;
float : right;
}
.header-text {
float :left ;
white-space : nowrap;
overflow : hidden;
text-overflow : ellipsis;
width : 50% ;
}
}
@media screen and (min-width : 992px ){
.header-icon {
padding-top : 17px ;
font-size : 1.4em ;
width : 1.1em ;
height : 1.1em ;
float : right;
margin-right : 10px ;
cursor : pointer;
}
.header-text {
float :left ;
white-space : nowrap;
width : 50% ;
cursor : auto;
}
}
}
.button-container {
margin : 25px auto;
}
scss コピー
El archivo exportado incluye una columna oculta que contiene el nivel de cada DataRecord
en la hoja. Este nivel se utiliza en los resúmenes para filtrar las celdas que deben incluirse en la función de resumen.
En la siguiente tabla, puede encontrar la fórmula de Excel correspondiente a cada uno de los resúmenes predeterminados.
Tipo de datos
Función
Función Excel
string
, boolean
contar
="Contar: "&CONTAR.SI(inicio:fin, nivel de registro)
number
, currency
, percent
contar
="Contar: "&CONTAR.SI(inicio:fin, nivel de registro)
mín.
="Min: "&MIN(IF(inicio:fin=nivel de registro, inicio de rango:fin de rango))
máximo
="Máx: "&MAX(IF(inicio:fin=nivel de registro, inicio de rango:fin de rango))
promedio
="Promedio: "&PROMEDIOIF(inicio:fin, nivel de registro, inicio de rango:fin de rango)
suma
="Suma: "&SUMIF(inicio:fin, nivel de registro, inicio de rango:fin de rango)
date
contar
="Contar: "&CONTAR.SI(inicio:fin, nivel de registro)
más temprano
="Más temprano: "& TEXT(MIN(IF(start:end=recordLevel, rangeStart:rangeEnd)), formato)
el último
="Último: "&TEXT(MAX(IF(start:end=recordLevel, rangeStart:rangeEnd)), formato)
Limitaciones conocidas
Limitación
Descripción
Exportar resúmenes personalizados
Los resúmenes personalizados se exportarán como cadenas en lugar de funciones de Excel.
Exportar resúmenes con plantillas
Los resúmenes con plantilla no son compatibles y se exportarán como los predeterminados.
Navegación por teclado
Se puede navegar por las filas de resumen con las siguientes interacciones de teclado:
ARRIBA : navega una celda hacia arriba
ABAJO : navega una celda hacia abajo
IZQUIERDA : navega una celda hacia la izquierda
DERECHA : navega una celda hacia la derecha
CTRL + IZQUIERDA o INICIO : navega a la celda más a la izquierda
CTRL + DERECHA o FINAL : navega a la celda más a la derecha
Estilo
Para comenzar a diseñar el comportamiento de clasificación, necesitamos importar el archivo index
, donde se encuentran todas las funciones del tema y los mixins de componentes:
@use "igniteui-angular/theming" as *;
scss
Siguiendo el enfoque más simple, creamos un nuevo tema que extiende el grid-summary-theme
y acepta $background-color
, $focus-background-color
, $label-color
, $result-color
, $pinned-border-width
, Parámetros $pinned-border-style
y $pinned-border-color
.
$custom-theme : grid-summary-theme(
$background-color : #e0f3ff ,
$focus-background-color : rgba(#94d1f7 , .3 ),
$label-color : #e41c77 ,
$result-color : black,
$pinned-border-width : 2px ,
$pinned-border-style : dotted,
$pinned-border-color : #e41c77
);
scss
En lugar de codificar los valores de color como acabamos de hacer, podemos lograr una mayor flexibilidad en términos de colores mediante el uso de las palette
funciones y color
. Consulte el Palettes
tema para obtener orientación detallada sobre cómo usarlos.
El último paso es incluir el tema personalizado del componente:
@include css-vars($custom-theme );
scss
Si el componente utiliza una ViewEncapsulation Emulated
, es necesario penetrate
esta encapsulación usando::ng-deep
:
:host {
::ng-deep {
@include css-vars($custom-theme );
}
}
scss
Manifestación
import { Component, OnInit, ViewChild, ViewEncapsulation } from '@angular/core' ;
import { DefaultSortingStrategy, GridSelectionMode, GridSummaryCalculationMode, GridSummaryPosition, IgxGridComponent, IgxNumberSummaryOperand, IgxSummaryOperand, IgxSummaryResult, ISortingExpression, SortingDirection, IgxButtonGroupComponent, IgxGridToolbarComponent, IgxGridToolbarActionsComponent, IgxGridToolbarPinningComponent, IgxColumnComponent } from 'igniteui-angular' ;
import { INVOICE_DATA } from '../../data/invoiceData' ;
import { IgxPreventDocumentScrollDirective } from '../../directives/prevent-scroll.directive' ;
class CustomSummary {
public operate(data?: any []): IgxSummaryResult[] {
const result = [];
result.push({
key : 'sum' ,
label : 'Sum' ,
summaryResult : IgxNumberSummaryOperand.sum(data)
}, {
key : 'count' ,
label : 'Count' ,
summaryResult : data.length ? data.length : 0
});
return result;
}
}
@Component ({
selector : 'app-grid-groupby-summary-sample' ,
styleUrls : ['./grid-groupby-summary-styling-sample.component.scss' ],
templateUrl : './grid-groupby-summary-styling-sample.component.html' ,
imports : [IgxButtonGroupComponent, IgxGridComponent, IgxPreventDocumentScrollDirective, IgxGridToolbarComponent, IgxGridToolbarActionsComponent, IgxGridToolbarPinningComponent, IgxColumnComponent]
})
export class GridGroupBySummaryStylingSampleComponent {
@ViewChild ('grid1' , { read : IgxGridComponent, static : true })
public grid1: IgxGridComponent;
public data;
public expr: ISortingExpression[];
public customSummary = CustomSummary;
public summaryPositions;
public summaryPosition: GridSummaryPosition = GridSummaryPosition.bottom;
public summaryCalcModes;
public summaryCalculationMode: GridSummaryCalculationMode = GridSummaryCalculationMode.rootAndChildLevels;
public selectionMode: GridSelectionMode = 'multiple' ;
constructor ( ) {
this .data = INVOICE_DATA;
this .expr = [
{ dir : SortingDirection.Asc, fieldName : 'ShipCountry' , ignoreCase : false ,
strategy : DefaultSortingStrategy.instance() }
];
this .summaryPositions = [
{
label : GridSummaryPosition.top,
selected : this .summaryPosition === GridSummaryPosition.top,
togglable : true
},
{
label : GridSummaryPosition.bottom,
selected : this .summaryPosition === GridSummaryPosition.bottom,
togglable : true
}
];
this .summaryCalcModes = [
{
label : 'Root Level Only' ,
selected : this .summaryCalculationMode === GridSummaryCalculationMode.rootLevelOnly,
togglable : true ,
value : GridSummaryCalculationMode.rootLevelOnly
},
{
label : 'Child Levels Only' ,
selected : this .summaryCalculationMode === GridSummaryCalculationMode.childLevelsOnly,
togglable : true ,
value : GridSummaryCalculationMode.childLevelsOnly
},
{
label : 'Root And Child Levels' ,
selected : this .summaryCalculationMode === GridSummaryCalculationMode.rootAndChildLevels,
togglable : true ,
value : GridSummaryCalculationMode.rootAndChildLevels
}
];
}
public selectSummaryPosition (event ) {
this .summaryPosition = this .summaryPositions[event.index].label;
this .grid1.summaryPosition = this .summaryPosition;
}
public selectSummaryCalcMode (event ) {
this .summaryCalculationMode = this .summaryCalcModes[event.index].value;
this .grid1.summaryCalculationMode = this .summaryCalculationMode;
}
public formatDate (val: Date ) {
return new Intl .DateTimeFormat('en-US' ).format(val);
}
public formatCurrency (value: number ) {
return '$' + value.toFixed(2 );
}
public isDate (value: any ) {
if (value instanceof Date ) {
return true ;
} else {
return false ;
}
}
}
ts コピー <div class ="grid-wrapper" >
<div class ="summary-chooser" >
<igx-buttongroup [values ]="summaryCalcModes" (selected )="selectSummaryCalcMode($event)" > </igx-buttongroup >
</div >
<div class ="summary-chooser" >
<igx-buttongroup [values ]="summaryPositions" (selected )="selectSummaryPosition($event)" > </igx-buttongroup >
</div >
<igx-grid [igxPreventDocumentScroll ]="true" #grid1 [data ]="data" [width ]="'100%'" [height ]="'570px'" [rowSelection ]='selectionMode' [groupingExpressions ]='expr' >
<igx-grid-toolbar >
<igx-grid-toolbar-actions >
<igx-grid-toolbar-pinning > </igx-grid-toolbar-pinning >
</igx-grid-toolbar-actions >
</igx-grid-toolbar >
<igx-column field ="ShipCountry" header ="Ship Country" width ="200px" [groupable ]="true" [pinned ]="true" >
</igx-column >
<igx-column field ="ShipCity" header ="Ship City" width ="250px" [groupable ]="true" >
</igx-column >
<igx-column field ="UnitPrice" header ="Unit Price" width ="150px" [formatter ]="formatCurrency" dataType ="number" [groupable ]="true" [hasSummary ]="true" >
</igx-column >
<igx-column field ="Quantity" header ="Quantity" width ="150px" dataType ="number" [groupable ]="true" [hasSummary ]="true" [summaries ]="customSummary" >
</igx-column >
</igx-grid >
</div >
html コピー @use "layout.scss" ;
@use "igniteui-angular/theming" as *;
$summaries-background : #e0f3ff ;
$custom-theme : grid-summary-theme(
$background-color : $summaries-background ,
$focus-background-color : rgba(#94d1f7 , 0.3 ),
$label-color : #e41c77 ,
$result-color : black,
$pinned-border-width : 2px ,
$pinned-border-style : dotted,
$pinned-border-color : #e41c77 ,
);
:host {
::ng-deep {
igx-grid-summary-row {
--summaries-patch-background: #{$summaries-background };
}
@include css-vars($custom-theme );
}
}
scss コピー
Referencias de API
Recursos adicionales
Nuestra comunidad es activa y siempre da la bienvenida a nuevas ideas.