Unfortunately, I can't use the built-in filters. I have a requirement that filters must be custom and external. Actually SourceData not fetched on the page, it Entity Framework DbSet that supplied from data access layer and execute query to db on each data read.
01.
<TelerikTextBox @bind-Value=
"FilterName"
/>
02.
<TelerikTextBox @bind-Value=
"FilterEmail"
/>
03.
04.
<TelerikButton OnClick=
"Filter"
>Filter</TelerikButton>
05.
06.
<TelerikGrid Data=@GridData TotalCount=@Total Sortable=
true
Pageable=
true
>
07.
<TelerikGridColumns>
08.
<TelerikGridColumn Field=
"@nameof(Model.Name)"
/>
09.
<TelerikGridColumn Field=
"@nameof(Model.Email)"
/>
10.
</TelerikGridColumns>
11.
12.
<TelerikGridEvents>
13.
<EventsManager OnRead=ReadData />
14.
</TelerikGridEvents>
15.
</TelerikGrid>
16.
17.
@code{
18.
private
DataSourceRequest _dataSourceRequest;
19.
20.
public
IQueryable<Model> SourceData {
get
;
set
; }
21.
public
IEnumerable<Model> GridData {
get
;
set
; }
22.
public
int
Total {
get
;
set
; }
23.
24.
public
string
FilterName {
get
;
set
; }
25.
public
string
FilterEmail {
get
;
set
; }
26.
27.
protected
Task ReadData(GridReadEventArgs args)
28.
{
29.
if
(_dataSourceRequest ==
null
)
30.
_dataSourceRequest = args.Request;
31.
32.
return
ReadData();
33.
}
34.
35.
private
async Task ReadData(IEnumerable<IFilterDescriptor> filters =
null
)
36.
{
37.
if
(_dataSourceRequest ==
null
)
return
;
38.
39.
if
(filters !=
null
)
40.
{
41.
_dataSourceRequest.Filters.Clear();
42.
_dataSourceRequest.Filters.AddRange(filters);
43.
}
44.
45.
var datasourceResult = await SourceData.ToDataSourceResultAsync(_dataSourceRequest);
46.
GridData = (datasourceResult.Data
as
IEnumerable<Model>).ToList();
47.
Total = datasourceResult.Total;
48.
49.
StateHasChanged();
50.
}
51.
52.
protected
Task Filter()
53.
{
54.
var filters =
new
List<IFilterDescriptor>();
55.
if
(!
string
.IsNullOrWhiteSpace(FilterName))
56.
filters.Add(
new
FilterDescriptor(nameof(Model.Name), FilterOperator.Contains, FilterName));
57.
58.
if
(!
string
.IsNullOrWhiteSpace(FilterEmail))
59.
filters.Add(
new
FilterDescriptor(nameof(Model.Email), FilterOperator.Contains, FilterEmail));
60.
61.
return
ReadData(filters);
62.
}
63.
64.
public
class
Model
65.
{
66.
public
string
Name {
get
;
set
; }
67.
public
string
Email {
get
;
set
; }
68.
}
69.
}