From 5b701f9c8583c7d3d699844277d1277adee900aa Mon Sep 17 00:00:00 2001 From: Elena Khamlyuk Date: Wed, 8 Jul 2026 14:37:08 +0300 Subject: [PATCH 1/6] add a readme --- CS/Components/ConditionalFormatSelector.razor | 342 +++++++++--------- CS/Components/Pages/Index.razor | 161 +++++---- CS/Components/Pages/Index.razor.css | 3 + CS/readme.md | 8 - README.md | 176 +++++++++ result.png | Bin 0 -> 69364 bytes 6 files changed, 433 insertions(+), 257 deletions(-) delete mode 100644 CS/readme.md create mode 100644 README.md create mode 100644 result.png diff --git a/CS/Components/ConditionalFormatSelector.razor b/CS/Components/ConditionalFormatSelector.razor index 7ad1a6a..c26dc63 100644 --- a/CS/Components/ConditionalFormatSelector.razor +++ b/CS/Components/ConditionalFormatSelector.razor @@ -1,174 +1,170 @@ -@using ConditionalFormatSelector.Data -@using DevExpress.Data.Filtering -@typeparam TModel - - - - - - - - - - - - - @foreach (var field in typeof(TModel).GetProperties().Where(p => VisibleFilterFields?.Contains(p.Name) == true)) { - - } - - - - - - - - - - - - - - -
- -
-
- -
-
-
-@code { - [Parameter] - public List? Formats { get; set; } = new List(); - [Parameter] - public EventCallback FormatsChanged { get; set; } - [Parameter] - public string[]? VisibleFilterFields { get; set; } - [Parameter] - public List? SummaryConditions { get; set; } - [Parameter] - public required List FormatStyles { get; set; } - - DxPopup? popupRef; - List conditions = new List(); - string? currentColumnName; - string? currentFormatId; - - string SaveButtonText => - IsEmptyFilterCriteriaSelected - ? "Select a Filter" - : (isNew ? "Add Format" : "Save Changes"); - - bool isNew = true; - bool IsEmptyFilterCriteriaSelected => - selectedConditionType is ConditionType.Filter && - (selectedFilterCriteria is null || string.IsNullOrEmpty(selectedFilterCriteria.ToString())); - - ConditionType selectedConditionType; - CriteriaOperator? selectedFilterCriteria; - string? selectedFormatStyleName; - - protected override void OnInitialized() { - conditions.Add(new ConditionInfo(ConditionType.Filter, "Filter")); - if (SummaryConditions?.Any() == true) - conditions.AddRange(SummaryConditions); - } - - void OnApplyClick() { - bool isValidCondition = selectedFilterCriteria is not null || selectedConditionType is not ConditionType.Filter; - var condition = conditions.FirstOrDefault(c => c.ConditionType == selectedConditionType); - - if (condition is not null && currentColumnName is not null && isValidCondition) { - if (condition.ConditionType is ConditionType.Filter) - condition = new FilterConditionInfo(condition.ConditionName, selectedFilterCriteria!); - - if (isNew) { - isNew = false; - if (Formats is not null) { - var format = new SimpleFormat( - currentColumnName, - condition, - FormatStyles.FirstOrDefault(fs => fs.FormatName == selectedFormatStyleName) - ); - Formats.Add(format); - } - } - else { - var format = Formats?.FirstOrDefault(f => f.FormatId == currentFormatId); - if (format is not null) { - format.Condition = condition; - format.Style = FormatStyles.FirstOrDefault(fs => fs.FormatName == selectedFormatStyleName); - } - } - } - - popupRef?.CloseAsync(); - FormatsChanged.InvokeAsync(); - } - - private void OnCancelClick() { - popupRef?.CloseAsync(); - } - - private void OnDeleteClick() { - var format = Formats?.FirstOrDefault(f => f.FormatId == currentFormatId); - if (format is null || Formats is null) { - Console.WriteLine($"Could not find format with ID:{currentFormatId} in the Formats collection"); - return; - } - Formats.Remove(format); - FormatsChanged.InvokeAsync(); - popupRef?.CloseAsync(); - } - - public void AddNewFormat(string fieldName) { - var firstOrDefaultCondition = conditions.FirstOrDefault(); - if (firstOrDefaultCondition is null) { - Console.WriteLine("No conditions available to show Format Selector"); - return; - } - - currentColumnName = fieldName; - currentFormatId = null; - isNew = true; - selectedConditionType = firstOrDefaultCondition.ConditionType; - selectedFilterCriteria = null; - selectedFormatStyleName = null; - - StateHasChanged(); - popupRef?.ShowAsync(); - } - - public void EditFormat(string formatId) { - var formatItem = Formats?.FirstOrDefault(f => f.FormatId == formatId); - if (formatItem is null) { - Console.WriteLine($"Could not find format with ID:{formatId} in the Formats collection"); - return; - } - - currentColumnName = formatItem.ColumnFieldName; - currentFormatId = formatId; - isNew = false; - selectedConditionType = formatItem.Condition.ConditionType; - if (formatItem.Condition is FilterConditionInfo filterInfo) - selectedFilterCriteria = filterInfo.FilterCriteria; - selectedFormatStyleName = formatItem.Style?.FormatName; - - StateHasChanged(); - popupRef?.ShowAsync(); - } - - public void ClearAllColumnFormats(string fieldName) { - Formats?.RemoveAll(f => f.ColumnFieldName == fieldName); - FormatsChanged.InvokeAsync(); - } +@using ConditionalFormatSelector.Data +@using DevExpress.Data.Filtering +@typeparam TModel + + + + + + + + + + + @foreach (var field in typeof(TModel).GetProperties().Where(p => VisibleFilterFields?.Contains(p.Name) == true)) { + + } + + + + + + + + + + + +
+ +
+
+
+
+
+ +@code { + [Parameter] + public List? Formats { get; set; } = new List(); + [Parameter] + public EventCallback FormatsChanged { get; set; } + [Parameter] + public string[]? VisibleFilterFields { get; set; } + [Parameter] + public List? SummaryConditions { get; set; } + [Parameter] + public required List FormatStyles { get; set; } + + DxPopup? popupRef; + List conditions = new List(); + string? currentColumnName; + string? currentFormatId; + + string SaveButtonText => + IsEmptyFilterCriteriaSelected + ? "Select a Filter" + : (isNew ? "Add Format" : "Save Changes"); + + bool isNew = true; + bool IsEmptyFilterCriteriaSelected => + selectedConditionType is ConditionType.Filter && + (selectedFilterCriteria is null || string.IsNullOrEmpty(selectedFilterCriteria.ToString())); + + ConditionType selectedConditionType; + CriteriaOperator? selectedFilterCriteria; + string? selectedFormatStyleName; + + protected override void OnInitialized() { + conditions.Add(new ConditionInfo(ConditionType.Filter, "Filter")); + if (SummaryConditions?.Any() == true) + conditions.AddRange(SummaryConditions); + } + + void OnApplyClick() { + bool isValidCondition = selectedFilterCriteria is not null || selectedConditionType is not ConditionType.Filter; + var condition = conditions.FirstOrDefault(c => c.ConditionType == selectedConditionType); + + if (condition is not null && currentColumnName is not null && isValidCondition) { + if (condition.ConditionType is ConditionType.Filter) + condition = new FilterConditionInfo(condition.ConditionName, selectedFilterCriteria!); + + if (isNew) { + isNew = false; + if (Formats is not null) { + var format = new SimpleFormat( + currentColumnName, + condition, + FormatStyles.FirstOrDefault(fs => fs.FormatName == selectedFormatStyleName) + ); + Formats.Add(format); + } + } + else { + var format = Formats?.FirstOrDefault(f => f.FormatId == currentFormatId); + if (format is not null) { + format.Condition = condition; + format.Style = FormatStyles.FirstOrDefault(fs => fs.FormatName == selectedFormatStyleName); + } + } + } + + popupRef?.CloseAsync(); + FormatsChanged.InvokeAsync(); + } + + private void OnCancelClick() { + popupRef?.CloseAsync(); + } + + private void OnDeleteClick() { + var format = Formats?.FirstOrDefault(f => f.FormatId == currentFormatId); + if (format is null || Formats is null) { + Console.WriteLine($"Could not find format with ID:{currentFormatId} in the Formats collection"); + return; + } + Formats.Remove(format); + FormatsChanged.InvokeAsync(); + popupRef?.CloseAsync(); + } + + public void AddNewFormat(string fieldName) { + var firstOrDefaultCondition = conditions.FirstOrDefault(); + if (firstOrDefaultCondition is null) { + Console.WriteLine("No conditions available to show Format Selector"); + return; + } + + currentColumnName = fieldName; + currentFormatId = null; + isNew = true; + selectedConditionType = firstOrDefaultCondition.ConditionType; + selectedFilterCriteria = null; + selectedFormatStyleName = null; + + StateHasChanged(); + popupRef?.ShowAsync(); + } + + public void EditFormat(string formatId) { + var formatItem = Formats?.FirstOrDefault(f => f.FormatId == formatId); + if (formatItem is null) { + Console.WriteLine($"Could not find format with ID:{formatId} in the Formats collection"); + return; + } + + currentColumnName = formatItem.ColumnFieldName; + currentFormatId = formatId; + isNew = false; + selectedConditionType = formatItem.Condition.ConditionType; + if (formatItem.Condition is FilterConditionInfo filterInfo) + selectedFilterCriteria = filterInfo.FilterCriteria; + selectedFormatStyleName = formatItem.Style?.FormatName; + + StateHasChanged(); + popupRef?.ShowAsync(); + } + + public void ClearAllColumnFormats(string fieldName) { + Formats?.RemoveAll(f => f.ColumnFieldName == fieldName); + FormatsChanged.InvokeAsync(); + } } \ No newline at end of file diff --git a/CS/Components/Pages/Index.razor b/CS/Components/Pages/Index.razor index 4f8882a..f782e05 100644 --- a/CS/Components/Pages/Index.razor +++ b/CS/Components/Pages/Index.razor @@ -1,77 +1,86 @@ -@page "/" -@rendermode InteractiveServer -@using ConditionalFormatSelector.Data - -Conditional Format Selector Example - -
- - - - - - - - - - - - - -
- - - -

Applied Formats:

-@foreach (var format in formats) { -
Column: @format.ColumnFieldName - Formatting: @format.ToString()
-} - -@code { - ConditionalFormatSelector? formatSelectorRef; - List data = GridItem.GetData(); - List formats = SimpleFormat.GenerateTestFormats("Progress", 20, "Red Background", 80, "Green Background"); - string[] visibleFields = new string[] { "Progress", "Code" }; - List summaryConditions = new List - { - new SummaryConditionInfo(ConditionType.GreaterThanTotalSummary, "Progress is greater than average", "Progress", "AverageProgress"), - new SummaryConditionInfo(ConditionType.LessThanTotalSummary, "Progress is less than average", "Progress", "AverageProgress"), - }; - List formatStyles = ConditionalFormatHelper.GetFormatStyles(); - - private void CustomizeContextMenu(GridCustomizeContextMenuEventArgs args) { - args.Items.Clear(); - - if (args.Context is GridHeaderCommandContext headerContext && headerContext.Column is IGridDataColumn column) { - var formatItem = args.Items.AddCustomItem("Conditional Formatting"); - formatItem.Items.AddCustomItem("Apply New Format", () => { formatSelectorRef?.AddNewFormat(column.FieldName); }); - foreach (SimpleFormat format in formats.Where(f => f.ColumnFieldName == column.FieldName)) { - formatItem.Items.AddCustomItem(format.ToString(), () => { formatSelectorRef?.EditFormat(format.FormatId); }); - } - formatItem.Items.AddCustomItem("Clear Formats", () => { formatSelectorRef?.ClearAllColumnFormats(column.FieldName); }); - } - } - - private void OnCustomizeElement(GridCustomizeElementEventArgs args) { - foreach (var format in formats) { - format.ApplyStyle(args); - } - } - - private void OnFormatsChanged() { - StateHasChanged(); - } +@page "/" +@rendermode InteractiveServer +@using ConditionalFormatSelector.Data + +Conditional Format Selector Example + +
+ + + + + + + + + + + + + +
+ + + +Applied Rules: + + + + + + @foreach (var format in formats) { + + + + + } +
ColumnFormat
@format.ColumnFieldName@format.ToString()
+ +@code { + ConditionalFormatSelector? formatSelectorRef; + List data = GridItem.GetData(); + List formats = SimpleFormat.GenerateTestFormats("Progress", 20, "Red Background", 80, "Green Background"); + string[] visibleFields = new string[] { "Progress", "Code" }; + List summaryConditions = new List + { + new SummaryConditionInfo(ConditionType.GreaterThanTotalSummary, "Progress is greater than average", "Progress", "AverageProgress"), + new SummaryConditionInfo(ConditionType.LessThanTotalSummary, "Progress is less than average", "Progress", "AverageProgress"), + }; + List formatStyles = ConditionalFormatHelper.GetFormatStyles(); + + private void CustomizeContextMenu(GridCustomizeContextMenuEventArgs args) { + args.Items.Clear(); + + if (args.Context is GridHeaderCommandContext headerContext && headerContext.Column is IGridDataColumn column) { + var formatItem = args.Items.AddCustomItem("Conditional Formatting"); + formatItem.Items.AddCustomItem("Apply New Format", () => { formatSelectorRef?.AddNewFormat(column.FieldName); }); + foreach (SimpleFormat format in formats.Where(f => f.ColumnFieldName == column.FieldName)) { + formatItem.Items.AddCustomItem(format.ToString(), () => { formatSelectorRef?.EditFormat(format.FormatId); }); + } + formatItem.Items.AddCustomItem("Clear Formatting", () => { formatSelectorRef?.ClearAllColumnFormats(column.FieldName); }); + } + } + + private void OnCustomizeElement(GridCustomizeElementEventArgs args) { + foreach (var format in formats) { + format.ApplyStyle(args); + } + } + + private void OnFormatsChanged() { + StateHasChanged(); + } } \ No newline at end of file diff --git a/CS/Components/Pages/Index.razor.css b/CS/Components/Pages/Index.razor.css index 50d7e7a..4c9aab2 100644 --- a/CS/Components/Pages/Index.razor.css +++ b/CS/Components/Pages/Index.razor.css @@ -1,3 +1,6 @@ ::deep .tasks-grid { height: 80vh; +} +table * { + border: 1px solid black; } \ No newline at end of file diff --git a/CS/readme.md b/CS/readme.md deleted file mode 100644 index 8f3300d..0000000 --- a/CS/readme.md +++ /dev/null @@ -1,8 +0,0 @@ -App.razor - added conditional format css -conditional.format.css - describe formatting rules for conditional formatting -Data - data classes -ConditionalFormatSelector.razor - selector -Index.razor - main logic - -=== -TODO - generate test formats refactoring. \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..88268ca --- /dev/null +++ b/README.md @@ -0,0 +1,176 @@ +# Blazor Grid – Apply Conditional Formatting at Runtime + +The DevExpress Blazor Grid supports custom styles applied during component render (using the [CustomizeElement](https://docs.devexpress.com/Blazor/DevExpress.Blazor.DxGrid.CustomizeElement) event). This example implements runtime formatting support. Users can right-click a column header to create, modify, or remove formatting rules in the UI (without source code modifications). + +![Blazor Grid - Cells Formatted Based on a Condition](./result.png) + +## Implementation Details + +### Define Custom Styles + +In the _wwwroot/css_ folder, create a stylesheet that stores CSS rules that users can apply to Grid regions. We recommend the use of public design tokens as described in the following help topic: [CSS Variables in Fluent Themes](https://docs.devexpress.com/Blazor/405705/styling-and-themes/fluent-theme-customization/fluent-css-variables). + +You can review design token usage for this example in the following file: [conditional.format.css](./CS/wwwroot/css/conditional.format.css). + +### Implement a Format Object + +1. Create a [SimpleFormat](./CS/Data/SimpleFormat.cs) class to store the following information: + * The target column's [FieldName](https://docs.devexpress.com/Blazor/DevExpress.Blazor.DxGridDataColumn.FieldName) + * [Conditions](./CS/Data/ConditionInfo.cs) + * [Custom style information](./CS/Data/FormatStyleInfo.cs) + + In this example, the following predefined conditions are used: + * The filter condition. Refer to the following help topic for information on how to build filter criteria: [Criteria Language Syntax](https://docs.devexpress.com/CoreLibraries/4928/devexpress-data-library/criteria-language-syntax). + * Conditions based on summary (greater/less than total summary). Such conditions may be of use if you want to evaluate values across the entire data set (for example, averages). You can add your own custom conditions as your needs dictate. + + ```cs + public enum ConditionType { + Filter, + GreaterThanTotalSummary, + LessThanTotalSummary + } + + public class SimpleFormat { + public SimpleFormat(string columnFieldName, ConditionInfo condition, FormatStyleInfo? style) { + FormatId = Guid.NewGuid().ToString(); + ColumnFieldName = columnFieldName; + Condition = condition; + Style = style; + } + public string FormatId { get; } + public ConditionInfo Condition { get; set; } + public FormatStyleInfo? Style { get; set; } + public string ColumnFieldName { get; set; } + } + ``` + +1. [Evaluate](./CS/Data/ConditionalFormatHelper.cs#L16) whether the style should be applied to the [current element](./CS/Data/GridItem.cs) based on the [specified condition](./CS/Data/ConditionInfo.cs). + + ```cs + public static bool Evaluate(SimpleFormat format, GridCustomizeElementEventArgs args) { + switch(format.Condition.ConditionType) { + case ConditionType.Filter: + return EvaluateFilterCriteria(format, args); + case ConditionType.GreaterThanTotalSummary: + return EvaluateGreaterThanTotalSummary(format, args); + case ConditionType.LessThanTotalSummary: + return EvaluateLessThanTotalSummary(format, args); + default: + return false; + } + } + ``` + + Review the following file for additional implementation details: [ConditionalFormatHelper.cs](./CS/Data/ConditionalFormatHelper.cs). + +1. In the [SimpleFormat](./CS/Data/SimpleFormat.cs) class, implement a method that calls the evaluation method and applies CSS rules. + + ```cs + public class SimpleFormat { + public void ApplyStyle(GridCustomizeElementEventArgs args) { + bool isTargetDataCell = args.ElementType == GridElementType.DataCell && args.Column is IGridDataColumn column && column.FieldName == ColumnFieldName; + if(isTargetDataCell) { + bool shouldApply = ConditionalFormatHelper.Evaluate(this, args); + if(shouldApply) { + if(!string.IsNullOrEmpty(args.CssClass)) + args.CssClass += " "; + if(Style != null) + args.CssClass += Style.CssClassName; + } + } + } + } + ``` + +### Create a Format Selector Component + +1. Create a UI that allows users to configure conditions and styles as a separate Razor component. +1. Check if specified user conditions are valid. +1. Process apply, cancel, and remove operations. After each operation, invoke the [FormatsChanged](./CS/Components/ConditionalFormatSelector.razor#L49) callback. +1. Add a newly created component to the _Index.razor_ page. In the `FormatsChanged` handler, call the `StateHasChanged` method to re-render the page after new styles are applied. + +```html + + +@code { + private void OnFormatsChanged() { + StateHasChanged(); + } +} +``` + +Review the following file for implementation details: [ConditionalFormatSelector.razor](./CS/Components/ConditionalFormatSelector.razor). + +### Set Up a Grid + +1. Add a `DxGrid` to the _Index.razor_ page and populate it with data. +1. _Optional_. Add a [TotalSummary](https://docs.devexpress.com/Blazor/404471/components/grid/data-shaping/summary) if you want to use conditions that cover the entire data set (for example, average values). +1. Enable the Grid's context menu in required regions using the [ContextMenus](https://docs.devexpress.com/Blazor/DevExpress.Blazor.DxGrid.ContextMenus) property. +1. Handle the [CustomizeContextMenu](https://docs.devexpress.com/Blazor/DevExpress.Blazor.DxGrid.CustomizeContextMenu) event to add custom items to the context menu (**Conditional Formatting**, **Apply New Format**, and **Clear Formatting**). +1. Process context menu item clicks. +1. Handle the [CustomizeElement](https://docs.devexpress.com/Blazor/DevExpress.Blazor.DxGrid.CustomizeElement) to apply styles specified by a user. + +```html + + + @* ... *@ + + + + + + +@code { + List formats = SimpleFormat.GenerateTestFormats("Progress", 20, "Red Background", 80, "Green Background"); + + private void CustomizeContextMenu(GridCustomizeContextMenuEventArgs args) { + args.Items.Clear(); + + if (args.Context is GridHeaderCommandContext headerContext && headerContext.Column is IGridDataColumn column) { + var formatItem = args.Items.AddCustomItem("Conditional Formatting"); + formatItem.Items.AddCustomItem("Apply New Format", () => { formatSelectorRef?.AddNewFormat(column.FieldName); }); + foreach (SimpleFormat format in formats.Where(f => f.ColumnFieldName == column.FieldName)) { + formatItem.Items.AddCustomItem(format.ToString(), () => { formatSelectorRef?.EditFormat(format.FormatId); }); + } + formatItem.Items.AddCustomItem("Clear Formatting", () => { formatSelectorRef?.ClearAllColumnFormats(column.FieldName); }); + } + } + + private void OnCustomizeElement(GridCustomizeElementEventArgs args) { + foreach (var format in formats) { + format.ApplyStyle(args); + } + } +} +``` + +## Files to Review + +- [Index.razor](./CS/Components/Pages/Index.razor) +- [ConditionalFormatSelector.razor](./CS/Components/ConditionalFormatSelector.razor) +- [ConditionalFormatHelper.cs](./CS/Data/ConditionalFormatHelper.cs) +- [SimpleFormat.cs](./CS/Data/SimpleFormat.cs) +- [ConditionInfo.cs](./CS/Data/ConditionInfo.cs) +- [FormatStyleInfo.cs](./CS/Data/FormatStyleInfo.cs) +- [conditional.format.css](./CS/wwwroot/css/conditional.format.css) + +## Documentation + +- [DevExpress Design System Foundation](https://docs.devexpress.com/DesignSystem/405636/foundation) +- [CSS Variables in Fluent Themes](https://docs.devexpress.com/Blazor/405705/styling-and-themes/fluent-theme-customization/fluent-css-variables) +- [DxGrid.CustomizeElement](https://docs.devexpress.com/Blazor/DevExpress.Blazor.DxGrid.CustomizeElement) +- [DxGrid.CustomizeContextMenu](https://docs.devexpress.com/Blazor/DevExpress.Blazor.DxGrid.CustomizeContextMenu) + +## More Examples + +- [Blazor Grid - Customize cell appearance based on custom conditions](https://github.com/DevExpress-Examples/blazor-grid-conditional-formatting) +- [Blazor Grid - Customize Context Menu](https://github.com/DevExpress-Examples/blazor-grid-show-context-menu) diff --git a/result.png b/result.png new file mode 100644 index 0000000000000000000000000000000000000000..9853b894c9572a121fd197b9d4ca113f90548c6a GIT binary patch literal 69364 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 literal 0 HcmV?d00001 From 623e50615e08de88712cf5f29c61c3c2b4d87bdd Mon Sep 17 00:00:00 2001 From: Elena Khamlyuk Date: Wed, 8 Jul 2026 14:38:49 +0300 Subject: [PATCH 2/6] update devexpress version --- CS/ConditionalFormatSelector.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CS/ConditionalFormatSelector.csproj b/CS/ConditionalFormatSelector.csproj index c17ee51..51fb5a1 100644 --- a/CS/ConditionalFormatSelector.csproj +++ b/CS/ConditionalFormatSelector.csproj @@ -5,6 +5,6 @@ enable - + From bad14b88be405dd6ac78fb8a28299b3b97a547ae Mon Sep 17 00:00:00 2001 From: Elena Khamlyuk Date: Thu, 9 Jul 2026 12:11:47 +0300 Subject: [PATCH 3/6] upd --- README.md | 42 +++++++++++++++++++++++++++--------------- 1 file changed, 27 insertions(+), 15 deletions(-) diff --git a/README.md b/README.md index 88268ca..08eeb07 100644 --- a/README.md +++ b/README.md @@ -20,7 +20,19 @@ You can review design token usage for this example in the following file: [condi * [Custom style information](./CS/Data/FormatStyleInfo.cs) In this example, the following predefined conditions are used: - * The filter condition. Refer to the following help topic for information on how to build filter criteria: [Criteria Language Syntax](https://docs.devexpress.com/CoreLibraries/4928/devexpress-data-library/criteria-language-syntax). + * The filter condition. In this example, [Filter Criteria API](https://docs.devexpress.com/CoreLibraries/17541/devexpress-data-library) is used to evaluate the specified condition. + ```cs + public static bool EvaluateFilterCriteria(SimpleFormat format, GridCustomizeElementEventArgs args) { + if(format.Condition is not FilterConditionInfo filterInfo) + return false; + object dataItem = args.Grid.GetDataItem(args.VisibleIndex); + var evaluator = new ExpressionEvaluator( + new EvaluatorContextDescriptorDefault(dataItem.GetType()), + filterInfo.FilterCriteria + ); + return (bool)evaluator.Evaluate(dataItem); + } + ``` * Conditions based on summary (greater/less than total summary). Such conditions may be of use if you want to evaluate values across the entire data set (for example, averages). You can add your own custom conditions as your needs dictate. ```cs @@ -85,31 +97,31 @@ You can review design token usage for this example in the following file: [condi ### Create a Format Selector Component 1. Create a UI that allows users to configure conditions and styles as a separate Razor component. -1. Check if specified user conditions are valid. +1. Check if specified conditions are valid. 1. Process apply, cancel, and remove operations. After each operation, invoke the [FormatsChanged](./CS/Components/ConditionalFormatSelector.razor#L49) callback. 1. Add a newly created component to the _Index.razor_ page. In the `FormatsChanged` handler, call the `StateHasChanged` method to re-render the page after new styles are applied. -```html - + ```html + -@code { - private void OnFormatsChanged() { - StateHasChanged(); + @code { + private void OnFormatsChanged() { + StateHasChanged(); + } } -} -``` + ``` Review the following file for implementation details: [ConditionalFormatSelector.razor](./CS/Components/ConditionalFormatSelector.razor). ### Set Up a Grid 1. Add a `DxGrid` to the _Index.razor_ page and populate it with data. -1. _Optional_. Add a [TotalSummary](https://docs.devexpress.com/Blazor/404471/components/grid/data-shaping/summary) if you want to use conditions that cover the entire data set (for example, average values). -1. Enable the Grid's context menu in required regions using the [ContextMenus](https://docs.devexpress.com/Blazor/DevExpress.Blazor.DxGrid.ContextMenus) property. +1. _Optional_. Add a [TotalSummary](https://docs.devexpress.com/Blazor/404471/components/grid/data-shaping/summary) if you want to use conditions related to the entire data set. +1. Enable the Grid's context menu in desired regions using the [ContextMenus](https://docs.devexpress.com/Blazor/DevExpress.Blazor.DxGrid.ContextMenus) property. 1. Handle the [CustomizeContextMenu](https://docs.devexpress.com/Blazor/DevExpress.Blazor.DxGrid.CustomizeContextMenu) event to add custom items to the context menu (**Conditional Formatting**, **Apply New Format**, and **Clear Formatting**). 1. Process context menu item clicks. 1. Handle the [CustomizeElement](https://docs.devexpress.com/Blazor/DevExpress.Blazor.DxGrid.CustomizeElement) to apply styles specified by a user. From 91200a0dba9a77d1671714f2402a665c87fa0dd3 Mon Sep 17 00:00:00 2001 From: Elena Khamliuk <80813840+khamlyuk@users.noreply.github.com> Date: Mon, 13 Jul 2026 11:15:14 +0300 Subject: [PATCH 4/6] Apply suggestions from code review Co-authored-by: Vladimir Abadzhev Co-authored-by: Elena Khamliuk <80813840+khamlyuk@users.noreply.github.com> --- README.md | 36 +++++++++++++----------------------- 1 file changed, 13 insertions(+), 23 deletions(-) diff --git a/README.md b/README.md index 08eeb07..f471c6d 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # Blazor Grid – Apply Conditional Formatting at Runtime -The DevExpress Blazor Grid supports custom styles applied during component render (using the [CustomizeElement](https://docs.devexpress.com/Blazor/DevExpress.Blazor.DxGrid.CustomizeElement) event). This example implements runtime formatting support. Users can right-click a column header to create, modify, or remove formatting rules in the UI (without source code modifications). +This example extends the DevExpress Blazor Grid customization capabilities so that users can specify and apply conditional formatting rules at runtime. The format editor appears when a user right-clicks a column header. Once the user specifies required rules and styles, the [CustomizeElement](https://docs.devexpress.com/Blazor/DevExpress.Blazor.DxGrid.CustomizeElement) event applies those styles to data cells. ![Blazor Grid - Cells Formatted Based on a Condition](./result.png) @@ -8,9 +8,9 @@ The DevExpress Blazor Grid supports custom styles applied during component rende ### Define Custom Styles -In the _wwwroot/css_ folder, create a stylesheet that stores CSS rules that users can apply to Grid regions. We recommend the use of public design tokens as described in the following help topic: [CSS Variables in Fluent Themes](https://docs.devexpress.com/Blazor/405705/styling-and-themes/fluent-theme-customization/fluent-css-variables). +In the _wwwroot/css_ folder, create a stylesheet that stores CSS rules that users can apply to Grid regions. We recommend the use of public design tokens when constructing styles. See the following help topic for additional information: [CSS Variables in Fluent Themes](https://docs.devexpress.com/Blazor/405705/styling-and-themes/fluent-theme-customization/fluent-css-variables). -You can review design token usage for this example in the following file: [conditional.format.css](./CS/wwwroot/css/conditional.format.css). +To review design token usage in this example, see the following file: [conditional.format.css](./CS/wwwroot/css/conditional.format.css). ### Implement a Format Object @@ -19,21 +19,10 @@ You can review design token usage for this example in the following file: [condi * [Conditions](./CS/Data/ConditionInfo.cs) * [Custom style information](./CS/Data/FormatStyleInfo.cs) - In this example, the following predefined conditions are used: - * The filter condition. In this example, [Filter Criteria API](https://docs.devexpress.com/CoreLibraries/17541/devexpress-data-library) is used to evaluate the specified condition. - ```cs - public static bool EvaluateFilterCriteria(SimpleFormat format, GridCustomizeElementEventArgs args) { - if(format.Condition is not FilterConditionInfo filterInfo) - return false; - object dataItem = args.Grid.GetDataItem(args.VisibleIndex); - var evaluator = new ExpressionEvaluator( - new EvaluatorContextDescriptorDefault(dataItem.GetType()), - filterInfo.FilterCriteria - ); - return (bool)evaluator.Evaluate(dataItem); - } - ``` - * Conditions based on summary (greater/less than total summary). Such conditions may be of use if you want to evaluate values across the entire data set (for example, averages). You can add your own custom conditions as your needs dictate. + This example allows users to specify the following condition types: + * Build your own condition. This example uses a standalone Filter Control as the condition builder UI and then evaluates the resulting rule with the help of [Filter Criteria API](https://docs.devexpress.com/CoreLibraries/17541/devexpress-data-library). + + * Cell value is greater than or less than the total summary (average). ```cs public enum ConditionType { @@ -96,9 +85,10 @@ You can review design token usage for this example in the following file: [condi ### Create a Format Selector Component -1. Create a UI that allows users to configure conditions and styles as a separate Razor component. +1. Create a Razor component: the UI that allows users to configure conditions and styles. 1. Check if specified conditions are valid. -1. Process apply, cancel, and remove operations. After each operation, invoke the [FormatsChanged](./CS/Components/ConditionalFormatSelector.razor#L49) callback. +1. Process "Apply", "Cancel", and "Remove" operations. After each operation, invoke the [FormatsChanged](./CS/Components/ConditionalFormatSelector.razor#L49) callback. + 1. Add a newly created component to the _Index.razor_ page. In the `FormatsChanged` handler, call the `StateHasChanged` method to re-render the page after new styles are applied. ```html @@ -120,11 +110,11 @@ Review the following file for implementation details: [ConditionalFormatSelector ### Set Up a Grid 1. Add a `DxGrid` to the _Index.razor_ page and populate it with data. -1. _Optional_. Add a [TotalSummary](https://docs.devexpress.com/Blazor/404471/components/grid/data-shaping/summary) if you want to use conditions related to the entire data set. -1. Enable the Grid's context menu in desired regions using the [ContextMenus](https://docs.devexpress.com/Blazor/DevExpress.Blazor.DxGrid.ContextMenus) property. +1. Add a [TotalSummary](https://docs.devexpress.com/Blazor/404471/components/grid/data-shaping/summary) that will be used as a reference value in summary-based conditions. +1. Enable the Grid's column header context menu using the [ContextMenus](https://docs.devexpress.com/Blazor/DevExpress.Blazor.DxGrid.ContextMenus) property. 1. Handle the [CustomizeContextMenu](https://docs.devexpress.com/Blazor/DevExpress.Blazor.DxGrid.CustomizeContextMenu) event to add custom items to the context menu (**Conditional Formatting**, **Apply New Format**, and **Clear Formatting**). 1. Process context menu item clicks. -1. Handle the [CustomizeElement](https://docs.devexpress.com/Blazor/DevExpress.Blazor.DxGrid.CustomizeElement) to apply styles specified by a user. +1. Handle the [CustomizeElement](https://docs.devexpress.com/Blazor/DevExpress.Blazor.DxGrid.CustomizeElement) event to apply user-specified styles. ```html Date: Mon, 13 Jul 2026 11:17:33 +0300 Subject: [PATCH 5/6] Remove empty lines --- README.md | 20 +++++++++----------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/README.md b/README.md index f471c6d..63e3d8a 100644 --- a/README.md +++ b/README.md @@ -10,7 +10,7 @@ This example extends the DevExpress Blazor Grid customization capabilities so th In the _wwwroot/css_ folder, create a stylesheet that stores CSS rules that users can apply to Grid regions. We recommend the use of public design tokens when constructing styles. See the following help topic for additional information: [CSS Variables in Fluent Themes](https://docs.devexpress.com/Blazor/405705/styling-and-themes/fluent-theme-customization/fluent-css-variables). -To review design token usage in this example, see the following file: [conditional.format.css](./CS/wwwroot/css/conditional.format.css). +To review design token usage in this example, see the following file: [conditional.format.css](./CS/wwwroot/css/conditional.format.css). ### Implement a Format Object @@ -19,10 +19,9 @@ To review design token usage in this example, see the following file: [condition * [Conditions](./CS/Data/ConditionInfo.cs) * [Custom style information](./CS/Data/FormatStyleInfo.cs) - This example allows users to specify the following condition types: - * Build your own condition. This example uses a standalone Filter Control as the condition builder UI and then evaluates the resulting rule with the help of [Filter Criteria API](https://docs.devexpress.com/CoreLibraries/17541/devexpress-data-library). - - * Cell value is greater than or less than the total summary (average). + This example allows users to specify the following condition types: + * Build your own condition. This example uses a standalone Filter Control as the condition builder UI and then evaluates the resulting rule with the help of [Filter Criteria API](https://docs.devexpress.com/CoreLibraries/17541/devexpress-data-library). + * Cell value is greater than or less than the total summary (average). ```cs public enum ConditionType { @@ -85,10 +84,9 @@ To review design token usage in this example, see the following file: [condition ### Create a Format Selector Component -1. Create a Razor component: the UI that allows users to configure conditions and styles. +1. Create a Razor component: the UI that allows users to configure conditions and styles. 1. Check if specified conditions are valid. -1. Process "Apply", "Cancel", and "Remove" operations. After each operation, invoke the [FormatsChanged](./CS/Components/ConditionalFormatSelector.razor#L49) callback. - +1. Process "Apply", "Cancel", and "Remove" operations. After each operation, invoke the [FormatsChanged](./CS/Components/ConditionalFormatSelector.razor#L49) callback. 1. Add a newly created component to the _Index.razor_ page. In the `FormatsChanged` handler, call the `StateHasChanged` method to re-render the page after new styles are applied. ```html @@ -110,11 +108,11 @@ Review the following file for implementation details: [ConditionalFormatSelector ### Set Up a Grid 1. Add a `DxGrid` to the _Index.razor_ page and populate it with data. -1. Add a [TotalSummary](https://docs.devexpress.com/Blazor/404471/components/grid/data-shaping/summary) that will be used as a reference value in summary-based conditions. -1. Enable the Grid's column header context menu using the [ContextMenus](https://docs.devexpress.com/Blazor/DevExpress.Blazor.DxGrid.ContextMenus) property. +1. Add a [TotalSummary](https://docs.devexpress.com/Blazor/404471/components/grid/data-shaping/summary) that will be used as a reference value in summary-based conditions. +1. Enable the Grid's context menu using the [ContextMenus](https://docs.devexpress.com/Blazor/DevExpress.Blazor.DxGrid.ContextMenus) property. 1. Handle the [CustomizeContextMenu](https://docs.devexpress.com/Blazor/DevExpress.Blazor.DxGrid.CustomizeContextMenu) event to add custom items to the context menu (**Conditional Formatting**, **Apply New Format**, and **Clear Formatting**). 1. Process context menu item clicks. -1. Handle the [CustomizeElement](https://docs.devexpress.com/Blazor/DevExpress.Blazor.DxGrid.CustomizeElement) event to apply user-specified styles. +1. Handle the [CustomizeElement](https://docs.devexpress.com/Blazor/DevExpress.Blazor.DxGrid.CustomizeElement) event to apply user-specified styles. ```html Date: Fri, 24 Jul 2026 12:00:04 +0300 Subject: [PATCH 6/6] Update README to clarify conditional formatting example This example allows users to specify and apply conditional formatting rules at runtime, enhancing the DevExpress Blazor Grid's customization capabilities. --- README.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 63e3d8a..ba26fca 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # Blazor Grid – Apply Conditional Formatting at Runtime -This example extends the DevExpress Blazor Grid customization capabilities so that users can specify and apply conditional formatting rules at runtime. The format editor appears when a user right-clicks a column header. Once the user specifies required rules and styles, the [CustomizeElement](https://docs.devexpress.com/Blazor/DevExpress.Blazor.DxGrid.CustomizeElement) event applies those styles to data cells. +This example allows users to specify and apply conditional formatting rules at runtime. The format editor appears on-screen when a user right-clicks a column header. Once the user specifies required rules and styles, the [CustomizeElement](https://docs.devexpress.com/Blazor/DevExpress.Blazor.DxGrid.CustomizeElement) event applies desired styles to data cells. ![Blazor Grid - Cells Formatted Based on a Condition](./result.png) @@ -8,7 +8,7 @@ This example extends the DevExpress Blazor Grid customization capabilities so th ### Define Custom Styles -In the _wwwroot/css_ folder, create a stylesheet that stores CSS rules that users can apply to Grid regions. We recommend the use of public design tokens when constructing styles. See the following help topic for additional information: [CSS Variables in Fluent Themes](https://docs.devexpress.com/Blazor/405705/styling-and-themes/fluent-theme-customization/fluent-css-variables). +In the wwwroot/css folder, create a stylesheet to store CSS rules users can apply to Grid regions. We recommend the use of public design tokens when constructing styles. Review the following help topic for additional information in this regard: [CSS Variables in Fluent Themes](https://docs.devexpress.com/Blazor/405705/styling-and-themes/fluent-theme-customization/fluent-css-variables). To review design token usage in this example, see the following file: [conditional.format.css](./CS/wwwroot/css/conditional.format.css). @@ -20,7 +20,7 @@ To review design token usage in this example, see the following file: [condition * [Custom style information](./CS/Data/FormatStyleInfo.cs) This example allows users to specify the following condition types: - * Build your own condition. This example uses a standalone Filter Control as the condition builder UI and then evaluates the resulting rule with the help of [Filter Criteria API](https://docs.devexpress.com/CoreLibraries/17541/devexpress-data-library). + * Build your own condition. This example uses a standalone Filter Builder component for the condition builder UI and then evaluates the resulting rule using the [Filter Criteria API](https://docs.devexpress.com/CoreLibraries/17541/devexpress-data-library). * Cell value is greater than or less than the total summary (average). ```cs @@ -61,7 +61,7 @@ To review design token usage in this example, see the following file: [condition } ``` - Review the following file for additional implementation details: [ConditionalFormatHelper.cs](./CS/Data/ConditionalFormatHelper.cs). + Review the following file for implementation details: [ConditionalFormatHelper.cs](./CS/Data/ConditionalFormatHelper.cs). 1. In the [SimpleFormat](./CS/Data/SimpleFormat.cs) class, implement a method that calls the evaluation method and applies CSS rules. @@ -84,10 +84,10 @@ To review design token usage in this example, see the following file: [condition ### Create a Format Selector Component -1. Create a Razor component: the UI that allows users to configure conditions and styles. +1. Create a Razor component (the UI designed to configure conditions and styles). 1. Check if specified conditions are valid. 1. Process "Apply", "Cancel", and "Remove" operations. After each operation, invoke the [FormatsChanged](./CS/Components/ConditionalFormatSelector.razor#L49) callback. -1. Add a newly created component to the _Index.razor_ page. In the `FormatsChanged` handler, call the `StateHasChanged` method to re-render the page after new styles are applied. +1. Add the newly created component to the _Index.razor_ page. In the `FormatsChanged` handler, call the `StateHasChanged` method to re-render the page after new styles are applied. ```html