From e408a4ead9f30c9b439fd6f2c406e00d91257342 Mon Sep 17 00:00:00 2001 From: Dimo Dimov Date: Wed, 27 Oct 2021 13:23:27 +0300 Subject: [PATCH] docs: Add ListView SearchBox KB --- knowledge-base/listview-searchbox.md | 125 +++++++++++++++++++++++++++ 1 file changed, 125 insertions(+) create mode 100644 knowledge-base/listview-searchbox.md diff --git a/knowledge-base/listview-searchbox.md b/knowledge-base/listview-searchbox.md new file mode 100644 index 0000000000..62becb489b --- /dev/null +++ b/knowledge-base/listview-searchbox.md @@ -0,0 +1,125 @@ +--- +title: ListView SearchBox +description: How to implement a ListView search box that filters by multiple data fields. +type: how-to +page_title: ListView Search Box +slug: listview-searchbox +position: +tags: listview,search,searchbox,filter,filtering +ticketid: 1536554 +res_type: kb +--- + +## Description + +How to implement a ListView seach box, similar to the [SearchBox in the Blazor Grid](https://demos.telerik.com/blazor-ui/grid/searchbox)? I would like to use a single input to search and filter in all data fields of the ListView data. + +## Solution + +It is possible to search and filter the ListView programmatically. The example below is a modified version of the [ListView filtering demo](https://demos.telerik.com/blazor-ui/listview/filtering). + +* Notice the usage of a [`CompositeFilterDescriptor`](https://docs.telerik.com/blazor-ui/api/Telerik.DataSource.CompositeFilterDescriptor), instead of a [`FilterDescriptor`](https://docs.telerik.com/blazor-ui/api/Telerik.DataSource.FilterDescriptor). This is because we are searching in multiple fields with an `OR` logical operator. The [Grid Filtering documentation]({%slug components/grid/filtering%}#filter-descriptors) explains the difference between the two descriptor types. +* Populate the `FilterDescriptors` collection of the `CompositeFilterDescriptor` object with one `FilterDescriptor` for each field that you want to search in. + +>caption ListView Search Textbox + +````CSHTML +@* ListView SearchBox *@ + +@using Telerik.DataSource +@using Telerik.DataSource.Extensions + + + +
+ + + Clear +
+
+ +
+ + + +@code { + List ListViewData; + List SourceData; + string SearchString = "22"; + + async Task LoadListViewData(string newSearchString) + { + SearchString = newSearchString; + + if (String.IsNullOrWhiteSpace(SearchString)) + { + ListViewData = SourceData; + } + else + { + var request = new DataSourceRequest() + { + Filters = new List() + }; + + var cfd = new CompositeFilterDescriptor(); + + cfd.LogicalOperator = FilterCompositionLogicalOperator.Or; + cfd.FilterDescriptors.Add(new FilterDescriptor("Name", FilterOperator.Contains, SearchString)); + cfd.FilterDescriptors.Add(new FilterDescriptor("Description", FilterOperator.Contains, SearchString)); + + request.Filters.Add(cfd); + + ListViewData = (SourceData.ToDataSourceResult(request).Data as IEnumerable).ToList(); + } + } + + async Task ClearSearch() + { + SearchString = ""; + await LoadListViewData(SearchString); + } + + protected override async Task OnInitializedAsync() + { + SourceData = new List(); + + for (int i = 1; i <= 50; i++) + { + + SourceData.Add(new Product() + { + ID = i, + Name = "Product " + (i * 11).ToString(), + Description = "Description " + (i * 22).ToString() + }); + } + + await LoadListViewData(SearchString); + } + + public class Product + { + public int ID { get; set; } + public string Name { get; set; } + public string Description { get; set; } + } +} +````