Searching in Angular Grid component
3 Aug 202424 minutes to read
The Syncfusion Angular Grid includes a powerful built-in searching feature that allows users to search for specific data within the grid. This feature enables efficient filtering of grid records based on user-defined search criteria, making it easier to locate and display relevant information. Whether you have a large dataset or simply need to find specific records quickly, the search feature provides a convenient solution.
To use the searching feature, need to inject SearchService in the provider section of your AppModule. And set the allowSearching property to true to enable the searching feature in the grid.
To further enhance the search functionality, you can integrate a search text box directly into the grid’s toolbar. This allows users to enter search criteria conveniently within the grid interface. To add the search item to the grid’s toolbar, use the toolbar property and add Search item.
import { NgModule } from '@angular/core'
import { BrowserModule } from '@angular/platform-browser'
import { GridModule, SearchService, ToolbarService } from '@syncfusion/ej2-angular-grids'
import { Component, OnInit } from '@angular/core';
import { data } from './datasource';
import { ToolbarItems } from '@syncfusion/ej2-angular-grids';
@Component({
imports: [
GridModule
],
providers: [SearchService, ToolbarService],
standalone: true,
selector: 'app-root',
template: `<ejs-grid [dataSource]='data' [toolbar]='toolbarOptions' height='272px'>
<e-columns>
<e-column field='OrderID' headerText='Order ID' textAlign='Right' width=90></e-column>
<e-column field='CustomerID' headerText='Customer ID' width=100></e-column>
<e-column field='Freight' headerText='Freight' textAlign='Right' format='C' width=80></e-column>
<e-column field='OrderDate' headerText='Order Date' textAlign='Right' format='yMd' width=100></e-column>
</e-columns>
</ejs-grid>`
})
export class AppComponent implements OnInit {
public data?: object[];
public toolbarOptions?: ToolbarItems[];
ngOnInit(): void {
this.data = data;
this.toolbarOptions = ['Search'];
}
}
import { bootstrapApplication } from '@angular/platform-browser';
import { AppComponent } from './app.component';
import 'zone.js';
bootstrapApplication(AppComponent).catch((err) => console.error(err));
- The clear icon is shown in the Data Grid search text box when it is focused on search text or after typing the single character in the search text box. A single click of the clear icon clears the text in the search box as well as the search results in the Grid.
- In Syncfusion Grid component, searching operates independently for parent and child grids. Searching within the parent grid filters only parent records, and similarly, searching within the child grid filters only child records. The component does not support simultaneous searching across both parent and child grids.
Initial search
By default, the search operation can be performed on the grid data after the grid renders. However, there might be scenarios where need to perform a search operation on the grid data during the initial rendering of the grid. In such cases, you can make use of the initial search feature provided by the grid.
To apply search at initial rendering, need to set the following properties in the searchSettings object.
Property | Description |
---|---|
fields | Specifies the fields in which the search operation needs to be performed. |
operator | Specifies the operator to be used for the search operation. |
key | Specifies the key value to be searched. |
ignoreCase | ignoreCase specifies whether the search operation needs to be case-sensitive or case-insensitive. |
ignoreAccent | ignoreAccent property will ignore the diacritic characters or accents in the text during a search operation. |
The following example demonstrates how to set an initial search in the grid using the searchSettings
property. The searchSettings
property is set with the following values:
-
fields
: CustomerID specifies that the search should be performed only in the ‘CustomerID’ field. -
operator
: contains indicates that the search should find records that contain the specified search key. -
key
: Ha is the initial search key that will be applied when the grid is rendered. -
ignoreCase
: true makes the search case-insensitive. -
ignoreAccent
: true will ignores diacritic characters or accents during the search operation.
import { NgModule } from '@angular/core'
import { BrowserModule } from '@angular/platform-browser'
import { GridModule, SearchService, ToolbarService } from '@syncfusion/ej2-angular-grids'
import { Component, OnInit } from '@angular/core';
import { data } from './datasource';
import { ToolbarItems, SearchSettingsModel } from '@syncfusion/ej2-angular-grids';
@Component({
imports: [
GridModule
],
providers: [SearchService, ToolbarService],
standalone: true,
selector: 'app-root',
template: `<ejs-grid [dataSource]='data' [searchSettings]='searchOptions' [toolbar]='toolbarOptions' height='272px'>
<e-columns>
<e-column field='OrderID' headerText='Order ID' textAlign='Right' width=90></e-column>
<e-column field='CustomerID' headerText='Customer ID' width=100></e-column>
<e-column field='Freight' headerText='Freight' textAlign='Right' format='C' width=80></e-column>
<e-column field='OrderDate' headerText='Order Date' textAlign='Right' format='yMd' width=100></e-column>
</e-columns>
</ejs-grid>`
})
export class AppComponent implements OnInit {
public data?: object[];
public toolbarOptions?: ToolbarItems[];
public searchOptions?: SearchSettingsModel;
ngOnInit(): void {
this.data = data;
this.searchOptions = { fields: ['CustomerID'], operator: 'contains', key: 'Ha', ignoreCase: true, ignoreAccent:true };
this.toolbarOptions = ['Search'];
}
}
import { bootstrapApplication } from '@angular/platform-browser';
import { AppComponent } from './app.component';
import 'zone.js';
bootstrapApplication(AppComponent).catch((err) => console.error(err));
By default, grid searches all the bound column values. However, you can customize this behavior by definining the searchSettings.fields property.
Search operators
Search operators are symbols or keywords used to define the type of comparison or condition applied during a search operation. They help specify how the search key should match the data being searched. The searchSettings.operator property can be used to define the search operator in the grid.
By default, the searchSettings.operator
is set to contains, which returns the values contains the search key. The following operators are supported in searching:
Operator | Description |
---|---|
startswith | Checks whether a value begins with the specified value. |
endswith | Checks whether a value ends with the specified value. |
contains | Checks whether a value contains with the specified value. |
wildcard | Processes one or more search patterns using the “*“ symbol, returning values that match the given patterns. |
like | Processes a single search pattern using the ”%” symbol, retrieving values that match the specified pattern. |
equal | Checks whether a value equal to the specified value. |
notequal | Checks whether a value not equal to the specified value. |
These operators provide flexibility in defining the search behavior and allow you to perform different types of comparisons based on your requirements.
The following example demonstrates how to set the searchSettings.operator
property based on changing the dropdown value using the change event of the DropDownList component.
import { NgModule } from '@angular/core'
import { BrowserModule } from '@angular/platform-browser'
import { GridModule, SearchService, ToolbarService } from '@syncfusion/ej2-angular-grids'
import { DropDownListAllModule } from '@syncfusion/ej2-angular-dropdowns'
import { Component, OnInit,ViewChild } from '@angular/core';
import { data } from './datasource';
import { GridComponent, ToolbarItems,SearchSettingsModel } from '@syncfusion/ej2-angular-grids';
import { ChangeEventArgs } from '@syncfusion/ej2-angular-dropdowns';
@Component({
imports: [
GridModule,
DropDownListAllModule
],
providers: [SearchService, ToolbarService],
standalone: true,
selector: 'app-root',
template: `
<div style="display: flex">
<label style="padding: 10px 10px 26px 0">
Change the search operators:
</label>
<ejs-dropdownlist
style="margin-top:5px"
id="value"
#dropdown
index="0"
width="100"
[dataSource]="ddlData"
[fields]='fields'
(change)="valueChange($event)"
></ejs-dropdownlist>
</div>
<ejs-grid #grid style="padding: 5px 5px" [dataSource]='data' [toolbar]='toolbarOptions' [searchSettings]="searchSettings" height='272px'>
<e-columns>
<e-column field='OrderID' headerText='Order ID' textAlign='Right' width=90></e-column>
<e-column field='CustomerID' headerText='Customer ID' width=100></e-column>
<e-column field='ShipName' headerText='Ship Name' width=110></e-column>
<e-column field='ShipCountry' headerText='Ship Country' textAlign='Right' width=100></e-column>
</e-columns>
</ejs-grid>`
})
export class AppComponent implements OnInit {
public data?: object[];
public toolbarOptions?: ToolbarItems[];
public searchSettings?: SearchSettingsModel
@ViewChild('grid') public grid?: GridComponent;
public fields?: object = { text: 'text', value: 'value' };
public ddlData?: object[] = [
{ text: 'startswith', value: 'startswith' },
{ text: 'endswith', value: 'endswith' },
{ text: 'wildcard', value: 'wildcard' },
{ text: 'like', value: 'like' },
{ text: 'equal', value: 'equal' },
{ text: 'not equal', value: 'notequal' },
];
ngOnInit(): void {
this.data = data;
this.toolbarOptions = ['Search'];
this.searchSettings = { operator: 'contains' };
}
valueChange(args: ChangeEventArgs): void {
(this.grid as GridComponent).searchSettings.operator = args.value as string;
}
}
import { bootstrapApplication } from '@angular/platform-browser';
import { AppComponent } from './app.component';
import 'zone.js';
bootstrapApplication(AppComponent).catch((err) => console.error(err));
Search by external button
The Syncfusion Grid component allows you to perform searches programmatically, enabling you to search for records using an external button instead of relying solely on the built-in search bar. This feature provides flexibility and allows for custom search implementations within your application. To search for records using an external button, you can utilize the search method provided by the Grid component.
The search
method allows you to perform a search operation based on a search key or criteria. The following example demonstatres how to implement search
by an external button using the following steps:
- Add a button element outside of the grid component.
- Attach a click event handler to the button.
- Inside the event handler, get the reference of the grid component.
- Invoke the
search
method of the grid by passing the search key as a parameter.
import { NgModule } from '@angular/core'
import { BrowserModule } from '@angular/platform-browser'
import { GridComponent,GridModule, SearchService, ToolbarService } from '@syncfusion/ej2-angular-grids'
import { ButtonModule } from '@syncfusion/ej2-angular-buttons'
import { TextBoxModule,TextBoxComponent } from '@syncfusion/ej2-angular-inputs'
import { Component, OnInit, ViewChild } from '@angular/core';
import { data } from './datasource';
@Component({
imports: [ GridModule, ButtonModule,TextBoxModule],
providers: [SearchService, ToolbarService],
standalone: true,
selector: 'app-root',
template: `
<div class="e-float-input" style="width: 120px; display: inline-block;">
<ejs-textbox #searchInput width="100" placeholder="Search text"></ejs-textbox>
<span class="e-float-line"></span>
</div>
<button ejs-button id='search' (click)='search()'>Search</button>
<ejs-grid #grid [dataSource]='data' height='260px'>
<e-columns>
<e-column field='OrderID' headerText='Order ID' textAlign='Right' width=90></e-column>
<e-column field='CustomerID' headerText='Customer ID' width=100></e-column>
<e-column field='ShipCity' headerText='Ship City' width=100></e-column>
<e-column field='ShipName' headerText='Ship Name' width=120></e-column>
</e-columns>
</ejs-grid>`
})
export class AppComponent implements OnInit {
public data?: object[];
@ViewChild('grid') public grid?: GridComponent;
@ViewChild('searchInput') public searchInput?: TextBoxComponent;
ngOnInit(): void {
this.data = data;
}
search() {
const searchText: string = (this.searchInput as TextBoxComponent).value;
(this.grid as GridComponent).search(searchText);
}
}
import { bootstrapApplication } from '@angular/platform-browser';
import { AppComponent } from './app.component';
import 'zone.js';
bootstrapApplication(AppComponent).catch((err) => console.error(err));
Search specific columns
By default, the search functionality searches all visible columns. However, if you want to search
only specific columns, you can define the specific column’s field names in the searchSettings.fields property. This allows you to narrow down the search to a targeted set of columns, which is particularly useful when dealing with large datasets or grids with numerous columns.
The following example demonstrates how to search specific columns such as CustomerID, Freight, and ShipCity by using the searchSettings.fields
property.
import { NgModule } from '@angular/core'
import { BrowserModule } from '@angular/platform-browser'
import { GridModule, SearchService, ToolbarService } from '@syncfusion/ej2-angular-grids'
import { Component, OnInit } from '@angular/core';
import { data } from './datasource';
import { ToolbarItems, SearchSettingsModel } from '@syncfusion/ej2-angular-grids';
@Component({
imports: [
GridModule
],
providers: [SearchService, ToolbarService],
standalone: true,
selector: 'app-root',
template: `<ejs-grid #grid [dataSource]='data' [height]='260' [searchSettings]='searchSettings' [toolbar]='toolbar' >
<e-columns>
<e-column field='OrderID' headerText='Order ID' textAlign='Right' width=90></e-column>
<e-column field='CustomerID' headerText='Customer ID' width=100></e-column>
<e-column field='Freight' headerText='Freight' textAlign='Center' format='C2' width=80></e-column>
<e-column field='ShipCity' headerText='Ship City' width=100 ></e-column>
</e-columns>
</ejs-grid>`
})
export class AppComponent implements OnInit {
public data?: object[];
public searchSettings?: SearchSettingsModel;
public toolbar?: ToolbarItems[];
ngOnInit(): void {
this.data = data;
this.toolbar = ['Search'];
this.searchSettings = {fields: ['CustomerID', 'Freight', 'ShipCity']};
}
}
import { bootstrapApplication } from '@angular/platform-browser';
import { AppComponent } from './app.component';
import 'zone.js';
bootstrapApplication(AppComponent).catch((err) => console.error(err));
Search on each key stroke
The search on each keystroke feature in Syncfusion Grid enables you to perform real-time searching of grid data as they type in the search text box. This functionality provides a seamless and interactive searching experience, allowing you to see the search results dynamically updating in real time as they enter each keystroke in the search box
To achieve this, you need to bind the keyup
event to the search input element inside the created event of the grid component.
In the following example, the created
event is bound to the grid component, and inside the event handler, the keyup
event is bound to the search input element. Whenever the keyup
event is triggered, the current search
string is obtained from the search
input element, and the search
method is invoked on the grid instance with the current search string as a parameter. This allows the search results to be displayed in real-time as you type in the search box.
import { NgModule } from '@angular/core'
import { BrowserModule } from '@angular/platform-browser'
import { GridModule, SearchService, ToolbarService } from '@syncfusion/ej2-angular-grids'
import { Component, OnInit, ViewChild } from '@angular/core';
import { data } from './datasource';
import { ToolbarItems, GridComponent } from '@syncfusion/ej2-angular-grids';
@Component({
imports: [
GridModule
],
providers: [SearchService, ToolbarService],
standalone: true,
selector: 'app-root',
template: `<ejs-grid #grid [dataSource]='data' [toolbar]='toolbarOptions' (created)='created()' height='400' width='100%'>
<e-columns>
<e-column field='OrderID' headerText='Order ID' textAlign='Right' width=90></e-column>
<e-column field='CustomerID' headerText='Customer ID' width=100></e-column>
<e-column field='EmployeeID' headerText='Employee ID' textAlign='Right' width=80></e-column>
<e-column field='ShipCity' headerText='Ship City' width=100></e-column>
<e-column field='ShipCountry' headerText='Ship Country' width=100></e-column>
<e-column field='ShipName' headerText='Ship Name' width=120></e-column>
</e-columns>
</ejs-grid>`
})
export class AppComponent implements OnInit {
public data?: object[];
public toolbarOptions?: ToolbarItems[];
@ViewChild('grid')
public grid?: GridComponent;
ngOnInit(): void {
this.data = data;
this.toolbarOptions = ['Search'];
}
created(): void {
(document.getElementById((this.grid as GridComponent).element.id + "_searchbar") as Element).addEventListener('keyup', () => {
(this.grid as GridComponent).search(((event as MouseEvent).target as HTMLInputElement).value)
});
}
}
import { bootstrapApplication } from '@angular/platform-browser';
import { AppComponent } from './app.component';
import 'zone.js';
bootstrapApplication(AppComponent).catch((err) => console.error(err));
Search on each key stroke approach may affect the performance of the application when dealing with a large number of records.
Perform search based on column formatting
By default, the search operation considers the underlying raw data of each cell for searching. However, in some cases, you may want to search based on the formatted data visible to the users. To search data based on column formatting, you can utilize the grid.valueFormatterService.fromView
method within the actionBegin event. This method allows you to retrieve the formatted value of a cell and perform searching on each column using the OR predicate.
The following example demonstrates how to implement searching based on column formatting in the Grid. In the actionBegin
event, retrieve the search value from the getColumns method. Iterate through the columns and check whether the column has a format specified. If the column has a format specified, use the grid.valueFormatterService.fromView
method to get the formatted value of the cell. If the formatted value matches the search value, set the OR predicate that includes the current column filter and the new filter based on the formatted value.
import { NgModule } from '@angular/core'
import { BrowserModule } from '@angular/platform-browser'
import { GridModule, SearchService, ToolbarService } from '@syncfusion/ej2-angular-grids'
import { Component, OnInit,ViewChild } from '@angular/core';
import { data } from './datasource';
import { GridComponent, ToolbarItems,SearchEventArgs, KeyboardEventArgs } from '@syncfusion/ej2-angular-grids';
import { Query, Predicate } from '@syncfusion/ej2-data';
@Component({
imports: [
GridModule
],
providers: [SearchService, ToolbarService],
standalone: true,
selector: 'app-root',
template: `<ejs-grid #grid [dataSource]='data' [toolbar]='toolbarOptions' height='272px' (actionBegin)="actionBegin($event)" (keyPressed)="keyPressed($event)">
<e-columns>
<e-column field='OrderID' headerText='Order ID' textAlign='Right' width=90></e-column>
<e-column field='CustomerID' headerText='Customer ID' width=100></e-column>
<e-column field='Freight' headerText='Freight' textAlign='Right' format='C' width=80></e-column>
<e-column field='OrderDate' headerText='Order Date' textAlign='Right' format='yMd' width=100></e-column>
</e-columns>
</ejs-grid>`
})
export class AppComponent implements OnInit {
public data?: object[];
public toolbarOptions?: ToolbarItems[];
@ViewChild('grid') public grid?: GridComponent;
ngOnInit(): void {
this.data = data;
this.toolbarOptions = ['Search'];
}
actionBegin(args:SearchEventArgs) {
if (args.requestType == 'searching') {
args.cancel = true;
setTimeout(() => {
var columns = (this.grid as GridComponent).getColumns();
var predicate = null;
for (var i = 0; i < columns.length; i++) {
var val = (this.grid as GridComponent).valueFormatterService.fromView(
args.searchString as string,
columns[i].getParser(),
columns[i].type
);
if (val) {
if (predicate == null) {
predicate = new Predicate(
columns[i].field,
'contains',
val,
true,
true
);
} else {
predicate = predicate.or(
columns[i].field,
'contains',
val,
true,
true
);
}
}
}
(this.grid as GridComponent).query = new Query().where(predicate as Predicate);
}, 200);
}
}
keyPressed(args: KeyboardEventArgs) {
if (
args.key == 'Enter' &&
args.target instanceof HTMLElement &&
args.target.closest('.e-search') &&
(args.target as HTMLInputElement).value == ''
) {
args.cancel = true;
(this.grid as GridComponent).query = new Query();
}
}
}
import { bootstrapApplication } from '@angular/platform-browser';
import { AppComponent } from './app.component';
import 'zone.js';
bootstrapApplication(AppComponent).catch((err) => console.error(err));
Perform search operation in Grid using multiple keywords
In addition to searching with a single keyword, the Grid component offers the capability to perform a search operation using multiple keywords. This feature enables you to narrow down your search results by simultaneously matching multiple keywords. It can be particularly useful when you need to find records that meet multiple search conditions simultaneously. This can be achieved by the actionBegin event of the Grid.
The following example demonstrates, how to perform a search with multiple keywords in the grid by using the query
property when the requestType
is searching in the actionBegin
event. The searchString is divided into multiple keywords using a comma (,) as the delimiter. Each keyword is then utilized to create a predicate
that checks for a match in the desired columns. If multiple keywords are present, the predicates are combined using an OR condition. Finally, the Grid’s query
property is updated with the constructed predicate
, and the Grid is refreshed to update the changes in the UI.
On the other hand, the actionComplete event is used to manage the completion of the search
operation. It ensures that the search input value is updated if necessary and clears the query
when the search input is empty.
import { NgModule } from '@angular/core'
import { BrowserModule } from '@angular/platform-browser'
import { GridModule, SearchService, ToolbarService } from '@syncfusion/ej2-angular-grids'
import { Component, OnInit, ViewChild } from '@angular/core';
import { data } from './datasource';
import { ToolbarItems, SearchSettingsModel, GridComponent, SearchEventArgs, Column } from '@syncfusion/ej2-angular-grids';
import { Predicate, Query, } from '@syncfusion/ej2-data';
@Component({
imports: [
GridModule
],
providers: [SearchService, ToolbarService],
standalone: true,
selector: 'app-root',
template: `<ejs-grid #Grid [dataSource]='data' [toolbar]='toolbarOptions' [searchSettings]='searchOptions'(actionBegin)="actionBegin($event)" (actionComplete)="actionComplete($event)" height='400' width='100%'>
<e-columns>
<e-column field='OrderID' headerText='Order ID' textAlign='Right' width=90></e-column>
<e-column field='CustomerID' headerText='Customer ID' width=100></e-column>
<e-column field='EmployeeID' headerText='Employee ID' textAlign='Right' width=80></e-column>
<e-column field='ShipCity' headerText='Ship City' width=100></e-column>
<e-column field='ShipCountry' headerText='Ship Country' width=100></e-column>
<e-column field='ShipName' headerText='Ship Name' width=120></e-column>
</e-columns>
</ejs-grid>`
})
export class AppComponent implements OnInit {
public values?: string;
public key = '';
public removeQuery = false;
public valueAssign = false;
public data?: object[];
public toolbarOptions?: ToolbarItems[];
public searchOptions?: SearchSettingsModel;
@ViewChild('Grid') public grid?: GridComponent;
ngOnInit(): void {
this.data = data;
this.searchOptions = {
fields: [
'OrderID',
'CustomerID',
'EmployeeID',
'ShipCity',
'ShipCountry',
'ShipName'
],
operator: 'contains',
key: '',
ignoreCase: true,
};
this.toolbarOptions = ['Search'];
}
actionBegin({ requestType, searchString }: SearchEventArgs) {
if (requestType == 'searching') {
const keys = (searchString as string).split(',');
var flag = true;
var predicate: any;
if (keys.length > 1) {
if ((this.grid as GridComponent).searchSettings.key !== '') {
this.values = searchString;
keys.forEach((key: string) => {
(this.grid as GridComponent).getColumns().forEach((col: Column) => {
if (flag) {
predicate = new Predicate(col.field, 'contains', key, true);
flag = false;
}
else {
var predic = new Predicate(col.field, 'contains', key, true);
predicate = predicate.or(predic);
}
});
});
(this.grid as GridComponent).query = new Query().where(predicate);
(this.grid as GridComponent).searchSettings.key = '';
this.valueAssign = true;
this.removeQuery = true;
(this.grid as GridComponent).refresh();
}
}
}
}
actionComplete(args: SearchEventArgs) {
if (args.requestType === 'refresh' && this.valueAssign) {
const searchBar = document.querySelector<HTMLInputElement>('#' + (this.grid as GridComponent).element.id + '_searchbar');
if (searchBar) {
searchBar.value = this.values || '';
this.valueAssign = false;
}
else if (
args.requestType === 'refresh' &&
this.removeQuery
) {
const searchBar = document.querySelector<HTMLInputElement>('#' + (this.grid as GridComponent).element.id + '_searchbar');
if (searchBar) {
searchBar.value = '';
}
(this.grid as GridComponent).query = new Query();
this.removeQuery = false;
(this.grid as GridComponent).refresh();
}
}
}
}
import { bootstrapApplication } from '@angular/platform-browser';
import { AppComponent } from './app.component';
import 'zone.js';
bootstrapApplication(AppComponent).catch((err) => console.error(err));
By using this approach, you can perform a search operation in the grid using multiple keywords.
How to ignore accent while searching
By default, the searching operation in the Grid component does not ignore diacritic characters or accents. However, there are cases where ignoring diacritic characters becomes necessary. This feature enhances the search experience by enabling data searching without considering accents, ensuring a more comprehensive and accurate search and it can be achieved by utilizing the searchSettings.ignoreAccent property of the Grid component as true.
The following example demonstrates how to define the ignoreAccent
property within the searchSettings property of the grid. Additionally, the EJ2 Toggle Switch Button component is included to modify the value of the searchSettings.ignoreAccent
property. When the switch is toggled, the change event is triggered, and the searchSettings.ignoreAccent
property is updated accordingly. This functionality helps to visualize the impact of the searchSettings.ignoreAccent
setting when performing search operations.
import { NgModule } from '@angular/core'
import { BrowserModule } from '@angular/platform-browser'
import { GridModule, SearchService, ToolbarService } from '@syncfusion/ej2-angular-grids'
import {
ButtonModule,
CheckBoxModule,
RadioButtonModule,
SwitchModule,
} from '@syncfusion/ej2-angular-buttons'
import { Component, OnInit,ViewChild } from '@angular/core';
import { data } from './datasource';
import { ToolbarItems, GridComponent } from '@syncfusion/ej2-angular-grids';
import { ChangeEventArgs } from '@syncfusion/ej2-angular-buttons';
@Component({
imports: [
GridModule,
ButtonModule,
CheckBoxModule,
RadioButtonModule,
SwitchModule,
],
providers: [SearchService, ToolbarService],
standalone: true,
selector: 'app-root',
template: `
<div>
<label style="padding: 10px 10px">
Enable or disable ignoreAccent property
</label>
<ejs-switch id="switch" (change)="onSwitchChange($event)"></ejs-switch>
</div>
<ejs-grid #grid [dataSource]='data' [toolbar]='toolbarOptions' height='272px'>
<e-columns>
<e-column field='CategoryName' headerText='Category Name' width='100'></e-column>
<e-column field='ProductName' headerText='Product Name' width='130'></e-column>
<e-column field='QuantityPerUnit' headerText='Quantity per unit' width='150' textAlign='Right'></e-column>
<e-column field='UnitsInStock' headerText='Units In Stock' width='80' textAlign='Right'></e-column>
</e-columns>
</ejs-grid>`
})
export class AppComponent implements OnInit {
public data?: object[];
public toolbarOptions?: ToolbarItems[];
@ViewChild('grid')
public grid?: GridComponent;
ngOnInit(): void {
this.data = data;
this.toolbarOptions = ['Search'];
}
onSwitchChange(args: ChangeEventArgs) {
if (args.checked) {
(this.grid as GridComponent).searchSettings.ignoreAccent = true;
} else {
(this.grid as GridComponent).searchSettings.ignoreAccent = false;
}
}
}
import { bootstrapApplication } from '@angular/platform-browser';
import { AppComponent } from './app.component';
import 'zone.js';
bootstrapApplication(AppComponent).catch((err) => console.error(err));
- You can set searchSettings.ignoreAccent property along with other search settings such as fields, operator, and ignoreCase to achieve the desired search behavior.
- This feature works only for the characters that are not in the ASCII range.
- This feature may have a slight impact on search performance.
Highlight the search text
The Syncfusion Grid component allows you to visually highlight search results within the displayed data. This feature helps you to quickly identify where the search items are found within the displayed data. By adding a style to the matched text, you can quickly identify where the search items are present in the grid.
To achieve search text highlighting in the Grid, you can utilize the queryCellInfo event. This event is triggered for each cell during the Grid rendering process, allowing you to customize the cell content based on your requirements.
The following example demonstrates how to highlight search text in grid using the queryCellInfo
event. The queryCellInfo
event checks if the current cell is in the desired search column, retrieves the cell value, search keyword and uses the includes
method to check if the cell value contains the search keyword. If it does, the matched text is replaced with the same text wrapped in a span
tag with a customcss
class. You can then use CSS to define the customcss
class and style to easily identify where the search keywords are present in the grid.
import { NgModule } from '@angular/core'
import { BrowserModule } from '@angular/platform-browser'
import { GridModule, SearchService, ToolbarService } from '@syncfusion/ej2-angular-grids'
import { Component, OnInit, ViewChild } from '@angular/core';
import { data } from './datasource';
import { ToolbarItems, SearchEventArgs, GridComponent, QueryCellInfoEventArgs, Column } from '@syncfusion/ej2-angular-grids';
interface ColumnData{
[key: string]: number| string;
OrderID:number,
Freight:number,
CustomerID:string,
ShipCity:string,
ShipName:string,
ShipCountry:string,
ShipPostalCode:number
}
@Component({
imports: [
GridModule
],
providers: [SearchService, ToolbarService],
standalone: true,
selector: 'app-root',
template: `<ejs-grid #grid [dataSource]='data' [toolbar]='toolbarOptions' (actionBegin)="actionBegin($event)" (queryCellInfo)="queryCellInfo($event)" height='400' width='100%'>
<e-columns>
<e-column field='OrderID' headerText='Order ID' textAlign='Right' width=90></e-column>
<e-column field='CustomerID' headerText='Customer ID' width=100></e-column>
<e-column field='EmployeeID' headerText='Employee ID' textAlign='Right' width=80></e-column>
<e-column field='ShipCity' headerText='Ship City' width=100></e-column>
<e-column field='ShipCountry' headerText='Ship Country' width=100></e-column>
<e-column field='ShipName' headerText='Ship Name' width=120></e-column>
</e-columns>
</ejs-grid>`
})
export class AppComponent implements OnInit {
public key?:string = '';
public data?: object[];
public toolbarOptions?: ToolbarItems[];
@ViewChild('grid') public grid?: GridComponent;
ngOnInit(): void {
this.data = data;
this.toolbarOptions = ['Search'];
}
actionBegin(args:SearchEventArgs) {
if (args.requestType === 'searching') {
(this.key as string) = (args.searchString as string).toLowerCase();
}
}
queryCellInfo(args: QueryCellInfoEventArgs) {
if ((this.key as string) != '') {
var cellContent = (args.data as ColumnData)[(args.column as Column).field];
var parsedContent = cellContent.toString().toLowerCase();
if (parsedContent.includes((this.key as string).toLowerCase())) {
var i = 0;
var searchStr = '';
while (i < (this.key as string).length) {
var index = parsedContent.indexOf((this.key as string)[i]);
searchStr = searchStr + cellContent.toString()[index];
i++;
}
(args.cell as HTMLElement).innerHTML = (args.cell as HTMLElement).innerText.replaceAll(
searchStr,
"<span class='customcss'>" + searchStr + '</span>'
);
}
}
}
}
import { bootstrapApplication } from '@angular/platform-browser';
import { AppComponent } from './app.component';
import 'zone.js';
bootstrapApplication(AppComponent).catch((err) => console.error(err));
Clear search by external button
The Syncfusion Grid component provides a capability to clear searched data in the grid. This functionality offers the ability to reset or clear any active search filters that have been applied to the grid’s data.
To clear the searched grid records from an external button, you can set the searchSettings.key property to an empty
string to clear the search text. This property represents the current search text in the search box.
The following example demonstrates how to clear the searched records using an external button.
import { NgModule } from '@angular/core'
import { BrowserModule } from '@angular/platform-browser'
import { GridModule, SearchService, ToolbarService } from '@syncfusion/ej2-angular-grids'
import { ButtonModule } from '@syncfusion/ej2-angular-buttons'
import { Component, OnInit, ViewChild } from '@angular/core';
import { data } from './datasource';
import { ToolbarItems, SearchSettingsModel, GridComponent } from '@syncfusion/ej2-angular-grids';
@Component({
imports: [
GridModule,
ButtonModule
],
providers: [SearchService, ToolbarService],
standalone: true,
selector: 'app-root',
template:
`<button ejs-button id='clear' (click)='clearSearch()'>Clear Search</button>
<ejs-grid #grid style="margin-top:5px" [dataSource]='data' [searchSettings]='searchOptions' [toolbar]='toolbarOptions' height='260px'>
<e-columns>
<e-column field='OrderID' headerText='Order ID' textAlign='Right' width=90></e-column>
<e-column field='CustomerID' headerText='Customer ID' width=100></e-column>
<e-column field='ShipCity' headerText='Ship City' width=100></e-column>
<e-column field='ShipName' headerText='Ship Name' width=120></e-column>
</e-columns>
</ejs-grid>`
})
export class AppComponent implements OnInit {
public data?: object[];
public toolbarOptions?: ToolbarItems[];
public searchOptions?: SearchSettingsModel;
@ViewChild('grid') public grid?: GridComponent;
ngOnInit(): void {
this.data = data;
this.searchOptions = { fields: ['CustomerID'], operator: 'contains', key: 'Ha', ignoreCase: true };
this.toolbarOptions = ['Search'];
}
clearSearch() {
(this.grid as GridComponent).searchSettings.key = '';
}
}
import { bootstrapApplication } from '@angular/platform-browser';
import { AppComponent } from './app.component';
import 'zone.js';
bootstrapApplication(AppComponent).catch((err) => console.error(err));
You can also clear the searched records by using the clear icon within the search input field.