Hello,
I want to create a custome filter for some columns where i use a templete for manipulate the data.
I found that i need to use a FilterItemTemplate functionalities for that, but I can’t use a FilterItemContext like the tamplate or i can't make to work it.
<SfGrid ID="Grid" @ref="DefaultGrid"
TValue="WorkOrderDto"
DataSource="_workOrders.Value.WorkOrders"
AllowFiltering="@_dashboard.Filterable"
AllowSorting="@_dashboard.Sortable"
ShowColumnChooser="true"
Height="100%"
Width="100%"
AllowExcelExport="true">
<GridTemplates>
<ToolbarTemplate>
<SfToolbar>
<ToolbarEvents Clicked="ToolbarClickHandler"></ToolbarEvents>
<ToolbarItems>
<ToolbarItem Type="@ItemType.Button" Id="Grid_excelexport">
<Template>
<button class="btn btn-success btn-sm" TooltipText="Excel Export"><i class="fas fa-file-excel"></i> Excel</button>
</Template>
</ToolbarItem>
</ToolbarItems>
</SfToolbar>
</ToolbarTemplate>
</GridTemplates>
<GridEvents ExcelQueryCellInfoEvent="ExcelQueryCellInfoHandler" OnToolbarClick="ToolbarClickHandler" TValue="WorkOrderDto"></GridEvents>
<GridFilterSettings Type="Syncfusion.Blazor.Grids.FilterType.Excel"></GridFilterSettings>
<GridColumns>
@foreach (var column in _dashboard.Views.OrderBy(a => a.Order).ToList())
{
var width = column.Width > 0 ? $"{column.Width}" : "120";
switch (column.ViewType)
{
case ViewType.Field:
<GridColumn HeaderText="@column.Caption"
Field="@column.ValueName"
Width="@width"
AllowFiltering="@column.Filterable"
AllowSorting="@column.Sortable"
Format="@column.Format">
</GridColumn>
break;
case ViewType.Category:
var columnName = @column.ValueName;
<GridColumn HeaderText="@column.Caption"
Field="@column.ValueName"
Width="@width"
AllowFiltering="true"
AllowSorting="@column.Sortable"
SortComparer="new CategoryComparer(columnName)">
<Template Context="data">
@{
var order = (data as WorkOrderDto).Categories.FirstOrDefault(a => a.Category == column.ValueName);
if (order != null)
{
<Bubble Color="@order.Color"
Text="@order.Value?.ToString()"
HasComments="@order.Comments"
OnClick="@(() => OpenDetails((data as WorkOrderDto).Id, column.Caption, column.ReadOnly))">
</Bubble>
}
else
{
<Bubble Color="grey"
Text="N/A"
HasComments="false">
</Bubble>
}
}
</Template>
<FilterItemTemplate>
@{
var cat = (context as FilterItemTemplateContext);
}
</FilterItemTemplate>
</GridColumn>
break;
}
}
</GridColumns>
</SfGrid>
Regards!
Of course, I'll try to explain better, I want to activate the filter in some columns, because I have 2 types of columns, divided by a switch, the second one is my target or how i call “Category”.
The difficulty for us is because i use in those columns a template for get the data, also stroggle for sort the column but I was solve using SortComper functionality, and other difficulti is my objects, is not the same to the data source, exactly is a List of Objects inside my main object, I don’t know if exist some similar like the function "Sortcompare", i read some pages and i found that about FilterItemTemplate, but i dont figured out how can i use.
<SfGrid ID="Grid" @ref="DefaultGrid"
TValue="WorkOrderDto"
DataSource="_workOrders.Value.WorkOrders"
AllowFiltering="@_dashboard.Filterable"
AllowSorting="@_dashboard.Sortable"
ShowColumnChooser="true"
Height="100%"
Width="100%"
AllowExcelExport="true">
<GridTemplates>
<ToolbarTemplate>
<SfToolbar>
<ToolbarEvents Clicked="ToolbarClickHandler"></ToolbarEvents>
<ToolbarItems>
<ToolbarItem Type="@ItemType.Button" Id="Grid_excelexport">
<Template>
<button class="btn btn-success btn-sm" TooltipText="Excel Export"><i class="fas fa-file-excel"></i> Excel</button>
</Template>
</ToolbarItem>
</ToolbarItems>
</SfToolbar>
</ToolbarTemplate>
</GridTemplates>
<GridEvents ExcelQueryCellInfoEvent="ExcelQueryCellInfoHandler" OnToolbarClick="ToolbarClickHandler" TValue="WorkOrderDto"></GridEvents>
<GridFilterSettings Type="Syncfusion.Blazor.Grids.FilterType.Excel"></GridFilterSettings>
<GridColumns>
@foreach (var column in _dashboard.Views.OrderBy(a => a.Order).ToList())
{
var width = column.Width > 0 ? $"{column.Width}" : "120";
switch (column.ViewType)
{
case ViewType.Field:
<GridColumn HeaderText="@column.Caption"
Field="@column.ValueName"
Width="@width"
AllowFiltering="@column.Filterable"
AllowSorting="@column.Sortable"
Format="@column.Format">
</GridColumn>
break;
case ViewType.Category:
var columnName = @column.ValueName;
<GridColumn HeaderText="@column.Caption"
Field="@column.ValueName"
Width="@width"
AllowFiltering="true"
AllowSorting="@column.Sortable"
SortComparer="new CategoryComparer(columnName)">
<Template Context="data">
@{
var order = (data as WorkOrderDto).Categories.FirstOrDefault(a => a.Category
== column.ValueName);
if (order != null)
{
<Bubble Color="@order.Color"
Text="@order.Value?.ToString()"
HasComments="@order.Comments"
OnClick="@(() => OpenDetails((data as WorkOrderDto).Id, column.Caption, column.ReadOnly))">
</Bubble>
}
else
{
<Bubble Color="grey"
Text="N/A"
HasComments="false">
</Bubble>
}
}
</Template>
</GridColumn>
break;
}
}
</GridColumns>
</SfGrid>
i Hope this help for understand my problem better.