Your search did not match any results.
Select Box

Search and Editing

Set the searchEnabled option to true to allow users to search. The following options help you configure the feature:

  • searchExpr
    Specifies one or several data fields to search.
  • searchMode
    Specifies whether found items should contain the typed-in string or start with it.
  • searchTimeout
    Specifies the delay between the moment a user stops typing and the moment the search is executed.
  • minSearchLength
    Specifies the minimum number of characters that a user should type in to trigger the search.
  • showDataBeforeSearch
    Specifies whether the widget should display the unfiltered item list until a user have typed in the minimum number of characters (minSearchLength).

Set the acceptCustomValue option to true to allow users to add values to the SelectBox. You should also implement the onCustomItemCreating handler to create new data source entries.

Copy to CodeSandBox
Apply
Reset
<div id="selectbox-demo"> <div class="widget-container"> <div class="dx-fieldset"> <div class="dx-fieldset-header">SearchBox</div> <div class="dx-field"> <div class="dx-field-label">Product</div> <div class="dx-field-value"> <dx-select-box [dataSource]="products" displayExpr="Name" [searchMode]="searchModeOption" [searchExpr]="searchExprOption" [searchTimeout]="searchTimeoutOption" [minSearchLength]="minSearchLengthOption" [searchEnabled]="true"></dx-select-box> </div> </div> </div> <div class="dx-fieldset"> <div class="dx-fieldset-header">EditBox</div> <div class="dx-field"> <div class="dx-field-label">Product</div> <div class="dx-field-value"> <dx-select-box #selectBox [dataSource]="productsDataSource" [acceptCustomValue]="true" displayExpr="Name" [value]="simpleProducts[0]" (onCustomItemCreating)="addCustomItem($event)"></dx-select-box> </div> </div> <div class="dx-field current-product"> Current product: <span class="current-value"> {{selectBox.value.Name}} (ID: {{selectBox.value.ID}}) </span> </div> </div> </div> <div class="options"> <div class="caption">SearchBox Options</div> <div class="option"> <div>Search Mode</div> <dx-select-box [items]="['contains', 'startswith']" [value]="searchModeOption"></dx-select-box> </div> <div class="option"> <div>Search Expression</div> <dx-select-box [items]="searchExprOptionItems" displayExpr="name" valueExpr="value" [value]="searchExprOption"></dx-select-box> </div> <div class="option"> <div>Search Timeout</div> <dx-number-box [min]="0" [max]="5000" [value]="searchTimeoutOption" [showSpinButtons]="true" [step]="100"></dx-number-box> </div> <div class="option"> <div>Minimum Search Length</div> <dx-number-box [min]="0" [max]="5" [value]="minSearchLengthOption" [showSpinButtons]="true"></dx-number-box> </div> <div class="option"> <dx-check-box [value]="showDataBeforeSearchOption" text="Show Data Before Search"></dx-check-box> </div> </div> </div>
import { NgModule, Component, enableProdMode } from '@angular/core'; import { BrowserModule } from '@angular/platform-browser'; import { platformBrowserDynamic } from '@angular/platform-browser-dynamic'; import { DxNumberBoxModule, DxCheckBoxModule, DxSelectBoxModule } from 'devextreme-angular'; import DataSource from 'devextreme/data/data_source'; import { Product, Service, SimpleProduct } from './app.service'; if(!/localhost/.test(document.location.host)) { enableProdMode(); } @Component({ selector: 'demo-app', templateUrl: 'app/app.component.html', styleUrls: ['app/app.component.css'], providers: [Service] }) export class AppComponent { products: Product[]; simpleProducts: SimpleProduct[]; productsDataSource: DataSource; searchModeOption: string = "contains"; searchExprOption: any = "Name"; searchTimeoutOption: number = 200; minSearchLengthOption: number = 0; showDataBeforeSearchOption: boolean = false; searchExprOptionItems: Array<any> = [{ name: "'Name'", value: "Name" }, { name: "['Name', 'Category']", value: ['Name', 'Category'] }] constructor(service: Service) { this.products = service.getProducts(); this.simpleProducts = service.getSimpleProducts(); this.productsDataSource = new DataSource(this.simpleProducts); } addCustomItem(data) { if(!data.text) return; const productIds = this.simpleProducts.map(function(item) { return item.ID; }); const incrementedId = Math.max.apply(null, productIds) + 1; const newItem = { Name: data.text, ID: incrementedId }; this.productsDataSource.store().insert(newItem); this.productsDataSource.load(); data.customItem = newItem; } } @NgModule({ imports: [ BrowserModule, DxSelectBoxModule, DxNumberBoxModule, DxCheckBoxModule ], declarations: [AppComponent], bootstrap: [AppComponent] }) export class AppModule { } platformBrowserDynamic().bootstrapModule(AppModule);
::ng-deep .widget-container { margin-right: 320px; } ::ng-deep .current-product { padding-top: 11px; } ::ng-deep .current-value { font-weight: bold; } ::ng-deep .options { padding: 20px; background-color: rgba(191, 191, 191, 0.15); position: absolute; right: 0; top: 0; bottom: 0; width: 260px; } ::ng-deep .caption { font-weight: 500; font-size: 18px; } ::ng-deep .option { margin-top: 10px; }
import { Injectable } from '@angular/core'; export class Product { ID: number; Name: string; Price: number; Current_Inventory: number; Backorder: number; Manufacturing: number; Category: string; ImageSrc: string; } export class SimpleProduct { Name: string; ID: number; } let simpleProducts:SimpleProduct[] = [ { "Name": "HD Video Player", "ID": 0 }, { "Name": "SuperHD Video Player", "ID": 1 }, { "Name": "SuperPlasma 50", "ID": 2 }, { "Name": "SuperLED 50", "ID": 3 }, { "Name": "SuperLED 42", "ID": 4 }, { "Name": "SuperLCD 55", "ID": 5 }, { "Name": "SuperLCD 42", "ID": 6 }, { "Name": "SuperPlasma 65", "ID": 7 }, { "Name": "SuperLCD 70", "ID": 8 }, { "Name": "Projector Plus", "ID": 9 }, { "Name": "Projector PlusHT", "ID": 10 }, { "Name": "ExcelRemote IR", "ID": 11 }, { "Name": "ExcelRemote Bluetooth", "ID": 12 }, { "Name": "ExcelRemote IP", "ID": 13 } ]; let products: Product[] = [{ "ID": 1, "Name": "HD Video Player", "Price": 330, "Current_Inventory": 225, "Backorder": 0, "Manufacturing": 10, "Category": "Video Players", "ImageSrc": "../../../../images/products/1.png" }, { "ID": 2, "Name": "SuperHD Video Player", "Price": 400, "Current_Inventory": 150, "Backorder": 0, "Manufacturing": 25, "Category": "Video Players", "ImageSrc": "../../../../images/products/2.png" }, { "ID": 3, "Name": "SuperPlasma 50", "Price": 2400, "Current_Inventory": 0, "Backorder": 0, "Manufacturing": 0, "Category": "Televisions", "ImageSrc": "../../../../images/products/3.png" }, { "ID": 4, "Name": "SuperLED 50", "Price": 1600, "Current_Inventory": 77, "Backorder": 0, "Manufacturing": 55, "Category": "Televisions", "ImageSrc": "../../../../images/products/4.png" }, { "ID": 5, "Name": "SuperLED 42", "Price": 1450, "Current_Inventory": 445, "Backorder": 0, "Manufacturing": 0, "Category": "Televisions", "ImageSrc": "../../../../images/products/5.png" }, { "ID": 6, "Name": "SuperLCD 55", "Price": 1350, "Current_Inventory": 345, "Backorder": 0, "Manufacturing": 5, "Category": "Televisions", "ImageSrc": "../../../../images/products/6.png" }, { "ID": 7, "Name": "SuperLCD 42", "Price": 1200, "Current_Inventory": 210, "Backorder": 0, "Manufacturing": 20, "Category": "Televisions", "ImageSrc": "../../../../images/products/7.png" }, { "ID": 8, "Name": "SuperPlasma 65", "Price": 3500, "Current_Inventory": 0, "Backorder": 0, "Manufacturing": 0, "Category": "Televisions", "ImageSrc": "../../../../images/products/8.png" }, { "ID": 9, "Name": "SuperLCD 70", "Price": 4000, "Current_Inventory": 95, "Backorder": 0, "Manufacturing": 5, "Category": "Televisions", "ImageSrc": "../../../../images/products/9.png" }, { "ID": 10, "Name": "DesktopLED 21", "Price": 175, "Current_Inventory": null, "Backorder": 425, "Manufacturing": 75, "Category": "Monitors", "ImageSrc": "../../../../images/products/10.png" }, { "ID": 12, "Name": "DesktopLCD 21", "Price": 170, "Current_Inventory": 210, "Backorder": 0, "Manufacturing": 60, "Category": "Monitors", "ImageSrc": "../../../../images/products/12.png" }, { "ID": 13, "Name": "DesktopLCD 19", "Price": 160, "Current_Inventory": 150, "Backorder": 0, "Manufacturing": 210, "Category": "Monitors", "ImageSrc": "../../../../images/products/13.png" }, { "ID": 14, "Name": "Projector Plus", "Price": 550, "Current_Inventory": null, "Backorder": 55, "Manufacturing": 10, "Category": "Projectors", "ImageSrc": "../../../../images/products/14.png" }, { "ID": 15, "Name": "Projector PlusHD", "Price": 750, "Current_Inventory": 110, "Backorder": 0, "Manufacturing": 90, "Category": "Projectors", "ImageSrc": "../../../../images/products/15.png" }, { "ID": 16, "Name": "Projector PlusHT", "Price": 1050, "Current_Inventory": 0, "Backorder": 75, "Manufacturing": 57, "Category": "Projectors", "ImageSrc": "../../../../images/products/16.png" }, { "ID": 17, "Name": "ExcelRemote IR", "Price": 150, "Current_Inventory": 650, "Backorder": 0, "Manufacturing": 190, "Category": "Automation", "ImageSrc": "../../../../images/products/17.png" }, { "ID": 18, "Name": "ExcelRemote Bluetooth", "Price": 180, "Current_Inventory": 310, "Backorder": 0, "Manufacturing": 0, "Category": "Automation", "ImageSrc": "../../../../images/products/18.png" }, { "ID": 19, "Name": "ExcelRemote IP", "Price": 200, "Current_Inventory": 0, "Backorder": 325, "Manufacturing": 225, "Category": "Automation", "ImageSrc": "../../../../images/products/19.png" }]; @Injectable() export class Service { getSimpleProducts(): SimpleProduct[] { return simpleProducts; } getProducts(): Product[] { return products; } }
// In real applications, you should not transpile code in the browser. You can see how to create your own application with Angular and DevExtreme here: // https://js.devexpress.com/Documentation/Guide/Angular_Components/Getting_Started/Create_a_DevExtreme_Application/ System.config({ transpiler: 'ts', typescriptOptions: { module: "commonjs", emitDecoratorMetadata: true, experimentalDecorators: true }, meta: { 'typescript': { "exports": "ts" } }, paths: { 'npm:': 'https://unpkg.com/' }, map: { 'ts': 'npm:plugin-typescript@8.0.0/lib/plugin.js', 'typescript': 'npm:typescript@3.4.5/lib/typescript.js', '@angular/core': 'npm:@angular/core@8.0.0/bundles/core.umd.js', '@angular/common': 'npm:@angular/common@8.0.0/bundles/common.umd.js', '@angular/compiler': 'npm:@angular/compiler@8.0.0/bundles/compiler.umd.js', '@angular/platform-browser': 'npm:@angular/platform-browser@8.0.0/bundles/platform-browser.umd.js', '@angular/platform-browser-dynamic': 'npm:@angular/platform-browser-dynamic@8.0.0/bundles/platform-browser-dynamic.umd.js', '@angular/router': 'npm:@angular/router@8.0.0/bundles/router.umd.js', '@angular/forms': 'npm:@angular/forms@8.0.0/bundles/forms.umd.js', '@angular/common/http': 'npm:@angular/common@8.0.0/bundles/common-http.umd.js', 'tslib': 'npm:tslib/tslib.js', 'rxjs': 'npm:rxjs@6.3.3', 'rxjs/operators': 'npm:rxjs@6.3.3/operators', 'devextreme': 'npm:devextreme@19.1', 'jszip': 'npm:jszip@3.1.3/dist/jszip.min.js', 'quill': 'npm:quill@1.3.7/dist/quill.js', 'devexpress-diagram': 'npm:devexpress-diagram', 'devextreme-angular': 'npm:devextreme-angular@19.1' }, packages: { 'app': { main: './app.component.ts', defaultExtension: 'ts' }, 'devextreme': { defaultExtension: 'js' }, 'rxjs': { main: 'index.js', defaultExtension: 'js' }, 'rxjs/operators': { main: 'index.js', defaultExtension: 'js' }, 'devextreme-angular': { main: 'index.js', defaultExtension: 'js' } } });
<!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <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=1.0" /> <link rel="stylesheet" type="text/css" href="https://cdn3.devexpress.com/jslib/19.1.7/css/dx.common.css" /> <link rel="stylesheet" type="text/css" href="https://cdn3.devexpress.com/jslib/19.1.7/css/dx.light.css" /> <script src="https://unpkg.com/core-js@2.4.1/client/shim.min.js"></script> <script src="https://unpkg.com/zone.js@0.6.25/dist/zone.js"></script> <script src="https://unpkg.com/reflect-metadata@0.1.3/Reflect.js"></script> <script src="https://unpkg.com/systemjs@0.21.3/dist/system.js"></script> <script src="config.js"></script> <script> System.import('app').catch(console.error.bind(console)); </script> </head> <body class="dx-viewport"> <div class="demo-container"> <demo-app>Loading...</demo-app> </div> </body> </html>