зеркало из https://github.com/telerik/blazor-docs.git
5.4 KiB
5.4 KiB
title | description | type | page_title | slug | tags | res_type | ticketid |
---|---|---|---|---|---|---|---|
Custom Sorting Order for Groups in DropDownList | Learn how to apply a custom order to groups in the DropDownList for Blazor. | how-to | How to Set a Custom Grouping Order in Blazor DropDownList | dropdownlist-custom-sorting-order-groups | dropdownlist, blazor, telerik, grouping, custom order | kb | 1666981, 1579415 |
Environment
Product | DropDownList for Blazor, AutoComplete for Blazor, MultiSelect for Blazor, ComboBox for Blazor, MultiColumnComboBox for Blazor |
Description
I am using the [grouping feature of the DropDownList]({%slug components/dropdownlist/grouping%}). My DropDownList model has a nested model as property. The DropDownList GroupField
parameter is bound to a property of the nested model. I want the groups to appear in a non-alphabetical, custom order. I can see that there is a feature request to add a sort direction option when grouping. But in the meantime how can I customize the grouping order in the DropDownList?
Solution
To sort the groups in a DropDownList by a custom order, perform a manual sorting operation in the [OnRead
event]({%slug components/dropdownlist/events%}#onread) handler. Follow these steps:
- Create a list of strings that represents the values of the group headers. This list will determine the preferred sorting order.
- Cast the [
DataSourceResult
]({%slug common-features-data-binding-onread%}#event-argument) toAggregateFunctionsGroup
. - Sort the casted data using the
Sort
method with a custom comparison function. - Pass the sorted data as [
args.Data
]({%slug common-features-data-binding-onread%}#todatasourceresult-method).
caption Apply a custom grouping order in the DropDownList
@using Telerik.DataSource.Extensions
@using Telerik.DataSource
<TelerikDropDownList TItem="@Product"
TValue="@int"
OnRead="@ReadItems"
@bind-Value="@SelectedValue"
GroupField="ProductCategory.CategoryName"
TextField="@nameof(Product.Description)"
ValueField="@nameof(Product.ProductId)"
DefaultText="Select a Product">
</TelerikDropDownList>
@code {
private int SelectedValue { get; set; }
private List<Product> Products = new List<Product>
{
new Product { ProductId = 10, Description = "Juliet Jewelery Product", ProductCategory = new ProductCategory { CategoryId = 10, CategoryName = "Jewelery" } },
new Product { ProductId = 18, Description = "Medical Care Product", ProductCategory = new ProductCategory { CategoryId = 8, CategoryName = "Healthcare" } },
new Product { ProductId = 19, Description = "QQ Tech Product", ProductCategory = new ProductCategory { CategoryId = 9, CategoryName = "Information Technology" } },
new Product { ProductId = 10, Description = "Z Jewelery Product", ProductCategory = new ProductCategory { CategoryId = 10, CategoryName = "Jewelery" } },
new Product { ProductId = 4, Description = "Delta Bond Product", ProductCategory = new ProductCategory { CategoryId = 4, CategoryName = "Defense" } },
new Product { ProductId = 8, Description = "Health Care Product", ProductCategory = new ProductCategory { CategoryId = 8, CategoryName = "Healthcare" } },
new Product { ProductId = 9, Description = "Tech Product", ProductCategory = new ProductCategory { CategoryId = 9, CategoryName = "Information Technology" } }
};
protected async Task ReadItems(DropDownListReadEventArgs args)
{
await Task.Delay(200);
var preferredOrder = new List<string> { "Healthcare", "Information Technology", "Defense", "Jewelery" };
var datasourceResult = Products.ToDataSourceResult(args.Request);
var sortedData = datasourceResult.Data.Cast<AggregateFunctionsGroup>().ToList();
sortedData.Sort((a, b) =>
{
int indexA = preferredOrder.IndexOf(a.Key.ToString());
int indexB = preferredOrder.IndexOf(b.Key.ToString());
if (indexA >= 0 && indexB >= 0)
{
return indexA.CompareTo(indexB);
}
if (indexA >= 0) return -1;
if (indexB >= 0) return 1;
return a.Key.ToString().CompareTo(b.Key.ToString());
});
args.Data = sortedData;
}
public class Product
{
public int ProductId { get; set; }
public string Description { get; set; }
public ProductCategory ProductCategory { get; set; }
}
public class ProductCategory
{
public int CategoryId { get; set; }
public string CategoryName { get; set; }
}
}
```
## See Also
- [Telerik DropDownList for Blazor - Overview]({%slug components/dropdownlist/overview%})
- [OnRead Event in Telerik DropDownList]({%slug components/dropdownlist/events%}#onread)
- [Grouping in Telerik DropDownList]({%slug components/dropdownlist/grouping%})
- [Custom Grouping Order in Grid]({%slug grid-custom-grouping-order%})