From 2c1621e85ad88a24e1144a1dbdb8a73a9b65f544 Mon Sep 17 00:00:00 2001 From: sridhar Date: Wed, 5 Nov 2025 00:20:08 +0530 Subject: [PATCH 1/2] 980754: Restoring the UG changes --- blazor/pivot-table/aggregation.md | 99 +-- blazor/pivot-table/calculated-field.md | 185 ++++-- blazor/pivot-table/conditional-formatting.md | 43 +- .../elasticsearch.md | 167 +++-- .../microsoft-sql-server.md | 209 +++--- .../connecting-to-data-source/mongodb.md | 109 +++- .../connecting-to-data-source/mysql.md | 112 +++- .../connecting-to-data-source/oracledb.md | 108 +++- .../connecting-to-data-source/postgreSQL.md | 104 ++- .../connecting-to-data-source/snowflakedb.md | 103 ++- blazor/pivot-table/css-customization.md | 30 +- blazor/pivot-table/data-binding.md | 142 +++-- blazor/pivot-table/data-compression.md | 28 +- blazor/pivot-table/defer-layout-update.md | 50 +- blazor/pivot-table/drill-down.md | 229 +++---- blazor/pivot-table/drill-through.md | 11 +- blazor/pivot-table/editing.md | 203 +++--- blazor/pivot-table/excel-export.md | 115 ++-- blazor/pivot-table/field-list.md | 151 +++-- blazor/pivot-table/filtering.md | 251 ++++---- blazor/pivot-table/globalization.md | 2 +- blazor/pivot-table/grouping-bar.md | 283 ++++---- blazor/pivot-table/grouping.md | 112 ++-- .../apply-custom-styles-to-pivot-cells.md | 6 +- .../bind-complex-data-to-the-pivot-table.md | 4 +- .../customize-number-and-date-format.md | 24 +- .../how-to/customizing-loading-indicator.md | 4 +- ...play-string-value-to-pivot-table-values.md | 10 +- .../pivot-table/how-to/hide-empty-headers.md | 54 +- ...ble-tooltip-for-row-and-column-headers.png | Bin 59943 -> 26459 bytes ...stom-tooltip-for-row-and-column-headers.md | 239 +++---- .../how-to/switching-older-themes-style.md | 14 +- blazor/pivot-table/hyper-link.md | 365 ++++++----- ...ivottable-show-sub-total-using-toolbar.png | Bin 37478 -> 46902 bytes ...r-pivottable-show-sub-totals-at-bottom.png | Bin 0 -> 39182 bytes ...azor-pivottable-show-sub-totals-at-top.png | Bin 0 -> 38327 bytes ...or-pivottable-show-total-using-toolbar.png | Bin 37663 -> 44565 bytes blazor/pivot-table/images/code-web-app.jpeg | Bin 0 -> 99615 bytes ...-data-sqlclient-nuget-package-install.jpeg | Bin 0 -> 100447 bytes blazor/pivot-table/images/mysql-data.PNG | Bin 287751 -> 43790 bytes .../images/next-nuget-package-install.png | Bin 0 -> 29235 bytes .../images/oracle-code-web-app.png | Bin 0 -> 52808 bytes blazor/pivot-table/images/postgresql_data.png | Bin 0 -> 15947 bytes blazor/pivot-table/number-formatting.md | 48 +- blazor/pivot-table/paging.md | 32 +- blazor/pivot-table/pdf-export.md | 340 +++++----- blazor/pivot-table/pivot-chart.md | 482 +++++++------- blazor/pivot-table/row-and-column.md | 602 +++++++++--------- .../pivot-table/server-side-pivot-engine.md | 176 +++-- blazor/pivot-table/show-hide-totals.md | 148 +++-- blazor/pivot-table/sorting.md | 128 ++-- blazor/pivot-table/state-persistence.md | 13 +- blazor/pivot-table/tool-bar.md | 428 +++++++------ blazor/pivot-table/tool-tip.md | 2 +- blazor/pivot-table/virtual-scrolling.md | 39 +- 55 files changed, 3321 insertions(+), 2683 deletions(-) create mode 100644 blazor/pivot-table/images/blazor-pivottable-show-sub-totals-at-bottom.png create mode 100644 blazor/pivot-table/images/blazor-pivottable-show-sub-totals-at-top.png create mode 100644 blazor/pivot-table/images/code-web-app.jpeg create mode 100644 blazor/pivot-table/images/ms-data-sqlclient-nuget-package-install.jpeg create mode 100644 blazor/pivot-table/images/next-nuget-package-install.png create mode 100644 blazor/pivot-table/images/oracle-code-web-app.png create mode 100644 blazor/pivot-table/images/postgresql_data.png diff --git a/blazor/pivot-table/aggregation.md b/blazor/pivot-table/aggregation.md index 15a0c423c4..017c7c3440 100644 --- a/blazor/pivot-table/aggregation.md +++ b/blazor/pivot-table/aggregation.md @@ -9,27 +9,28 @@ documentation: ug # Aggregation in Blazor Pivot Table Component -N> This feature is applicable only for relational data source. +N> This feature is applicable only for the relational data source. -End user can perform calculations over a group of values (exclusively for value fields bound in value axis) using the aggregation option. By default, values are added (summed) together. The other aggregation types are explained below. +End users can perform calculations on groups of values (specifically for value fields placed in the value axis) by using different aggregation types. By default, values are combined by summing them. Additional aggregation types are described below. -N> The fields with data type such as number supports all aggregation types mentioned below except for **"CalculatedField"**. The fields with data type such as string, date, datetime, boolean, etc., supports **"Count"** and **"DistinctCount"** aggregation types alone. +N> Numeric fields support all aggregation types listed below, except **CalculatedField**. Fields of type string, date, datetime, boolean, and similar types support only **Count** and **DistinctCount** aggregation. | Operator | Description | |------|-------------| -| Sum| Displays the pivot table values with sum.| -| Product| Displays the pivot table values with product.| -| Count| Displays the pivot table values with count.| -| DistinctCount| Displays the pivot table values with distinct count.| -| Min| Displays the pivot table with minimum value.| -| Max| Displays the pivot table with maximum value.| -| Avg| Displays the pivot table values with average.| -| Index| Displays the pivot table values with index.| -| PopulationStDev| Displays the pivot table values with standard deviation of population.| -| SampleStDev| Displays the pivot table values with sample standard deviation.| -| PopulationVar| Displays the pivot table values with variance of population.| -| SampleVar| Displays the pivot table values with sample variance.| -| RunningTotals| Displays the pivot table values with running totals.| +| Sum| Displays the total sum for the selected field values.| +| Product| Displays the product of the selected field values.| +| Count| Displays the number of records for the selected field.| +| DistinctCount| Displays the number of unique records for the selected field.| +| Min| Displays the minimum value for the selected field.| +| Max| Displays the maximum value for the selected field.| +| Avg| Displays the average (mean) of the selected field values.| +| Median| Displays the median value for the selected field.| +| Index| Displays the index value for the selected field data.| +| PopulationStDev| Displays the standard deviation of the population for the selected field.| +| SampleStDev| Displays the sample standard deviation for the selected field.| +| PopulationVar| Displays the variance of the population for the selected field.| +| SampleVar| Displays the sample variance for the selected field.| +| RunningTotals| Displays the running total for the selected field values.| | DifferenceFrom| Displays the pivot table values with difference from the value of the base item in the base field.| | PercentageOfDifferenceFrom| Displays the pivot table values with percentage difference from the value of the base item in the base field.| | PercentageOfGrandTotal| Displays the pivot table values with percentage of grand total of all values.| @@ -42,11 +43,11 @@ N> The fields with data type such as number supports all aggregation types menti ## Assigning aggregation type for value fields through API -For each value field, the aggregation type can be set using the property [Type](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewValue.html#Syncfusion_Blazor_PivotView_PivotViewValue_Type) in [PivotViewValue](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewValue.html) class. Meanwhile, aggregation types like [SummaryTypes.DifferenceFrom](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SummaryTypes.html) and [SummaryTypes.PercentageOfDifferenceFrom](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SummaryTypes.html) can check for specific field of specific item using [BaseField](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewValue.html#Syncfusion_Blazor_PivotView_PivotViewValue_BaseField) and [BaseItem](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewValue.html#Syncfusion_Blazor_PivotView_PivotViewValue_BaseItem) properties. Likewise, [SummaryTypes.PercentageOfParentTotal](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SummaryTypes.html) type can check for specific field using [BaseField](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewValue.html#Syncfusion_Blazor_PivotView_PivotViewValue_BaseField) property. For instance, the aggregation type [SummaryTypes.DifferenceFrom](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SummaryTypes.html) would intake the specified field and its corresponding member as input and its value is compared across other members in the same field and also across different fields to formulate an appropriate output value. +For each value field, the aggregation type can be set using the property [Type](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotFieldOptions.html#Syncfusion_Blazor_PivotView_PivotFieldOptions_Type) in [PivotViewValue](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewValue.html) class. Meanwhile, aggregation types like [SummaryTypes.DifferenceFrom](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SummaryTypes.html#Syncfusion_Blazor_PivotView_SummaryTypes_DifferenceFrom) and [SummaryTypes.PercentageOfDifferenceFrom](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SummaryTypes.html#Syncfusion_Blazor_PivotView_SummaryTypes_PercentageOfDifferenceFrom) can check for specific field of specific item using [BaseField](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotFieldOptions.html#Syncfusion_Blazor_PivotView_PivotFieldOptions_BaseField) and [BaseItem](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotFieldOptions.html#Syncfusion_Blazor_PivotView_PivotFieldOptions_BaseItem) properties. Likewise, [SummaryTypes.PercentageOfParentTotal](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SummaryTypes.html#Syncfusion_Blazor_PivotView_SummaryTypes_PercentageOfParentTotal) type can check for specific field using [BaseField](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotFieldOptions.html#Syncfusion_Blazor_PivotView_PivotFieldOptions_BaseField) property. For instance, the aggregation type [SummaryTypes.DifferenceFrom](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SummaryTypes.html#Syncfusion_Blazor_PivotView_SummaryTypes_DifferenceFrom) would intake the specified field and its corresponding member as input and its value is compared across other members in the same field and also across different fields to formulate an appropriate output value. -* [Type](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewValue.html#Syncfusion_Blazor_PivotView_PivotViewValue_Type): It allows to set the aggregate type of the field. -* [BaseField](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewValue.html#Syncfusion_Blazor_PivotView_PivotViewValue_BaseField): It allows to set the specific field to aggregate the values. -* [BaseItem](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewValue.html#Syncfusion_Blazor_PivotView_PivotViewValue_BaseItem): It allows to set the specific member to aggregate the values. +* [Type](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotFieldOptions.html#Syncfusion_Blazor_PivotView_PivotFieldOptions_Type): It allows to set the aggregate type of the field. +* [BaseField](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotFieldOptions.html#Syncfusion_Blazor_PivotView_PivotFieldOptions_BaseField): It allows to set the specific field to aggregate the values. +* [BaseItem](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotFieldOptions.html#Syncfusion_Blazor_PivotView_PivotFieldOptions_BaseItem): It allows to set the specific member to aggregate the values. ```cshtml @using Syncfusion.Blazor.PivotView @@ -84,13 +85,15 @@ For each value field, the aggregation type can be set using the property [Type]( ![Aggregation in Blazor PivotTable](images/blazor-pivottable-aggregation.png) -N> By default, the aggregation will be considered as [SummaryTypes.Sum](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SummaryTypes.html) to the value fields which had number type and for the value fields which had non-number type such as string, date, datetime, boolean, etc., the aggregation type will be considered as [SummaryTypes.Count](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SummaryTypes.html). +N> By default, the aggregation will be considered as [SummaryTypes.Sum](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SummaryTypes.html#Syncfusion_Blazor_PivotView_SummaryTypes_Sum) to the value fields which had number type and for the value fields which had non-number type values such as string, date, datetime, boolean, etc., the aggregation type will be considered as [SummaryTypes.Count](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SummaryTypes.html#Syncfusion_Blazor_PivotView_SummaryTypes_Count). ## Show desired aggregation types in its dropdown menu -By default, all the aggregation types are displayed in the dropdown menu available in buttons. However, based on the request for an application, there may be a need to show selective aggregation types on our own. This can be achieved using the [AggregateTypes](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SfPivotView-1.html#Syncfusion_Blazor_PivotView_SfPivotView_1_AggregateTypes) property. +By default, the dropdown menu for value fields includes all available aggregation types. However, you can customize this menu to display only specific aggregation types relevant to your application using the [AggregateTypes](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SfPivotView-1.html#Syncfusion_Blazor_PivotView_SfPivotView_1_AggregateTypes) property. This allows you to tailor the user experience by limiting the options to those that best fit your use case. - ```cshtml +The following code demonstrates how to configure the pivot table component to display only the **DistinctCount**, **Average**, and **Product** aggregation types in the dropdown menu. + +```cshtml @using Syncfusion.Blazor.PivotView @@ -133,17 +136,19 @@ By default, all the aggregation types are displayed in the dropdown menu availab ## Modifying aggregation type for value fields at runtime -Aggregation types can be changed easily through UI at runtime. The value fields bound to grouping bar and field list appears with a dropdown icon which helps to select an appropriate aggregation type for the respective value field. On selection, the values in the pivot table will be changed dynamically. +You can dynamically modify the aggregation type for value fields in the Pivot Table component through the UI at runtime. Value fields, displayed in the grouping bar and field list, include a dropdown icon that allows you to select from various aggregation types (e.g., **Sum**, **Average**, **Count**). Once you select a new aggregation type, the pivot table updates instantly to reflect the change, providing a seamless experience for data analysis. ![Modifying Aggregation Types via FieldList in Blazor PivotTable](images/blazor-pivottable-aggregation-fieldlist-menu.png)
-
+ ![Modifying Aggregation Types via GroupBar in Blazor PivotTable](images/blazor-pivottable-aggregation-groupbar-menu.png) ## Hiding aggregation type from button text -By default, in value axis each field would be displayed by its name and aggregation type together. To hide aggregation type and display field name alone, set the property [ShowAggregationOnValueField](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html#Syncfusion_Blazor_PivotView_PivotViewDataSourceSettings_1_ShowAggregationOnValueField) in [PivotViewDataSourceSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html) class to **false**. +By default, each field in the value axis is displayed with its name and aggregation type (e.g., "Sum of Units Sold"). To display only the field name (e.g., "Units Sold") and hide the aggregation type, set the [ShowAggregationOnValueField](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html#Syncfusion_Blazor_PivotView_PivotViewDataSourceSettings_1_ShowAggregationOnValueField) property in [PivotViewDataSourceSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html) class to **false**. + +This customization enhances the clarity of the pivot table’s interface by simplifying the button text, making it more concise and user-friendly. ```cshtml @using Syncfusion.Blazor.PivotView @@ -181,13 +186,14 @@ By default, in value axis each field would be displayed by its name and aggregat ![Hiding Aggregation Types via FieldList in Blazor PivotTable](images/blazor-pivottable-hide-aggregation-via-fieldlist.png)
+ ![Hiding Aggregation Types via GroupBar in Blazor PivotTable](images/blazor-pivottable-hide-aggregation-via-groupbar.png) ## Hiding aggregation type icon from UI -By default, the icon to set aggregation type is enabled in the grouping bar. To disable this icon, set the property [ShowValueTypeIcon](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewGroupingBarSettings.html#Syncfusion_Blazor_PivotView_PivotViewGroupingBarSettings_ShowValueTypeIcon) in [PivotViewGroupingBarSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewGroupingBarSettings.html) class to **false**. +By default, the dropdown icon to change the aggregation type is visible in the grouping bar. To hide this icon, set the [ShowValueTypeIcon](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewGroupingBarSettings.html#Syncfusion_Blazor_PivotView_PivotViewGroupingBarSettings_ShowValueTypeIcon) property within [PivotViewGroupingBarSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewGroupingBarSettings.html) class to **false**. -N> Icon to change the aggregation type can be hidden only in Grouping Bar but not in Field List at the moment. +N> The aggregation type icon can only be hidden in the Grouping Bar, not in the Field List. ```cshtml @using Syncfusion.Blazor.PivotView @@ -229,19 +235,19 @@ N> Icon to change the aggregation type can be hidden only in Grouping Bar but no ### OnActionBegin -The event [OnActionBegin](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewEvents-1.html#Syncfusion_Blazor_PivotView_PivotViewEvents_1_OnActionBegin) triggers when clicking and selecting the aggregate type via the dropdown icon in the value field button, which is present in both grouping bar and field list UI. This allows user to identify the current action being performed at runtime. It has the following parameters: +The event [OnActionBegin](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewEvents-1.html#Syncfusion_Blazor_PivotView_PivotViewEvents_1_OnActionBegin) triggers when clicking and selecting the aggregate type via the dropdown icon in the value field button, which is present in both grouping bar and field list UI. This allows the user to identify the current action being performed at runtime. It has the following parameters: -* [DataSourceSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotActionBeginEventArgs.html#Syncfusion_Blazor_PivotView_PivotActionBeginEventArgs_DataSourceSettings): It holds the current data source settings such as input data source, rows, columns, values, filters, format settings and so on. +* [DataSourceSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotActionBeginEventArgs.html#Syncfusion_Blazor_PivotView_PivotActionBeginEventArgs_DataSourceSettings): Contains the current data source settings such as input data source, rows, columns, values, filters, format settings and more. -* [ActionName](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotActionBeginEventArgs.html#Syncfusion_Blazor_PivotView_PivotActionBeginEventArgs_ActionName): It holds the name of the current action began. For example, while performing aggregation, the action name will be shown as **Aggregate field**. +* [ActionName](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotActionBeginEventArgs.html#Syncfusion_Blazor_PivotView_PivotActionBeginEventArgs_ActionName): Provides the name of the current action initiated. For example, when selecting aggregation, the action name is **Aggregate field**. -* [FieldInfo](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotActionBeginEventArgs.html#Syncfusion_Blazor_PivotView_PivotActionBeginEventArgs_FieldInfo): It holds the selected value field information. +* [FieldInfo](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotActionBeginEventArgs.html#Syncfusion_Blazor_PivotView_PivotActionBeginEventArgs_FieldInfo): Contains information regarding the selected value field. -N> This option is applicable only when the field based UI actions are performed such as filtering, sorting, removing field from grouping bar, editing and aggregation type change. +N> This option applies only to actions performed through the field-based UI, such as filtering, sorting, removing a field from the grouping bar, editing, and changing the aggregation type. -* [Cancel](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotActionBeginEventArgs.html#Syncfusion_Blazor_PivotView_PivotActionBeginEventArgs_Cancel): It allows user to restrict the current action. +* [Cancel](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotActionBeginEventArgs.html#Syncfusion_Blazor_PivotView_PivotActionBeginEventArgs_Cancel): Allows restricting the current action. -In the following example, action taken during aggregation type selection via dropdown icon can be restricted by setting the **args.Cancel** option to **true** in the `OnActionBegin` event. +In the following example, an action taken during aggregation type selection via the dropdown icon can be prevented by setting the **args.Cancel** option to **true** in the `OnActionBegin` event. ```cshtml @using Syncfusion.Blazor.PivotView @@ -284,18 +290,17 @@ In the following example, action taken during aggregation type selection via dro } } ``` -### OnActionComplete - -The event [OnActionComplete](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewEvents-1.html#Syncfusion_Blazor_PivotView_PivotViewEvents_1_OnActionComplete) triggers when a UI action, such as applying aggregation using the dropdown icon via the value field button, which is present in both the grouping bar and the field list UI, is completed. This allows user to identify the current UI action being completed at runtime. It has the following parameters: - -* [DataSourceSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotActionCompleteEventArgs-1.html#Syncfusion_Blazor_PivotView_PivotActionCompleteEventArgs_1_DataSourceSettings): It holds the current data source settings such as input data source, rows, columns, values, filters, format settings and so on. -* [ActionName](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotActionCompleteEventArgs-1.html#Syncfusion_Blazor_PivotView_PivotActionCompleteEventArgs_1_ActionName): It holds the name of the current action completed. For example, after completing the aggregation, the action name will be shown as **Field aggregated**. +### OnActionComplete -* [FieldInfo](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotActionCompleteEventArgs-1.html#Syncfusion_Blazor_PivotView_PivotActionCompleteEventArgs_1_FieldInfo): It holds the selected value field information. +The [OnActionComplete](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewEvents-1.html#Syncfusion_Blazor_PivotView_PivotViewEvents_1_OnActionComplete) event is triggered when a UI action is completed, such as changing the aggregation type using the dropdown icon in the value field button, available within both the grouping bar and field list user interfaces. This event enables users to identify which UI action has been completed at runtime. The event provides the following parameters: -N> This option is applicable only when the field based UI actions are performed such as filtering, sorting, removing field from grouping bar, editing and aggregation type change. +* [DataSourceSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotActionCompleteEventArgs-1.html#Syncfusion_Blazor_PivotView_PivotActionCompleteEventArgs_1_DataSourceSettings): The current data source settings, including input data source, rows, columns, values, filters, format settings, and related properties. +* [ActionName](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotActionCompleteEventArgs-1.html#Syncfusion_Blazor_PivotView_PivotActionCompleteEventArgs_1_ActionName): Specifies the name of the completed action. For example, after changing the aggregation type, the action name will be **Field aggregated**. +* [FieldInfo](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotActionCompleteEventArgs-1.html#Syncfusion_Blazor_PivotView_PivotActionCompleteEventArgs_1_FieldInfo): Contains information about the selected value field. +* [ActionInfo](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotActionCompleteEventArgs-1.html#Syncfusion_Blazor_PivotView_PivotActionCompleteEventArgs_1_ActionInfo): Defines the unique information about the current UI action performed. +N> This option is applicable only when field-based UI actions are performed, such as filtering, sorting, removing a field from the grouping bar, editing, and changing the aggregation type. ```cshtml @using Syncfusion.Blazor.PivotView @@ -337,13 +342,13 @@ N> This option is applicable only when the field based UI actions are performed } } ``` -### OnActionFailure -The event [OnActionFailure](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewEvents-1.html#Syncfusion_Blazor_PivotView_PivotViewEvents_1_OnActionFailure) triggers when the current UI action fails to achieve the desired result. It has the following parameters: +### OnActionFailure -* [ActionName](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotActionFailureEventArgs.html#Syncfusion_Blazor_PivotView_PivotActionFailureEventArgs_ActionName): It holds the name of the current action failed. For example, if the action fails while performing the aggregation, then the action name will be shown as **Aggregate field**. +The [OnActionFailure](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewEvents-1.html#Syncfusion_Blazor_PivotView_PivotViewEvents_1_OnActionFailure) event is triggered when a UI action fails to produce the expected result. This event provides detailed information about the failure through the following parameters: -* [ErrorInfo](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotActionFailureEventArgs.html#Syncfusion_Blazor_PivotView_PivotActionFailureEventArgs_ErrorInfo): It holds the error information of the current UI action. +* [ActionName](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotActionFailureEventArgs.html#Syncfusion_Blazor_PivotView_PivotActionFailureEventArgs_ActionName): Specifies the name of the failed action. For example, if the failure occurs during aggregation, the action name will be **Aggregate field**. +* [ErrorInfo](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotActionFailureEventArgs.html#Syncfusion_Blazor_PivotView_PivotActionFailureEventArgs_ErrorInfo): Contains detailed error information related to the failed UI action. ```cshtml @using Syncfusion.Blazor.PivotView diff --git a/blazor/pivot-table/calculated-field.md b/blazor/pivot-table/calculated-field.md index 7511dd74eb..b8c664fe6e 100644 --- a/blazor/pivot-table/calculated-field.md +++ b/blazor/pivot-table/calculated-field.md @@ -9,14 +9,25 @@ documentation: ug # Calculated Field in Blazor Pivot Table Component -Allows end user to create a new calculated field in the pivot table, based on the available fields from the bound data source or using simple formula with basic arithmetic operators. It can be added at runtime through the built-in dialog, invoked from Field List UI. To do so, set the [AllowCalculatedField](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SfPivotView-1.html#Syncfusion_Blazor_PivotView_SfPivotView_1_AllowCalculatedField) property in [SfPivotView](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SfPivotView-1.html) class to **true** in the pivot table. End user can now see a "CALCULATED FIELD" button enabled in Field List UI automatically, which on clicking will invoke the calculated field dialog and perform necessary operation. +The calculated field feature enables users to create custom value fields using mathematical formulas and existing fields from their data source. Users can perform complex calculations with basic arithmetic operators and seamlessly integrate these custom fields into their pivot table for enhanced data visualization and reporting. -Calculated field can also be included in the pivot table through code behind using the [PivotViewCalculatedFieldsSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewCalculatedFieldSetting.html) class. The required properties to create a new calculate field are: -* [Name](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewCalculatedFieldSetting.html#Syncfusion_Blazor_PivotView_PivotViewCalculatedFieldSetting_Name): It allows to indicate the calculated field with a unique name. -* [Formula](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewCalculatedFieldSetting.html#Syncfusion_Blazor_PivotView_PivotViewCalculatedFieldSetting_Formula): It allows to set the formula. -* [Format](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.FormatSettings.html#Syncfusion_Blazor_PivotView_FormatSettings_Format): It helps to set the number format for the resultant value. +## Creating calculated fields -N> The calculated field is applicable only for value fields. By default, the calculated fields created through code-behind are only added to the field list and calculated field dialog UI. To display the calculated field in the pivot table UI, it must be added to the [`PivotViewValues`](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewValue.html) class, as shown in the code below. +Users can create calculated fields in two convenient ways: +- **Interactive Method**: Using the built-in dialog accessible from the Field List UI. +- **Code-Based Method**: Configuring fields programmatically using the [PivotViewCalculatedFieldSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewCalculatedFieldSetting.html) class. + +To enable the calculated field functionality, set the [AllowCalculatedField](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SfPivotView-1.html#Syncfusion_Blazor_PivotView_SfPivotView_1_AllowCalculatedField) property to **true**. Once enabled, a "CALCULATED FIELD" button appears in the Field List UI. Clicking this button opens the calculated field dialog, where users can create and manage custom fields using an intuitive interface. + +### Defining calculated fields programmatically + +You can define calculated fields programmatically using the [PivotViewCalculatedFieldSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewCalculatedFieldSetting.html) class. This approach is ideal for pre-configuring specific calculations. The following properties are essential for creating a calculated field: + +- [Name](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotCalculatedFieldSetting.html#Syncfusion_Blazor_PivotView_PivotCalculatedFieldSetting_Name): Specifies a unique name for the calculated field. +- [Formula](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotCalculatedFieldSetting.html#Syncfusion_Blazor_PivotView_PivotCalculatedFieldSetting_Formula): Defines the mathematical expression using existing field names and arithmetic operators. +- [Format](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.FormatSettings.html#Syncfusion_Blazor_PivotView_FormatSettings_Format): Configures the number format for displaying calculated results. + +N> The calculated field feature applies only to value fields. By default, calculated fields created programmatically are added to the field list and calculated field dialog UI. To display a calculated field in the pivot table UI, it must be added to the [PivotViewValues](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewValue.html) class, as shown in the code below. ```cshtml @using Syncfusion.Blazor.PivotView @@ -60,7 +71,9 @@ N> The calculated field is applicable only for value fields. By default, the cal ![Calculated Field in Blazor PivotTable](images/blazor-pivottable-calculated-field.png) -Meanwhile, the user can also view calculated field dialog in UI by invoking [CreateCalculatedFieldDialogAsync](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SfPivotView-1.html#Syncfusion_Blazor_PivotView_SfPivotView_1_CreateCalculatedFieldDialog) method on an external button click. +## Opening the calculated field dialog programmatically + +You can display the calculated field dialog by calling the [CreateCalculatedFieldDialogAsync](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SfPivotView-1.html#Syncfusion_Blazor_PivotView_SfPivotView_1_CreateCalculatedFieldDialog) method when an external button is clicked. This provides additional flexibility for accessing the calculated field functionality. ```cshtml @using Syncfusion.Blazor.PivotView @@ -109,65 +122,108 @@ Meanwhile, the user can also view calculated field dialog in UI by invoking [Cre ![Displaying Calculated Field Button in Blazor PivotTable](images/blazor-pivottable-calc-field.png) -## Editing through the field list and the grouping bar +## Editing through the field list and grouping bar -User can also modify the existing calculated field using the built-in edit option available directly in the field list (or) grouping bar. To do so, click the "Edit" icon available in the calculated field button. Now the calculated field dialog is opened and the current calculated field name, formula and format can be changed at runtime. +You can easily modify existing calculated fields using the built-in edit option available in both the field list and grouping bar. This feature allows you to update formulas, change field names, or adjust formatting without recreating the entire calculated field. + +To edit an existing calculated field: + +1. Locate the calculated field button in either the field list or the grouping bar. +2. Click the **Edit** icon next to the calculated field name. +3. The calculated field dialog opens, displaying the current settings. +4. Make changes to the field name, formula, or format as needed. +5. Click **OK** to apply the changes. ![Editing Calculated Field in Blazor PivotTable](images/blazor-pivottable-editing-calculated-field.png)
-
+ ![Editing Calculated Field Formula in Blazor PivotTable](images/blazor-pivottable-calc-fieldlist-edit.png) -## Renaming the existing calculated field +## Renaming an existing calculated field + +You can rename any existing calculated field directly through the user interface at runtime. This option helps you maintain clear and meaningful names for your calculated fields as your analysis requirements evolve. + +To rename a calculated field: -Existing calculated field can be renamed only through the UI at runtime. To do so, open the calculated field dialog, select the target field and click "Edit" icon. User can now see the existing name getting displayed in the text box at the top of the dialog. Now, change the name based on user requirement and click "OK". +1. Locate the calculated field button in either the field list or the grouping bar. +2. Click the **Edit** icon next to the calculated field name. +3. The calculated field dialog opens, displaying the current field name in the text box at the top. +4. Replace the existing name with your preferred name. +5. Click **OK** to save the new name. - ![Editing in Blazor PivotTable Calculated Field](images/blazor-pivottable-edit-calculate-field.png)
-
+ ![Renaming in Blazor PivotTable Calculated Field](images/blazor-pivottable-renaming-calc-field.png) -## Editing the existing calculated field formula +## Editing an existing calculated field formula + +This option allows you to modify the formulas of existing calculated fields directly through the user interface, ensuring your calculations remain accurate and up to date with changing requirements. -Existing calculated field formula can be edited only through the UI at runtime. To do so, open the calculated field dialog, select the target field and click "Edit" icon. User can now see the existing formula getting displayed in a multiline text box at the bottom of the dialog. Now, change the formula based on user requirement and click "OK". +To edit an existing calculated field formula: + +1. Open the calculated field dialog. +2. Select the calculated field you want to edit from the list. +3. Click the **Edit** icon next to the selected field. +4. The existing formula appears in a multiline text box at the bottom of the dialog. +5. Update the formula according to your requirements. +6. Click **OK** to save your changes. + +The pivot table will automatically refresh to reflect the updated calculations. ![Editing in Blazor PivotTable Calculated Field](images/blazor-pivottable-editing-calculated-field.png)
-
+ ![Editing in Blazor PivotTable Calculated Field Formula](images/blazor-pivottable-edit-calc-field-formula.png) -## Reusing the existing formula in a new calculate field +## Reusing an existing formula in a new calculated field + +This option enables you to quickly create new calculated fields by reusing formulas from existing fields, saving time and ensuring consistency across your calculations. + +To reuse an existing formula: -While creating a new calculated field, if the user wants to the add the formula of an existing calculated field, it can be done easily. To do so, simply drag-and-drop the existing calculated field to the "Formula" section. +1. Open the calculated field dialog to create a new field. +2. Locate the existing calculated field whose formula you want to reuse. +3. Drag the existing calculated field from the tree view. +4. Drop it into the **Formula** section. +5. The formula from the existing field is automatically added to your new calculated field. +6. Modify the formula further if needed, or use it as is. +7. Click **OK** to create the new calculated field. ![Dragging Existing Calculated Field in Blazor PivotTable](images/blazor-pivottable-drag-existing-calculated-field.png)
-
+ ![Dragging Blazor PivotTable Field to Formula](images/blazor-pivottable-drag-calc-field-to-formula.png)
-
+ ![Reusing Existing Calculated Field Formula in Blazor PivotTable](images/blazor-pivottable-reusing-existed-calc-field-formula.png) -## Apply the format to the calculated field values +## Applying formatting to calculated field values + +Formatting calculated field values enhances the readability and insight of your data in the pivot table. You can apply different formats using the calculated field dialog in the UI or programmatically through code. -Values in a new or existing calculated field can be formatted via the calculated field UI or code behind. The [PivotViewFormatSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewFormatSetting.html) property in code-behind can be used to specify the desired format. For more information about the supported formats [refer here](https://blazor.syncfusion.com/documentation/pivot-table/number-formatting). +To format calculated field values in your code, use the [PivotViewFormatSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewFormatSetting.html) class. For more information about supported number formats, refer to the documentation [here](https://blazor.syncfusion.com/documentation/pivot-table/number-formatting). -To apply format to calculated field values at runtime via UI, a built-in dropdown under the "Format" label is available, from which the user can select the pre-defined format options listed below. +### Formatting through the user interface -* **Standard** - Denotes the numeric type. -* **Currency** - Denotes the currency type. -* **Percentage** - Denotes the percentage type. +To apply formatting to calculated field values via the user interface, use the built-in "Format" dropdown available in the calculated field dialog. This dropdown provides the following predefined format options: + +* **Standard** - Displays numbers in their basic numeric form. +* **Currency** - Displays numbers as currency values. +* **Percentage** - Displays numbers as percentage values. * **Custom** - Denotes the custom format. For example: "C2". This shows the value "9584.3" as "$9584.30." -* **None** - Denotes that no format will be applied. +* **None** - Applies no formatting to the values. -N> By default, **None** will be selected from the dropdown. +N> By default, **None** is selected in the dropdown. ![Applying Format to Blazor PivotTable Calculated Field](images/blazor-pivottable-calc-formatstring.png) -In addition, you can specify the desired custom formats by selecting the **Custom** option from the "Format" dropdown. +### Applying custom formatting + +For specific formatting requirements, select the **Custom** option from the "Format" dropdown. This allows you to enter custom format patterns that meet your exact display needs. ![Applying custom format through Blazor PivotTable calculated field dialog UI](images/calculatdfield-apply-custom-format.png) + ## Supported operators and functions for the calculated field formula Below is a list of operators and functions that can be used in the formula to create the calculated fields. @@ -314,14 +370,25 @@ Syntax: Max(number1, number2) ### CalculatedFieldCreate -The event [CalculatedFieldCreate](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewEvents-1.html#Syncfusion_Blazor_PivotView_PivotViewEvents_1_CalculatedFieldCreate) fires while closing the dialog on "OK" button click. It allows to customize the new or existing calculated field information obtained from the dialog. It has the following parameters. +The [CalculatedFieldCreate](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewEvents-1.html#Syncfusion_Blazor_PivotView_PivotViewEvents_1_CalculatedFieldCreate) event enables you to validate and manage calculated field details before they are applied to the pivot table. This ensures data accuracy and prevents invalid configurations. The event is triggered when the "OK" button is clicked to close the calculated field dialog, allowing you to modify or validate the calculated field information before it is saved. + +**Event Parameters:** + +The event provides the following parameters to facilitate interaction with calculated field data: + +* [CalculatedField](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.CalculatedFieldCreateEventArgs.html#Syncfusion_Blazor_PivotView_CalculatedFieldCreateEventArgs_CalculatedField): Contains the calculated field information (new or existing) that was entered in the dialog. + +* [CalculatedFieldSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.CalculatedFieldCreateEventArgs.html#Syncfusion_Blazor_PivotView_CalculatedFieldCreateEventArgs_CalculatedFieldSettings): Provides access to the current [CalculatedFieldSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewCalculatedFieldSetting.html) of the pivot table. + +* [Cancel](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.CalculatedFieldCreateEventArgs.html#Syncfusion_Blazor_PivotView_CalculatedFieldCreateEventArgs_Cancel): A boolean property that prevents the dialog changes from being applied when set to **true**. -* [CalculatedField](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.CalculatedFieldCreateEventArgs.html#Syncfusion_Blazor_PivotView_CalculatedFieldCreateEventArgs_CalculatedField): It holds the new or existing calculated field information obtained from the dialog. +* [DataSourceSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.CalculatedFieldCreateEventArgs.html#Syncfusion_Blazor_PivotView_CalculatedFieldCreateEventArgs_DataSourceSettings): Contains the current data source configuration, including input data, rows, columns, values, filters, and format settings. -* [CalculatedFieldSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.CalculatedFieldCreateEventArgs.html#Syncfusion_Blazor_PivotView_CalculatedFieldCreateEventArgs_CalculatedFieldSettings): It holds the [CalculatedFieldSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewCalculatedFieldSetting.html) property of the pivot report. +* [FieldName](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.CalculatedFieldCreateEventArgs.html#Syncfusion_Blazor_PivotView_CalculatedFieldCreateEventArgs_FieldName): Specifies the name of the field being created or updated. -* [Cancel](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.CalculatedFieldCreateEventArgs.html#Syncfusion_Blazor_PivotView_CalculatedFieldCreateEventArgs_Cancel): It is a boolean property and by setting this to true , the customization done in calculated field dialog won’t be applied to the calculated field. +**Example:** +The following example shows how to prevent users from creating calculated fields without setting a format: ```cshtml @using Syncfusion.Blazor.PivotView @@ -371,11 +438,20 @@ The event [CalculatedFieldCreate](https://help.syncfusion.com/cr/blazor/Syncfu ### OnActionBegin -The event [OnActionBegin](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewEvents-1.html#Syncfusion_Blazor_PivotView_PivotViewEvents_1_OnActionBegin) when clicking calculated field button, calculated field edit icon and context menu in the tree view inside the calculated field dialog. This allows user to identify the current action being performed at runtime. It has the following parameters: +The [OnActionBegin](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewEvents-1.html#Syncfusion_Blazor_PivotView_PivotViewEvents_1_OnActionBegin) event allows you to control and monitor calculated field operations before they are executed, enabling you to validate or restrict user actions as needed. -* [DataSourceSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotActionBeginEventArgs.html#Syncfusion_Blazor_PivotView_PivotActionBeginEventArgs_DataSourceSettings): It holds the current data source settings such as input data source, rows, columns, values, filters, format settings and so on. +This event is triggered when users interact with calculated field functionality in the following ways: +- Clicking the calculated field button +- Clicking the edit icon for an existing calculated field +- Using the context menu in the tree view within the calculated field dialog -* [ActionName](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotActionBeginEventArgs.html#Syncfusion_Blazor_PivotView_PivotActionBeginEventArgs_ActionName): It holds the name of the current action began. The following are the UI actions and their names: +The event provides the following parameters to help you handle these interactions: + +**Event Parameters:** + +- [DataSourceSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotActionBeginEventArgs.html#Syncfusion_Blazor_PivotView_PivotActionBeginEventArgs_DataSourceSettings): Contains the current data source configuration, including input data, rows, columns, values, filters, format settings, and other pivot table settings. + +- [ActionName](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotActionBeginEventArgs.html#Syncfusion_Blazor_PivotView_PivotActionBeginEventArgs_ActionName): Identifies the specific action the user is attempting to perform. The table below lists the available actions and their corresponding names: | Action | Action Name| |----------------|-------------| @@ -383,13 +459,15 @@ The event [OnActionBegin](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazo | [Edit icon in calculated field](https://blazor.syncfusion.com/documentation/pivot-table/calculated-field#editing-through-the-field-list-and-the-groupingbar)| Edit calculated field| | [Context menu in the tree view inside the calculated field dialog](./calculated-field)| Calculated field context menu| -* [FieldInfo](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotActionBeginEventArgs.html#Syncfusion_Blazor_PivotView_PivotActionBeginEventArgs_FieldInfo): It holds the selected value field information. +- [FieldInfo](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotActionBeginEventArgs.html#Syncfusion_Blazor_PivotView_PivotActionBeginEventArgs_FieldInfo): Provides information about the selected field when the action involves a specific field. -N> This option is applicable only when the field based UI actions are performed such as filtering, sorting, removing field from grouping bar, editing and aggregation type change. +N> This parameter is available only when the action involves a specific field, such as filtering, sorting, removing a field from the grouping bar, editing, or changing the aggregation type. -* [Cancel](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotActionBeginEventArgs.html#Syncfusion_Blazor_PivotView_PivotActionBeginEventArgs_Cancel): It allows user to restrict the current action. +- [Cancel](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotActionBeginEventArgs.html#Syncfusion_Blazor_PivotView_PivotActionBeginEventArgs_Cancel): A boolean property that allows you to prevent the current action from completing. Set this to **true** to stop the action from proceeding. -In the following example, the calculated field button click action, that is, opening of the calculated field dialog can be restricted by setting the **args.Cancel** option to **true** in the `OnActionBegin` event. +**Example:** + +The example below illustrates how to prevent access to the calculated field dialog by canceling the action triggered when a user clicks the calculated field button. This is achieved by setting the **args.Cancel** property to **true** within the [OnActionBegin](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewEvents-1.html#Syncfusion_Blazor_PivotView_PivotViewEvents_1_OnActionBegin) event: ```cshtml @using Syncfusion.Blazor.PivotView @@ -438,25 +516,33 @@ In the following example, the calculated field button click action, that is, ope } } ``` + ### OnActionComplete -The event [OnActionComplete](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewEvents-1.html#Syncfusion_Blazor_PivotView_PivotViewEvents_1_OnActionComplete) triggers when the calculated field is completely created or edited. This allows user to identify the current UI action being completed at runtime. It has the following parameters: +The [OnActionComplete](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewEvents-1.html#Syncfusion_Blazor_PivotView_PivotViewEvents_1_OnActionComplete) event enables you to track when calculated field operations are successfully completed in the Pivot Table. This event is useful for performing additional actions or logging activities after users create or modify calculated fields. + +The event provides the following parameters to help you handle completed operations: -* [DataSourceSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotActionCompleteEventArgs-1.html#Syncfusion_Blazor_PivotView_PivotActionCompleteEventArgs_1_DataSourceSettings): It holds the current data source settings such as input data source, rows, columns, values, filters, format settings and so on. +**Event Parameters:** -* [ActionName](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotActionCompleteEventArgs-1.html#Syncfusion_Blazor_PivotView_PivotActionCompleteEventArgs_1_ActionName): It holds the name of the current action completed. The following are the UI actions and their names: +- [DataSourceSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotActionCompleteEventArgs-1.html#Syncfusion_Blazor_PivotView_PivotActionCompleteEventArgs_1_DataSourceSettings): Contains the updated data source configuration, including input data, rows, columns, values, filters, format settings, and other pivot table settings after the operation is completed. + +- [ActionName](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotActionCompleteEventArgs-1.html#Syncfusion_Blazor_PivotView_PivotActionCompleteEventArgs_1_ActionName): Identifies the specific action completed by the user. The table below lists the available actions and their corresponding names: | Action | Action Name| |----------------|-------------| | [Calculated field button](https://blazor.syncfusion.com/documentation/pivot-table/calculated-field)| Calculated field applied| | [Edit icon in calculated field](https://blazor.syncfusion.com/documentation/pivot-table/calculated-field#editing-through-the-field-list-and-the-groupingbar)| Calculated field edited| +- [FieldInfo](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotActionCompleteEventArgs-1.html#Syncfusion_Blazor_PivotView_PivotActionCompleteEventArgs_1_FieldInfo): Provides information about the selected field when the action involves a specific field. + +N> This parameter is available only when the action involves a specific field, such as filtering, sorting, removing a field from the grouping bar, editing, or changing the aggregation type. -* [FieldInfo](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotActionCompleteEventArgs-1.html#Syncfusion_Blazor_PivotView_PivotActionCompleteEventArgs_1_FieldInfo): It holds the selected value field information. +- [ActionInfo](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotActionCompleteEventArgs-1.html#Syncfusion_Blazor_PivotView_PivotActionCompleteEventArgs_1_ActionInfo): Contains detailed information about the completed action. For calculated field operations, this includes the complete calculated field information, its formula, and the field name. -N> This option is applicable only when the field based UI actions are performed such as filtering, sorting, removing field from grouping bar, editing and aggregation type change. +**Example:** -* [ActionInfo](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotActionCompleteEventArgs-1.html#Syncfusion_Blazor_PivotView_PivotActionCompleteEventArgs_1_ActionInfo): It holds the unique information about the current UI action. For example, if the edit action is completed, this event will be triggered, and the argument will display information such as the entire calculated field information and its formula, including the field name. +The example below demonstrates how to use the [OnActionComplete](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewEvents-1.html#Syncfusion_Blazor_PivotView_PivotViewEvents_1_OnActionComplete) event to log information when calculated field operations are completed: ```cshtml @using Syncfusion.Blazor.PivotView @@ -505,9 +591,10 @@ N> This option is applicable only when the field based UI actions are performed } } ``` + ### OnActionFailure -The event [OnActionFailure](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewEvents-1.html#Syncfusion_Blazor_PivotView_PivotViewEvents_1_OnActionFailure) triggers when the current UI action fails to achieve the desired result. It has the following parameters: +The [OnActionFailure](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewEvents-1.html#Syncfusion_Blazor_PivotView_PivotViewEvents_1_OnActionFailure) event is triggered when a UI action fails to produce the expected result. This event provides detailed information about the failure through the following parameters: * [ActionName](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotActionFailureEventArgs.html#Syncfusion_Blazor_PivotView_PivotActionFailureEventArgs_ActionName): It holds the name of the current action failed. The following are the UI actions and their names: @@ -517,7 +604,6 @@ The event [OnActionFailure](https://help.syncfusion.com/cr/blazor/Syncfusion.Bla | [Edit icon in calculated field](https://blazor.syncfusion.com/documentation/pivot-table/calculated-field#editing-through-the-field-list-and-the-groupingbar)| Edit calculated field| | [Context menu in the tree view inside the calculated field dialog](./calculated-field)| Calculated field context menu| - * [ErrorInfo](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotActionFailureEventArgs.html#Syncfusion_Blazor_PivotView_PivotActionFailureEventArgs_ErrorInfo): It holds the error information of the current UI action. ```cshtml @@ -578,4 +664,5 @@ The event [OnActionFailure](https://help.syncfusion.com/cr/blazor/Syncfusion.Bla } } ``` + N> You can refer to the [Blazor Pivot Table](https://www.syncfusion.com/blazor-components/blazor-pivot-table) feature tour page for its groundbreaking feature representations. You can also explore the [Blazor Pivot Table example](https://blazor.syncfusion.com/demos/pivot-table/default-functionalities?theme=bootstrap5) to know how to render and configure the pivot table. \ No newline at end of file diff --git a/blazor/pivot-table/conditional-formatting.md b/blazor/pivot-table/conditional-formatting.md index 8cd80f1ed5..5e97707c05 100644 --- a/blazor/pivot-table/conditional-formatting.md +++ b/blazor/pivot-table/conditional-formatting.md @@ -9,14 +9,14 @@ documentation: ug # Conditional Formatting in Blazor Pivot Table Component -It allows the end user to change the appearance of the pivot table value cells with its background color, font color, font family, and font size based on the specific conditions. +The conditional formatting feature enables users to customize the appearance of pivot table value cells by modifying background color, font color, font family, and font size based on specific conditions. This powerful visualization feature helps highlight important value cells and makes them stand out in the pivot table. To know about **Conditional Formatting** feature in Blazor Pivot Table component, you can check this video. {% youtube "youtube:https://www.youtube.com/watch?v=C2w2KWKc0f8"%} -The conditional formatting can be applied at runtime through the built-in dialog, invoked from the toolbar. To do so, set the [AllowConditionalFormatting](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SfPivotView-1.html#Syncfusion_Blazor_PivotView_SfPivotView_1_AllowConditionalFormatting) and [ShowToolbar](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SfPivotView-1.html#Syncfusion_Blazor_PivotView_SfPivotView_1_ShowToolbar) properties in [SfPivotView](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SfPivotView-1.html) class to **true**. Also, include the item [ToolbarItems.ConditionalFormatting](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.ToolbarItems.html) within the [Toolbar](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SfPivotView-1.html#Syncfusion_Blazor_PivotView_SfPivotView_1_Toolbar) property in the [SfPivotView](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SfPivotView-1.html) class. End user can now see the "Conditional Formatting" icon in toolbar UI automatically, which on clicking will invoke the formatting dialog to perform necessary operations. +The conditional formatting can be applied at runtime through the built-in dialog, invoked from the toolbar. To enable this functionality, set the [AllowConditionalFormatting](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SfPivotView-1.html#Syncfusion_Blazor_PivotView_SfPivotView_1_AllowConditionalFormatting) and [ShowToolbar](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SfPivotView-1.html#Syncfusion_Blazor_PivotView_SfPivotView_1_ShowToolbar) properties in [SfPivotView](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SfPivotView-1.html) class to **true**. Additionally, include the item [ToolbarItems.ConditionalFormatting](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.ToolbarItems.html) within the [Toolbar](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SfPivotView-1.html#Syncfusion_Blazor_PivotView_SfPivotView_1_Toolbar) property in the [SfPivotView](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SfPivotView-1.html) class. Users will see the "Conditional Formatting" icon in the toolbar UI automatically, which opens the formatting dialog when clicked. ```cshtml @using Syncfusion.Blazor.PivotView @@ -55,35 +55,38 @@ The conditional formatting can be applied at runtime through the built-in dialog ``` - -![Displaying Conditional Format Icon in Blazor PivotTable Toolbar](images/blazor-pivottable-conditional-format-in-toolbar.png) +![Displaying Conditional Format Icon in Blazor Pivot Table Toolbar](images/blazor-pivottable-conditional-format-in-toolbar.png)

-![Adding New Conditional Format in Blazor PivotTable](images/blazor-pivottable-add-new-conditonal-format.png) +![Adding New Conditional Format in Blazor Pivot Table](images/blazor-pivottable-add-new-conditonal-format.png)

-![Changing Conditional Format Criteria in Blazor PivotTable](images/blazor-pivottable-change-conditional-format-criteria.png) +![Changing Conditional Format Criteria in Blazor Pivot Table](images/blazor-pivottable-change-conditional-format-criteria.png)

-![Displaying Conditional Format in Blazor PivotGrid](images/blazor-pivotgrid-with-conditional-format.png) +![Displaying Conditional Format in Blazor Pivot Table](images/blazor-pivotgrid-with-conditional-format.png) -Conditional formatting can also be included in the pivot table through the code-behind using the [PivotViewConditionalFormatSetting](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewConditionalFormatSetting.html) class. The required properties to apply a new conditional formatting are, +## Configure conditional formatting through code-behind + +Conditional formatting can also be applied programmatically during component initialization using the [PivotViewConditionalFormatSetting](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewConditionalFormatSetting.html) class in the [PivotViewDataSourceSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html). This approach allows you to define formatting rules directly in the code-behind, ensuring that specific styling conditions are automatically applied when the pivot table loads. The required properties to apply a new conditional formatting are, * [ApplyGrandTotals](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewConditionalFormatSetting.html#Syncfusion_Blazor_PivotView_PivotViewConditionalFormatSetting_ApplyGrandTotals): This boolean property allows you to restrict conditional formatting for grand totals in the row and column axes. By default, this property is set to true. * [Measure](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewConditionalFormatSetting.html#Syncfusion_Blazor_PivotView_PivotViewConditionalFormatSetting_Measure): Specifies the value field name for which style will be applied. * [Conditions](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewConditionalFormatSetting.html#Syncfusion_Blazor_PivotView_PivotViewConditionalFormatSetting_Conditions): Defines the operator type used for conditional formatting, such as equals, greater than, less than, etc. * [Value1](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewConditionalFormatSetting.html#Syncfusion_Blazor_PivotView_PivotViewConditionalFormatSetting_Value1): Specifies the starting value for the conditional formatting. * [Value2](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewConditionalFormatSetting.html#Syncfusion_Blazor_PivotView_PivotViewConditionalFormatSetting_Value2): Specifies the ending value for the conditional formatting range. This property is applicable only for conditions like **Between** and **NotBetween**. -* [PivotViewStyle](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewStyle.html): Specifies the custom styling applied to the cell. +* [PivotViewStyle](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewStyle.html): Specifies the custom styling applied to the cell. -The available style properties in [PivotViewStyle](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewStyle.html) class, to set in value cells are: +The [PivotViewStyle](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewStyle.html) class includes the following properties, which you can use to customize the appearance of value cells: * [BackgroundColor](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewStyle.html#Syncfusion_Blazor_PivotView_PivotViewStyle_BackgroundColor): It allows to set the background color to the value cell in the pivot table. * [Color](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewStyle.html#Syncfusion_Blazor_PivotView_PivotViewStyle_Color): It allows to set the font color to the value cell in the pivot table. * [FontFamily](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewStyle.html#Syncfusion_Blazor_PivotView_PivotViewStyle_FontFamily): It allows to set the font family to the value cell in the pivot table. * [FontSize](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewStyle.html#Syncfusion_Blazor_PivotView_PivotViewStyle_FontSize): It allows to set the font size to the value cell in the pivot table. -Meanwhile, user can also view conditional formatting dialog in UI by invoking [ShowConditionalFormattingDialogAsync](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SfPivotView-1.html#Syncfusion_Blazor_PivotView_SfPivotView_1_ShowConditionalFormattingDialog) method on an external button click. +## Opening conditional formatting dialog programmatically + +Users can also access the conditional formatting dialog through external UI elements by calling the [ShowConditionalFormattingDialogAsync](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SfPivotView-1.html#Syncfusion_Blazor_PivotView_SfPivotView_1_ShowConditionalFormattingDialog) method. In the following example, an external button is used to open the conditional formatting dialog programmatically. ```cshtml @using Syncfusion.Blazor.PivotView @@ -140,13 +143,15 @@ Meanwhile, user can also view conditional formatting dialog in UI by invoking [S ``` -![Displaying Conditional Format Button in Blazor PivotTable](images/blazor-pivottable-conditional-format-button.png) +![Displaying Conditional Format Button in Blazor Pivot Table](images/blazor-pivottable-conditional-format-button.png) -![Applying Conditional Format in Blazor PivotTable](images/blazor-pivottable-apply-conditional-format.png) +![Applying Conditional Format in Blazor Pivot Table](images/blazor-pivottable-apply-conditional-format.png) ## Conditional formatting for all fields -It allows end user to apply conditional formatting commonly for all value fields just by ignoring the [Measure](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewConditionalFormatSetting.html#Syncfusion_Blazor_PivotView_PivotViewConditionalFormatSetting_Measure) property and setting rest of the properties in [PivotViewConditionalFormatSetting](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewConditionalFormatSetting.html) class. +The Pivot Table component allows you to apply conditional formatting to all value fields simultaneously. This approach ensures consistent highlighting and styling of value cells across the entire pivot table, removing the need to configure formatting for each value field individually. + +To format all value fields together, use the [PivotViewConditionalFormatSetting](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewConditionalFormatSetting.html) class without specifying the [Measure](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewConditionalFormatSetting.html#Syncfusion_Blazor_PivotView_PivotViewConditionalFormatSetting_Measure) property. When the [Measure](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewConditionalFormatSetting.html#Syncfusion_Blazor_PivotView_PivotViewConditionalFormatSetting_Measure) property is omitted, the formatting rules are automatically applied to every value field in your pivot table, resulting in a uniform appearance for all value cells. ```cshtml @using Syncfusion.Blazor.PivotView @@ -191,11 +196,11 @@ It allows end user to apply conditional formatting commonly for all value fields ``` -![Applying Conditonal Format to Value Field in Blazor PivotTable](images/blazor-pivottable-conditional-format.png) +![Applying Conditional Format to Value Field in Blazor Pivot Table](images/blazor-pivottable-conditional-format.png) ## Conditional formatting for specific value field -It allows the end user to apply conditional formatting to a specific value field by setting the [Measure](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewConditionalFormatSetting.html#Syncfusion_Blazor_PivotView_PivotViewConditionalFormatSetting_Measure) property with specific value field name in [PivotViewConditionalFormatSetting](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewConditionalFormatSetting.html) class. +To apply conditional formatting exclusively to a particular value field, set the [Measure](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewConditionalFormatSetting.html#Syncfusion_Blazor_PivotView_PivotViewConditionalFormatSetting_Measure) property with the specific value field name in [PivotViewConditionalFormatSetting](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewConditionalFormatSetting.html) class. ```cshtml @using Syncfusion.Blazor.PivotView @@ -240,12 +245,12 @@ It allows the end user to apply conditional formatting to a specific value field ``` -![Applying Conditional Format to Specific Field in Blazor PivotTable](images/blazor-pivottable-conditional-format-for-specific-field.png) +![Applying Conditional Format to Specific Field in Blazor Pivot Table](images/blazor-pivottable-conditional-format-for-specific-field.png) ## Editing and removing existing conditional format -Editing and removing existing conditional format can be done through the UI at runtime. To do so, open the conditional formatting dialog and edit the "Value", "Condition" and "Format" options based on the user requirement and click "OK". To remove a conditional format, click the "Delete" icon besides the respective condition. +Editing and removing existing conditional format can be done through the UI at runtime. To do so, open the conditional formatting dialog and edit the "Value", "Condition" and "Format" options based on user requirement and click "OK". To remove a conditional format, click the "Delete" icon besides the respective condition. -![Editing Existed Conditional Format in Blazor PivotTable](images/blazor-pivottable-edit-conditional-format.png) +![Editing Existed Conditional Format in Blazor Pivot Table](images/blazor-pivottable-edit-conditional-format.png) N> You can refer to the [Blazor Pivot Table](https://www.syncfusion.com/blazor-components/blazor-pivot-table) feature tour page for its groundbreaking feature representations. You can also explore the [Blazor Pivot Table example](https://blazor.syncfusion.com/demos/pivot-table/default-functionalities?theme=bootstrap5) to know how to render and configure the pivot table. \ No newline at end of file diff --git a/blazor/pivot-table/connecting-to-data-source/elasticsearch.md b/blazor/pivot-table/connecting-to-data-source/elasticsearch.md index 3eddde37ab..cd91ae16db 100644 --- a/blazor/pivot-table/connecting-to-data-source/elasticsearch.md +++ b/blazor/pivot-table/connecting-to-data-source/elasticsearch.md @@ -1,24 +1,40 @@ --- -title: "Elasticsearch Data Binding in Blazor Pivot Table Component | Syncfusion" +layout: post +title: "Elasticsearch Data Binding in Blazor Pivot Table | Syncfusion" component: "Pivot Table" -description: "Learn how to bind data from a Elasticsearch database in the Syncfusion Blazor Pivot Table and more." +description: "Learn how to bind data from an Elasticsearch database to the Syncfusion Blazor Pivot Table and more." +platform: Blazor +documentation: ug --- -# Elasticsearch Data Binding +# Elasticsearch Data Binding in Blazor Pivot Table -This section describes how to use [Nest](https://www.nuget.org/packages/Nest) to retrieve data from a Elasticsearch database and bind it to the Blazor Pivot Table. +This guide explains how to connect an Elasticsearch database to the [Blazor Pivot Table](https://www.syncfusion.com/blazor-components/blazor-pivot-table) using the [NEST](https://www.nuget.org/packages/Nest) library. It describes two approaches: directly retrieving and binding data to the Pivot Table, and using a Web API service to fetch and display Elasticsearch data efficiently. -## Connecting a Elasticsearch to a Syncfusion® Blazor Pivot Table +## Connecting an Elasticsearch Database to a Syncfusion® Blazor Pivot Table -**1.** Create a simple Blazor Pivot Table by following the **"Getting Started"** documentation [link](../getting-started). +This section explains how to connect the Pivot Table component to an Elasticsearch database by directly retrieving data using the [NEST](https://www.nuget.org/packages/Nest) library. -**2.** To connect a Elasticsearch database using the Nest in our application, we need to install the [Nest](https://www.nuget.org/packages/Nest) NuGet package. To do so, open the NuGet package manager of the project solution, search for the package **Nest** and install it. +### Step 1: Create a Pivot Table in Blazor +1. Set up a Blazor Pivot Table as described in the [Getting Started](../getting-started) documentation. -![Add the NuGet package "Nest" to the project](../images/Elasticsearch-nuget-package-install.png) +### Step 2: Install the NEST NuGet Package +1. Open the **NuGet Package Manager** in your project solution. +2. Search for the **NEST** package and install it to enable connectivity with the Elasticsearch server. -**3.** Next, in the **Index.razor** page, under the **OnInitialized** method, connect to Elasticsearch database. You can get the specified database by using the **ElasticClient**. Following that, the **Search** method of the **ElasticClient** is used to retrieve results from the database. Then populate the data collection from the **Hits** of the **SearchResponse** into a list using the **JTokenReader**. +![Add the NuGet package Nest to the project](../images/next-nuget-package-install.png) -**4.** Finally, bind the list to the [DataSource](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html?&_ga=2.187712492.558891908.1675655056-779654442.1675225237#Syncfusion_Blazor_PivotView_PivotViewDataSourceSettings_1_DataSource) property in the [PivotViewDataSourceSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.DataSourceSettingsModel-1.html?_ga=2.112723776.558891908.1675655056-779654442.1675225237) and configure the report to use the Elasticsearch data. +### Step 3: Configure Elasticsearch Connection +1. In the **Index.razor** page, within the `OnInitialized` method, use the **ElasticClient** class from the NEST library to establish a connection to the Elasticsearch database. +2. Use the **Search** method to query an Elasticsearch index and retrieve data. +3. Convert the retrieved data from the `Hits` collection of the `SearchResponse` into a list using `JTokenReader`. + +### Step 4: Bind Data to the Pivot Table +1. Assign the populated list to the [DataSource](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html#Syncfusion_Blazor_PivotView_PivotViewDataSourceSettings_1_DataSource) property within the [PivotViewDataSourceSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html). +2. Configure the Pivot Table report to structure the data retrieved from the Elasticsearch database. +3. Add fields to the [PivotViewRows](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html#Syncfusion_Blazor_PivotView_PivotViewDataSourceSettings_1_Rows), [PivotViewColumns](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html#Syncfusion_Blazor_PivotView_PivotViewDataSourceSettings_1_Columns), [PivotViewValues](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html#Syncfusion_Blazor_PivotView_PivotViewDataSourceSettings_1_Values), and [PivotViewFilters](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html#Syncfusion_Blazor_PivotView_PivotViewDataSourceSettings_1_Filters) properties of [PivotViewDataSourceSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html) to define the report structure, specifying how data fields are organized and aggregated in the Pivot Table. + +Below is the sample code to bind and configure the Pivot Table with Elasticsearch data. ```cshtml @using System.Data @@ -28,7 +44,7 @@ This section describes how to use [Nest](https://www.nuget.org/packages/Nest) to @using Syncfusion.Blazor.PivotView - + @@ -45,7 +61,7 @@ This section describes how to use [Nest](https://www.nuget.org/packages/Nest) to @code { - private static List dataList = new List(); + private static List dataList = new List(); protected override void OnInitialized() { @@ -82,55 +98,45 @@ This section describes how to use [Nest](https://www.nuget.org/packages/Nest) to } ``` -When you run the application, the resultant pivot table will look like this. +### Step 5: Run and Verify the Pivot Table +1. Run the Blazor application. +2. The Pivot Table will display the data fetched from the Elasticsearch database, structured according to the defined report. +3. The resulting Pivot Table will appear as follows: ![Blazor Pivot Table bound with Elasticsearch data](../images/blazor-pivottable-Elasticsearch-databinding.png) -## Connecting a Elasticsearch to a Syncfusion® Blazor Pivot Table via Web API service +## Connecting an Elasticsearch Database to a Syncfusion® Blazor Pivot Table via Web API Service -### Create a Web API service to fetch Elasticsearch data +This section explains how to create a Web API service to retrieve data from an Elasticsearch database and connect it to the [Blazor Pivot Table](https://www.syncfusion.com/blazor-components/blazor-pivot-table). -**1.** Open Visual Studio and create an ASP.NET Core Web App project type, naming it **MyWebService**. To create an ASP.NET Core Web application, follow the documentation [link](https://learn.microsoft.com/en-us/visualstudio/get-started/csharp/tutorial-aspnet-core?view=vs-2022). +### Create a Web API Service to Fetch Elasticsearch Data -![Create ASP.NET Core Web App project](../images/azure-asp-core-web-service-create.png) +Follow these steps to create a Web API service that retrieves data from an Elasticsearch database and prepares it for the Pivot Table. -**2.** To connect a Elasticsearch using the **Nest** in our application, we need to install the [Nest](https://www.nuget.org/packages/Nest) NuGet package. To do so, open the NuGet package manager of the project solution, search for the package **Nest** and install it. +#### Step 1: Create an ASP.NET Core Web Application +1. Open Visual Studio and create a new **ASP.NET Core Web App** project named **MyWebService**. +2. Follow the instructions in the [Microsoft documentation](https://learn.microsoft.com/en-us/visualstudio/get-started/csharp/tutorial-aspnet-core?view=vs-2022) to set up the project. -![Add the NuGet package "Nest" to the project](../images/Elasticsearch-nuget-package-install-in-web-service-app.png) +![Create ASP.NET Core Web App project](../images/azure-asp-core-web-service-create.png) -**3.** Create a Web API controller (aka, PivotController.cs) file under **Controllers** folder that helps to establish data communication with the Pivot Table. +#### Step 2: Install the NEST NuGet Package +1. Install the **NEST** package using the **NuGet Package Manager** to enable Elasticsearch connectivity. -**4.** In the Web API controller (aka, PivotController), **ElasticClient** helps to connect the Elasticsearch database. Next, using **Search** method of the **ElasticClient** you can query your Elasticsearch index and retrieve results from the database. +![Add the NuGet package Nest to the project](../images/next-nuget-package-install.png) -```csharp -using Microsoft.AspNetCore.Mvc; -using Nest; -using Newtonsoft.Json; +#### Step 3: Create a Web API Controller +1. In the **Controllers** folder, create a new Web API controller named **PivotController.cs**. +2. This controller will facilitate data communication between the Elasticsearch database and the Pivot Table. -namespace MyWebService.Controllers -{ - [ApiController] - [Route("[controller]")] - public class PivotController : ControllerBase - { - private static object FetchElasticsearchData() - { - // Replace with your own connection string. - var connectionString = ""; - var uri = new Uri(connectionString); - var connectionSettings = new ConnectionSettings(uri); - var client = new ElasticClient(connectionSettings); - var searchResponse = client.Search(s => s - .Index("australian_weather") - .Size(1000) - ); - return searchResponse.Documents; - } - } -} -``` +#### Step 4: Configure Elasticsearch Connection +1. In the **PivotController.cs** file, use the **ElasticClient** class from the NEST library to establish a connection to the Elasticsearch database. +2. Use the **Search** method to query an Elasticsearch index and retrieve data. -**5.** In the **Get()** method of the **PivotController.cs** file, the **FetchElasticsearchData** method is used to retrieve the Elasticsearch data as a object, which is then serialized into JSON string using **JsonConvert.SerializeObject()**. +#### Step 5: Implement Data Retrieval Logic +1. In the **PivotController.cs** file, define a **Get()** method that calls the **FetchElasticsearchData** method to retrieve data from Elasticsearch. +2. Serialize the retrieved data into JSON format using **JsonConvert.SerializeObject()**. + +Here’s the sample code for the **PivotController.cs** file: ```csharp using Microsoft.AspNetCore.Mvc; @@ -166,23 +172,56 @@ namespace MyWebService.Controllers } ``` -**6.** Run the application and it will be hosted within the URL `https://localhost:44323`. +#### Step 6: Run the Web Application +1. Build and run the web application. +2. The application will be hosted at the URL `https://localhost:44323`. -**7.** Finally, the retrieved data from Elasticsearch which is in the form of JSON can be found in the Web API controller available in the URL link `https://localhost:44323/Pivot`, as shown in the browser page below. +#### Step 7: Verify the Data +1. Access the Web API endpoint at `https://localhost:44323/Pivot` to view the JSON data retrieved from the Elasticsearch database. +2. The browser will display the JSON data, as shown below. ![Hosted Web API URL](../images/Elasticsearch-data.png) -### Connecting the Pivot Table to a Elasticsearch using the Web API service +### Connecting the Pivot Table to an Elasticsearch Database Using the Web API Service + +This section explains how to connect the Pivot Table component to an Elasticsearch database by retrieving data from the Web API service created in the previous section. -**1.** Create a simple Blazor Pivot Table by following the **"Getting Started"** documentation [link](../getting-started). +#### Step 1: Create a Pivot Table in Blazor +1. Set up a Blazor Pivot Table as described in the [Getting Started](../getting-started) documentation. -**2.** Map the hosted Web API's URL link `https://localhost:44323/Pivot` to the Pivot Table in **Index.razor** by using the [Url](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataManager.html?&_ga=2.200411303.844585580.1677740066-2135459383.1677740066#Syncfusion_Blazor_DataManager_Url) property under [PivotViewDataSourceSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.DataSourceSettingsModel-1.html?_ga=2.200411303.844585580.1677740066-2135459383.1677740066). This [Url](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html#Syncfusion_Blazor_PivotView_PivotViewDataSourceSettings_1_Url) property aids in the de-serialization of Elasticsearch data into instances of your model data class (aka, TValue="ElasticSearchService") while bound to the pivot table. +#### Step 2: Configure the Web API URL in the Pivot Table +1. In the **Index.razor** file, map the Web API URL (`https://localhost:44323/Pivot`) to the Pivot Table using the [Url](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html#Syncfusion_Blazor_PivotView_PivotViewDataSourceSettings_1_Url) property within the [PivotViewDataSourceSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html). +2. The [Url](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html#Syncfusion_Blazor_PivotView_PivotViewDataSourceSettings_1_Url) property facilitates deserializing Elasticsearch data into instances of your model data class (i.e., TValue="ElasticSearchService") for binding to the Pivot Table. ```cshtml @using Syncfusion.Blazor.PivotView - + + + + +@code { + public class ElasticSearchService + { + public int Quantity { get; set; } + public string Product { get; set; } + public string Date { get; set; } + public string Country { get; set; } + public double Amount { get; set; } + } +} +``` + +#### Step 3: Define the Pivot Table Report +1. Configure the Pivot Table report in the **Index.razor** file to structure the data retrieved from the Elasticsearch database. +2. Add fields to the [PivotViewRows](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html#Syncfusion_Blazor_PivotView_PivotViewDataSourceSettings_1_Rows), [PivotViewColumns](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html#Syncfusion_Blazor_PivotView_PivotViewDataSourceSettings_1_Columns), [PivotViewValues](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html#Syncfusion_Blazor_PivotView_PivotViewDataSourceSettings_1_Values), and [PivotViewFilters](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html#Syncfusion_Blazor_PivotView_PivotViewDataSourceSettings_1_Filters) properties to organize data in the Pivot Table. + +```cshtml +@using Syncfusion.Blazor.PivotView + + + @@ -199,20 +238,22 @@ namespace MyWebService.Controllers @code { - public class PostgreSQLService + public class ElasticSearchService { - public TimeSpan openinghours_practice { get; set; } - public TimeSpan closinghours_practice { get; set; } - public string servicetype { get; set; } - public string servicecategory { get; set; } - public int revenue { get; set; } + public int Quantity { get; set; } + public string Product { get; set; } + public string Date { get; set; } + public string Country { get; set; } + public double Amount { get; set; } } } ``` - -When you run the application, the resultant pivot table will look like this. +#### Step 4: Run and Verify the Pivot Table +1. Run the Blazor application. +2. The Pivot Table will display the data fetched from the Elasticsearch database via the Web API, structured according to the defined report. +3. The resulting Pivot Table will appear as follows: ![Blazor Pivot Table bound with Elasticsearch data](../images/blazor-pivottable-Elasticsearch-databinding.png) -> In [this](https://github.com/SyncfusionExamples/how-to-bind-Elasticsearch-database-to-pivot-table/tree/master/Blazor) GitHub repository, you can find our Blazor Pivot Table sample for binding data from a Elasticsearch using the Web API service. \ No newline at end of file +N> In [this](https://github.com/SyncfusionExamples/how-to-bind-Elasticsearch-database-to-pivot-table/tree/master/Blazor) GitHub repository, you can find our Blazor Pivot Table sample for binding data from an Elasticsearch database using the Web API service. \ No newline at end of file diff --git a/blazor/pivot-table/connecting-to-data-source/microsoft-sql-server.md b/blazor/pivot-table/connecting-to-data-source/microsoft-sql-server.md index a585b85c99..5140a335b3 100644 --- a/blazor/pivot-table/connecting-to-data-source/microsoft-sql-server.md +++ b/blazor/pivot-table/connecting-to-data-source/microsoft-sql-server.md @@ -1,24 +1,39 @@ --- -title: "Microsoft SQL Data Binding in Blazor Pivot Table Component | Syncfusion" +layout: post +title: "Microsoft SQL Data Binding in Blazor Pivot Table | Syncfusion" component: "Pivot Table" -description: "Learn how to bind data from a Microsoft SQL server in the Syncfusion Blazor Pivot Table and more." +description: "Learn how to connect a Microsoft SQL Server database to the Syncfusion Blazor Pivot Table and more." +platform: Blazor +documentation: ug --- -# Microsoft SQL Data Binding +# Microsoft SQL Data Binding in Blazor Pivot Table -This section describes how to use [System.Data.SqlClient](https://www.nuget.org/packages/System.Data.SqlClient/4.8.5?_src=template) to retrieve data from a Microsoft SQL server database and bind it to the Blazor Pivot Table. +This guide explains how to connect a Microsoft SQL Server database to the [Blazor Pivot Table](https://www.syncfusion.com/blazor-components/blazor-pivot-table) using the [System.Data.SqlClient](https://www.nuget.org/packages/System.Data.SqlClient/4.8.5?_src=template) library. It covers two methods: directly retrieving and binding data to the Pivot Table and using a Web API service to fetch and display Microsoft SQL data. ## Connecting a Microsoft SQL database to a Syncfusion® Blazor Pivot Table -**1.** Create a simple Blazor Pivot Table by following the **"Getting Started"** documentation [link](../getting-started). +This section describes how to connect the [Blazor Pivot Table](https://www.syncfusion.com/blazor-components/blazor-pivot-table) to a Microsoft SQL database by directly retrieving data using the [System.Data.SqlClient](https://www.nuget.org/packages/System.Data.SqlClient/4.8.5?_src=template) library. -**2.** To connect a Microsoft SQL using the Microsoft SQL driver in our application, we need to install the [System.Data.SqlClient](https://www.nuget.org/packages/System.Data.SqlClient/4.8.5?_src=template) NuGet package. To do so, open the NuGet package manager of the project solution, search for the package **System.Data.SqlClient** and install it. +### Step 1: Set up a Blazor Pivot Table +1. Create a [Blazor Pivot Table](https://www.syncfusion.com/blazor-components/blazor-pivot-table) by following the [Getting Started](../getting-started) guide. -![Add the NuGet package "System.Data.SqlClient" to the project](../images/system-Data-sql-client-nuget-package-install.png) +### Step 2: Install the System.Data.SqlClient NuGet package +1. Open the **NuGet Package Manager** in your project solution. +2. Search for and install the [System.Data.SqlClient](https://www.nuget.org/packages/System.Data.SqlClient/4.8.5?_src=template) package to enable Microsoft SQL Server connectivity. -**3.** Next, in the **Index.razor** page, under the **OnInitialized** method, connect to Microsoft SQL server. **SqlConnection** helps to connect the SQL database (that is, Database1.mdf). Next, using **SqlCommand** and **SqlDataAdapter** you can process the desired SQL query string and retrieve data from the database. The **Fill** method of the DataAdapter is used to populate the SQL data into a **DataTable** , which is then converted to List type. +![Add the NuGet package System.Data.SqlClient to the project](../images/system-Data-sql-client-nuget-package-install.png) -**4.** Finally, bind the list to the [DataSource](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html?&_ga=2.187712492.558891908.1675655056-779654442.1675225237#Syncfusion_Blazor_PivotView_PivotViewDataSourceSettings_1_DataSource) property in the [PivotViewDataSourceSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.DataSourceSettingsModel-1.html?_ga=2.112723776.558891908.1675655056-779654442.1675225237) and configure the report to use the Microsoft SQL data. +### Step 3: Connect to the Microsoft SQL database +In the **Index.razor** file, under the `OnInitialized` method, use the [System.Data.SqlClient](https://www.nuget.org/packages/System.Data.SqlClient/4.8.5?_src=template) library to connect to a Microsoft SQL database and retrieve data for the Pivot Table. + +1. **Establish connection**: Use **SqlConnection** with a valid connection string, such as `Server=localhost;Database=Database1;Trusted_Connection=True;`, to connect to the Microsoft SQL database. +2. **Query and fetch data**: Execute a SQL query, such as `SELECT * FROM table1`, using **SqlCommand** to retrieve data for the Pivot Table. +3. **Structure the data**: Use the **Fill** method of **SqlDataAdapter** to populate the query results into a **DataTable**, which is then converted to a list for binding to the Pivot Table. + +### Step 4: Bind data to the Pivot Table +1. Assign the retrieved list to the [DataSource](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html#Syncfusion_Blazor_PivotView_PivotViewDataSourceSettings_1_DataSource) property of the [PivotViewDataSourceSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.DataSourceSettingsModel-1.html). +2. Configure the Pivot Table by defining fields in the [PivotViewColumns](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html#Syncfusion_Blazor_PivotView_PivotViewDataSourceSettings_1_Columns), [PivotViewRows](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html#Syncfusion_Blazor_PivotView_PivotViewDataSourceSettings_1_Rows), [PivotViewValues](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html#Syncfusion_Blazor_PivotView_PivotViewDataSourceSettings_1_Values), and [PivotViewFormatSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html#Syncfusion_Blazor_PivotView_PivotViewDataSourceSettings_1_FormatSettings) to organize and format the data. ```cshtml @using Syncfusion.Blazor.PivotView; @@ -39,7 +54,7 @@ This section describes how to use [System.Data.SqlClient](https://www.nuget.org/ - + @code { @@ -77,105 +92,138 @@ This section describes how to use [System.Data.SqlClient](https://www.nuget.org/ } ``` -When you run the application, the resultant pivot table will look like this. +### Step 5: Run and verify the Pivot Table +1. Run the Blazor application. +2. The Pivot Table will display the Microsoft SQL data, organized according to the defined configuration. +3. The resulting Pivot Table will look like this: ![Blazor Pivot Table bound with Microsoft SQL data](../images/blazor-pivottable-Ms-SQL-databinding.png) ## Connecting a Microsoft SQL to a Syncfusion® Blazor Pivot Table via Web API service +This section explains how to create a Web API service to fetch data from a Microsoft SQL database and connect it to the Blazor Pivot Table. + ### Create a Web API service to fetch Microsoft SQL data -**1.** Open Visual Studio and create an ASP.NET Core Web App project type, naming it **MyWebService**. To create an ASP.NET Core Web application, follow the documentation [link](https://learn.microsoft.com/en-us/visualstudio/get-started/csharp/tutorial-aspnet-core?view=vs-2022). +Follow these steps to set up a Web API service that retrieves Microsoft SQL data for the Pivot Table. + +#### Step 1: Create an ASP.NET Core Web application +1. Open Visual Studio and create a new **ASP.NET Core Web App** project named **MyWebService**. +2. Refer to the [Microsoft documentation](https://learn.microsoft.com/en-us/visualstudio/get-started/csharp/tutorial-aspnet-core?view=vs-2022) for detailed setup instructions. ![Create ASP.NET Core Web App project](../images/azure-asp-core-web-service-create.png) -**2.** To connect a Microsoft SQL using the **System.Data.SqlClient** in our application, we need to install the [System.Data.SqlClient](https://www.nuget.org/packages/System.Data.SqlClient/4.8.5?_src=template) NuGet package. To do so, open the NuGet package manager of the project solution, search for the package **System.Data.SqlClient** and install it. +#### Step 2: Install the System.Data.SqlClient NuGet package +1. Open the **NuGet Package Manager** in your project solution. +2. Search for and install the [System.Data.SqlClient](https://www.nuget.org/packages/System.Data.SqlClient/4.8.5?_src=template) package to enable Microsoft SQL Server connectivity. -![Add the NuGet package "Sytem.Data.SqlClient" to the project](../images/system-Data-sql-client-nuget-package-install.png) +![Add the NuGet package System.Data.SqlClient to the project](../images/system-Data-sql-client-nuget-package-install.png) -**3.** Create a Web API controller (aka, PivotController.cs) file under **Controllers** folder that helps to establish data communication with the Pivot Table. +#### Step 3: Create a Web API controller +1. In the **Controllers** folder, create a new Web API controller named **PivotController.cs**. +2. This controller manages data communication between the Microsoft SQL database and the Pivot Table. -**4.** In the Web API controller (aka, PivotController), connect to Microsoft SQL server. **SqlConnection** helps to connect the SQL database (that is, Database1.mdf). Next, using **SqlCommand** and **SqlDataAdapter** you can process the desired SQL query string and retrieve data from the database. The **Fill** method of the DataAdapter is used to populate the SQL data into a **DataTable** as shown in the following code snippet. +#### Step 4: Connect to Microsoft SQL and retrieve data +In the **PivotController.cs** file, use the [System.Data.SqlClient](https://www.nuget.org/packages/System.Data.SqlClient/4.8.5?_src=template) library to connect to a Microsoft SQL database and fetch data for the Pivot Table. -```csharp - using Microsoft.AspNetCore.Mvc; - using Microsoft SQL.Data.Microsoft SQLClient; - using Newtonsoft.Json; - using System.Data; +1. **Establish connection**: Use **SqlConnection** with a valid connection string to access the Microsoft SQL database. +2. **Fetch data**: Run a SQL query, such as `SELECT * FROM table1`, using **SqlCommand** to retrieve data. +3. **Prepare data**: Use the **Fill** method of **SqlDataAdapter** to store the query results in a **DataTable** for JSON serialization. - namespace MyWebService.Controllers +```csharp +using Microsoft.AspNetCore.Mvc; +using Newtonsoft.Json; +using System.Data; +using System.Data.SqlClient; + +namespace MyWebService.Controllers +{ + [ApiController] + [Route("[controller]")] + public class PivotController : ControllerBase { - [ApiController] - [Route("[controller]")] - public class PivotController : ControllerBase + private static DataTable FetchSQLResult() { - public dynamic GetMicrosoft SQLResult() - { - // Replace with your own connection string. - string conSTR = @""; - string xquery = "SELECT * FROM table1"; - SqlConnection sqlConnection = new(conSTR); - sqlConnection.Open(); - SqlCommand sqlCommand = new(xquery, sqlConnection); - SqlDataAdapter dataAdapter = new(sqlCommand); - DataTable dataTable = new(); - dataAdapter.Fill(dataTable); - return dataTable; - } + string conSTR = @""; + string xquery = "SELECT * FROM table1"; + SqlConnection sqlConnection = new(conSTR); + sqlConnection.Open(); + SqlCommand sqlCommand = new(xquery, sqlConnection); + SqlDataAdapter dataAdapter = new(sqlCommand); + DataTable dataTable = new(); + dataAdapter.Fill(dataTable); + sqlConnection.Close(); + return dataTable; } } - +} ``` -**5.** In the **Get()** method of the **PivotController.cs** file, the **GetMicrosoft SQLResult** method is used to retrieve the Microsoft SQL data as a list, which is then serialized into JSON string using **JsonConvert.SerializeObject()**. +#### Step 5: Serialize data to JSON +1. In the **PivotController.cs** file, create a **Get** method that calls **FetchSQLResult** to retrieve Microsoft SQL data. +2. Use **JsonConvert.SerializeObject** from the [Newtonsoft.Json](https://www.nuget.org/packages/Newtonsoft.Json) library to serialize the **DataTable** into JSON format. -```csharp - using Microsoft.AspNetCore.Mvc; - using Microsoft SQL.Data.Microsoft SQLClient; - using Newtonsoft.Json; - using System.Data; +> Ensure the **Newtonsoft.Json** NuGet package is installed in your project. - namespace MyWebService.Controllers +```csharp +using Microsoft.AspNetCore.Mvc; +using Newtonsoft.Json; +using System.Data; +using System.Data.SqlClient; + +namespace MyWebService.Controllers +{ + [ApiController] + [Route("[controller]")] + public class PivotController : ControllerBase { - [ApiController] - [Route("[controller]")] - public class PivotController : ControllerBase + [HttpGet(Name = "GetSQLResult")] + public object Get() { - [HttpGet(Name = "GetMicrosoft SQLResult")] - public object Get() - { - return JsonConvert.SerializeObject(GetMicrosoft SQLResult()); - } - - public dynamic GetMicrosoft SQLResult() - { - // Replace with your own connection string. - string conSTR = @""; - string xquery = "SELECT * FROM table1"; - SqlConnection sqlConnection = new(conSTR); - sqlConnection.Open(); - SqlCommand sqlCommand = new(xquery, sqlConnection); - SqlDataAdapter dataAdapter = new(sqlCommand); - DataTable dataTable = new(); - dataAdapter.Fill(dataTable); - return dataTable; - } + return JsonConvert.SerializeObject(FetchSQLResult()); } - } + private static DataTable FetchSQLResult() + { + string conSTR = @""; + string xquery = "SELECT * FROM table1"; + SqlConnection sqlConnection = new(conSTR); + sqlConnection.Open(); + SqlCommand sqlCommand = new(xquery, sqlConnection); + SqlDataAdapter dataAdapter = new(sqlCommand); + DataTable dataTable = new(); + dataAdapter.Fill(dataTable); + sqlConnection.Close(); + return dataTable; + } + } +} ``` -**6.** Run the application and it will be hosted within the URL `https://localhost:7146`. +#### Step 6: Run the Web API service +1. Build and run the application. +2. The application will be hosted at `https://localhost:7139/` (the port number may vary). + +#### Step 7: Verify the JSON data +1. Access the Web API endpoint at `https://localhost:7139/Pivot` to view the JSON data retrieved from the Microsoft SQL database. +2. The browser will display the JSON data, as shown below. -**7.** Finally, the retrieved data from Microsoft SQL database which is in the form of JSON can be found in the Web API controller available in the URL link `https://localhost:7146/Pivot`, as shown in the browser page below. +![Hosted Web API URL](../images/code-web-app.jpeg) -![Hosted Web API URL](../images/Ms-Sql-data.png) +### Connecting the Pivot Table to a Microsoft SQL database using the Web API service -### Connecting the Pivot Table to a Microsoft SQL using the Web API service +This section explains how to connect the [Blazor Pivot Table](https://www.syncfusion.com/blazor-components/blazor-pivot-table) to Microsoft SQL data retrieved via the Web API service. -**1.** Create a simple Blazor Pivot Table by following the **"Getting Started"** documentation [link](../getting-started). +#### Step 1: Set up a Blazor Pivot Table +1. Create a [Blazor Pivot Table](https://www.syncfusion.com/blazor-components/blazor-pivot-table) by following the [Getting Started](../getting-started) guide. -**2.** Map the hosted Web API's URL link `https://localhost:7139/Pivot` to the Pivot Table in **Index.razor** by using the [Url](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataManager.html?&_ga=2.200411303.844585580.1677740066-2135459383.1677740066#Syncfusion_Blazor_DataManager_Url) property under [PivotViewDataSourceSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.DataSourceSettingsModel-1.html?_ga=2.200411303.844585580.1677740066-2135459383.1677740066). This [Url](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html#Syncfusion_Blazor_PivotView_PivotViewDataSourceSettings_1_Url) property aids in the de-serialization of Microsoft SQL data into instances of your model data class (aka, TValue="ProductDetails") while bound to the pivot table. +#### Step 2: Configure the Web API URL +1. In the **Index.razor** file, map the Web API URL (`https://localhost:7139/Pivot`) to the Pivot Table using the [Url](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html#Syncfusion_Blazor_PivotView_PivotViewDataSourceSettings_1_Url) property of [PivotViewDataSourceSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.DataSourceSettingsModel-1.html). +2. The [Url](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html#Syncfusion_Blazor_PivotView_PivotViewDataSourceSettings_1_Url) property deserialize Microsoft SQL data into instances of your model data class (e.g., `TValue="OrderDetails"`) for binding to the Pivot Table. + +#### Step 3: Define the Pivot Table report +1. Configure the Pivot Table by defining fields in the [PivotViewColumns](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html#Syncfusion_Blazor_PivotView_PivotViewDataSourceSettings_1_Columns), [PivotViewRows](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html#Syncfusion_Blazor_PivotView_PivotViewDataSourceSettings_1_Rows), [PivotViewValues](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html#Syncfusion_Blazor_PivotView_PivotViewDataSourceSettings_1_Values), and [PivotViewFormatSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html#Syncfusion_Blazor_PivotView_PivotViewDataSourceSettings_1_FormatSettings) properties. +2. Enable the field list by setting [ShowFieldList](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SfPivotView-1.html#Syncfusion_Blazor_PivotView_SfPivotView_1_ShowFieldList) to **true** for interactive field management. ```cshtml @using Syncfusion.Blazor.PivotView @@ -194,7 +242,7 @@ When you run the application, the resultant pivot table will look like this. - + @@ -210,9 +258,12 @@ When you run the application, the resultant pivot table will look like this. } ``` - -When you run the application, the resultant pivot table will look like this. +#### Step 4: Run and verify the Pivot Table +1. Run the Blazor application. +2. The Pivot Table will display the Microsoft SQL data fetched via the Web API, structured according to the defined configuration. +3. The resulting Pivot Table will look like this: ![Blazor Pivot Table bound with Microsoft SQL data](../images/blazor-pivottable-Ms-SQL-databinding.png) -> In [this](https://github.com/SyncfusionExamples/how-to-bind-SQL-to-pivot-table/tree/master/Blazor) GitHub repository, you can find our Blazor Pivot Table sample for binding data from a Microsoft SQL using the Web API service. \ No newline at end of file +### Additional resources +Explore a complete example of the Blazor Pivot Table integrated with an ASP.NET Core Web application to fetch data from a Microsoft SQL database in this [GitHub repository](https://github.com/SyncfusionExamples/aspnetcore-bind-SQL-database-to-pivot-table). \ No newline at end of file diff --git a/blazor/pivot-table/connecting-to-data-source/mongodb.md b/blazor/pivot-table/connecting-to-data-source/mongodb.md index e7270f05ea..e43bab03b0 100644 --- a/blazor/pivot-table/connecting-to-data-source/mongodb.md +++ b/blazor/pivot-table/connecting-to-data-source/mongodb.md @@ -1,24 +1,39 @@ --- +layout: post title: "MongoDB Data Binding in Blazor Pivot Table Component | Syncfusion" component: "Pivot Table" -description: "Learn how to bind data from a MongoDB in the Syncfusion Blazor Pivot Table and more." +description: "Learn how to connect a MongoDB database to the Syncfusion Blazor Pivot Table using the MongoDB.Driver library." +platform: Blazor +documentation: ug --- -# MongoDB Data Binding +# MongoDB Data Binding in Blazor Pivot Table Component -This section describes how to use [MongoDB driver](https://www.nuget.org/packages/MongoDB.Driver) to retrieve data from a MongoDB and bind it to the Blazor Pivot Table. +This guide explains how to connect a MongoDB database to the [Blazor Pivot Table](https://www.syncfusion.com/blazor-components/blazor-pivot-table) using the [MongoDB.Driver](https://www.nuget.org/packages/MongoDB.Driver) library. It covers two methods: directly retrieving and binding data to the Pivot Table, and using a Web API service to fetch and display MongoDB data. ## Connecting a MongoDB to a Syncfusion® Blazor Pivot Table -**1.** Create a simple Blazor Pivot Table by following the **"Getting Started"** documentation [link](../getting-started). +This section describes how to connect the Blazor Pivot Table to a MongoDB database by directly retrieving data using the [MongoDB.Driver](https://www.nuget.org/packages/MongoDB.Driver) library. -**2.** To connect a MongoDB using the MongoDB driver in our application, we need to install the [MongoDB.Driver](https://www.nuget.org/packages/MongoDB.Driver) NuGet package. To do so, open the NuGet package manager of the project solution, search for the package **MongoDB.Driver** and install it. +### Step 1: Set Up a Blazor Pivot Table +1. Create a Blazor Pivot Table by following the [Getting Started](../getting-started) guide. -![Add the NuGet package "MongoDB.Driver" to the project](../images/mongodb-nuget-package-install.png) +### Step 2: Install the MongoDB.Driver NuGet Package +1. Open the **NuGet Package Manager** in your project solution. +2. Search for the [MongoDB.Driver](https://www.nuget.org/packages/MongoDB.Driver) package and install it to enable MongoDB connectivity. -**3.** Next, in the **Index.razor** page, under the **OnInitialized** method, connect to MongoDB. You can get the specified database by using the **MongoClient** and its **GetDatabase** method. Following that, the **GetCollection** method of the **IMongoDatabase** is used to retrieve the desired collection from the database. Then, using a **BsonDocument** instance, populate the data collection from the **IMongoCollection** into a list using the **Find** method. +![Add the NuGet package MongoDB.Driver to the project](../images/mongodb-nuget-package-install.png) -**4.** Finally, bind the list to the [DataSource](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html?&_ga=2.187712492.558891908.1675655056-779654442.1675225237#Syncfusion_Blazor_PivotView_PivotViewDataSourceSettings_1_DataSource) property in the [PivotViewDataSourceSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.DataSourceSettingsModel-1.html?_ga=2.112723776.558891908.1675655056-779654442.1675225237) and configure the report to use the MongoDB data. +### Step 3: Connect to MongoDB +1. In the **Index.razor** file, under the `OnInitialized` method, use the **MongoClient** class to connect to the MongoDB database with a valid connection string. +2. Access the desired database using the **GetDatabase** method and retrieve the target collection with the **GetCollection** method. +3. Use the **Find** method with a **BsonDocument** to fetch data from the collection and convert it to a list. + +### Step 4: Bind Data to the Pivot Table +1. Assign the retrieved list to the [DataSource](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html#Syncfusion_Blazor_PivotView_PivotViewDataSourceSettings_1_DataSource) property of the [PivotViewDataSourceSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.DataSourceSettingsModel-1.html). +2. Configure the Pivot Table report by defining fields in the [PivotViewRows](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html#Syncfusion_Blazor_PivotView_PivotViewDataSourceSettings_1_Rows), [PivotViewColumns](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html#Syncfusion_Blazor_PivotView_PivotViewDataSourceSettings_1_Columns), [PivotViewValues](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html#Syncfusion_Blazor_PivotView_PivotViewDataSourceSettings_1_Values), and [PivotViewFormatSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html#Syncfusion_Blazor_PivotView_PivotViewDataSourceSettings_1_FormatSettings) to organize and format the data. + +The following code connects to a MongoDB database, retrieves data, and binds it to the Pivot Table. ```cshtml @using Syncfusion.Blazor.PivotView @@ -73,25 +88,41 @@ This section describes how to use [MongoDB driver](https://www.nuget.org/package } ``` -When you run the application, the resultant pivot table will look like this. +### Step 5: Run and Verify the Pivot Table +1. Run the Blazor application. +2. The Pivot Table will display the MongoDB data, organized according to the defined report. +3. The resulting Pivot Table will look like this: ![Blazor Pivot Table bound with MongoDB data](../images/blazor-pivottable-mongodb-databinding.png) ## Connecting a MongoDB to a Syncfusion® Blazor Pivot Table via Web API service -### Create a Web API service to fetch MongoDB data +This section explains how to create a Web API service to fetch data from a MongoDB database and connect it to the [Blazor Pivot Table](https://www.syncfusion.com/blazor-components/blazor-pivot-table) using the [MongoDB.Driver](https://www.nuget.org/packages/MongoDB.Driver). + +### Create a Web API Service to Fetch MongoDB Data + +Follow these steps to set up a Web API service that retrieves MongoDB data for the Pivot Table. -**1.** Open Visual Studio and create an ASP.NET Core Web App project type, naming it **MyWebService**. To create an ASP.NET Core Web application, follow the documentation [link](https://learn.microsoft.com/en-us/visualstudio/get-started/csharp/tutorial-aspnet-core?view=vs-2022). +#### Step 1: Create an ASP.NET Core Web Application +1. Open Visual Studio and create a new **ASP.NET Core Web App** project named **MyWebService**. +2. Refer to the [Microsoft documentation](https://learn.microsoft.com/en-us/visualstudio/get-started/csharp/tutorial-aspnet-core?view=vs-2022) for detailed setup instructions. ![Create ASP.NET Core Web App project](../images/azure-asp-core-web-service-create.png) -**2.** To connect a MongoDB using the **MongoDB driver** in our application, we need to install the [MongoDB.Driver](https://www.nuget.org/packages/MongoDB.Driver) NuGet package. To do so, open the NuGet package manager of the project solution, search for the package **MongoDB.Driver** and install it. +#### Step 2: Install the MongoDB.Driver NuGet Package +1. Open the **NuGet Package Manager** in the project solution. +2. Search for and install the [MongoDB.Driver](https://www.nuget.org/packages/MongoDB.Driver) package to enable MongoDB connectivity. -![Add the NuGet package "MongoDB.Driver" to the project](../images/mongodb-nuget-package-install-in-web-service-app.png) +![Add the NuGet package MongoDB.Driver to the project](../images/mongodb-nuget-package-install-in-web-service-app.png) -**3.** Create a Web API controller (aka, PivotController.cs) file under **Controllers** folder that helps to establish data communication with the Pivot Table. +#### Step 3: Create a Web API Controller +1. In the **Controllers** folder, create a new Web API controller named **PivotController.cs**. +2. This controller manages data communication between the MongoDB database and the Pivot Table. -**4.** In the Web API controller (aka, PivotController), **MongoClient** helps to connect the MongoDB server and retrieve database via **GetDatabase** method. Following that, the **GetCollection** method of the **IMongoDatabase** is used to retrieve the desired collection from the database. Then, using a **BsonDocument** instance, populate the data collection from the **IMongoCollection** into a list using the **Find** method. +#### Step 4: Connect to MongoDB and Retrieve Data +1. In the **PivotController.cs** file, use **MongoClient** to connect to the MongoDB database with a valid connection string. +2. Access the database with **GetDatabase** and the target collection with **GetCollection**. +3. Retrieve data using the **Find** method and convert it to a list. ```csharp using Microsoft.AspNetCore.Mvc; @@ -129,7 +160,13 @@ namespace MyWebService.Controllers } ``` -**5.** In the **Get()** method of the **PivotController.cs** file, the **FetchMongoDbResult** method is used to retrieve the MongoDB data as a list, which is then serialized into JSON string using **JsonConvert.SerializeObject()**. +#### Step 5: Serialize Data to JSON +1. In the **PivotController.cs** file, create a **Get** method that calls **FetchMongoDbResult** to retrieve MongoDB data. +2. Use **JsonConvert.SerializeObject** from the [Newtonsoft.Json](https://www.nuget.org/packages/Newtonsoft.Json) library to serialize the data into JSON format. + +> Ensure the **Newtonsoft.Json** NuGet package is installed in your project. + +The following code sets up the Web API controller to fetch and serialize MongoDB data. ```csharp using Microsoft.AspNetCore.Mvc; @@ -172,25 +209,40 @@ namespace MyWebService.Controllers } ``` -**6.** Run the application and it will be hosted within the URL `https://localhost:44346`. +#### Step 6: Run the Web API Service +1. Build and run the application. +2. The application will be hosted at `https://localhost:44346/` (the port number may vary). -**7.** Finally, the retrieved data from MongoDB which is in the form of JSON can be found in the Web API controller available in the URL link `https://localhost:44346/Pivot`, as shown in the browser page below. +#### Step 7: Verify the JSON Data +1. Access the Web API endpoint at `https://localhost:44346/Pivot` to view the JSON data retrieved from MongoDB. +2. The browser will display the JSON data, as shown below. ![Hosted Web API URL](../images/mongodb-data.png) -### Connecting the Pivot Table to a MongoDB using the Web API service +### Connecting the Pivot Table to MongoDB Using the Web API Service + +This section explains how to connect the Blazor Pivot Table to MongoDB data retrieved via the Web API service. -**1.** Create a simple Blazor Pivot Table by following the **"Getting Started"** documentation [link](../getting-started). +#### Step 1: Set Up a Blazor Pivot Table +1. Create a Blazor Pivot Table by following the [Getting Started](../getting-started) guide. -**2.** Map the hosted Web API's URL link `https://localhost:44346/Pivot` to the Pivot Table in **Index.razor** by using the [Url](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataManager.html?&_ga=2.200411303.844585580.1677740066-2135459383.1677740066#Syncfusion_Blazor_DataManager_Url) property under [PivotViewDataSourceSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.DataSourceSettingsModel-1.html?_ga=2.200411303.844585580.1677740066-2135459383.1677740066). This [Url](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html#Syncfusion_Blazor_PivotView_PivotViewDataSourceSettings_1_Url) property aids in the de-serialization of MongoDB data into instances of your model data class (aka, TValue="ProductDetails") while bound to the pivot table. +#### Step 2: Configure the Web API URL +1. In the **Index.razor** file, map the Web API URL (`https://localhost:44346/Pivot`) to the Pivot Table using the [Url](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html#Syncfusion_Blazor_PivotView_PivotViewDataSourceSettings_1_Url) property of [PivotViewDataSourceSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.DataSourceSettingsModel-1.html). +2. The [Url](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html#Syncfusion_Blazor_PivotView_PivotViewDataSourceSettings_1_Url) property facilitates deserializing MongoDB data into instances of your model data class (i.e., TValue="ProductDetails") for binding to the Pivot Table. + +#### Step 3: Define the Pivot Table Report +1. Configure the Pivot Table report by defining fields in the [PivotViewRows](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html#Syncfusion_Blazor_PivotView_PivotViewDataSourceSettings_1_Rows), [PivotViewColumns](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html#Syncfusion_Blazor_PivotView_PivotViewDataSourceSettings_1_Columns), [PivotViewValues](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html#Syncfusion_Blazor_PivotView_PivotViewDataSourceSettings_1_Values), and [PivotViewFormatSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html#Syncfusion_Blazor_PivotView_PivotViewDataSourceSettings_1_FormatSettings) properties. +2. Enable the field list by setting [ShowFieldList](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SfPivotView-1.html#Syncfusion_Blazor_PivotView_SfPivotView_1_ShowFieldList) to **true** for interactive field management. + +The following code connects the Pivot Table to the Web API and configures the report. ```cshtml @using Syncfusion.Blazor.PivotView - + - + @@ -210,7 +262,7 @@ namespace MyWebService.Controllers @code { public class ProductDetails - { + { public ObjectId _id { get; set; } public int Sold { get; set; } public double Amount { get; set; } @@ -222,9 +274,12 @@ namespace MyWebService.Controllers } ``` - -When you run the application, the resultant pivot table will look like this. +#### Step 4: Run and Verify the Pivot Table +1. Run the Blazor application. +2. The Pivot Table will display the MongoDB data fetched via the Web API, structured according to the defined report. +3. The resulting Pivot Table will look like this: ![Blazor Pivot Table bound with MongoDB data](../images/blazor-pivottable-mongodb-databinding.png) -> In [this](https://github.com/SyncfusionExamples/how-to-bind-MongoDB-to-pivot-table/tree/master/Blazor) GitHub repository, you can find our Blazor Pivot Table sample for binding data from a MongoDB using the Web API service. \ No newline at end of file +### Additional Resources +Explore a complete example of the Blazor Pivot Table integrated with MongoDB using a Web API service in this [GitHub repository](https://github.com/SyncfusionExamples/how-to-bind-MongoDB-to-pivot-table/tree/master/Blazor). \ No newline at end of file diff --git a/blazor/pivot-table/connecting-to-data-source/mysql.md b/blazor/pivot-table/connecting-to-data-source/mysql.md index b3f1bfe690..b10aa27e29 100644 --- a/blazor/pivot-table/connecting-to-data-source/mysql.md +++ b/blazor/pivot-table/connecting-to-data-source/mysql.md @@ -1,24 +1,41 @@ --- +layout: post title: "MySQL Data Binding in Blazor Pivot Table Component | Syncfusion" component: "Pivot Table" -description: "Learn how to bind data from a MySQL in the Syncfusion Blazor Pivot Table and more." +description: "Learn how to connect a MySQL database to the Syncfusion Blazor Pivot Table using the MySql.Data library." +platform: Blazor +documentation: ug --- -# MySQL Data Binding +# MySQL Data Binding in Blazor Pivot Table Component -This section describes how to use [MySQL data](https://www.nuget.org/packages/MySql.Data) to retrieve data from a MySQL server and bind it to the Blazor Pivot Table. +This guide explains how to connect a MySQL database to the [Blazor Pivot Table](https://www.syncfusion.com/blazor-components/blazor-pivot-table) using the [MySql.Data](https://www.nuget.org/packages/MySql.Data) library. It covers two methods: directly retrieving and binding data to the Pivot Table and using a Web API service to fetch and display MySQL data. -## Connecting a MySQL database to a Syncfusion® Blazor Pivot Table +## Connecting a MySQL Database to a Syncfusion® Blazor Pivot Table -**1.** Create a simple Blazor Pivot Table by following the **"Getting Started"** documentation [link](../getting-started). +This section describes how to connect the [Blazor Pivot Table](https://www.syncfusion.com/blazor-components/blazor-pivot-table) to a MySQL database by directly retrieving data using the [MySql.Data](https://www.nuget.org/packages/MySql.Data) library. -**2.** To connect a MySQL using the MySQL driver in our application, we need to install the [MySQL.Data](https://www.nuget.org/packages/MySql.Data) NuGet package. To do so, open the NuGet package manager of the project solution, search for the package **MySQL.Data** and install it. +### Step 1: Set Up a Blazor Pivot Table +1. Create a [Blazor Pivot Table](https://www.syncfusion.com/blazor-components/blazor-pivot-table) by following the [Getting Started](../getting-started) guide. -![Add the NuGet package "MySQL.Data" to the project](../images/MySQL-nuget-package-install-in-web-service-app.png) +### Step 2: Install the MySql.Data NuGet Package +1. Open the **NuGet Package Manager** in your project solution and search for **MySql.Data**. +2. Install the **MySql.Data** package to add MySQL database support. -**3.** Next, in the **Index.razor** page, under the **OnInitialized** method, connect to MySQL. **MySqlConnection** helps to connect the MySQL database. Next, using **MySqlCommand** and **MySqlDataAdapter** you can process the desired query string and retrieve data from the MySQL database. The **Fill** method of the **MySqlDataAdapter** is used to populate the retrieved data into a **DataTable**, which is then converted to a List. +![Add the NuGet package MySql.Data to the project](../images/MySQL-nuget-package-install-in-web-service-app.png) -**4.** Finally, bind the list to the [DataSource](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html?&_ga=2.187712492.558891908.1675655056-779654442.1675225237#Syncfusion_Blazor_PivotView_PivotViewDataSourceSettings_1_DataSource) property in the [PivotViewDataSourceSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.DataSourceSettingsModel-1.html?_ga=2.112723776.558891908.1675655056-779654442.1675225237) and configure the report to use the MySQL data. +### Step 3: Connect to MySQL +In the **Index.razor** file, under the `OnInitialized` method, use the [MySql.Data](https://www.nuget.org/packages/MySql.Data) library to connect to a MySQL database and retrieve data for the Pivot Table. + +1. **Establish Connection**: Use **MySqlConnection** with a valid connection string (e.g., `Server=localhost;Database=mydb;Uid=myuser;Pwd=mypassword;`) to connect to the MySQL database. +2. **Query and Fetch Data**: Execute a SQL query (e.g., `SELECT * FROM orders`) using **MySqlCommand** to retrieve data for the Pivot Table. +3. **Structure the Data**: Use **MySqlDataAdapter**'s **Fill** method to populate the query results into a **DataTable**, which is then converted to a list for binding to the Pivot Table. + +### Step 4: Bind Data to the Pivot Table +1. Assign the retrieved list to the [DataSource](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html#Syncfusion_Blazor_PivotView_PivotViewDataSourceSettings_1_DataSource) property of the [PivotViewDataSourceSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.DataSourceSettingsModel-1.html). +2. Configure the Pivot Table by defining fields in the [PivotViewColumns](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html#Syncfusion_Blazor_PivotView_PivotViewDataSourceSettings_1_Columns), [PivotViewRows](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html#Syncfusion_Blazor_PivotView_PivotViewDataSourceSettings_1_Rows), [PivotViewValues](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html#Syncfusion_Blazor_PivotView_PivotViewDataSourceSettings_1_Values), and [PivotViewFormatSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html#Syncfusion_Blazor_PivotView_PivotViewDataSourceSettings_1_FormatSettings) to organize and format the data. + +The following code connects to a MySQL database, retrieves data, and binds it to the Pivot Table. ```cshtml @using Syncfusion.Blazor.PivotView @@ -80,25 +97,42 @@ This section describes how to use [MySQL data](https://www.nuget.org/packages/My } ``` -When you run the application, the resultant pivot table will look like this. +### Step 5: Run and Verify the Pivot Table +1. Run the Blazor application. +2. The Pivot Table will display the MySQL data, organized according to the defined configuration. +3. The resulting Pivot Table will look like this: ![Blazor Pivot Table bound with MySQL data](../images/blazor-pivottable-MySQL-databinding.png) ## Connecting a MySQL to a Syncfusion® Blazor Pivot Table via Web API service -### Create a Web API service to fetch MySQL data +This section explains how to create a Web API service to fetch data from a MySQL database and connect it to the Blazor Pivot Table. + +### Create a Web API Service to Fetch MySQL Data -**1.** Open Visual Studio and create an ASP.NET Core Web App project type, naming it **MyWebService**. To create an ASP.NET Core Web application, follow the documentation [link](https://learn.microsoft.com/en-us/visualstudio/get-started/csharp/tutorial-aspnet-core?view=vs-2022). +Follow these steps to set up a Web API service that retrieves MySQL data for the Pivot Table. + +#### Step 1: Create an ASP.NET Core Web Application +1. Open Visual Studio and create a new **ASP.NET Core Web App** project named **MyWebService**. +2. Refer to the [Microsoft documentation](https://learn.microsoft.com/en-us/visualstudio/get-started/csharp/tutorial-aspnet-core?view=vs-2022) for detailed setup instructions. ![Create ASP.NET Core Web App project](../images/azure-asp-core-web-service-create.png) -**2.** To connect a MySQL using the **MySQL data** in our application, we need to install the [MySQL.Data](https://www.nuget.org/packages/MySQL.Driver) NuGet package. To do so, open the NuGet package manager of the project solution, search for the package **MySQL.Data** and install it. +#### Step 2: Install the MySql.Data NuGet Package +1. Install the [MySql.Data](https://www.nuget.org/packages/MySql.Data) package using the **NuGet Package Manager** to enable MySQL connectivity. + +![Add the NuGet package MySql.Data to the project](../images/MySQL-nuget-package-install-in-web-service-app.png) -![Add the NuGet package "MySQL.Data" to the project](../images/MySQL-nuget-package-install-in-web-service-app.png) +#### Step 3: Create a Web API Controller +1. In the **Controllers** folder, create a new Web API controller named **PivotController.cs**. +2. This controller manages data communication between the MySQL database and the Pivot Table. -**3.** Create a Web API controller (aka, PivotController.cs) file under **Controllers** folder that helps to establish data communication with the Pivot Table. +#### Step 4: Connect to MySQL and Retrieve Data +In the **PivotController.cs** file, use the [MySql.Data](https://www.nuget.org/packages/MySql.Data) library to connect to a MySQL database and fetch data for the Pivot Table. -**4.** In the Web API controller (aka, PivotController), ***MySqlConnection** helps to connect the MySQL database. Next, using **MySqlCommand** and **MySqlDataAdapter** you can process the desired query string and retrieve data from the MySQL database. The **Fill** method of the **MySqlDataAdapter** is used to populate the retrieved data into a **DataTable** as shown in the following code snippet. +1. **Establish Connection**: Use **MySqlConnection** with a valid connection string to access the MySQL database. +2. **Fetch Data**: Run a SQL query (e.g., `SELECT * FROM orders`) using **MySqlCommand** to retrieve data. +3. **Prepare Data**: Use **MySqlDataAdapter**'s **Fill** method to store the query results in a **DataTable** for JSON serialization. ```csharp using Microsoft.AspNetCore.Mvc; @@ -129,7 +163,13 @@ When you run the application, the resultant pivot table will look like this. ``` -**5.** In the **Get()** method of the **PivotController.cs** file, the **GetMySQLResult** method is used to retrieve the MySQL data as a list, which is then serialized into JSON string using **JsonConvert.SerializeObject()**. +#### Step 5: Serialize Data to JSON +1. In the **PivotController.cs** file, create a **Get** method that calls **FetchMySQLResult** to retrieve MySQL data. +2. Use **JsonConvert.SerializeObject** from the [Newtonsoft.Json](https://www.nuget.org/packages/Newtonsoft.Json) library to serialize the **DataTable** into JSON format. + +> Ensure the **Newtonsoft.Json** NuGet package is installed in your project. + +The following code sets up the Web API controller to fetch and serialize MySQL data. ```csharp using Microsoft.AspNetCore.Mvc; @@ -166,24 +206,39 @@ When you run the application, the resultant pivot table will look like this. ``` -**6.** Run the application and it will be hosted within the URL `https://localhost:7146`. +#### Step 6: Run the Web API Service +1. Build and run the application. +2. The application will be hosted at `https://localhost:7146/` (the port number may vary). -**7.** Finally, the retrieved data from MySQL database which is in the form of JSON can be found in the Web API controller available in the URL link `https://localhost:7146/Pivot`, as shown in the browser page below. +#### Step 7: Verify the JSON Data +1. Access the Web API endpoint at `https://localhost:7146/Pivot` to view the JSON data retrieved from MySQL. +2. The browser will display the JSON data, as shown below. ![Hosted Web API URL](../images/mysql-data.png) -### Connecting the Pivot Table to a MySQL using the Web API service +### Connecting the Pivot Table to MySQL Using the Web API Service + +This section explains how to connect the Blazor Pivot Table to MySQL data retrieved via the Web API service. + +#### Step 1: Set Up a Blazor Pivot Table +1. Create a Blazor Pivot Table by following the [Getting Started](../getting-started) guide. -**1.** Create a simple Blazor Pivot Table by following the **"Getting Started"** documentation [link](../getting-started). +#### Step 2: Configure the Web API URL +1. In the **Index.razor** file, map the Web API URL (`https://localhost:7146/Pivot`) to the Pivot Table using the [Url](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html#Syncfusion_Blazor_PivotView_PivotViewDataSourceSettings_1_Url) property of [PivotViewDataSourceSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.DataSourceSettingsModel-1.html). +2. The [Url](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html#Syncfusion_Blazor_PivotView_PivotViewDataSourceSettings_1_Url) property facilitates deserializing MySQL data into instances of your model data class (i.e., TValue="OrderDetails") for binding to the Pivot Table. -**2.** Map the hosted Web API's URL link `https://localhost:7146/Pivot` to the Pivot Table in **Index.razor** by using the [Url](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataManager.html?&_ga=2.200411303.844585580.1677740066-2135459383.1677740066#Syncfusion_Blazor_DataManager_Url) property under [PivotViewDataSourceSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.DataSourceSettingsModel-1.html?_ga=2.200411303.844585580.1677740066-2135459383.1677740066). This [Url](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html#Syncfusion_Blazor_PivotView_PivotViewDataSourceSettings_1_Url) property aids in the de-serialization of MySQL data into instances of your model data class (aka, TValue="ProductDetails") while bound to the pivot table. +#### Step 3: Define the Pivot Table Report +1. Configure the Pivot Table by defining fields in the [PivotViewColumns](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html#Syncfusion_Blazor_PivotView_PivotViewDataSourceSettings_1_Columns), [PivotViewRows](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html#Syncfusion_Blazor_PivotView_PivotViewDataSourceSettings_1_Rows), [PivotViewValues](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html#Syncfusion_Blazor_PivotView_PivotViewDataSourceSettings_1_Values), and [PivotViewFormatSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html#Syncfusion_Blazor_PivotView_PivotViewDataSourceSettings_1_FormatSettings) properties. +2. Enable the field list by setting [ShowFieldList](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SfPivotView-1.html#Syncfusion_Blazor_PivotView_SfPivotView_1_ShowFieldList) to **true** for interactive field management. + +The following code connects the Pivot Table to the Web API and configures the report. ```cshtml @using Syncfusion.Blazor.PivotView - - + + @@ -211,9 +266,12 @@ When you run the application, the resultant pivot table will look like this. } ``` - -When you run the application, the resultant pivot table will look like this. +#### Step 4: Run and Verify the Pivot Table +1. Run the Blazor application. +2. The Pivot Table will display the MySQL data fetched via the Web API, structured according to the defined configuration. +3. The resulting Pivot Table will look like this: ![Blazor Pivot Table bound with MySQL data](../images/blazor-pivottable-MySQL-databinding.png) -> In [this](https://github.com/SyncfusionExamples/how-to-bind-MySQL-to-pivot-table/tree/master/Blazor) GitHub repository, you can find our Blazor Pivot Table sample for binding data from a MySQL using the Web API service. +### Additional Resources +Explore a complete example of the Blazor Pivot Table integrated with MySQL using a Web API service in this [GitHub repository](https://github.com/SyncfusionExamples/web-bind-MySQL-database-to-pivot-table/tree/master/Blazor). \ No newline at end of file diff --git a/blazor/pivot-table/connecting-to-data-source/oracledb.md b/blazor/pivot-table/connecting-to-data-source/oracledb.md index f038de1bc8..000a00a9b7 100644 --- a/blazor/pivot-table/connecting-to-data-source/oracledb.md +++ b/blazor/pivot-table/connecting-to-data-source/oracledb.md @@ -1,24 +1,39 @@ --- -title: "Oracle database Data Binding in Blazor Pivot Table Component | Syncfusion" +layout: post +title: "Oracle Data Binding in Blazor Pivot Table | Syncfusion" component: "Pivot Table" -description: "Learn how to bind data from a Oracle database in the Syncfusion Blazor Pivot Table and more." +description: "Learn how to connect an Oracle database to the Syncfusion Blazor Pivot Table using the Oracle.ManagedDataAccess library." +platform: Blazor +documentation: ug --- -# Oracle Data Binding +# Oracle Data Binding in Blazor Pivot Table Component -This section describes how to use [Oracle ManagedDataAccess Core](https://www.nuget.org/packages/Oracle.ManagedDataAccess.Core) to retrieve data from a Oracle database and bind it to the Blazor Pivot Table. +This guide explains how to connect an Oracle database to the [Blazor Pivot Table](https://www.syncfusion.com/blazor-components/blazor-pivot-table) using the [Oracle.ManagedDataAccess](https://www.nuget.org/packages/Oracle.ManagedDataAccess) library. It covers two methods: directly retrieving and binding data to the Pivot Table and using a Web API service to fetch and display Oracle data. -## Connecting a Oracle database to a Syncfusion® Blazor Pivot Table +## Connecting an Oracle database to a Syncfusion® Blazor Pivot Table -**1.** Create a simple Blazor Pivot Table by following the **"Getting Started"** documentation [link](../getting-started). +This section describes how to connect the [Blazor Pivot Table](https://www.syncfusion.com/blazor-components/blazor-pivot-table) to an Oracle database by directly retrieving data using the [Oracle.ManagedDataAccess](https://www.nuget.org/packages/Oracle.ManagedDataAccess) library. -**2.** To connect a Oracle Server using the Oracle ManagedDataAccess Core in our application, we need to install the [Oracle.ManagedDataAccess.Core](https://www.nuget.org/packages/Oracle.ManagedDataAccess.Core) NuGet package. To do so, open the NuGet package manager of the project solution, search for the package **Oracle.ManagedDataAccess.Core** and install it. +### Step 1: Set up a Blazor Pivot Table +1. Create a [Blazor Pivot Table](https://www.syncfusion.com/blazor-components/blazor-pivot-table) by following the [Getting Started](../getting-started) guide. -![Add the NuGet package "Oracle.ManagedDataAccess.Core" to the project](../images/oracledb-nuget-package-install.png) +### Step 2: Install the Oracle.ManagedDataAccess NuGet package +1. Open the **NuGet Package Manager** in your project solution and search for [Oracle.ManagedDataAccess.Core](https://www.nuget.org/packages/Oracle.ManagedDataAccess.Core/). +2. Install the [Oracle.ManagedDataAccess.Core](https://www.nuget.org/packages/Oracle.ManagedDataAccess.Core/) package to add Oracle support. -**3.** Next, in the **Index.razor** page, under the **OnInitialized** method, connect to Oracle database. You can get the specified database by using the **OracleConnection**. Following that, the **OracleCommand** is used to retrieve the desired collection from the database. Then populate the data collection from the **OracleCommand** into a list using the **Read** method of **OracleDataReader**. +![Add the NuGet package Oracle.ManagedDataAccess.Core to the project](../images/oracledb-nuget-package-install.png) -**4.** Finally, bind the list to the [DataSource](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html?&_ga=2.187712492.558891908.1675655056-779654442.1675225237#Syncfusion_Blazor_PivotView_PivotViewDataSourceSettings_1_DataSource) property in the [PivotViewDataSourceSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.DataSourceSettingsModel-1.html?_ga=2.112723776.558891908.1675655056-779654442.1675225237) and configure the report to use the Oracle database data. +### Step 3: Connect to the Oracle database +In the **Index.razor** file, under the `OnInitialized` method, use the [Oracle.ManagedDataAccess](https://www.nuget.org/packages/Oracle.ManagedDataAccess) library to connect to an Oracle database and retrieve data for the Pivot Table. + +1. **Establish connection**: Use **OracleConnection** with a valid connection string, for example, `Data Source=localhost;User Id=myuser;Password=mypassword;`, to connect to the Oracle database. +2. **Query and fetch data**: Execute a SQL query, such as `SELECT * FROM EMPLOYEES`, using **OracleCommand** to retrieve data for the Pivot Table. +3. **Structure the data**: Use **OracleDataAdapter**'s **Fill** method to populate the query results into a **DataTable**, which is then converted to a list for binding to the Pivot Table. + +### Step 4: Bind data to the Pivot Table +1. Assign the retrieved list to the [DataSource](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html#Syncfusion_Blazor_PivotView_PivotViewDataSourceSettings_1_DataSource) property of the [PivotViewDataSourceSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.DataSourceSettingsModel-1.html). +2. Configure the Pivot Table by defining fields in the [PivotViewColumns](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html#Syncfusion_Blazor_PivotView_PivotViewDataSourceSettings_1_Columns), [PivotViewRows](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html#Syncfusion_Blazor_PivotView_PivotViewDataSourceSettings_1_Rows), [PivotViewValues](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html#Syncfusion_Blazor_PivotView_PivotViewDataSourceSettings_1_Values), and [PivotViewFormatSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html#Syncfusion_Blazor_PivotView_PivotViewDataSourceSettings_1_FormatSettings) to organize and format the data. ```cshtml @using System.Data @@ -91,25 +106,42 @@ This section describes how to use [Oracle ManagedDataAccess Core](https://www.nu } ``` -When you run the application, the resultant pivot table will look like this. +### Step 5: Run and verify the Pivot Table +1. Run the Blazor application. +2. The Pivot Table will display the Oracle data, organized according to the defined configuration. +3. The resulting Pivot Table will look like this: -![Blazor Pivot Table bound with OracleDB data](../images/blazor-pivottable-oracledb-databinding.png) +![Blazor Pivot Table bound with Oracle data](../images/blazor-pivottable-oracledb-databinding.png) -## Connecting a Oracle database to a Syncfusion® Blazor Pivot Table via Web API service +## Connecting an Oracle database to a Syncfusion® Blazor Pivot Table via Web API service + +This section explains how to create a Web API service to fetch data from an Oracle database and connect it to the Blazor Pivot Table. ### Create a Web API service to fetch Oracle data -**1.** Open Visual Studio and create an ASP.NET Core Web App project type, naming it **MyWebService**. To create an ASP.NET Core Web application, follow the documentation [link](https://learn.microsoft.com/en-us/visualstudio/get-started/csharp/tutorial-aspnet-core?view=vs-2022). +Follow these steps to set up a Web API service that retrieves Oracle data for the Pivot Table. + +#### Step 1: Create an ASP.NET Core Web application +1. Open Visual Studio and create a new **ASP.NET Core Web App** project named **MyWebService**. +2. Refer to the [Microsoft documentation](https://learn.microsoft.com/en-us/visualstudio/get-started/csharp/tutorial-aspnet-core?view=vs-2022) for detailed setup instructions. -![Create ASP.NET Core Web App project](../images/azure-asp-core-web-service-create.png) +![Creating an ASP.NET Core Web App project](../images/azure-asp-core-web-service-create.png) -**2.** To connect a Oracle database using the **Oracle ManagedDataAccess Core** in our application, we need to install the [Oracle.ManagedDataAccess.Core](https://www.nuget.org/packages/Oracle.ManagedDataAccess.Core) NuGet package. To do so, open the NuGet package manager of the project solution, search for the package **Oracle.ManagedDataAccess.Core** and install it. +#### Step 2: Install the Oracle NuGet package +1. Install the [Oracle.ManagedDataAccess.Core](https://www.nuget.org/packages/Oracle.ManagedDataAccess.Core/) package using the **NuGet Package Manager** to enable Oracle connectivity. -![Add the NuGet package "Oracle.ManagedDataAccess.Core" to the project](../images/oracledb-nuget-package-install-in-web-service-app.png) +![Add the NuGet package Oracle.ManagedDataAccess.Core to the project](../images/oracledb-nuget-package-install-in-web-service-app.png) -**3.** Create a Web API controller (aka, PivotController.cs) file under **Controllers** folder that helps to establish data communication with the Pivot Table. +#### Step 3: Create a Web API controller +1. In the **Controllers** folder, create a new Web API controller named **PivotController.cs**. +2. This controller manages data communication between the Oracle database and the Pivot Table. -**4.** In the Web API controller (aka, PivotController), **OracleConnection** helps to connect the Oracle database. Next, using **OracleCommand** and **OracleDataAdapter** you can process the desired query string and retrieve data from the Oracle database. The **Fill** method of the **OracleDataAdapter** is used to populate the retrieved data into a **DataTable** as shown in the following code snippet. +#### Step 4: Connect to Oracle and retrieve data +In the **PivotController.cs** file, use the [Oracle.ManagedDataAccess](https://www.nuget.org/packages/Oracle.ManagedDataAccess) library to connect to an Oracle database and fetch data for the Pivot Table. + +1. **Establish connection**: Use **OracleConnection** with a valid connection string to access the Oracle database. +2. **Fetch data**: Run a SQL query, such as `SELECT * FROM EMPLOYEES`, using **OracleCommand** to retrieve data. +3. **Prepare data**: Use **OracleDataAdapter**'s **Fill** method to store the query results in a **DataTable** for JSON serialization. ```csharp using Microsoft.AspNetCore.Mvc; @@ -140,7 +172,11 @@ namespace MyWebService.Controllers } ``` -**5.** In the **Get()** method of the **PivotController.cs** file, the **FetchOracleDbResult** method is used to retrieve the Oracle data as a DataTable, which is then serialized into JSON string using **JsonConvert.SerializeObject()**. +#### Step 5: Serialize data to JSON +1. In the **PivotController.cs** file, create a **Get** method that calls **FetchOracleResult** to retrieve Oracle data. +2. Use **JsonConvert.SerializeObject** from the [Newtonsoft.Json](https://www.nuget.org/packages/Newtonsoft.Json) library to serialize the **DataTable** into JSON format. + +> Ensure the **Newtonsoft.Json** NuGet package is installed in your project. ```csharp using Microsoft.AspNetCore.Mvc; @@ -177,17 +213,30 @@ namespace MyWebService.Controllers } ``` -**6.** Run the application and it will be hosted within the URL `https://localhost:44346`. +#### Step 6: Run the Web API service +1. Build and run the application. +2. The application will be hosted at `https://localhost:44346/` (the port number may vary). -**7.** Finally, the retrieved data from Oracle database which is in the form of JSON can be found in the Web API controller available in the URL link `https://localhost:44346/Pivot`, as shown in the browser page below. +#### Step 7: Verify the JSON data +1. Access the Web API endpoint at `https://localhost:44346/Pivot` to view the JSON data retrieved from Oracle. +2. The browser will display the JSON data, as shown below. -![Hosted Web API URL](../images/oracledb-data.png) +![Hosted Web API URL](../images/oracle-code-web-app.png) ### Connecting the Pivot Table to a Oracle database using the Web API service -**1.** Create a simple Blazor Pivot Table by following the **"Getting Started"** documentation [link](../getting-started). +This section explains how to connect the Blazor Pivot Table to Oracle data retrieved via the Web API service. + +#### Step 1: Set up a Blazor Pivot Table +1. Create a Blazor Pivot Table by following the [Getting Started](../getting-started) guide. -**2.** Map the hosted Web API's URL link `https://localhost:44346/Pivot` to the Pivot Table in **Index.razor** by using the [Url](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataManager.html?&_ga=2.200411303.844585580.1677740066-2135459383.1677740066#Syncfusion_Blazor_DataManager_Url) property under [PivotViewDataSourceSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.DataSourceSettingsModel-1.html?_ga=2.200411303.844585580.1677740066-2135459383.1677740066). This [Url](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html#Syncfusion_Blazor_PivotView_PivotViewDataSourceSettings_1_Url) property aids in the de-serialization of Oracle database data into instances of your model data class (aka, TValue="EmployeeDetails") while bound to the pivot table. +#### Step 2: Configure the Web API URL +1. In the **Index.razor** file, map the Web API URL (`https://localhost:44346/Pivot`) to the Pivot Table using the [Url](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html#Syncfusion_Blazor_PivotView_PivotViewDataSourceSettings_1_Url) property of [PivotViewDataSourceSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.DataSourceSettingsModel-1.html). +2. The [Url](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html#Syncfusion_Blazor_PivotView_PivotViewDataSourceSettings_1_Url) property deserialize Oracle data into instances of your model data class (e.g., TValue="EmployeeDetails") for binding to the Pivot Table. + +#### Step 3: Define the Pivot Table report +1. Configure the Pivot Table by defining fields in the [PivotViewColumns](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html#Syncfusion_Blazor_PivotView_PivotViewDataSourceSettings_1_Columns), [PivotViewRows](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html#Syncfusion_Blazor_PivotView_PivotViewDataSourceSettings_1_Rows), [PivotViewValues](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html#Syncfusion_Blazor_PivotView_PivotViewDataSourceSettings_1_Values), and [PivotViewFormatSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html#Syncfusion_Blazor_PivotView_PivotViewDataSourceSettings_1_FormatSettings) properties. +2. Enable the field list by setting [ShowFieldList](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SfPivotView-1.html#Syncfusion_Blazor_PivotView_SfPivotView_1_ShowFieldList) to **true** for interactive field management. ```cshtml @using Syncfusion.Blazor.PivotView @@ -227,9 +276,12 @@ namespace MyWebService.Controllers } ``` - -When you run the application, the resultant pivot table will look like this. +#### Step 4: Run and verify the Pivot Table +1. Run the Blazor application. +2. The Pivot Table will display the Oracle data fetched via the Web API, structured according to the defined configuration. +3. The resulting Pivot Table will look like this: ![Blazor Pivot Table bound with OracleDB data](../images/blazor-pivottable-oracledb-databinding.png) -> In [this](https://github.com/SyncfusionExamples/how-to-bind-Oracle-database-to-pivot-table/tree/master/Blazor) GitHub repository, you can find our Blazor Pivot Table sample for binding data from a Oracle database using the Web API service. \ No newline at end of file +### Additional resources +Explore a complete example of the Blazor Pivot Table integrated with an ASP.NET Core Web application to fetch data from an Oracle database in this [GitHub repository](https://github.com/SyncfusionExamples/how-to-bind-Oracle-database-to-pivot-table/tree/master/Blazor). \ No newline at end of file diff --git a/blazor/pivot-table/connecting-to-data-source/postgreSQL.md b/blazor/pivot-table/connecting-to-data-source/postgreSQL.md index 7f28725fa7..8a425dd950 100644 --- a/blazor/pivot-table/connecting-to-data-source/postgreSQL.md +++ b/blazor/pivot-table/connecting-to-data-source/postgreSQL.md @@ -1,24 +1,39 @@ --- +layout: post title: "PostgreSQL Data Binding in Blazor Pivot Table Component | Syncfusion" component: "Pivot Table" -description: "Learn how to bind data from a PostgreSQL database in the Syncfusion Blazor Pivot Table and more." +description: "Learn how to connect a PostgreSQL database to the Syncfusion Blazor Pivot Table using the Npgsql.EntityFrameworkCore.PostgreSQL library." +platform: Blazor +documentation: ug --- -# PostgreSQL Data Binding +# PostgreSQL Data Binding in Blazor Pivot Table Component -This section describes how to use [Npgsql EntityFrameworkCore PostgreSQL](https://www.nuget.org/packages/Npgsql.EntityFrameworkCore.PostgreSQL) to retrieve data from a PostgreSQL database and bind it to the Blazor Pivot Table. +This guide explains how to connect a PostgreSQL database to the [Blazor Pivot Table](https://www.syncfusion.com/blazor-components/blazor-pivot-table) using the [Npgsql.EntityFrameworkCore.PostgreSQL](https://www.nuget.org/packages/Npgsql.EntityFrameworkCore.PostgreSQL) library. It covers two methods: directly retrieving and binding data to the Pivot Table and using a Web API service to fetch and display PostgreSQL data. ## Connecting a PostgreSQL to a Syncfusion® Blazor Pivot Table -**1.** Create a simple Blazor Pivot Table by following the **"Getting Started"** documentation [link](../getting-started). +This section explains how to connect a PostgreSQL database to the Blazor Pivot Table by directly retrieving data using the [Npgsql.EntityFrameworkCore.PostgreSQL](https://www.nuget.org/packages/Npgsql.EntityFrameworkCore.PostgreSQL) library. -**2.** To connect a PostgreSQL using the Npgsql EntityFrameworkCore PostgreSQL in our application, we need to install the [Npgsql.EntityFrameworkCore.PostgreSQL](https://www.nuget.org/packages/Npgsql.EntityFrameworkCore.PostgreSQL) NuGet package. To do so, open the NuGet package manager of the project solution, search for the package **Npgsql.EntityFrameworkCore.PostgreSQL** and install it. +### Step 1: Set Up a Blazor Pivot Table +1. Create a [Blazor Pivot Table](https://www.syncfusion.com/blazor-components/blazor-pivot-table) by following the [Getting Started](../getting-started) guide. -![Add the NuGet package "Npgsql.EntityFrameworkCore.PostgreSQL" to the project](../images/postgreSQL-nuget-package-install.png) +### Step 2: Install the Npgsql.EntityFrameworkCore.PostgreSQL NuGet Package +1. Open the **NuGet Package Manager** in your project solution and search for **Npgsql.EntityFrameworkCore.PostgreSQL**. +2. Install the **Npgsql.EntityFrameworkCore.PostgreSQL** package to add PostgreSQL support. -**3.** Next, in the **Index.razor** page, under the **OnInitialized** method, connect to PostgreSQL database. You can get the specified database by using the **NpgsqlConnection**. Following that, the **NpgsqlCommand** is used to retrieve the desired collection from the database. Then populate the data collection from the **NpgsqlCommand** into a list using the **Read** method of **NpgsqlDataReader**. +![Installing the Npgsql.EntityFrameworkCore.PostgreSQL NuGet package](../images/postgreSQL-nuget-package-install.png) -**4.** Finally, bind the list to the [DataSource](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html?&_ga=2.187712492.558891908.1675655056-779654442.1675225237#Syncfusion_Blazor_PivotView_PivotViewDataSourceSettings_1_DataSource) property in the [PivotViewDataSourceSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.DataSourceSettingsModel-1.html?_ga=2.112723776.558891908.1675655056-779654442.1675225237) and configure the report to use the PostgreSQL data. +### Step 3: Connect to the PostgreSQL Database +In the **Index.razor** file, under the `OnInitialized` method, use the [Npgsql.EntityFrameworkCore.PostgreSQL](https://www.nuget.org/packages/Npgsql.EntityFrameworkCore.PostgreSQL) library to connect to the PostgreSQL database and retrieve data. + +1. **Establish Connection**: Use `NpgsqlConnection` with a valid connection string (e.g., `Server=localhost;Database=mydb;User Id=myuser;Password=mypassword;`) to connect to the PostgreSQL database. +2. **Query and Fetch Data**: Execute a SQL query, such as `SELECT * FROM apxtimestamp`, using `NpgsqlCommand` to retrieve data for the Pivot Table. +3. **Structure Data**: Use `NpgsqlDataReader` to read the query results and populate them into a list for binding to the Pivot Table. + +### Step 4: Bind Data to the Pivot Table +1. Assign the retrieved list to the [DataSource](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html#Syncfusion_Blazor_PivotView_PivotViewDataSourceSettings_1_DataSource) property of the [PivotViewDataSourceSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.DataSourceSettingsModel-1.html). +2. Configure the Pivot Table by defining fields in the [PivotViewColumns](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html#Syncfusion_Blazor_PivotView_PivotViewDataSourceSettings_1_Columns), [PivotViewRows](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html#Syncfusion_Blazor_PivotView_PivotViewDataSourceSettings_1_Rows), [PivotViewValues](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html#Syncfusion_Blazor_PivotView_PivotViewDataSourceSettings_1_Values), and [PivotViewFormatSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html#Syncfusion_Blazor_PivotView_PivotViewDataSourceSettings_1_FormatSettings) to organize and format the data. ```cshtml @using System.Data @@ -84,25 +99,42 @@ This section describes how to use [Npgsql EntityFrameworkCore PostgreSQL](https: } ``` -When you run the application, the resultant pivot table will look like this. +### Step 5: Run and Verify the Pivot Table +1. Run the Blazor application. +2. The Pivot Table will display the PostgreSQL data, organized based on the defined configuration. +3. The resulting Pivot Table will look like this: ![Blazor Pivot Table bound with PostgreSQL data](../images/blazor-pivottable-postgreSQL-databinding.png) -## Connecting a PostgreSQL to a Syncfusion® Blazor Pivot Table via Web API service +## Connecting a PostgreSQL Database to a Syncfusion® Blazor Pivot Table via Web API Service + +This section explains how to create a Web API service to fetch data from a PostgreSQL database and connect it to the Blazor Pivot Table. ### Create a Web API service to fetch PostgreSQL data -**1.** Open Visual Studio and create an ASP.NET Core Web App project type, naming it **MyWebService**. To create an ASP.NET Core Web application, follow the documentation [link](https://learn.microsoft.com/en-us/visualstudio/get-started/csharp/tutorial-aspnet-core?view=vs-2022). +Follow these steps to set up a Web API service that retrieves PostgreSQL data for the Pivot Table. + +#### Step 1: Create an ASP.NET Core Web Application +1. Open Visual Studio and create a new ASP.NET Core Web App project named **MyWebService**. +2. Refer to the [Microsoft documentation](https://learn.microsoft.com/en-us/visualstudio/get-started/csharp/tutorial-aspnet-core?view=vs-2022) for detailed setup instructions. + +![Creating an ASP.NET Core Web App project](../images/azure-asp-core-web-service-create.png) -![Create ASP.NET Core Web App project](../images/azure-asp-core-web-service-create.png) +#### Step 2: Install the Npgsql NuGet Package +1. Install the [Npgsql.EntityFrameworkCore.PostgreSQL](https://www.nuget.org/packages/Npgsql.EntityFrameworkCore.PostgreSQL) package using the **NuGet Package Manager** to enable PostgreSQL connectivity. -**2.** To connect a PostgreSQL using the **Npgsql EntityFrameworkCore PostgreSQL** in our application, we need to install the [Npgsql.EntityFrameworkCore.PostgreSQL](https://www.nuget.org/packages/Npgsql.EntityFrameworkCore.PostgreSQL) NuGet package. To do so, open the NuGet package manager of the project solution, search for the package **Npgsql.EntityFrameworkCore.PostgreSQL** and install it. +![Installing the Npgsql.EntityFrameworkCore.PostgreSQL NuGet package](../images/postgreSQL-nuget-package-install-in-web-service-app.png) -![Add the NuGet package "Npgsql.EntityFrameworkCore.PostgreSQL" to the project](../images/postgreSQL-nuget-package-install-in-web-service-app.png) +#### Step 3: Create a Web API Controller +1. In the **Controllers** folder, create a new Web API controller named **PivotController.cs**. +2. This controller handles data communication between the PostgreSQL database and the Pivot Table. -**3.** Create a Web API controller (aka, PivotController.cs) file under **Controllers** folder that helps to establish data communication with the Pivot Table. +#### Step 4: Connect to PostgreSQL and Retrieve Data +In the **PivotController.cs** file, use the [Npgsql.EntityFrameworkCore.PostgreSQL](https://www.nuget.org/packages/Npgsql.EntityFrameworkCore.PostgreSQL) library to connect to the PostgreSQL database and fetch data. -**4.** In the Web API controller (aka, PivotController), **NpgsqlConnection** helps to connect the PostgreSQL database. Next, using **NpgsqlCommand** and **NpgsqlDataAdapter** you can process the desired query string and retrieve data from the PostgreSQL database. The **Fill** method of the **NpgsqlDataAdapter** is used to populate the retrieved data into a **DataTable** as shown in the following code snippet. +1. **Establish Connection**: Use `NpgsqlConnection` with a valid connection string to access the PostgreSQL database. +2. **Fetch Data**: Execute a SQL query, such as `SELECT * FROM apxtimestamp`, using `NpgsqlCommand` to retrieve data. +3. **Prepare Data**: Use `NpgsqlDataAdapter`’s `Fill` method to store the query results in a `DataTable` for JSON serialization. ```csharp using Microsoft.AspNetCore.Mvc; @@ -132,7 +164,11 @@ namespace MyWebService.Controllers } ``` -**5.** In the **Get()** method of the **PivotController.cs** file, the **GetPostgreSQLResult** method is used to retrieve the PostgreSQL data as a DataTable, which is then serialized into JSON string using **JsonConvert.SerializeObject()**. +#### Step 5: Serialize Data to JSON +1. In the **PivotController.cs** file, create a `Get` method that calls `GetPostgreSQLResult` to retrieve PostgreSQL data. +2. Use `JsonConvert.SerializeObject` from the [Newtonsoft.Json](https://www.nuget.org/packages/Newtonsoft.Json) library to serialize the `DataTable` into JSON format. + +> Ensure the **Newtonsoft.Json** NuGet package is installed in your project. ```csharp using Microsoft.AspNetCore.Mvc; @@ -168,17 +204,30 @@ namespace MyWebService.Controllers } ``` -**6.** Run the application and it will be hosted within the URL `https://localhost:44378`. +#### Step 6: Run the Web API Service +1. Build and run the application. +2. The application will be hosted at `https://localhost:44378/` (the port number may vary). + +#### Step 7: Verify the JSON Data +1. Access the Web API endpoint at `https://localhost:44378/Pivot` to view the JSON data retrieved from PostgreSQL. +2. The browser will display the JSON data, as shown below. -**7.** Finally, the retrieved data from PostgreSQL which is in the form of JSON can be found in the Web API controller available in the URL link `https://localhost:44378/Pivot`, as shown in the browser page below. +![Hosted Web API URL](../images/postgresql_data.png) -![Hosted Web API URL](../images/postgreSQL-data.png) +### Connecting the Pivot Table to a PostgreSQL Database Using the Web API Service -### Connecting the Pivot Table to a PostgreSQL using the Web API service +This section explains how to connect the Blazor Pivot Table to PostgreSQL data retrieved via the Web API service. -**1.** Create a simple Blazor Pivot Table by following the **"Getting Started"** documentation [link](../getting-started). +#### Step 1: Set Up a Blazor Pivot Table +1. Create a Blazor Pivot Table by following the [Getting Started](../getting-started) guide. -**2.** Map the hosted Web API's URL link `https://localhost:44378/Pivot` to the Pivot Table in **Index.razor** by using the [Url](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataManager.html?&_ga=2.200411303.844585580.1677740066-2135459383.1677740066#Syncfusion_Blazor_DataManager_Url) property under [PivotViewDataSourceSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.DataSourceSettingsModel-1.html?_ga=2.200411303.844585580.1677740066-2135459383.1677740066). This [Url](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html#Syncfusion_Blazor_PivotView_PivotViewDataSourceSettings_1_Url) property aids in the de-serialization of PostgreSQL data into instances of your model data class (aka, TValue="PostgreSQLService") while bound to the pivot table. +#### Step 2: Configure the Web API URL +1. In the **Index.razor** file, map the Web API URL (`https://localhost:44378/Pivot`) to the Pivot Table using the [Url](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html#Syncfusion_Blazor_PivotView_PivotViewDataSourceSettings_1_Url) property of [PivotViewDataSourceSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.DataSourceSettingsModel-1.html). +2. The [Url](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html#Syncfusion_Blazor_PivotView_PivotViewDataSourceSettings_1_Url) property deserialize PostgreSQL data into instances of your model data class (e.g., `TValue="PostgreSQLService"`) for binding to the Pivot Table. + +#### Step 3: Define the Pivot Table Report +1. Configure the Pivot Table by defining fields in the [PivotViewColumns](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html#Syncfusion_Blazor_PivotView_PivotViewDataSourceSettings_1_Columns), [PivotViewRows](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html#Syncfusion_Blazor_PivotView_PivotViewDataSourceSettings_1_Rows), [PivotViewValues](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html#Syncfusion_Blazor_PivotView_PivotViewDataSourceSettings_1_Values), and [PivotViewFormatSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html#Syncfusion_Blazor_PivotView_PivotViewDataSourceSettings_1_FormatSettings) properties. +2. Enable the field list by setting [ShowFieldList](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SfPivotView-1.html#Syncfusion_Blazor_PivotView_SfPivotView_1_ShowFieldList) to `true` for interactive field management. ```cshtml @using Syncfusion.Blazor.PivotView @@ -215,9 +264,12 @@ namespace MyWebService.Controllers } ``` - -When you run the application, the resultant pivot table will look like this. +#### Step 4: Run and Verify the Pivot Table +1. Run the Blazor application. +2. The Pivot Table will display the PostgreSQL data fetched via the Web API, structured according to the defined configuration. +3. The resulting Pivot Table will look like this: ![Blazor Pivot Table bound with PostgreSQL data](../images/blazor-pivottable-mongodb-databinding.png) -> In [this](https://github.com/SyncfusionExamples/how-to-bind-PostgreSQL-database-to-pivot-table/tree/master/Blazor) GitHub repository, you can find our Blazor Pivot Table sample for binding data from a PostgreSQL using the Web API service. \ No newline at end of file +### Additional Resources +Explore a complete example of the Blazor Pivot Table integrated with an ASP.NET Core Web application to fetch data from a PostgreSQL database in this [GitHub repository](https://github.com/SyncfusionExamples/how-to-bind-PostgreSQL-database-to-pivot-table/tree/master/Blazor). \ No newline at end of file diff --git a/blazor/pivot-table/connecting-to-data-source/snowflakedb.md b/blazor/pivot-table/connecting-to-data-source/snowflakedb.md index 4a051c8778..b57d16bd5f 100644 --- a/blazor/pivot-table/connecting-to-data-source/snowflakedb.md +++ b/blazor/pivot-table/connecting-to-data-source/snowflakedb.md @@ -1,24 +1,39 @@ --- +layout: post title: "Snowflake Data Binding in Blazor Pivot Table Component | Syncfusion" component: "Pivot Table" -description: "Learn how to bind data from a Snowflake database in the Syncfusion Blazor Pivot Table and more." +description: "Learn how to connect a Snowflake database to the Syncfusion Blazor Pivot Table using the Snowflake.Data NuGet package." +platform: Blazor +documentation: ug --- -# Snowflake Data Binding +# Snowflake Data Binding in Blazor Pivot Table Component -This section describes how to use [Snowflake data](https://www.nuget.org/packages/Snowflake.Data) to retrieve data from a Snowflake database and bind it to the Blazor Pivot Table. +This guide explains how to connect a Snowflake database to the [Blazor Pivot Table](https://www.syncfusion.com/blazor-components/blazor-pivot-table) using the [Snowflake.Data](https://www.nuget.org/packages/Snowflake.Data) NuGet package. It covers two methods: directly retrieving and binding Snowflake data to the Pivot Table and using a Web API service to fetch and display Snowflake data. ## Connecting a Snowflake to a Syncfusion® Blazor Pivot Table -**1.** Create a simple Blazor Pivot Table by following the **"Getting Started"** documentation [link](../getting-started). +This section describes how to connect the [Blazor Pivot Table](https://www.syncfusion.com/blazor-components/blazor-pivot-table) to a Snowflake database by directly retrieving data using the [Snowflake.Data](https://www.nuget.org/packages/Snowflake.Data) library. -**2.** To connect a Snowflake database using the Snowflake data provider in our application, we need to install the [Snowflake.Data](https://www.nuget.org/packages/Snowflake.Data) NuGet package. To do so, open the NuGet package manager of the project solution, search for the package **Snowflake.Data** and install it. +### Step 1: Set up a Blazor Pivot Table +1. Create a [Blazor Pivot Table](https://www.syncfusion.com/blazor-components/blazor-pivot-table) by following the [Getting Started](../getting-started) guide. -![Add the NuGet package "Snowflake.Data" to the project](../images/Snowflake-nuget-package-install.png) +### Step 2: Install the Snowflake.Data NuGet Package +1. Open the **NuGet Package Manager** in your project solution and search for [Snowflake.Data](https://www.nuget.org/packages/Snowflake.Data/). +2. Install the [Snowflake.Data](https://www.nuget.org/packages/Snowflake.Data/) package to add Snowflake support. -**3.** Next, in the **Index.razor** page, under the **OnInitialized** method, connect to Snowflake database. You can get the specified database by using the **SnowflakeDbConnection**. Following that, the **SnowflakeDbDataAdapter** is used to retrieve the desired collection from the database. The **Fill** method of the **SnowflakeDbDataAdapter** is used to populate the retrieved data into a **DataTable**, which is then convert into a list. +![Add the NuGet package Snowflake.Data to the project](../images/Snowflake-nuget-package-install.png) -**4.** Finally, bind the list to the [DataSource](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html?&_ga=2.187712492.558891908.1675655056-779654442.1675225237#Syncfusion_Blazor_PivotView_PivotViewDataSourceSettings_1_DataSource) property in the [PivotViewDataSourceSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.DataSourceSettingsModel-1.html?_ga=2.112723776.558891908.1675655056-779654442.1675225237) and configure the report to use the Snowflake data. +### Step 3: Connect to the Snowflake Database +In the **Index.razor** file, under the `OnInitialized` method, use the [Snowflake.Data](https://www.nuget.org/packages/Snowflake.Data) library to connect to the Snowflake database and retrieve data for the Pivot Table. + +1. **Establish connection**: Use `SnowflakeDbConnection` with a valid connection string, such as `account=myaccount;user=myuser;password=mypassword;db=mydb;schema=myschema;`, to connect to the Snowflake database. +2. **Query and fetch data**: Execute a SQL query, such as `SELECT * FROM CALL_CENTER`, using `SnowflakeDbDataAdapter` to retrieve data. +3. **Structure the data**: Use the `Fill` method of `SnowflakeDbDataAdapter` to populate the query results into a `DataTable`, which is then converted to a list for binding to the Pivot Table. + +### Step 4: Bind Data to the Pivot Table +1. Assign the retrieved list to the [DataSource](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html#Syncfusion_Blazor_PivotView_PivotViewDataSourceSettings_1_DataSource) property of the [PivotViewDataSourceSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.DataSourceSettingsModel-1.html). +2. Configure the Pivot Table by defining fields in the [PivotViewColumns](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html#Syncfusion_Blazor_PivotView_PivotViewDataSourceSettings_1_Columns), [PivotViewRows](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html#Syncfusion_Blazor_PivotView_PivotViewDataSourceSettings_1_Rows), [PivotViewValues](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html#Syncfusion_Blazor_PivotView_PivotViewDataSourceSettings_1_Values), and [PivotViewFormatSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html#Syncfusion_Blazor_PivotView_PivotViewDataSourceSettings_1_FormatSettings) to organize and format the data. ```cshtml @using Syncfusion.Blazor.PivotView @@ -84,25 +99,43 @@ This section describes how to use [Snowflake data](https://www.nuget.org/package } ``` -When you run the application, the resultant pivot table will look like this. +### Step 5: Run and Verify the Pivot Table +1. Run the Blazor application. +2. The Pivot Table displays the Snowflake data, organized according to the defined configuration. +3. The resulting Pivot Table will look like this: ![Blazor Pivot Table bound with Snowflake data](../images/blazor-pivottable-Snowflake-databinding.png) ## Connecting a Snowflake database to a Syncfusion® Blazor Pivot Table via Web API service -### Create a Web API service to fetch Snowflake data +This section explains how to create a Web API service to fetch data from a Snowflake database and connect it to the [Blazor Pivot Table](https://www.syncfusion.com/blazor-components/blazor-pivot-table). + +### Create a Web API Service to Fetch Snowflake Data -**1.** Open Visual Studio and create an ASP.NET Core Web App project type, naming it **MyWebService**. To create an ASP.NET Core Web application, follow the documentation [link](https://learn.microsoft.com/en-us/visualstudio/get-started/csharp/tutorial-aspnet-core?view=vs-2022). +Follow these steps to set up a Web API service that retrieves Snowflake data for the Pivot Table. + +#### Step 1: Create an ASP.NET Core Web Application +1. Open Visual Studio and create a new ASP.NET Core Web App project named **MyWebService**. +2. Refer to the [Microsoft documentation](https://learn.microsoft.com/en-us/visualstudio/get-started/csharp/tutorial-aspnet-core?view=vs-2022) for detailed setup instructions. ![Create ASP.NET Core Web App project](../images/azure-asp-core-web-service-create.png) -**2.** To connect a Snowflake database using the **Snowflake.Data** in our application, we need to install the [Snowflake.Data](https://www.nuget.org/packages/Snowflake.Data) NuGet package. To do so, open the NuGet package manager of the project solution, search for the package **Snowflake.Data** and install it. +#### Step 2: Install the Snowflake.Data NuGet Package +1. Open the NuGet Package Manager in your project solution. +2. Search for and install the [Snowflake.Data](https://www.nuget.org/packages/Snowflake.Data) package to enable Snowflake connectivity. + +![Add the NuGet package Snowflake.Data to the project](../images/Snowflake-nuget-package-install-in-web-service-app.png) -![Add the NuGet package "Snowflake.Data" to the project](../images/Snowflake-nuget-package-install-in-web-service-app.png) +#### Step 3: Create a Web API Controller +1. In the **Controllers** folder, create a new Web API controller named **PivotController.cs**. +2. This controller manages data communication between the Snowflake database and the Pivot Table. -**3.** Create a Web API controller (aka, PivotController.cs) file under **Controllers** folder that helps to establish data communication with the Pivot Table. +#### Step 4: Connect to Snowflake and Retrieve Data +In the **PivotController.cs** file, use the [Snowflake.Data](https://www.nuget.org/packages/Snowflake.Data) library to connect to the Snowflake database and fetch data. -**4.** In the Web API controller (aka, PivotController), **SnowflakeDbConnection** helps to connect the Snowflake database. Next, using **SnowflakeDbDataAdapter** you can process the desired query string and retrieve data from the Snowflake database. The **Fill** method of the **SnowflakeDbDataAdapter** is used to populate the retrieved data into a **DataTable** as shown in the following code snippet. +1. **Establish connection**: Use `SnowflakeDbConnection` with a valid connection string to access the Snowflake database. +2. **Fetch data**: Run a SQL query, such as `SELECT * FROM CALL_CENTER`, using `SnowflakeDbDataAdapter` to retrieve data. +3. **Prepare data**: Use the `Fill` method of `SnowflakeDbDataAdapter` to store the query results in a `DataTable` for JSON serialization. ```csharp using Microsoft.AspNetCore.Mvc; @@ -134,7 +167,11 @@ namespace MyWebService.Controllers } ``` -**5.** In the **Get()** method of the **PivotController.cs** file, the **FetchSnowflakeResult** method is used to retrieve the Snowflake data as a DataTable, which is then serialized into JSON string using **JsonConvert.SerializeObject()**. +#### Step 5: Serialize Data to JSON +1. In the **PivotController.cs** file, create a `Get` method that calls `FetchSnowflakeResult` to retrieve Snowflake data. +2. Use `JsonConvert.SerializeObject` from the [Newtonsoft.Json](https://www.nuget.org/packages/Newtonsoft.Json) library to serialize the `DataTable` into JSON format. + +> Ensure the [Newtonsoft.Json](https://www.nuget.org/packages/Newtonsoft.Json) NuGet package is installed in your project. ```csharp using Microsoft.AspNetCore.Mvc; @@ -172,22 +209,35 @@ namespace MyWebService.Controllers } ``` -**6.** Run the application and it will be hosted within the URL `https://localhost:44378`. +#### Step 6: Run the Web API Service +1. Build and run the application. +2. The application will be hosted at `https://localhost:44378/` (the port number may vary). -**7.** Finally, the retrieved data from Snowflake database which is in the form of JSON can be found in the Web API controller available in the URL link `https://localhost:44378/Pivot`, as shown in the browser page below. +#### Step 7: Verify the JSON Data +1. Access the Web API endpoint at `https://localhost:44378/Pivot` to view the JSON data retrieved from the Snowflake database. +2. The browser will display the JSON data, as shown below. ![Hosted Web API URL](../images/Snowflake-data.png) -### Connecting the Pivot Table to a Snowflake database using the Web API service +### Connecting the Pivot Table to a Snowflake Database Using the Web API Service + +This section explains how to connect the [Blazor Pivot Table](https://www.syncfusion.com/blazor-components/blazor-pivot-table) to Snowflake data retrieved via the Web API service. + +#### Step 1: Set up a Blazor Pivot Table +1. Create a [Blazor Pivot Table](https://www.syncfusion.com/blazor-components/blazor-pivot-table) by following the [Getting Started](../getting-started) guide. -**1.** Create a simple Blazor Pivot Table by following the **"Getting Started"** documentation [link](../getting-started). +#### Step 2: Configure the Web API URL +1. In the **Index.razor** file, map the Web API URL (`https://localhost:44378/Pivot`) to the Pivot Table using the [Url](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html#Syncfusion_Blazor_PivotView_PivotViewDataSourceSettings_1_Url) property of [PivotViewDataSourceSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.DataSourceSettingsModel-1.html). +2. The [Url](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html#Syncfusion_Blazor_PivotView_PivotViewDataSourceSettings_1_Url) property deserialize Snowflake data into instances of your model data class (e.g., `TValue="SnowflakeService"`) for binding to the Pivot Table. -**2.** Map the hosted Web API's URL link `https://localhost:44378/Pivot` to the Pivot Table in **Index.razor** by using the [Url](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataManager.html?&_ga=2.200411303.844585580.1677740066-2135459383.1677740066#Syncfusion_Blazor_DataManager_Url) property under [PivotViewDataSourceSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.DataSourceSettingsModel-1.html?_ga=2.200411303.844585580.1677740066-2135459383.1677740066). This [Url](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html#Syncfusion_Blazor_PivotView_PivotViewDataSourceSettings_1_Url) property aids in the de-serialization of Snowflake data into instances of your model data class (aka, TValue="SnowflakeService") while bound to the pivot table. +#### Step 3: Define the Pivot Table Report +1. Configure the Pivot Table by defining fields in the [PivotViewColumns](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html#Syncfusion_Blazor_PivotView_PivotViewDataSourceSettings_1_Columns), [PivotViewRows](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html#Syncfusion_Blazor_PivotView_PivotViewDataSourceSettings_1_Rows), [PivotViewValues](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html#Syncfusion_Blazor_PivotView_PivotViewDataSourceSettings_1_Values), and [PivotViewFormatSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html#Syncfusion_Blazor_PivotView_PivotViewDataSourceSettings_1_FormatSettings) properties. +2. Enable the field list by setting [ShowFieldList](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SfPivotView-1.html#Syncfusion_Blazor_PivotView_SfPivotView_1_ShowFieldList) to `true` for interactive field management. ```cshtml @using Syncfusion.Blazor.PivotView - + @@ -219,9 +269,12 @@ namespace MyWebService.Controllers } ``` - -When you run the application, the resultant pivot table will look like this. +#### Step 4: Run and Verify the Pivot Table +1. Run the Blazor application. +2. The Pivot Table displays the Snowflake data fetched via the Web API, structured according to the defined configuration. +3. The resulting Pivot Table will look like this: ![Blazor Pivot Table bound with Snowflake data](../images/blazor-pivottable-Snowflake-databinding.png) -> In [this](https://github.com/SyncfusionExamples/how-to-bind-Snowflake-database-to-pivot-table/tree/master/Blazor) GitHub repository, you can find our Blazor Pivot Table sample for binding data from a Snowflake database using the Web API service. \ No newline at end of file +### Additional Resources +Explore a complete example of the [Blazor Pivot Table](https://www.syncfusion.com/blazor-components/blazor-pivot-table) integrated with an ASP.NET Core Web application to fetch data from a Snowflake database in this [GitHub repository](https://github.com/SyncfusionExamples/web-bind-Snowflake-database-to-pivot-table/tree/master/Blazor). \ No newline at end of file diff --git a/blazor/pivot-table/css-customization.md b/blazor/pivot-table/css-customization.md index a085e9a116..29e69744b6 100644 --- a/blazor/pivot-table/css-customization.md +++ b/blazor/pivot-table/css-customization.md @@ -9,9 +9,13 @@ documentation: ug # CSS Customization in Blazor Pivot Table Component +The Blazor Pivot Table component provides extensive CSS customization options, allowing users to modify the visual appearance and layout of various pivot table elements. This includes styling row headers, column headers, value cells, summary cells, Field List components, and Grouping Bar areas to match application themes and design requirements. + ## Hiding Axis -The visibility of row, column, value and filter axis in Field List and Grouping Bar can be changed using custom CSS setting. +The visibility of the row, column, value, and filter axis areas in both the Field List dialog and Grouping Bar can be controlled using custom CSS styling. Each axis area has specific CSS classes that allow precise targeting for customization. + +The following code example demonstrates how to hide the column axis in both the Grouping Bar and Field List within the Pivot Table. The CSS includes necessary height and spacing adjustments to prevent layout gaps and maintain visual consistency: ```cshtml @using Syncfusion.Blazor.PivotView @@ -103,13 +107,21 @@ The visibility of row, column, value and filter axis in Field List and Grouping ``` +**Note:** The CSS selectors above assume the Pivot Table component has the ID **PivotView**. Replace this with your actual component ID or use appropriate class-based selectors for your implementation. + +The CSS selectors target the following Pivot Table elements: +- `.e-group-columns`: Hides the column axis in the Grouping Bar. +- `.e-group-filters`: Adjusts the height of the filter axis to compensate for the hidden column axis in the Grouping Bar. +- `.e-field-list-columns`: Hides the column axis in the Field List dialog. +- `.e-field-list-values`: Adjusts the layout of the values axis when the column section is hidden in the Field List dialog. + ![Hiding Columns in Blazor PivotTable GroupingBar](images/blazor-pivottable-hide-columns-in-groupbar.png) ![Hiding Columns in Blazor PivotTable Field List](images/blazor-pivottable-hide-columns-in-fieldlist.png) ## Text Alignment -The alignment of text inside row headers, column headers, value cells and summary cells can be changed using custom CSS setting. +The alignment of text inside row headers, column headers, value cells, and summary cells can be customized using CSS styling. The following example demonstrates how to center-align text in value cells: ```cshtml @using Syncfusion.Blazor.PivotView @@ -166,14 +178,15 @@ The alignment of text inside row headers, column headers, value cells and summar //Bind the data source collection here. Refer "Assigning sample data to the pivot table" section in getting started for more details. } } - ``` ![Text Alignment in Blazor PivotGrid](images/blazor-pivotgrid-text-alignment.png) -## Customize header, value and summary cell style +## Customize header, value and summary cell styles + +The Pivot Table component elements including header cells, value cells, and summary cells can be styled using built-in CSS class names. This enables comprehensive visual customization of the component's appearance to match application themes and design requirements. -The elements in pivot table like header cell, value cell and summary cell style can be customized using built-in CSS names. +The following code sample demonstrates how to apply custom background colors to different cell types: ```cshtml @using Syncfusion.Blazor.PivotView @@ -225,9 +238,14 @@ The elements in pivot table like header cell, value cell and summary cell style //Bind the data source collection here. Refer "Assigning sample data to the pivot table" section in getting started for more details. } } - ``` +The CSS classes target the following Pivot Table elements: +- `.e-headercell`: Styles column header cells +- `.e-rowsheader`: Styles row header cells +- `.e-summary:not(.e-gtot)`: Styles subtotal summary cells (excluding grand totals) +- `.e-gtot`: Styles grand total cells + ![Blazor PivotGrid with Custom Styles](images/blazor-pivotgrid-custom-styles.png) N> You can refer to the [Blazor Pivot Table](https://www.syncfusion.com/blazor-components/blazor-pivot-table) feature tour page for its groundbreaking feature representations. You can also explore the [Blazor Pivot Table example](https://blazor.syncfusion.com/demos/pivot-table/default-functionalities?theme=bootstrap5) to know how to render and configure the pivot table. \ No newline at end of file diff --git a/blazor/pivot-table/data-binding.md b/blazor/pivot-table/data-binding.md index 896a1c409b..d49bcdf78a 100644 --- a/blazor/pivot-table/data-binding.md +++ b/blazor/pivot-table/data-binding.md @@ -11,11 +11,11 @@ documentation: ug ## JSON -For JSON data binding, the `type` property under [PivotViewDataSourceSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html) needs to be set as `JSON`. The default value is assumed as `JSON`. +For JSON data binding, the [`Type`](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html#Syncfusion_Blazor_PivotView_PivotViewDataSourceSettings_1_Type) property under [PivotViewDataSourceSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html) needs to be set as `DataSourceType.JSON`. Since JSON is the default data type, you can bind JSON data without setting this property. ### Binding JSON data via local -In-order to bind local JSON data to the pivot table, user can assign the local variable holding the JSON data to the [DataSource](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html#Syncfusion_Blazor_PivotView_PivotViewDataSourceSettings_1_DataSource) property under [PivotViewDataSourceSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html). +You can bind local JSON data to the Pivot Table by assigning a local variable containing the JSON data to the [DataSource](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html#Syncfusion_Blazor_PivotView_PivotViewDataSourceSettings_1_DataSource) property under [PivotViewDataSourceSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html). ```cshtml @using Syncfusion.Blazor.PivotView @@ -48,12 +48,11 @@ In-order to bind local JSON data to the pivot table, user can assign the local v //Bind the data source collection here. Refer "Assigning sample data to the pivot table" section in getting started for more details. } } - ``` - ![Blazor PivotTable with DataBinding](images/blazor-pivottable-data-binding.png) +![Blazor PivotTable with DataBinding](images/blazor-pivottable-data-binding.png) -Using local variable, the JSON data can also be bound to the pivot table using [SfDataManager](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataManager.html) option with the help of `JsonAdaptor`. Here the instance of [SfDataManager](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataManager.html) holding JSON data is assigned to [DataSource](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html#Syncfusion_Blazor_PivotView_PivotViewDataSourceSettings_1_DataSource) property under [PivotViewDataSourceSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html). The use of [SfDataManager](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataManager.html) is optional here. +You can also bind JSON data using the [SfDataManager](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataManager.html) with `JsonAdaptor`. In this approach, assign the [SfDataManager](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataManager.html) instance containing JSON data to the [DataSource](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html#Syncfusion_Blazor_PivotView_PivotViewDataSourceSettings_1_DataSource) property under [PivotViewDataSourceSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html). Using [SfDataManager](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataManager.html) is optional for local JSON data binding. ```cshtml @using Syncfusion.Blazor.PivotView @@ -89,12 +88,11 @@ Using local variable, the JSON data can also be bound to the pivot table using [ //Bind the data source collection here. Refer "Assigning sample data to the pivot table" section in getting started for more details. } } - ``` - ![Blazor PivotTable with Local Data Binding](images/blazor-pivottable-data-binding.png) +![Blazor PivotTable with Local Data Binding](images/blazor-pivottable-data-binding.png) -In the meantime, the JSON data from the local *.json file type can also be connected to the pivot table. Here, the file can be read by the **StreamReader** option, which will give the result in the string form. And the resulting string needs to be converted to JSON data that can be assigned to the [DataSource](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html#Syncfusion_Blazor_PivotView_PivotViewDataSourceSettings_1_DataSource) property under [PivotViewDataSourceSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html). +You can also load JSON data from a local *.json file to the Pivot Table. The file can be read using the **StreamReader**, which outputs the data as a string. This string must then be converted to JSON format and assigned to the [DataSource](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html#Syncfusion_Blazor_PivotView_PivotViewDataSourceSettings_1_DataSource) property under [PivotViewDataSourceSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html). ```cshtml @using Syncfusion.Blazor.PivotView @@ -154,7 +152,7 @@ In the meantime, the JSON data from the local *.json file type can also be conne ### Binding JSON data via remote -In-order to bind remote JSON data, mention the endpoint [Url](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataManager.html#Syncfusion_Blazor_DataManager_Url) under [PivotViewDataSourceSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html) property. The [Url](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataManager.html#Syncfusion_Blazor_DataManager_Url) property supports both direct downloadable file (*.json) and web service URL. +To bind remote JSON data to the Pivot Table, set the endpoint [Url](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataManager.html#Syncfusion_Blazor_DataManager_Url) in the [PivotViewDataSourceSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html) property. The [Url](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataManager.html#Syncfusion_Blazor_DataManager_Url) property accepts both direct downloadable JSON files (*.json) and web service URLs. ```cshtml @using Syncfusion.Blazor.PivotView @@ -194,13 +192,13 @@ In-order to bind remote JSON data, mention the endpoint [Url](https://help.syncf ## CSV -For CSV data binding, the `type` property under [PivotViewDataSourceSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html) needs to be set as `CSV` mandatorily. +To bind CSV data, set the [`Type`](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html#Syncfusion_Blazor_PivotView_PivotViewDataSourceSettings_1_Type) property under [PivotViewDataSourceSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html) to `DataSourceType.CSV`. -N> The CSV format is considered to be the most compact format compared to JSON since it is half the size of JSON. This helps to reduce the bandwidth while transferring to the browser. +N> The CSV format is more compact than JSON, using approximately half the size. This reduces bandwidth usage when transferring data to the browser. ### Binding CSV data via local -In-order to bind local CSV data to the pivot table, user needs to convert it as string array and then directly assign it to the [DataSource](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html#Syncfusion_Blazor_PivotView_PivotViewDataSourceSettings_1_DataSource) property under [PivotViewDataSourceSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html). +To bind local CSV data to the Pivot Table, convert the data into a string array and assign it directly to the [DataSource](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html#Syncfusion_Blazor_PivotView_PivotViewDataSourceSettings_1_DataSource) property under [PivotViewDataSourceSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html). ```cshtml @using Syncfusion.Blazor.PivotView @@ -258,7 +256,7 @@ In-order to bind local CSV data to the pivot table, user needs to convert it as ![Blazor PivotTable with CSV Data Binding](images/blazor-pivottable-csv-data-binding.png) -In the meantime, the CSV data from the local *. csv file type can also be connected to the pivot table. Here, the file can be read by the **StreamReader** option, which will give the result in the string form. And the resulting string needs to be converted to string array that can be assigned to the [DataSource](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html#Syncfusion_Blazor_PivotView_PivotViewDataSourceSettings_1_DataSource) property under [PivotViewDataSourceSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html). +You can also connect CSV data from a local *.csv file to the Pivot Table. The file can be read using the **StreamReader**, which outputs the data as a string. This string must then be converted to a string array and assigned to the [DataSource](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html#Syncfusion_Blazor_PivotView_PivotViewDataSourceSettings_1_DataSource) property under [PivotViewDataSourceSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html). ```cshtml @using Syncfusion.Blazor.PivotView @@ -297,7 +295,7 @@ In the meantime, the CSV data from the local *. csv file type can also be connec protected override void OnInitialized() { // Put appropriate file path here - string url = AppDomain.CurrentDomain.BaseDirectory + "sales.csv"; + string url = AppDomain.CurrentDomain.BaseDirectory + "sales.csv"; WebClient myWebClient = new WebClient(); Stream myStream = myWebClient.OpenRead(url); StreamReader stream = new StreamReader(myStream); @@ -321,14 +319,15 @@ In the meantime, the CSV data from the local *. csv file type can also be connec return splitted; } } - ``` ![Blazor PivotTable with Local CSV Data Binding](images/blazor-pivottable-csv-data-binding.png) ### Binding CSV data via remote -In-order to bind the remote CSV data, mention the endpoint [Url](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataManager.html#Syncfusion_Blazor_DataManager_Url) under [PivotViewDataSourceSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html) property. The [Url](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataManager.html#Syncfusion_Blazor_DataManager_Url) property supports both direct downloadable file (*.csv) and web service URL. +Remote CSV data binding allows you to load data directly from external sources without storing large datasets locally, which improves application performance and reduces memory usage. + +To bind remote CSV data, set the [Url](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataManager.html#Syncfusion_Blazor_DataManager_Url) property under [PivotViewDataSourceSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html) to point to your data source endpoint. The [Url](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataManager.html#Syncfusion_Blazor_DataManager_Url) property accepts both direct downloadable CSV files (*.csv) and web service URLs that return CSV data. ```cshtml @using Syncfusion.Blazor.PivotView @@ -373,13 +372,17 @@ In-order to bind the remote CSV data, mention the endpoint [Url](https://help.sy ## Remote Data Binding -To interact with remote data source, provide the endpoint [Url](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataManager.html#Syncfusion_Blazor_DataManager_Url) within [SfDataManager](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataManager.html) class along with appropriate [Adaptor](https://blazor.syncfusion.com/documentation/data/adaptors). By default, [SfDataManager](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataManager.html) uses [ODataAdaptor](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Adaptors.html#Syncfusion_Blazor_Adaptors_ODataAdaptor) for remote data-binding. +Remote data binding allows you to connect your Pivot Table component to data sources that are hosted on remote servers, enabling you to work with data from web services, databases, and other external sources. + +To bind remote data, specify the endpoint [Url](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataManager.html#Syncfusion_Blazor_DataManager_Url) within [SfDataManager](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataManager.html) along with the appropriate [Adaptor](https://blazor.syncfusion.com/documentation/data/adaptors). By default, [SfDataManager](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataManager.html) uses [ODataAdaptor](https://blazor.syncfusion.com/documentation/data/adaptors?no-cache=1#odata-adaptor) for remote data binding. N> When using [SfDataManager](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataManager.html) for data binding then the TValue must be provided explicitly in the [PivotViewDataSourceSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html) class. ### Binding with OData services -OData is a standardized protocol for creating and consuming data. User can retrieve data from OData service using the [SfDataManager](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataManager.html) class. +OData (Open Data Protocol) is a web-based protocol that provides a standard way to create and consume data APIs. You can easily connect your Pivot Table to OData services using the [SfDataManager](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataManager.html), which handles the communication and data retrieval automatically. + +The following example demonstrates how to bind the Pivot Table to an OData service: ```cshtml @using Syncfusion.Blazor.PivotView @@ -399,7 +402,7 @@ OData is a standardized protocol for creating and consuming data. User can retri - + @code{ @@ -412,12 +415,11 @@ OData is a standardized protocol for creating and consuming data. User can retri public double Freight { get; set; } } } - ``` ### Binding with OData V4 services -The OData V4 is an improved version of OData protocols, and the [SfDataManager](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataManager.html) class can be used to retrieve and consume OData V4 services. For more details on OData V4 services, refer to the [OData documentation](http://docs.oasis-open.org/odata/odata/v4.0/errata03/os/complete/part1-protocol/odata-v4.0-errata03-os-part1-protocol-complete.html#_Toc453752197). To bind OData V4 service, use the [ODataV4Adaptor](https://blazor.syncfusion.com/documentation/data/adaptors?no-cache=1#odatav4-adaptor). +OData V4 services provide enhanced query capabilities and improved performance for data retrieval operations. The OData V4 is an improved version of OData protocols, and the [SfDataManager](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataManager.html) can retrieve and consume OData V4 services. For more details on OData V4 services, refer to the [OData documentation](http://docs.oasis-open.org/odata/odata/v4.0/errata03/os/complete/part1-protocol/odata-v4.0-errata03-os-part1-protocol-complete.html#_Toc453752197). To bind OData V4 service, use the [ODataV4Adaptor](https://blazor.syncfusion.com/documentation/data/adaptors?no-cache=1#odatav4-adaptor). ```cshtml @using Syncfusion.Blazor.PivotView @@ -437,7 +439,7 @@ The OData V4 is an improved version of OData protocols, and the [SfDataManager]( - + @code{ @@ -450,12 +452,11 @@ The OData V4 is an improved version of OData protocols, and the [SfDataManager]( public double Freight { get; set; } } } - ``` ### Web API -User can use [WebApiAdaptor](https://blazor.syncfusion.com/documentation/data/adaptors#web-api-adaptor) to bind the pivot table with Web API created using OData endpoint. +Web API binding allows you to connect the Pivot Table directly to RESTful web services for dynamic data loading. Users can use [WebApiAdaptor](https://blazor.syncfusion.com/documentation/data/adaptors#web-api-adaptor) to bind the Pivot Table with Web API created using OData endpoint. ```cshtml @using Syncfusion.Blazor.PivotView @@ -478,7 +479,7 @@ User can use [WebApiAdaptor](https://blazor.syncfusion.com/documentation/data/ad - + @code{ @@ -491,7 +492,6 @@ User can use [WebApiAdaptor](https://blazor.syncfusion.com/documentation/data/ad public string ShipCity { get; set; } } } - ``` ## List binding @@ -730,31 +730,49 @@ Here, **ProductDetails** class implements the interface of **INotifyPropertyChan ## Mapping -One can define field information like alias name (caption), data type, aggregation type, show and hide subtotals etc. using the [FieldMapping](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.IPivotViewDataSourceSettings.html#Syncfusion_Blazor_PivotView_IPivotViewDataSourceSettings_FieldMapping) property under [PivotViewDataSourceSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html) class. The available options are, +Field mapping allows you to customize how fields appear and behave in the Pivot Table without changing the original data source. You can define field properties such as display names, data types, aggregation methods, and visibility settings using the [FieldMapping](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.IPivotViewDataSourceSettings.html#Syncfusion_Blazor_PivotView_IPivotViewDataSourceSettings_FieldMapping) property within [PivotViewDataSourceSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html). + +The following options are available for field mapping: + +**Field identification and display** + +* [Name](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.FieldOptions.html#Syncfusion_Blazor_PivotView_FieldOptions_Name) - Specifies the field name from your data source. +* [Caption](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.FieldOptions.html#Syncfusion_Blazor_PivotView_FieldOptions_Caption) - Sets a user-friendly display name for the field. This display name will appear in the Pivot Table UI instead of the original field name. +* [DataType](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.FieldOptions.html#Syncfusion_Blazor_PivotView_FieldOptions_DataType) - Specifies the field data type such as 'string', 'number', 'datetime', 'date', or 'boolean'. + +**Aggregation and calculation** + +* [Type](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.FieldOptions.html#Syncfusion_Blazor_PivotView_FieldOptions_Type) - Defines how values are aggregated in the Pivot Table, such as sum, product, count, average, minimum, or maximum. The default value is **sum**. This option applies only to relational data sources. +* [BaseField](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.FieldOptions.html#Syncfusion_Blazor_PivotView_FieldOptions_BaseField) - Specifies a comparison field for aggregate types like "DifferenceFrom", "PercentageOfDifferenceFrom", or "PercentageOfParentTotal". +* [BaseItem](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.FieldOptions.html#Syncfusion_Blazor_PivotView_FieldOptions_BaseItem) - Specifies a comparison member within a field for aggregate types like "DifferenceFrom", "PercentageOfDifferenceFrom", or "PercentageOfParentTotal". + +**Field positioning and behavior** + +* [Axis](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.FieldOptions.html#Syncfusion_Blazor_PivotView_FieldOptions_Axis) - Determines where the field appears in the Pivot Table (row, column, value, or filter axis). +* [ShowNoDataItems](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.FieldOptions.html#Syncfusion_Blazor_PivotView_FieldOptions_ShowNoDataItems) - Shows all field members in the Pivot Table, even when no data exists at row and column intersections. The default value is **false**. This option applies only to relational data sources. +* [ShowSubTotals](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.FieldOptions.html#Syncfusion_Blazor_PivotView_FieldOptions_ShowSubTotals) - Controls the visibility of subtotals for the field in row and column axes. The default value is **true**. + +**OLAP-specific options** -* [Name](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.FieldOptions.html#Syncfusion_Blazor_PivotView_FieldOptions_Name) - It is to specify the appropriate field name. -* [Caption](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.FieldOptions.html#Syncfusion_Blazor_PivotView_FieldOptions_Caption) - It is to set the alias name (caption) to the specific field. Instead of actual field name, the alias name (caption) will be set in the UI of the pivot table. -* [Type](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.FieldOptions.html#Syncfusion_Blazor_PivotView_FieldOptions_Type) - It is to display values in the pivot table with appropriate aggregation such as sum, product, count, average, minimum, maximum, etc. Its default value is **sum**. This option is applicable only for relational data source. -* [Axis](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.FieldOptions.html#Syncfusion_Blazor_PivotView_FieldOptions_Axis) - It will help to display the field in specified axis such as row/column/value/filter axis of the pivot table. -* [ShowNoDataItems](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.FieldOptions.html#Syncfusion_Blazor_PivotView_FieldOptions_ShowNoDataItems) - It is to show all the members of a specific field to the pivot table, even if there are no data in the intersection of the row and column. The default value is **false**. This option is applicable only for relational data source. -* [BaseField](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.FieldOptions.html#Syncfusion_Blazor_PivotView_FieldOptions_BaseField) - For the aggregate types like "DifferenceFrom" or "PercentageOfDifferenceFrom" or "PercentageOfParentTotal", selective field is assigned for comparison via this property. -* [BaseItem](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.FieldOptions.html#Syncfusion_Blazor_PivotView_FieldOptions_BaseItem) For the aggregate types like "DifferenceFrom" or "PercentageOfDifferenceFrom" or "PercentageOfParentTotal", selective member in a field is assigned for comparison via this property. -* [ShowSubTotals](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.FieldOptions.html#Syncfusion_Blazor_PivotView_FieldOptions_ShowSubTotals) - It is to show or hide sub-totals of a specific field in row and column axis of the pivot table. The default value is **true**. * [IsNamedSet](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.FieldOptions.html#Syncfusion_Blazor_PivotView_FieldOptions_IsNamedSet) - It is to set whether the specified field is named set or not. In general, the named set is a set of dimension members or a set expression (MDX query) to be created as a dimension in the SSAS OLAP cube itself. The default value is **false** and this option is applicable only for OLAP data source. -* [IsCalculatedField](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.FieldOptions.html#Syncfusion_Blazor_PivotView_FieldOptions_IsCalculatedField) - It is to set whether the specified field is a calculated field or not. In general, a calculated field is created from the bound data source or using simple formula with basic arithmetic operators in the pivot table. The default value is **false** and this option is applicable only for OLAP data source. -* [ShowFilterIcon](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.FieldOptions.html#Syncfusion_Blazor_PivotView_FieldOptions_ShowFilterIcon) - It is to show or hide the filter icon of a specific field which will be displayed on the button of the grouping bar and field list UI. This filter icon is used to filter the members of a specified field at runtime in the pivot table. The default value is **true**. -* [ShowSortIcon](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.FieldOptions.html#Syncfusion_Blazor_PivotView_FieldOptions_ShowSortIcon) - It is to show or hide the sort icon of a specific field which will be displayed on the button of the grouping bar and field list UI. This sort icon is used to order members of a specified field either in ascending or descending at runtime. The default value is **true**. -* [ShowRemoveIcon](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.FieldOptions.html#Syncfusion_Blazor_PivotView_FieldOptions_ShowRemoveIcon) - It is to show or hide the remove icon of a specific field which will be displayed on the button of the grouping bar and field list UI. This remove icon is used to remove the specified field during runtime. The default value is **true**. -* [ShowValueTypeIcon](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.FieldOptions.html#Syncfusion_Blazor_PivotView_FieldOptions_ShowValueTypeIcon) - It is to show or hide the value type icon of a specific field which will be displayed on the button of the grouping bar and field list UI. This value type icon helps to select the appropriate aggregation type to specified value field at runtime. The default value is **true**. -* [ShowEditIcon](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.FieldOptions.html#Syncfusion_Blazor_PivotView_FieldOptions_ShowEditIcon) - It is to show or hide the edit icon of a specific field which will be displayed on the button of the grouping bar and field list UI. This edit icon is used to modify caption, formula, and format of a specified calculated field at runtime. The default value is **true**. -* [AllowDragAndDrop](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.FieldOptions.html#Syncfusion_Blazor_PivotView_FieldOptions_AllowDragAndDrop) - It is to restrict specific field's button from being dragged on runtime in the grouping bar and field list UI. This will prevent from altering the current report. The default value is **true**. -* [DataType](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.FieldOptions.html#Syncfusion_Blazor_PivotView_FieldOptions_DataType) - It is to specify the type of the field like 'string', 'number', 'datetime', 'date', and 'boolean'. +* [IsCalculatedField](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.FieldOptions.html#Syncfusion_Blazor_PivotView_FieldOptions_IsCalculatedField) - It is to set whether the specified field is a calculated field or not. In general, a calculated field is created from the bound data source or using simple formula with basic arithmetic operators in the Pivot Table. The default value is **false** and this option is applicable only for OLAP data source. + +**UI interaction controls** + +* [ShowFilterIcon](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.FieldOptions.html#Syncfusion_Blazor_PivotView_FieldOptions_ShowFilterIcon) - Controls the visibility of the filter icon on field buttons in the grouping bar and field list. Users can filter field members at runtime using this icon. The default value is **true**. +* [ShowSortIcon](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.FieldOptions.html#Syncfusion_Blazor_PivotView_FieldOptions_ShowSortIcon) - Controls the visibility of the sort icon on field buttons in the grouping bar and field list. Users can sort field members in ascending or descending order at runtime. The default value is **true**. +* [ShowRemoveIcon](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.FieldOptions.html#Syncfusion_Blazor_PivotView_FieldOptions_ShowRemoveIcon) - Controls the visibility of the remove icon on field buttons in the grouping bar and field list. Users can remove fields from the report at runtime. The default value is **true**. +* [ShowValueTypeIcon](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.FieldOptions.html#Syncfusion_Blazor_PivotView_FieldOptions_ShowValueTypeIcon) - Controls the visibility of the value type icon on field buttons in the grouping bar and field list. Users can change the aggregation type for value fields at runtime. The default value is **true**. +* [ShowEditIcon](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.FieldOptions.html#Syncfusion_Blazor_PivotView_FieldOptions_ShowEditIcon) - Controls the visibility of the edit icon on field buttons in the grouping bar and field list. Users can modify the caption, formula, and format of calculated fields at runtime. The default value is **true**. +* [AllowDragAndDrop](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.FieldOptions.html#Syncfusion_Blazor_PivotView_FieldOptions_AllowDragAndDrop) - Controls whether field buttons can be dragged in the grouping bar and field list UI. Setting this to **false** prevents users from modifying the current report structure. The default value is **true**. -The main purpose of these mapping options is to configure each field that is not a part of the initial pivot report. Even if any field that is a part of this mapping is defined here, the value set in the initial report will have the highest preceding. +Field mapping is particularly useful for configuring fields that are not part of your initial pivot report. When a field appears in both the initial report and field mapping, the initial report settings take priority. -N> This option is applicable only for relational data source. +N> This option applies only to relational data sources. - ```cshtml +The following code sample demonstrates how to configure the visibility of field button icons: + +```cshtml @using Syncfusion.Blazor.PivotView @@ -788,7 +806,6 @@ N> This option is applicable only for relational data source. //Bind the data source collection here. Refer "Assigning sample data to the pivot table" section in getting started for more details. } } - ``` ![Blazor PivotTable with Mapping](images/blazor-pivottable-mapping.png) @@ -1009,7 +1026,7 @@ On the other hand, to configure the pivot table using Web API, provide the appro ## Values in row axis -By default, the value fields are plotted in column axis. To plot those fields in row axis, use the [ValueAxis](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html#Syncfusion_Blazor_PivotView_DataSourceSettingsModel_1_ValueAxis) property by setting its value as **row**. By default, it holds the value **column**. +You can display value fields in the row axis of the Pivot Table to make your data analysis clear and more accessible. By default, value fields appear in the column axis. To display these fields in the row axis, set the [ValueAxis](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html#Syncfusion_Blazor_PivotView_PivotViewDataSourceSettings_1_ValueAxis) property to **row**. The default value is **column**. ```cshtml @using Syncfusion.Blazor.PivotView @@ -1042,14 +1059,15 @@ By default, the value fields are plotted in column axis. To plot those fields in //Bind the data source collection here. Refer "Assigning sample data to the pivot table" section in getting started for more details. } } - ``` ![Blazor PivotTable with Value in Row Axis](images/blazor-pivottable-value-in-row-axis.png) ## Show 'no data' items -By default, the pivot table only shows the field item if it has data in its row or column combination. To show all items that do not have data in row and column combination in the pivot table, use the [ShowNoDataItems](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewRow.html#Syncfusion_Blazor_PivotView_PivotViewRow_ShowNoDataItems) property by setting its value to **true** for the desired fields. In the following code sample, rows of the "Country" and "Products" fields do not have data in all combination with "Year" and "Quarter" column field. +Display all field items in your Pivot Table, even when they lack data in certain row and column combinations, for a complete view of your data structure. By default, the Pivot Table displays field items only when they contain data in their respective row or column combinations. However, you can show all items, including those without data, by setting the [ShowNoDataItems](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewRow.html#Syncfusion_Blazor_PivotView_PivotViewRow_ShowNoDataItems) property to **true** for the desired fields. + +In the following example, the "Country" and "Products" field rows are displayed even when they don't have data in all combinations with the "Year" and "Quarter" column field. ```cshtml @using Syncfusion.Blazor.PivotView @@ -1082,14 +1100,13 @@ By default, the pivot table only shows the field item if it has data in its row //Bind the data source collection here. Refer "Assigning sample data to the pivot table" section in getting started for more details. } } - ``` ![Blazor PivotTable without Data](images/blazor-pivottable-without-data.png) ## Show value headers always -To show value header always in pivot table, even if it holds a single value, use the [AlwaysShowValueHeader](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html#Syncfusion_Blazor_PivotView_DataSourceSettingsModel_1_AlwaysShowValueHeader) property by setting its value as **true**. +Ensure value headers remain visible in your Pivot Table at all times, providing consistent column identification even with single value scenarios. The Pivot Table typically hides value headers when displaying only one value. To maintain consistent header visibility regardless of the number of values, set the [AlwaysShowValueHeader](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html#Syncfusion_Blazor_PivotView_PivotViewDataSourceSettings_1_AlwaysShowValueHeader) property to **true**. ```cshtml @using Syncfusion.Blazor.PivotView @@ -1121,14 +1138,13 @@ To show value header always in pivot table, even if it holds a single value, use //Bind the data source collection here. Refer "Assigning sample data to the pivot table" section in getting started for more details. } } - ``` ![Blazor PivotTable with Values Header](images/blazor-pivottable-values-header.png) ## Customize empty value cells -User can show custom string in empty value cells using the [EmptyCellsTextContent](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html#Syncfusion_Blazor_PivotView_PivotViewDataSourceSettings_1_EmptyCellsTextContent) property in [PivotViewDataSourceSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html) class of the pivot table. Since the property is of string data type, user can fill empty value cells with any value like "0", "-", "*", "(blank)", etc. Its common for all value fields and can be configured through code behind. +Show custom text in cells that contain no data to make your Pivot Table more informative and user-friendly. By default, empty value cells appear blank in the Pivot Table. However, you can display meaningful text in these cells using the [EmptyCellsTextContent](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html#Syncfusion_Blazor_PivotView_PivotViewDataSourceSettings_1_EmptyCellsTextContent) property within the [PivotViewDataSourceSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html). Since this property accepts string values, you can fill empty cells with any text such as "0", "-", "*", "(blank)", or other meaningful indicators. This setting applies to all value fields and can be configured in your code behind. ```cshtml @using Syncfusion.Blazor.PivotView @@ -1158,7 +1174,6 @@ User can show custom string in empty value cells using the [EmptyCellsTextConten //Bind the data source collection here. Refer "Assigning sample data to the pivot table" section in getting started for more details. } } - ``` ![Empty Values in Blazor PivotTable](images/blazor-pivottable-empty-values.png) @@ -1255,7 +1270,15 @@ In the following example, `true` is passed to the [`RefreshAsync`](https://help. ## Event -The event [OnLoad](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewEvents-1.html#Syncfusion_Blazor_PivotView_PivotViewEvents_1_OnLoad) fires before initiate rendering of pivot table. It holds following parameters like [DataSourceSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.LoadEventArgs-1.html#Syncfusion_Blazor_PivotView_LoadEventArgs_1_DataSourceSettings), [FieldsType](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.LoadEventArgs-1.html#Syncfusion_Blazor_PivotView_LoadEventArgs_1_FieldsType) and [PivotView](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.LoadEventArgs-1.html#Syncfusion_Blazor_PivotView_LoadEventArgs_1__ctor). In this event user can customize data source settings before initiating pivot table render module. +The [OnLoad](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewEvents-1.html#Syncfusion_Blazor_PivotView_PivotViewEvents_1_OnLoad) event fires before the Pivot Table begins rendering and provides access to key parameters that you can use to customize your data source configuration, apply filters, or modify field settings before the table displays. + +**Event Parameters** + +The load event provides the following parameters: + +- [DataSourceSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.LoadEventArgs-1.html#Syncfusion_Blazor_PivotView_LoadEventArgs_1_DataSourceSettings): Defines the current report configuration including data source, rows, columns, values, and filters. +- [FieldsType](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.LoadEventArgs-1.html#Syncfusion_Blazor_PivotView_LoadEventArgs_1_FieldsType): Defines the type of specific fields, such as whether they should be treated as numbers, dates, or text. +- [PivotView](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.LoadEventArgs-1.html#Syncfusion_Blazor_PivotView_LoadEventArgs_1__ctor): Defines the Pivot Table instance object that provides access to all component methods and properties. ```cshtml @using Syncfusion.Blazor.PivotView @@ -1274,9 +1297,9 @@ The event [OnLoad](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Pivot - - - + + + @@ -1295,7 +1318,6 @@ The event [OnLoad](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Pivot args.DataSourceSettings.ExpandAll = false; } } - ``` ![Loading Event in Blazor PivotTable](images/blazor-pivottable-load-event.png) diff --git a/blazor/pivot-table/data-compression.md b/blazor/pivot-table/data-compression.md index c1f3ac3261..17264cefe2 100644 --- a/blazor/pivot-table/data-compression.md +++ b/blazor/pivot-table/data-compression.md @@ -6,13 +6,14 @@ platform: Blazor control: Pivot Table documentation: ug --- + # Data Compression in Blazor Pivot Table component > This property is applicable only for relational data source. -When binding one million raw data, the pivot table processes all raw data to generate aggregated data during initial rendering and report manipulation. However, with data compression, the input raw data is compressed based on the uniqueness of the raw data, and the final compressed raw data are utilized by the pivot table. The compressed raw data is then used for further operations at all times, reducing the looping complexity and improving the performance of the pivot table. For example, if the pivot table is connected to one million raw data compressed to 1,000 unique raw data, it will render within 3 seconds rather than 10 seconds. You can enable this option by using the [AllowDataCompression](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SfPivotView-1.html#Syncfusion_Blazor_PivotView_SfPivotView_1_AllowDataCompression) property along with [EnableVirtualization](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SfPivotView-1.html#Syncfusion_Blazor_PivotView_SfPivotView_1_EnableVirtualization) property. +When binding large volumes of raw data, the pivot table processes all raw data to generate aggregated data during initial rendering and report manipulation. However, with data compression enabled, the input raw data is compressed based on the uniqueness of the raw data, and the final compressed raw data is utilized by the pivot table. The compressed raw data is then used for all subsequent operations, reducing the looping complexity and improving the performance of the pivot table. For example, if the pivot table connects to one million raw data records that compress to 1,000 unique raw data records, it will render significantly faster—potentially within 3 seconds rather than 10 seconds, depending on the data complexity and system specifications. Enable this option by using the [AllowDataCompression](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SfPivotView-1.html#Syncfusion_Blazor_PivotView_SfPivotView_1_AllowDataCompression) property along with [EnableVirtualization](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SfPivotView-1.html#Syncfusion_Blazor_PivotView_SfPivotView_1_EnableVirtualization) property. -> This options will only function when the virtual scrolling is enabled. +> N> This option will only function when the virtual scrolling is enabled. ```cshtml @using Syncfusion.Blazor.PivotView @@ -45,19 +46,18 @@ When binding one million raw data, the pivot table processes all raw data to gen //Bind the data source collection here. Refer "Assigning sample data to the pivot table" section in getting started for more details. } } - ``` -**Limitations during data compression** - -- The following aggregation types will not be supported. - - Average - - Populationsdev - - Samplestdev - - Populationvar - - Samplevar -- If you use any of the aggregations above, it will result in an aggregation type **Sum**. -- **Distinct count** will act as **Count** aggregation type. -- In the calculated field, an existing field can be inserted without altering its default aggregation type. Even if changed, it would revert to the default aggregation type for calculation. +**Limitations during data compression:** + +- The following aggregation types are not supported: + - Average + - PopulationStDev + - SampleStDev + - PopulationVar + - SampleVar +- If any of the above aggregation types are used, they will be automatically converted to **"Sum"** aggregation. +- **"DistinctCount"** will function as **"Count"** aggregation type. +- In a calculated field, existing fields can be inserted without changing their default aggregation type. Even if the aggregation type is changed, it will revert to the default aggregation type for calculation purposes. > You can refer to the [Blazor Pivot Table](https://www.syncfusion.com/blazor-components/blazor-pivot-table) feature tour page for its groundbreaking feature representations. You can also explore the [Blazor Pivot Table example](https://blazor.syncfusion.com/demos/pivot-table/default-functionalities?theme=bootstrap5) to know how to render and configure the pivot table. \ No newline at end of file diff --git a/blazor/pivot-table/defer-layout-update.md b/blazor/pivot-table/defer-layout-update.md index a7ef027a60..58ee64af83 100644 --- a/blazor/pivot-table/defer-layout-update.md +++ b/blazor/pivot-table/defer-layout-update.md @@ -9,38 +9,38 @@ documentation: ug # Defer Layout Update in Blazor Pivot Table Component -Defer layout update support allows to update the [Blazor Pivot Table](https://www.syncfusion.com/blazor-components/blazor-pivot-table) component only on demand. On enabling this feature, end user can drag-and-drop fields between row, column, value and filter axes, apply sorting and filtering inside the Field List, resulting in change of pivot report alone but not the pivot table values. Once all the operations are performed and on clicking the "Apply" button in the Field List, pivot table will start to update with the last modified report. This also helps in bringing better performance in pivot table component rendering. +Defer update support allows updating the [Blazor Pivot Table](https://www.syncfusion.com/blazor-components/blazor-pivot-table) component only on demand, significantly improving performance for complex data operations. When this feature is enabled, users can drag-and-drop fields between row, column, value, and filter axes, apply sorting and filtering inside the Field List, resulting in changes to the pivot report configuration without immediately updating the pivot table values. Once all operations are performed and the "Apply" button is clicked in the Field List, the pivot table will update with the final modified report. This approach reduces multiple unnecessary renders and brings better performance, especially when working with large datasets or performing multiple field operations. -The field list can be displayed in two different formats to interact with pivot table. They are: +The field list can be displayed in two different formats to interact with the pivot table: -* **In-built Field List (Popup)**: To display the field list icon in pivot table UI to invoke the built-in dialog. -* **Stand-alone Field List (Fixed)**: To display the field list in a static position within a web page. +* **In-built Field List (Popup)**: Displays the field list icon in the pivot table UI to invoke the built-in dialog. +* **Stand-alone Field List (Fixed)**: Displays the field list in a static position within a web page. ## In-built Field List (Popup) -To enable deferred updates in the pivot table, set the property [AllowDeferLayoutUpdate](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SfPivotView-1.html#Syncfusion_Blazor_PivotView_SfPivotView_1_AllowDeferLayoutUpdate) in [SfPivotView](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SfPivotView-1.html) as **true**. To make a note, the defer update option can be controlled only via Field List during runtime. +To enable deferred updates in the pivot table, set the property [AllowDeferLayoutUpdate](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SfPivotView-1.html#Syncfusion_Blazor_PivotView_SfPivotView_1_AllowDeferLayoutUpdate) in [SfPivotView](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SfPivotView-1.html) to **true**. Note that the defer update option can be controlled only via Field List during runtime. ```cshtml @using Syncfusion.Blazor.PivotView -   -         -             -             -         -         -             -             -         -         + + + + + + + + + + -             -         -      -             -         -     + + + + + + @code{ @@ -51,18 +51,17 @@ To enable deferred updates in the pivot table, set the property [AllowDeferLayou //Bind the data source collection here. Refer "Assigning sample data to the pivot table" section in getting started for more details. } } - ``` ![Blazor PivotTable with Defer Layout Update](images/blazor-pivottable-defer-layout-update.png) ## Stand-alone Field List (Fixed) -The field list can be rendered in a static position, anywhere in a web page layout, like a separate component. To do so, you need to set [RenderMode](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SfPivotFieldList-1.html#Syncfusion_Blazor_PivotView_SfPivotFieldList_1_RenderMode) property to [Mode.Fixed](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.Mode.html) in [SfPivotFieldList](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SfPivotFieldList-1.html). +The field list can be rendered in a static position anywhere in the web page layout, functioning as a separate component. To achieve this, set the [RenderMode](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SfPivotFieldList-1.html#Syncfusion_Blazor_PivotView_SfPivotFieldList_1_RenderMode) property to [Mode.Fixed](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.Mode.html) in [SfPivotFieldList](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SfPivotFieldList-1.html). -To enable deferred updates in the static fieldlist, set the property [AllowDeferLayoutUpdate](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SfPivotFieldList-1.html#Syncfusion_Blazor_PivotView_SfPivotFieldList_1_AllowDeferLayoutUpdate) in [SfPivotFieldlist](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SfPivotFieldList-1.html) as **true**. To make a note, the defer update option can be controlled only via Field List during runtime. +To enable deferred updates in the static fieldlist, set the [AllowDeferLayoutUpdate](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SfPivotFieldList-1.html#Syncfusion_Blazor_PivotView_SfPivotFieldList_1_AllowDeferLayoutUpdate) property to **true** in [SfPivotFieldList](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SfPivotFieldList-1.html). Note that the defer update option can be controlled only via Field List during runtime. -N> To make field list interact with pivot table, you need to use the **UpdateViewAsync** and **UpdateAsync** methods for data source update in both field list and pivot table simultaneously. +N> To make the field list interact with the pivot table, use the **UpdateViewAsync** and **UpdateAsync** methods to synchronize data source updates between both the field list and pivot table components simultaneously. ```cshtml @@ -116,7 +115,6 @@ N> To make field list interact with pivot table, you need to use the **UpdateVie this.fieldList.UpdateViewAsync(this.pivotView); } } - ``` ![Blazor PivotTable with Defer Static Update](images/blazor-pivottable-defer-static-update.png) diff --git a/blazor/pivot-table/drill-down.md b/blazor/pivot-table/drill-down.md index 38aa17c35c..022af40f21 100644 --- a/blazor/pivot-table/drill-down.md +++ b/blazor/pivot-table/drill-down.md @@ -13,45 +13,45 @@ documentation: ug ## Drill down and drill up -The drill down and drill up action helps to view the bound data in detailed and abstract view respectively. By default, if member(s) has children, then expand and collapse icon will be displayed in the respective row/column header. On clicking the icon, expand or collapse action will be performed automatically through built-in source code. Meanwhile, leaf member(s) does not contain expand and collapse icon. +The drill-down and drill-up features in the Pivot Table component allow users to expand or collapse hierarchical data for detailed or summarized views. When a field member(s) contains child items, expand and collapse icons automatically appear in the corresponding row or column header. Clicking these icons expands the selected item to display its child members or collapses it to show a summarized view. If a field member(s) does not have any further levels to display, the icons will not appear. ![Drill down and drill up in the Blazor Pivot Table](images/blazor-pivottable-drill-down.png) ## Drill position -It allows to drill only the current position of the selected member and exclude the drilled data of the selected member in other positions. For example, if "FY 2015" and "FY 2016" have "Q1" member as child in next level, and when end user attempts to drill "Q1" under "FY 2016", only it will be expanded and not "Q1" under "FY 2015". +The drill-down and drill-up features allow you to expand or collapse data for a specific member in the Pivot Table without affecting the same member in other positions. For example, if both "FY 2015" and "FY 2016" have "Quarter 1" as a child in the next level, drilling down into "Quarter 1" under "FY 2015" will expand only that specific instance. The "Quarter 1" under "FY 2016" will remain unchanged. -N> This feature is built-in and occurs every time when expand or collapse action is done for better performance. +N> This feature is built-in and works automatically every time you expand or collapse data, making the pivot table faster and more efficient. ![Drill position in the Blazor Pivot Table](images/blazor-pivottable-custom-drill-position.png) -## Expand all +## Expand All N> This property is applicable only for the relational data source. -It allows to either expand or collapse all headers that are displayed in row and column axes. To display all headers in expanded state, set the property [ExpandAll](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html#Syncfusion_Blazor_PivotView_PivotViewDataSourceSettings_1_ExpandAll) to **true** and to collapse all headers, set the property [ExpandAll](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html#Syncfusion_Blazor_PivotView_PivotViewDataSourceSettings_1_ExpandAll) to **false**. By default, [ExpandAll](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html#Syncfusion_Blazor_PivotView_PivotViewDataSourceSettings_1_ExpandAll) property is set to **false**. +The Pivot Table component allows users to interactively expand or collapse all field members displayed in the row and column axes. To display all hierarchical members in an expanded state, set the [`ExpandAll`](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html#Syncfusion_Blazor_PivotView_PivotViewDataSourceSettings_1_ExpandAll) property of [PivotViewDataSourceSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html) to **true**. To collapse all headers, set this property to **false**. By default, [`ExpandAll`](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html#Syncfusion_Blazor_PivotView_PivotViewDataSourceSettings_1_ExpandAll) is set to **false**, so only the top-level field members are shown until the user expands them manually. ```cshtml @using Syncfusion.Blazor.PivotView -   -         -             -             -         -         -             -             -         -         + + + + + + + + + + -             -         -         -             -         -     + + + + + + @code{ @@ -68,31 +68,33 @@ It allows to either expand or collapse all headers that are displayed in row and ## Expand all headers for specific fields -N> This option is applicable only for the relational data source. +N> This property is applicable only for the relational data source. + +The Pivot Table provides an option to expand or collapse all headers for specific fields in the [`PivotViewRows`](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewRow.html) or [`PivotViewColumns`](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewColumn.html) axis. To expand all headers for a particular field, set the [`ExpandAll`](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotFieldOptions.html#Syncfusion_Blazor_PivotView_PivotFieldOptions_ExpandAll) property to **true** in the [`PivotViewRows`](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewRow.html) or [`PivotViewColumns`](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewColumn.html) axis. By default, the [`ExpandAll`](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotFieldOptions.html#Syncfusion_Blazor_PivotView_PivotFieldOptions_ExpandAll) property is set to **false**, meaning the headers are collapsed. -Allow to expand or collapse all headers for specific fields(only) in row and column axes. To expand headers for a specific field in row and column axes, set the property [ExpandAll](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotFieldOptions.html#Syncfusion_Blazor_PivotView_PivotFieldOptions_ExpandAll) in [PivotViewRow](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewRow.html) and [PivotViewColumn](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewColumn.html) to **true**. By default, [ExpandAll](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotFieldOptions.html#Syncfusion_Blazor_PivotView_PivotFieldOptions_ExpandAll) property in [PivotViewRow](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewRow.html) and [PivotViewColumn](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewColumn.html) is set to **false**. +The following code demonstrates how to configure a Pivot Table with the [`ExpandAll`](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotFieldOptions.html#Syncfusion_Blazor_PivotView_PivotFieldOptions_ExpandAll) property enabled for specific fields. In this example, all headers for the **Year** field in the columns and the **Country** field in the rows are expanded. ```cshtml @using Syncfusion.Blazor.PivotView -   -         -             -             -         -         -             -             -         -         + + + + + + + + + + -             -         -         -             -         -     + + + + + + @code{ @@ -103,7 +105,6 @@ Allow to expand or collapse all headers for specific fields(only) in row and col // Bind the data source collection here. Refer "Assigning sample data to the pivot table" section in getting started for more details. } } - ``` ![Expand all headers for specific fields in the Blazor Pivot Table](images/blazor-pivottable-expanded-specific-field-items.png) @@ -112,37 +113,37 @@ Allow to expand or collapse all headers for specific fields(only) in row and col N> This option is applicable only for the relational data source. -In addition to the previous topic, there is an enhancement to expand and collapse all headers except specific header(s). To achieve this, [PivotViewDrilledMember](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDrilledMember.html) class is used. The required properties of the [PivotViewDrilledMember](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDrilledMember.html) class are explained as follows: +The Pivot Table component supports expanding or collapsing all headers except for specific field members. This functionality allows users to selectively control which members in the fields are expanded or collapsed, making it easier to focus analysis on relevant data in the Pivot Table. The [`PivotViewDrilledMember`](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDrilledMember.html) property is used to configure this behavior. Its key properties include: -* [Name](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDrilledMember.html#Syncfusion_Blazor_PivotView_PivotViewDrilledMember_Name): It allows to set the field name whose member(s) needs to be specifically drilled. -* [Items](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDrilledMember.html#Syncfusion_Blazor_PivotView_PivotViewDrilledMember_Items): It allows to set the exact member(s) which needs to be drilled. +- [`Name`](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDrilledMember.html#Syncfusion_Blazor_PivotView_PivotViewDrilledMember_Name): Specifies the field name whose members should remain expanded or collapsed. +- [`Items`](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDrilledMember.html#Syncfusion_Blazor_PivotView_PivotViewDrilledMember_Items): Lists the exact field members to expand or collapse. -N> The [PivotViewDrilledMember](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDrilledMember.html) option always works in vice-versa with respect to the property [ExpandAll](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html#Syncfusion_Blazor_PivotView_PivotViewDataSourceSettings_1_ExpandAll) in pivot table. For example, if [ExpandAll](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html#Syncfusion_Blazor_PivotView_PivotViewDataSourceSettings_1_ExpandAll) is set to **true**, then the member(s) added in [Items](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDrilledMember.html#Syncfusion_Blazor_PivotView_PivotViewDrilledMember_Items) collection alone will be in collapsed state. +The following example demonstrates how to configure a Pivot Table where all headers are expanded except for the **France** member in the **Country** field, which remains collapsed. ```cshtml @using Syncfusion.Blazor.PivotView -   -         -             -             -         -         -             -             -         -         + + + + + + + + + + -             -         -         -             -         + + + + + -             -         -     + + + @code{ @@ -153,18 +154,19 @@ N> The [PivotViewDrilledMember](https://help.syncfusion.com/cr/blazor/Syncfusion //Bind the data source collection here. Refer "Assigning sample data to the pivot table" section in getting started for more details. } } - ``` ![Expand all except specific members in the Blazor Pivot Table](images/blazor-pivottable-expandall-except-specific-items.png) -## Expand specific member(s) +## Expand or Collapse Specific Members + +The Pivot Table component enables users to programmatically expand or collapse specific members in any field placed under the row or column axes. This can be achieved using the [`PivotViewDrilledMember`](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDrilledMember.html) property. The following properties of [`PivotViewDrilledMember`](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDrilledMember.html) are described below: -End user can also manually expand or collapse specific member(s) in each fields under row and column axes using the [PivotViewDrilledMember](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDrilledMember.html) class from the code behind. The required properties of the [PivotViewDrilledMember](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDrilledMember.html) class are explained as follows: +* [`Name`](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDrilledMember.html#Syncfusion_Blazor_PivotView_PivotViewDrilledMember_Name): Specifies the field name whose members should be expanded or collapsed. +* [`Items`](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDrilledMember.html#Syncfusion_Blazor_PivotView_PivotViewDrilledMember_Items): Defines the exact members to be expanded or collapsed within the specified field. +* [`Delimiter`](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDrilledMember.html#Syncfusion_Blazor_PivotView_PivotViewDrilledMember_Delimiter): Sets the character used to separate a child member from its parent when specifying hierarchical members. -* [Name](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDrilledMember.html#Syncfusion_Blazor_PivotView_PivotViewDrilledMember_Name): It allows to set the field name whose member(s) needs to be specifically drilled. -* [Items](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDrilledMember.html#Syncfusion_Blazor_PivotView_PivotViewDrilledMember_Items): It allows to set the exact member(s) which needs to be drilled. -* [Delimiter](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDrilledMember.html#Syncfusion_Blazor_PivotView_PivotViewDrilledMember_Delimiter): It allows to separate next level of member from its parent member. +The following code demonstrates how to configure the Pivot Table to expand specific members by using the [`PivotViewDrilledMember`](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDrilledMember.html) property. In this example, the **FY 2015** and **FY 2016** members in the **Year** field, and the **Q1** member under **FY 2015** in the **Quarter** field, are expanded, while other members remain collapsed. ```cshtml @using Syncfusion.Blazor.PivotView @@ -209,42 +211,41 @@ End user can also manually expand or collapse specific member(s) in each fields ### OnActionBegin -The event [OnActionBegin](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewEvents-1.html#Syncfusion_Blazor_PivotView_PivotViewEvents_1_OnActionBegin) triggers when the UI actions such as drill down and drill up begin. This allows user to identify the current action being performed at runtime. It has the following parameters: - -* [DataSourceSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotActionBeginEventArgs.html#Syncfusion_Blazor_PivotView_PivotActionBeginEventArgs_DataSourceSettings): It holds the current data source settings such as input data source, rows, columns, values, filters, format settings and so on. +The [`OnActionBegin`](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewEvents-1.html#Syncfusion_Blazor_PivotView_PivotViewEvents_1_OnActionBegin) event triggers when a user starts a UI action, such as drilling down (expanding) or drilling up (collapsing) data in the pivot table. This event helps you track the action being performed and customize its behavior. It includes the following parameters: -* [ActionName](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotActionBeginEventArgs.html#Syncfusion_Blazor_PivotView_PivotActionBeginEventArgs_ActionName): It holds the name of the current action began. The following are the UI actions and their names: +- [`DataSourceSettings`](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotActionBeginEventArgs.html#Syncfusion_Blazor_PivotView_PivotActionBeginEventArgs_DataSourceSettings): Contains the current pivot table report settings, including the data source, rows, columns, values, filters, and format settings. +- [`ActionName`](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotActionBeginEventArgs.html#Syncfusion_Blazor_PivotView_PivotActionBeginEventArgs_ActionName): Indicates the name of the action being performed. The table below lists the UI actions and their corresponding names: | Action | Action Name| |----------------|---------------| | [Expand](./drill-down#drill-down-and-drill-up)| Drill down| | [Collapse](./drill-down#drill-down-and-drill-up)| Drill up| -* [Cancel](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotActionBeginEventArgs.html#Syncfusion_Blazor_PivotView_PivotActionBeginEventArgs_Cancel): It allows user to restrict the current action. +- [`Cancel`](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotActionBeginEventArgs.html#Syncfusion_Blazor_PivotView_PivotActionBeginEventArgs_Cancel): Allows you to block the current action by setting it to `true`. -In the following example, drill down and drill up action can be restricted by setting the **args.Cancel** option to **true** in the `OnActionBegin` event. +In the below sample, drill down and drill up action can be restricted by setting the **args.Cancel** option to **true** in the [`OnActionBegin`](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewEvents-1.html#Syncfusion_Blazor_PivotView_PivotViewEvents_1_OnActionBegin) event. ```cshtml @using Syncfusion.Blazor.PivotView -   -         -             -             -         -         -             -             -         -         + + + + + + + + + + -             -         -         -             -         -     + + + + + + @@ -265,20 +266,21 @@ In the following example, drill down and drill up action can be restricted by se } } ``` + ### OnActionComplete -The event [OnActionComplete](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewEvents-1.html#Syncfusion_Blazor_PivotView_PivotViewEvents_1_OnActionComplete) triggers when a UI action such as drill down or drill up, is completed. This allows user to identify the current UI action being completed at runtime. It has the following parameters: +The event [`OnActionComplete`](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewEvents-1.html#Syncfusion_Blazor_PivotView_PivotViewEvents_1_OnActionComplete) triggers when a UI action such as drill down or drill up, is completed. This allows user to identify the current UI actions being completed at runtime. It has the following parameters: -* [DataSourceSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotActionCompleteEventArgs-1.html#Syncfusion_Blazor_PivotView_PivotActionCompleteEventArgs_1_DataSourceSettings): It holds the current data source settings such as input data source, rows, columns, values, filters, format settings and so on. +* [`DataSourceSettings`](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotActionCompleteEventArgs-1.html#Syncfusion_Blazor_PivotView_PivotActionCompleteEventArgs_1_DataSourceSettings): It holds the current data source settings such as input data source, rows, columns, values, filters, format settings and so on. -* [ActionName](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotActionCompleteEventArgs-1.html#Syncfusion_Blazor_PivotView_PivotActionCompleteEventArgs_1_ActionName): It holds the name of the current action completed. The following are the UI actions and their names: +* [`ActionName`](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotActionCompleteEventArgs-1.html#Syncfusion_Blazor_PivotView_PivotActionCompleteEventArgs_1_ActionName): It holds the name of the current action completed. The following are the UI actions and their names: | Action | Action Name| |----------------|---------------| | [Expand](./drill-down#drill-down-and-drill-up)| Drill down| | [Collapse](./drill-down#drill-down-and-drill-up)| Drill up| -* [ActionInfo](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotActionCompleteEventArgs-1.html#Syncfusion_Blazor_PivotView_PivotActionCompleteEventArgs_1_ActionInfo): It holds the unique information about the current UI action. For example, if drill down action is completed, the event argument contains information such as field name and the drill information. +* [`ActionInfo`](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotActionCompleteEventArgs-1.html#Syncfusion_Blazor_PivotView_PivotActionCompleteEventArgs_1_ActionInfo): It holds the unique information about the current UI action. For example, if drill down action is completed, the event argument contains information such as field name and the drill information. ```cshtml @using Syncfusion.Blazor.PivotView @@ -320,40 +322,41 @@ The event [OnActionComplete](https://help.syncfusion.com/cr/blazor/Syncfusion.Bl } } ``` + ### OnActionFailure -The event [OnActionFailure](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewEvents-1.html#Syncfusion_Blazor_PivotView_PivotViewEvents_1_OnActionFailure) triggers when the current UI action fails to achieve the desired result. It has the following parameters: +The [`OnActionFailure`](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewEvents-1.html#Syncfusion_Blazor_PivotView_PivotViewEvents_1_OnActionFailure) event is triggered when a UI action does not produce the expected result. It provides details about the failure through the following parameters: -* [ActionName](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotActionFailureEventArgs.html#Syncfusion_Blazor_PivotView_PivotActionFailureEventArgs_ActionName): It holds the name of the current action failed. The following are the UI actions and their names: +* [`ActionName`](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotActionFailureEventArgs.html#Syncfusion_Blazor_PivotView_PivotActionFailureEventArgs_ActionName): The name of the action that failed. The table below lists the UI actions and their corresponding names: | Action | Action Name| |----------------|---------------| | [Expand](./drill-down#drill-down-and-drill-up) | Drill down | | [Collapse](./drill-down#drill-down-and-drill-up)| Drill up | -* [ErrorInfo](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotActionFailureEventArgs.html#Syncfusion_Blazor_PivotView_PivotActionFailureEventArgs_ErrorInfo): It holds the error information of the current UI action. +* [`ErrorInfo`](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotActionFailureEventArgs.html#Syncfusion_Blazor_PivotView_PivotActionFailureEventArgs_ErrorInfo): Contains details about the error that caused the action to fail. ```cshtml @using Syncfusion.Blazor.PivotView -   -         -             -             -         -         -             -             -         -         + + + + + + + + + + -             -         -         -             -         -     + + + + + + diff --git a/blazor/pivot-table/drill-through.md b/blazor/pivot-table/drill-through.md index a6f8e84615..a3e7058b76 100644 --- a/blazor/pivot-table/drill-through.md +++ b/blazor/pivot-table/drill-through.md @@ -9,7 +9,7 @@ documentation: ug # Drill Through in Blazor Pivot Table Component -It allows to view the underlying raw data of a summarized cell in the pivot table. It can be enabled by setting the [AllowDrillThrough](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SfPivotView-1.html#Syncfusion_Blazor_PivotView_SfPivotView_1_AllowDrillThrough) property to **true**. By double-clicking on any value cell, user can view the detailed raw data in a data grid inside a new window. In the new window, row header, column header and measure name of the clicked cell will be shown at the top. Also, the user can include or exclude fields available in the data grid using column chooser option. +The drill-through feature in the Pivot Table component allows users to view the raw, unaggregated data behind any aggregated cell in the pivot table. To enable this feature, set the [AllowDrillThrough](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SfPivotView-1.html#Syncfusion_Blazor_PivotView_SfPivotView_1_AllowDrillThrough) property to **true**. By double-clicking an aggregated cell, users can view its detailed raw data in a data grid displayed in a new window. The new window shows the row header, column header, and measure name of the selected cell at the top. Additionally, users can include or exclude fields available in the data grid using the column chooser option. ```cshtml @using Syncfusion.Blazor.PivotView @@ -48,7 +48,7 @@ It allows to view the underlying raw data of a summarized cell in the pivot tabl
![After Drill Through in Blazor PivotTable](images/blazor-pivottable-after-drillthrough.png) -Users can also view the underlying raw data though the pivot chart. By clicking on any data point, user can view the detailed raw data in a data grid inside a new window. +Users can also access drill-through data through the pivot chart. By clicking on any data point in the pivot chart, they can view the raw data in a data grid displayed in a new window. ```cshtml @using Syncfusion.Blazor.PivotView @@ -85,7 +85,6 @@ Users can also view the underlying raw data though the pivot chart. By clicking //Bind the data source collection here. Refer "Assigning sample data to the pivot table" section in getting started for more details. } } - ``` ![Before Drill Through in Blazor PivotChart](images/blazor-pivotchart-before-drillthrough.png) @@ -95,12 +94,11 @@ Users can also view the underlying raw data though the pivot chart. By clicking ## Maximum rows to retrieve -N> This property is applicable only for OLAP data sources. +N> This property is applicable only for the OLAP data source. -The [MaxRowsInDrillThrough](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewModel-1.html#Syncfusion_Blazor_PivotView_PivotViewModel_1_MaxRowsInDrillThrough) property allows to specify the maximum number of raw data to be returned during the drill through process. By default, this property is set to **"10000"** meaning that if you do not specify this property, you will get 10,000 or less raw data. +The [MaxRowsInDrillThrough](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewModel-1.html#Syncfusion_Blazor_PivotView_PivotViewModel_1_MaxRowsInDrillThrough) property specifies the maximum number of rows to be returned during a drill-through operation. By default, this property is set to **"10000"**, meaning that if it is not explicitly defined, up to 10,000 rows will be returned. ```cshtml - @using Syncfusion.Blazor.PivotView @@ -135,7 +133,6 @@ The [MaxRowsInDrillThrough](https://help.syncfusion.com/cr/blazor/Syncfusion.Bla public string Quarter { get; set; } } } - ``` ![Blazor PivotTable with Maximum Rows](images/blazor-pivottable-maximum-rows.png) diff --git a/blazor/pivot-table/editing.md b/blazor/pivot-table/editing.md index ab15ec7ea3..d873021e4e 100644 --- a/blazor/pivot-table/editing.md +++ b/blazor/pivot-table/editing.md @@ -9,14 +9,21 @@ documentation: ug # Editing in Blazor Pivot Table Component -N> This feature is applicable only for relational data source. +N> This feature is applicable only for the relational data source. -Cell edit allows to add, delete, or update the raw items of any value cell from the pivot table. The raw items can be viewed in a data grid inside a new window on double-clicking the appropriate value cell. In the data grid, CRUD operations can be performed by double-clicking the cells or using toolbar options. Once user finishes editing raw items, aggregation will be performed for the updated values in pivot table component immediately. This support can be enabled by setting the [AllowEditing](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewCellEditSettings.html#Syncfusion_Blazor_PivotView_PivotViewCellEditSettings_AllowEditing) property in [PivotViewCellEditSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewCellEditSettings.html) class to **true**. +The cell editing option allows users to directly change data in the pivot table by adding, updating, or deleting raw data items within any value cell. When you double-click a value cell, the raw items appear in a data grid within a new window. In this data grid, you can perform CRUD operations by double-clicking cells or using toolbar options. After you finish editing the raw items, the pivot table automatically updates the aggregated values. To enable this option, set the [AllowEditing](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewCellEditSettings.html#Syncfusion_Blazor_PivotView_PivotViewCellEditSettings_AllowEditing) property in [PivotViewCellEditSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewCellEditSettings.html) class to **true**. -To learn about how to work with **Editing** options in the Blazor Pivot Table, you can check on this video: +The [PivotViewCellEditSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewCellEditSettings.html) class provides comprehensive control over editing behavior through the following options: -{% youtube -"youtube:https://www.youtube.com/watch?v=bnOn_L6dPY4"%} +* [AllowAdding](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewCellEditSettings.html#Syncfusion_Blazor_PivotView_PivotViewCellEditSettings_AllowAdding): Enables adding new rows to the data grid. +* [AllowEditing](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewCellEditSettings.html#Syncfusion_Blazor_PivotView_PivotViewCellEditSettings_AllowEditing): Allows editing existing records in the data grid. +* [AllowDeleting](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewCellEditSettings.html#Syncfusion_Blazor_PivotView_PivotViewCellEditSettings_AllowDeleting): Enables deleting records directly from the data grid. +* [AllowCommandColumns](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewCellEditSettings.html#Syncfusion_Blazor_PivotView_PivotViewCellEditSettings_AllowCommandColumns): Displays built-in command buttons (edit, delete, save, cancel) in the data grid. +* [Mode](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewCellEditSettings.html#Syncfusion_Blazor_PivotView_PivotViewCellEditSettings_Mode): Sets the editing mode. +* [AllowEditOnDblClick](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewCellEditSettings.html#Syncfusion_Blazor_PivotView_PivotViewCellEditSettings_AllowEditOnDblClick): Enables users to start editing a cell by double-clicking it. +* [ShowConfirmDialog](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewCellEditSettings.html#Syncfusion_Blazor_PivotView_PivotViewCellEditSettings_ShowConfirmDialog): Shows a confirmation dialog before saving changes. +* [ShowDeleteConfirmDialog](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewCellEditSettings.html#Syncfusion_Blazor_PivotView_PivotViewCellEditSettings_ShowDeleteConfirmDialog): Shows a confirmation dialog before deleting a record. +* [AllowInlineEditing](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewCellEditSettings.html#Syncfusion_Blazor_PivotView_PivotViewCellEditSettings_AllowInlineEditing): Allows users to edit content directly in the cell. The CRUD operations available in the data grid toolbar and command column are: @@ -35,9 +42,13 @@ The following are the supported edit types in the data grid: * Batch * Command Columns +To learn about how to work with Editing options, you can check on this video for Blazor Pivot Table. + +{% youtube "https://www.youtube.com/watch?v=bnOn_L6dPY4" %} + ## Normal -In normal edit mode, when user starts editing, the state of the currently selected row alone will be completely changed to edit state. User can change the cell values and save it to the data source by clicking "Update" toolbar button. To enable the normal edit, set the [Mode](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewCellEditSettings.html#Syncfusion_Blazor_PivotView_PivotViewCellEditSettings_Mode) property in [PivotViewCellEditSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewCellEditSettings.html) class to [EditMode.Normal](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.EditMode.html#Syncfusion_Blazor_PivotView_EditMode_Normal). +Normal edit mode allows users to edit one row at a time in the editing dialog with simple data changes and updates. In normal edit mode, when editing begins, the selected row changes to edit state. Cell values can be modified and saved to the data source by clicking the "Update" toolbar button. To enable normal edit mode, set the [Mode](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewCellEditSettings.html#Syncfusion_Blazor_PivotView_PivotViewCellEditSettings_Mode) property in [PivotViewCellEditSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewCellEditSettings.html) class to [EditMode.Normal](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.EditMode.html#Syncfusion_Blazor_PivotView_EditMode_Normal). N> The normal edit mode [EditMode.Normal](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.EditMode.html#Syncfusion_Blazor_PivotView_EditMode_Normal) is set as the default mode for editing. @@ -72,14 +83,13 @@ N> The normal edit mode [EditMode.Normal](https://help.syncfusion.com/cr/blazor/ //Bind the data source collection here. Refer "Assigning sample data to the pivot table" section in getting started for more details. } } - ``` ![Normal Editing in Blazor PivotTable](images/blazor-pivottable-normal-editing.png) ## Dialog -In dialog edit mode, when user starts editing, the currently selected row data will be shown in an exclusive dialog. User can change cell values and save it to the data source by clicking "Save" button in the dialog. To enable the dialog edit, set the [Mode](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewCellEditSettings.html#Syncfusion_Blazor_PivotView_PivotViewCellEditSettings_Mode) property in [PivotViewCellEditSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewCellEditSettings.html) class to [EditMode.Dialog](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.EditMode.html#Syncfusion_Blazor_PivotView_EditMode_Dialog). +The dialog edit mode provides a focused editing environment by displaying the selected row data in an exclusive dialog window, ensuring clear visibility and controlled data modification. In dialog edit mode, when editing begins, the currently selected row data appears in a dedicated dialog. Cell values can be modified and saved to the data source by clicking the "Save" button in the dialog. To enable dialog editing, set the [Mode](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewCellEditSettings.html#Syncfusion_Blazor_PivotView_PivotViewCellEditSettings_Mode) property in [PivotViewCellEditSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewCellEditSettings.html) class to [EditMode.Dialog](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.EditMode.html#Syncfusion_Blazor_PivotView_EditMode_Dialog). ```cshtml @using Syncfusion.Blazor.PivotView @@ -112,14 +122,13 @@ In dialog edit mode, when user starts editing, the currently selected row data w //Bind the data source collection here. Refer "Assigning sample data to the pivot table" section in getting started for more details. } } - ``` -![Dialog Editing in Blaozr PivotTable](images/blazor-pivottable-dialog-editing.png) +![Dialog Editing in Blazor PivotTable](images/blazor-pivottable-dialog-editing.png) ## Batch -In batch edit mode, when user double-clicks any data grid cell, the state of target cell is changed to edit state. User can perform bulk changes and finally save (added, changed, and deleted data in the single request) to the data source by clicking "Update" toolbar button. To enable the batch edit, set the [Mode](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewCellEditSettings.html#Syncfusion_Blazor_PivotView_PivotViewCellEditSettings_Mode) property in [PivotViewCellEditSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewCellEditSettings.html) class to [EditMode.Batch](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.EditMode.html#Syncfusion_Blazor_PivotView_EditMode_Batch). +Batch editing enables users to make multiple changes to data grid cells and save them all at once, improving efficiency for bulk updates. When a user double-clicks any data grid cell in batch mode, the target cell changes to edit state. Users can perform multiple changes and save all modifications (added, changed, and deleted data) to the data source by clicking the **Update** toolbar button. To enable batch editing, set the [Mode](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewCellEditSettings.html#Syncfusion_Blazor_PivotView_PivotViewCellEditSettings_Mode) property in [PivotViewCellEditSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewCellEditSettings.html) class to [EditMode.Batch](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.EditMode.html#Syncfusion_Blazor_PivotView_EditMode_Batch). ```cshtml @using Syncfusion.Blazor.PivotView @@ -152,14 +161,26 @@ In batch edit mode, when user double-clicks any data grid cell, the state of tar //Bind the data source collection here. Refer "Assigning sample data to the pivot table" section in getting started for more details. } } - ``` ![Batch Editing in Blazor PivotTable](images/blazor-pivottable-batch-editing.png) ## Command column -An additional column appended in the data grid layout holds the command buttons to perform the CRUD operation. To enable the command columns, set the [AllowCommandColumns](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewCellEditSettings.html#Syncfusion_Blazor_PivotView_PivotViewCellEditSettings_AllowCommandColumns) property in [PivotViewCellEditSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewCellEditSettings.html) class to **true**. +The command column option provides dedicated action buttons within the data grid for streamlined CRUD operations as an alternative to using toolbar options. An additional column appears in the data grid layout containing command buttons to perform the CRUD operations. To enable the command columns, set the [AllowCommandColumns](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewCellEditSettings.html#Syncfusion_Blazor_PivotView_PivotViewCellEditSettings_AllowCommandColumns) property in [PivotViewCellEditSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewCellEditSettings.html) class to **true**. + +The available built-in command buttons are: + +| Command Button | Actions | +|----------------|---------| +| Edit | Edit the current row.| +| Delete | Delete the current row.| +| Save | Update the edited row.| +| Cancel | Cancel the edited state. | + +N> +- When the command column option is enabled, the Edit, Delete, Update, and Cancel buttons are not shown in the Data Grid's toolbar. Instead, these action buttons appear in the last column of each row within the Data Grid. +- To delete a record directly from the data grid using the **Delete** action button in the command column, you need to set the [AllowDeleting](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewCellEditSettings.html#Syncfusion_Blazor_PivotView_PivotViewCellEditSettings_AllowDeleting) property to **true**. ```cshtml @using Syncfusion.Blazor.PivotView @@ -192,14 +213,13 @@ An additional column appended in the data grid layout holds the command buttons //Bind the data source collection here. Refer "Assigning sample data to the pivot table" section in getting started for more details. } } - ``` ![Command Editing in Blazor PivotTable](images/blazor-pivottable-command-editing.png) ## Inline Editing -It allows editing of a value cell directly without the use of an external edit dialog. It is applicable if and only if a single raw data is used for the value of the cell. It is applicable to all editing modes, such as normal, batch, dialog and column commands. It can be enabled by setting the `AllowInlineEditing` property in `PivotViewCellEditSettings` to `true`. +The inline editing option provides streamlined data modification by allowing direct editing of value cells without opening an external dialog, improving workflow efficiency for quick data updates. This editing mode applies only when a single raw data item corresponds to the value of the cell and works with all editing modes including normal, batch, dialog, and column commands. Enable inline editing by setting the [AllowInlineEditing](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewCellEditSettings.html#Syncfusion_Blazor_PivotView_PivotViewCellEditSettings_AllowInlineEditing) property in [PivotViewCellEditSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewCellEditSettings.html) to **true**. ```cshtml @using Syncfusion.Blazor.PivotView @@ -232,14 +252,15 @@ It allows editing of a value cell directly without the use of an external edit d //Bind the data source collection here. Refer "Assigning sample data to the pivot table" section in getting started for more details. } } - ``` ![Inline Editing in Blazor PivotTable](images/blazor-pivottable-inline-editing.png) ## Editing using the pivot chart -Users can also add, delete, or update the underlying raw items of any data point via pivot chart. The raw items will be shown in the data grid in the new window by clicking the appropriate data point. Then you can edit the raw items as mentioned above by any of the edit types (normal, dialog, batch and command column). +Pivot chart editing provides an alternative way to conveniently update, add, or remove underlying data associated with any chart data point. This empowers users to perform CRUD (Create, Read, Update, Delete) operations on the underlying raw items linked to visualized data points for enhanced analysis. + +Clicking a data point in the pivot chart displays the underlying raw items in a data grid within a popup window. Users can then add, update, or delete these items using any of the supported edit types (normal, dialog, batch, or command column), following the same steps as for pivot table cells. ```cshtml @using Syncfusion.Blazor.PivotView @@ -277,7 +298,6 @@ Users can also add, delete, or update the underlying raw items of any data point //Bind the data source collection here. Refer "Assigning sample data to the pivot table" section in getting started for more details. } } - ``` ![Before Editing in Blazor PivotChart](images/blazor-pivotchart-before-drillthrough.png) @@ -289,80 +309,76 @@ Users can also add, delete, or update the underlying raw items of any data point ### EditCompleted -The event [`EditCompleted`](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewEvents-1.html#Syncfusion_Blazor_PivotView_PivotViewEvents_1_EditCompleted) triggers when values cells are edited completely. The event provides edited cell(s) information along with its previous cell value. It also helps to do the CRUD operation by manually updating the database which is connected to the component. It has the following parameters. +The event [EditCompleted](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewEvents-1.html#Syncfusion_Blazor_PivotView_PivotViewEvents_1_EditCompleted) triggers when values cells are edited completely. The event provides edited cell(s) information along with its previous cell value. It also helps to do the CRUD operation by manually updating the database which is connected to the component. It has the following parameters: -* `AddedData` - It holds the newly added raw data of the current edited cell which is used to add them in the datasource. - -* `ModifiedData` - It holds the modified raw data of the current edited cell as well as their current index, which is used to identify and update them in the datasource. - -* `RemovedData` - It holds the current edited cell's removed raw data as well as their current index, which is used to identify and remove them from the datasource. - -* `Cancel` - It is a boolean property and if it is set as **true**, the editing won’t be reflected in the pivot table. +* [AddedData](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.EditCompletedEventArgs-1.html#Syncfusion_Blazor_PivotView_EditCompletedEventArgs_1_AddedData) - It holds the newly added raw data of the current edited cell which is used to add them in the datasource. +* [ModifiedData](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.EditCompletedEventArgs-1.html#Syncfusion_Blazor_PivotView_EditCompletedEventArgs_1_ModifiedData) - It holds the modified raw data of the current edited cell as well as their current index, which is used to identify and update them in the datasource. +* [RemovedData](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.EditCompletedEventArgs-1.html#Syncfusion_Blazor_PivotView_EditCompletedEventArgs_1_RemovedData) - It holds the current edited cell's removed raw data as well as their current index, which is used to identify and remove them from the datasource. +* [Cancel](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.EditCompletedEventArgs-1.html#Syncfusion_Blazor_PivotView_EditCompletedEventArgs_1_Cancel) - It is a boolean property and if it is set as **true**, the editing won’t be reflected in the pivot table. ```cshtml @using Syncfusion.Blazor.PivotView - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + @code { - private List data { get; set; } - protected override void OnInitialized() - { - data = ProductDetails.GetProductData().ToList(); - //Bind the data source collection here. Refer "Assigning sample data to the pivot table" section in getting started for more details. - } - private void EditCompleted(EditCompletedEventArgs args) - { - // Here you can obtain all the newly added raw data for the current edited cell which is used to add them in the datasource. - List addedData = args.AddedData; - - // Here you can obtain all the modified raw data of the current edited cell as well as their current index, which is used to identify and update them in the datasource. - Dictionary modifiedData = args.ModifiedData; - - // Here you can obtain the current edited cell's all the removed raw data as well as their current index, which is used to identify and remove them from the datasource. - Dictionary removeData = args.RemovedData; - } + private List data { get; set; } + protected override void OnInitialized() + { + data = ProductDetails.GetProductData().ToList(); + //Bind the data source collection here. Refer "Assigning sample data to the pivot table" section in getting started for more details. + } + private void EditCompleted(EditCompletedEventArgs args) + { + // Here you can obtain all the newly added raw data for the current edited cell which is used to add them in the datasource. + List addedData = args.AddedData; + + // Here you can obtain all the modified raw data of the current edited cell as well as their current index, which is used to identify and update them in the datasource. + Dictionary modifiedData = args.ModifiedData; + + // Here you can obtain the current edited cell's all the removed raw data as well as their current index, which is used to identify and remove them from the datasource. + Dictionary removeData = args.RemovedData; + } } ``` ### OnActionBegin -The event [OnActionBegin](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewEvents-1.html#Syncfusion_Blazor_PivotView_PivotViewEvents_1_OnActionBegin) triggers when the UI actions such as CRUD operations (via dialog) and inline editing begin. This allows user to identify the current action being performed at runtime. It has the following parameters: +The event [OnActionBegin](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewEvents-1.html#Syncfusion_Blazor_PivotView_PivotViewEvents_1_OnActionBegin) triggers when editing actions such as add, edit, save, or delete are started through the UI (either by dialog or inline editing). This event lets users monitor the editing workflow and take action before the operation completes. The following parameters are available in the event: -* [DataSourceSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotActionBeginEventArgs.html#Syncfusion_Blazor_PivotView_PivotActionBeginEventArgs_DataSourceSettings) : It holds the current data source settings such as input data source, rows, columns, values, filters, format settings and so on. +* [DataSourceSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotActionBeginEventArgs.html#Syncfusion_Blazor_PivotView_PivotActionBeginEventArgs_DataSourceSettings): Contains the current data source settings, including all input data, rows, columns, values, filters, and format settings. +* [ActionName](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotActionBeginEventArgs.html#Syncfusion_Blazor_PivotView_PivotActionBeginEventArgs_ActionName): Shows the name of the editing action that has started. The following are the UI actions and their names: -* [ActionName](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotActionBeginEventArgs.html#Syncfusion_Blazor_PivotView_PivotActionBeginEventArgs_ActionName): It holds the name of the current action began. The following are the UI actions and their names: + | Action | Action Name| + |--------|-------------| + | Editing| Edit record| + | Save| Save edited records| + | Add| Add new record| + | Delete| Remove record| -| Action | Action Name| -|----------------|-------------| -| Editing| Edit record| -| Save| Save edited records| -| Add| Add new record| -| Delete| Remove record| +* [Cancel](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotActionBeginEventArgs.html#Syncfusion_Blazor_PivotView_PivotActionBeginEventArgs_Cancel): Allows users to stop (cancel) the action by setting this option to **true**. -* [Cancel](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotActionBeginEventArgs.html#Syncfusion_Blazor_PivotView_PivotActionBeginEventArgs_Cancel): It allows user to restrict the current action. - -In the following example, editing actions such as add and save can be restricted by setting the **args.Cancel** option to **true** in the `OnActionBegin` event. +In the following example, editing actions such as add and save can be restricted by setting the **args.Cancel** option to **true** in the [OnActionBegin](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewEvents-1.html#Syncfusion_Blazor_PivotView_PivotViewEvents_1_OnActionBegin) event. ```cshtml @using Syncfusion.Blazor.PivotView @@ -399,29 +415,29 @@ In the following example, editing actions such as add and save can be restricted // Triggers when the UI action begins. public void ActionBegin(PivotActionBeginEventArgs args) { - if(args.ActionName == "Add new record" && args.ActionName == "Save edited records") + if(args.ActionName == "Add new record" || args.ActionName == "Save edited records") { args.Cancel = true; } } } ``` -### OnActionComplete -The event [OnActionComplete](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewEvents-1.html#Syncfusion_Blazor_PivotView_PivotViewEvents_1_OnActionComplete) triggers when the UI action such as CRUD operations (via dialog) or inline editing, is completed. This allows user to identify the current UI action being completed at runtime. It has the following parameters: +### OnActionComplete -* [DataSourceSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotActionCompleteEventArgs-1.html#Syncfusion_Blazor_PivotView_PivotActionCompleteEventArgs_1_DataSourceSettings): It holds the current data source settings such as input data source, rows, columns, values, filters, format settings and so on. +The event [OnActionComplete](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewEvents-1.html#Syncfusion_Blazor_PivotView_PivotViewEvents_1_OnActionComplete) triggers whenever a UI action, such as add, update, remove, or save (using dialog or inline editing), is finished. This lets users know exactly what kind of action has just been completed. The event provides the following details: +* [DataSourceSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotActionCompleteEventArgs-1.html#Syncfusion_Blazor_PivotView_PivotActionCompleteEventArgs_1_DataSourceSettings): Contains the current data source settings, including input data, rows, columns, values, filters, format settings, and more. * [ActionName](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotActionCompleteEventArgs-1.html#Syncfusion_Blazor_PivotView_PivotActionCompleteEventArgs_1_ActionName): It holds the name of the current action completed. The following are the UI actions and their names: -| Action | Action Name| -|----------------|-------------| -| Save| Edited records saved| -| Add| New record added| -| Delete| Record removed | -| Update| Records updated| + | Action | Action Name| + |--------|-------------| + | Save| Edited records saved| + | Add| New record added| + | Delete| Record removed| + | Update| Records updated| -* [ActionInfo](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotActionCompleteEventArgs-1.html#Syncfusion_Blazor_PivotView_PivotActionCompleteEventArgs_1_ActionInfo): It holds the unique information about the current UI action. For example, if save action is completed, the event argument contains information such as mode of editing and saved records. +* [ActionInfo](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotActionCompleteEventArgs-1.html#Syncfusion_Blazor_PivotView_PivotActionCompleteEventArgs_1_ActionInfo): It holds the unique information about the current UI action. For example, if save action is completed, the event argument contains information such as mode of editing and saved records. ```cshtml @using Syncfusion.Blazor.PivotView @@ -457,25 +473,26 @@ The event [OnActionComplete](https://help.syncfusion.com/cr/blazor/Syncfusion.Bl } public void ActionComplete(PivotActionCompleteEventArgs args) { - if(args.ActionName == "New record added" && args.ActionName == "Edited records saved") + if(args.ActionName == "New record added" || args.ActionName == "Edited records saved") { // Triggers when the editing UI actions such as add and edit are completed. } } } ``` + ### OnActionFailure The event [OnActionFailure](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewEvents-1.html#Syncfusion_Blazor_PivotView_PivotViewEvents_1_OnActionFailure) triggers when the current UI action fails to achieve the desired result. It has the following parameters: * [ActionName](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotActionFailureEventArgs.html#Syncfusion_Blazor_PivotView_PivotActionFailureEventArgs_ActionName): It holds the name of the current action failed. The following are the UI actions and their names: -| Action | Action Name| -|----------------|-------------| -| Editing| Edit record| -| Save| Save edited records| -| Add| Add new record| -| Delete| Remove record| + | Action | Action Name| + |--------|-------------| + | Editing| Edit record| + | Save| Save edited records| + | Add| Add new record| + | Delete| Remove record| * [ErrorInfo](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotActionFailureEventArgs.html#Syncfusion_Blazor_PivotView_PivotActionFailureEventArgs_ErrorInfo): It holds the error information of the current UI action. @@ -525,7 +542,7 @@ The event [OnActionFailure](https://help.syncfusion.com/cr/blazor/Syncfusion.Bla } public void ActionFailure(PivotActionFailureEventArgs args) { - if(args.ActionName == "Add new record" && args.ActionName == "Edit record") + if(args.ActionName == "Add new record" || args.ActionName == "Edit record") { // Triggers when the current UI action fails to achieve the desired result. } diff --git a/blazor/pivot-table/excel-export.md b/blazor/pivot-table/excel-export.md index d10ed0e596..9364fcb060 100644 --- a/blazor/pivot-table/excel-export.md +++ b/blazor/pivot-table/excel-export.md @@ -9,16 +9,16 @@ documentation: ug # Excel export in Blazor Pivot Table component -The Excel export allows Pivot Table data to be exported as Excel document. To enable Excel export in the pivot table, set the [AllowExcelExport](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SfPivotView-1.html#Syncfusion_Blazor_PivotView_SfPivotView_1_AllowExcelExport) property in [SfPivotView](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SfPivotView-1.html) class to **true**. Once the API is set, user needs to call the [ExportToExcelAsync](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SfPivotView-1.html#Syncfusion_Blazor_PivotView_SfPivotView_1_ExcelExport_System_Object_System_Nullable_System_Boolean__System_Object_System_Nullable_System_Boolean__) method for exporting on external button click. +The Excel export feature allows you to export Pivot Table data as an Excel document for offline analysis and reporting. To enable Excel export functionality in the Pivot Table, set the [AllowExcelExport](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SfPivotView-1.html#Syncfusion_Blazor_PivotView_SfPivotView_1_AllowExcelExport) property in [SfPivotView](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SfPivotView-1.html) class to **true**. Once enabled, use the [ExportToExcelAsync](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SfPivotView-1.html#Syncfusion_Blazor_PivotView_SfPivotView_1_ExportToExcelAsync_Syncfusion_Blazor_Grids_ExcelExportProperties_System_Nullable_System_Boolean__System_Object_System_Nullable_System_Boolean__System_Boolean_) method to perform the Excel export operation. This method accepts a boolean parameter, **"asMemoryStream"**, which determines the export behavior: * **false:** Downloads the Excel file directly. * **true:** Returns the file as a memory stream for custom processing, storage, or manipulation. -In this example, false is used to initiate a direct download. +In the following example, an external button is used to start the Excel export process. When the user clicks the button, the [ExportToExcelAsync](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SfPivotView-1.html#Syncfusion_Blazor_PivotView_SfPivotView_1_ExportToExcelAsync_Syncfusion_Blazor_Grids_ExcelExportProperties_System_Nullable_System_Boolean__System_Object_System_Nullable_System_Boolean__System_Boolean_) method is called so that the Pivot Table data can be saved as an Excel file. In this example, **false** is used to initiate a direct download. -N> The pivot table component can be exported to Excel format using options available in the toolbar. For more details [refer](./tool-bar) here. +N> The Pivot Table component can be exported to Excel format using options available in the toolbar. For more details [refer](./tool-bar) here. ```cshtml @using Syncfusion.Blazor.PivotView @@ -50,7 +50,7 @@ N> The pivot table component can be exported to Excel format using options avail public List data { get; set; } protected override void OnInitialized() { - this.Data = ProductDetails.GetProductData().ToList(); + this.data = ProductDetails.GetProductData().ToList(); //Bind the data source collection here. Refer "Assigning sample data to the pivot table" section in getting started for more details. } @@ -62,11 +62,11 @@ N> The pivot table component can be exported to Excel format using options avail ![Excel Exporting in Blazor PivotTable](images/blazor-pivottable-excel-export.png) -## Changing the pivot table style while exporting +## Changing the Pivot Table style while exporting -The Excel export provides an option to change colors for headers, caption and records in pivot table before exporting. In-order to apply colors, define **theme** settings in **excelExportProperties** object and pass it as a parameter to the [ExportToExcelAsync](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SfPivotView-1.html#Syncfusion_Blazor_PivotView_SfPivotView_1_ExcelExport_System_Object_System_Nullable_System_Boolean__System_Object_System_Nullable_System_Boolean__) method. +The Excel export provides an option to change colors for headers, caption, and records in Pivot Table before exporting. To apply colors, define [Theme](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.ExcelExportProperties.html#Syncfusion_Blazor_Grids_ExcelExportProperties_Theme) settings in [ExcelExportProperties](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.ExcelExportProperties.html) class and pass it as a parameter to the [ExportToExcelAsync](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SfPivotView-1.html#Syncfusion_Blazor_PivotView_SfPivotView_1_ExportToExcelAsync_Syncfusion_Blazor_Grids_ExcelExportProperties_System_Nullable_System_Boolean__System_Object_System_Nullable_System_Boolean__System_Boolean_) method. -N> By default, material theme will be applied to the pivot table during Excel exporting. +N> By default, material theme is applied to exported Excel document. ```cshtml @using Syncfusion.Blazor.PivotView @@ -98,7 +98,7 @@ N> By default, material theme will be applied to the pivot table during Excel ex public List data { get; set; } protected override void OnInitialized() { - this.Data = ProductDetails.GetProductData().ToList(); + this.data = ProductDetails.GetProductData().ToList(); //Bind the data source collection here. Refer "Assigning sample data to the pivot table" section in getting started for more details. } @@ -116,15 +116,13 @@ N> By default, material theme will be applied to the pivot table during Excel ex this.pivot.ExportToExcelAsync(excelExportProperties); } } - ``` ![Changing Blazor PivotTable Style while Exporting](images/blazor-pivottable-style-format-in-excel.png) ## Add header and footer while exporting -The Excel export provides an option to include header and footer content for the excel document before exporting. In-order to add header and footer, define [Header](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.ExcelExportProperties.html#Syncfusion_Blazor_Grids_ExcelExportProperties_Header) and [Footer](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.ExcelExportProperties.html#Syncfusion_Blazor_Grids_ExcelExportProperties_Footer) properties in [ExcelExportProperties](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.ExcelExportProperties.html) and pass it as a parameter to the [ExportToExcelAsync](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SfPivotView-1.html#Syncfusion_Blazor_PivotView_SfPivotView_1_ExportToExcelAsync_Syncfusion_Blazor_Grids_ExcelExportProperties_System_Nullable_System_Boolean__System_Object_System_Nullable_System_Boolean__System_Boolean_) method. - +The Excel export provides an option to include header and footer content for the Excel document before exporting. To add header and footer, define [Header](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.ExcelExportProperties.html#Syncfusion_Blazor_Grids_ExcelExportProperties_Header) and [Footer](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.ExcelExportProperties.html#Syncfusion_Blazor_Grids_ExcelExportProperties_Footer) properties in [ExcelExportProperties](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.ExcelExportProperties.html) and pass it as a parameter to the [ExportToExcelAsync](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SfPivotView-1.html#Syncfusion_Blazor_PivotView_SfPivotView_1_ExportToExcelAsync_Syncfusion_Blazor_Grids_ExcelExportProperties_System_Nullable_System_Boolean__System_Object_System_Nullable_System_Boolean__System_Boolean_) method. ```cshtml @using Syncfusion.Blazor.PivotView @@ -191,14 +189,13 @@ The Excel export provides an option to include header and footer content for the await this.pivot.ExportToExcelAsync(excelExportProperties); } } - ``` ![Add Header and Footer while exporting in Blazor PivotTable](images/blazor-pivottable-header-and-footer-in-excel.png) ## Changing the file name while exporting -The Excel export provides an option to change file name of the document before exporting. In-order to change the file name, define **fileName** property in **excelExportProperties** object and pass it as a parameter to the [ExportToExcelAsync](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SfPivotView-1.html#Syncfusion_Blazor_PivotView_SfPivotView_1_ExcelExport_System_Object_System_Nullable_System_Boolean__System_Object_System_Nullable_System_Boolean__) method. +This option provides flexibility to specify a custom file name for your exported Excel document, making it easier to organize and identify your exported data files. To change the file name, define [FileName](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.ExcelExportProperties.html#Syncfusion_Blazor_Grids_ExcelExportProperties_FileName) property in [ExcelExportProperties](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.ExcelExportProperties.html) class and pass it as a parameter to the [ExportToExcelAsync](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SfPivotView-1.html#Syncfusion_Blazor_PivotView_SfPivotView_1_ExportToExcelAsync_Syncfusion_Blazor_Grids_ExcelExportProperties_System_Nullable_System_Boolean__System_Object_System_Nullable_System_Boolean__System_Boolean_) method. ```cshtml @using Syncfusion.Blazor.PivotView @@ -230,7 +227,7 @@ The Excel export provides an option to change file name of the document before e public List data { get; set; } protected override void OnInitialized() { - this.Data = ProductDetails.GetProductData().ToList(); + this.data = ProductDetails.GetProductData().ToList(); //Bind the data source collection here. Refer "Assigning sample data to the pivot table" section in getting started for more details. } @@ -242,27 +239,26 @@ The Excel export provides an option to change file name of the document before e this.pivot.ExportToExcelAsync(excelExportProperties); } } - ``` ![Changing Blazor PivotTable File Name while Exporting](images/blazor-pivottable-change-excel-file-name.png) ## Limitation when exporting millions of records to Excel format -By default, Microsoft Excel supports only 1,048,576 records in an Excel sheet. Hence, it is not possible to export millions of records to Excel. You can refer to the [documentation link](https://support.microsoft.com/en-gb/office/excel-specifications-and-limits-1672b34d-7043-467e-8e27-269d656771c3) for more details on Microsoft Excel specifications and limits. Therefore, it is suggested to export the data in CSV (Comma-Separated Values) or other formats that can handle large datasets more efficiently than Excel. +Understanding this limitation helps you choose the appropriate export format based on your data size requirements and ensures optimal performance for large datasets. By default, Microsoft Excel supports only 1,048,576 records in an Excel sheet. Therefore, it is not possible to export millions of records to Excel format. You can refer to the [documentation link](https://support.microsoft.com/en-gb/office/excel-specifications-and-limits-1672b34d-7043-467e-8e27-269d656771c3) for more details on Microsoft Excel specifications and limits. For large datasets, it is recommended to export the data in CSV (Comma-Separated Values) or other formats that can handle large datasets more efficiently than Excel. ## CSV Export -The Excel export allows pivot table data to be exported in **CSV** file format as well. To enable CSV export in the pivot table, set the [AllowExcelExport](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SfPivotView-1.html#Syncfusion_Blazor_PivotView_SfPivotView_1_AllowExcelExport) property in [SfPivotView](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SfPivotView-1.html) class as **true**. Once the API is set, user needs to call the [ExportToCsvAsync](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SfPivotView-1.html#Syncfusion_Blazor_PivotView_SfPivotView_1_CsvExport_System_Object_System_Nullable_System_Boolean__System_Object_System_Nullable_System_Boolean__) method for exporting on external button click. +The CSV export option allows you to export Pivot Table data as a plain text CSV file, making it easy to use the data with other spreadsheet or data analysis applications. To export the Pivot Table as a CSV file, ensure that the [AllowExcelExport](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SfPivotView-1.html#Syncfusion_Blazor_PivotView_SfPivotView_1_AllowExcelExport) property in [SfPivotView](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SfPivotView-1.html) class is set to **true**. Then, use the [ExportToCsvAsync](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SfPivotView-1.html#Syncfusion_Blazor_PivotView_SfPivotView_1_ExportToCsvAsync_System_Boolean_Syncfusion_Blazor_Grids_ExcelExportProperties_System_Boolean_) method to perform the CSV export operation. This method accepts a boolean parameter, **"asMemoryStream"**, which determines the export behavior: * **false:** Downloads the Excel file directly. * **true:** Returns the file as a memory stream for custom processing, storage, or manipulation. -In this example, false is used to initiate a direct download. +In the following example, an external button is used to start the CSV export process. When the user clicks the button, the [ExportToCsvAsync](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SfPivotView-1.html#Syncfusion_Blazor_PivotView_SfPivotView_1_ExportToCsvAsync_System_Boolean_Syncfusion_Blazor_Grids_ExcelExportProperties_System_Boolean_) method is called so that the Pivot Table data can be saved as a CSV file. In this example, **false** is used to initiate a direct download. -N> The pivot table component can be exported to CSV format using options available in the toolbar. For more details [refer](./tool-bar) here. +N> The Pivot Table component can be exported to CSV format using options available in the toolbar. For more details [refer](./tool-bar) here. ```cshtml @using Syncfusion.Blazor.PivotView @@ -270,7 +266,7 @@ N> The pivot table component can be exported to CSV format using options availab - + @@ -304,14 +300,13 @@ N> The pivot table component can be exported to CSV format using options availab this.pivot.ExportToCsvAsync(false); } } - ``` ![CSV Exporting in Blazor PivotTable](images/blazor-pivottable-csv-export.png) ## Export all pages -When the [EnableVirtualization](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SfPivotView-1.html#Syncfusion_Blazor_PivotView_SfPivotView_1_EnableVirtualization) property in the [SfPivotView](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SfPivotView-1.html) is set to **true**, the entire virtual data of the pivot table (i.e. the data that contains all of the records used to render the complete pivot table) will be exported as an Excel/CSV document. To export only the current viewport of the pivot table, set the [ExportAllPages](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SfPivotView-1.html#Syncfusion_Blazor_PivotView_SfPivotView_1_ExportAllPages) property to **false**. +This option gives flexibility to export either the entire dataset rendered by the Pivot Table (all pages) or just the data currently visible in the viewport. To export the entire Pivot Table data, ensure the [EnableVirtualization](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SfPivotView-1.html#Syncfusion_Blazor_PivotView_SfPivotView_1_EnableVirtualization) property in the [SfPivotView](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SfPivotView-1.html) is set to **true**. Set the [ExportAllPages](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SfPivotView-1.html#Syncfusion_Blazor_PivotView_SfPivotView_1_ExportAllPages) property to **false** to export only the visible records. This setting applies to both Excel and CSV exports. ```cshtml @using Syncfusion.Blazor.PivotView @@ -351,9 +346,9 @@ When the [EnableVirtualization](https://help.syncfusion.com/cr/blazor/Syncfusion ## Saving Excel document to stream -Rather than exporting the Pivot Table as a downloadable file, the user can save the Excel document as a memory stream. This is achieved by setting the **asMemoryStream** parameter to **true** in the [ExportToExcelAsync](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SfPivotView-1.html#Syncfusion_Blazor_PivotView_SfPivotView_1_ExcelExport_System_Object_System_Nullable_System_Boolean__System_Object_System_Nullable_System_Boolean__) method. The resulting memory stream can then be further processed and customized by the user before being exported as a document. +The user can save a Pivot Table as a memory stream instead of downloading it as an Excel file. This is done by setting the `asMemoryStream` parameter to `true` in the [ExportToExcelAsync](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SfPivotView-1.html#Syncfusion_Blazor_PivotView_SfPivotView_1_ExcelExport_System_Object_System_Nullable_System_Boolean__System_Object_System_Nullable_System_Boolean__) method. The memory stream can then be processed or saved as needed. -N> This option is only available if virtualization is enabled in the pivot table. +N> This option requires [EnableVirtualization](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SfPivotView-1.html#Syncfusion_Blazor_PivotView_SfPivotView_1_EnableVirtualization) to be set to `true` in the Pivot Table. ```cshtml @using Syncfusion.Blazor.PivotView @@ -363,7 +358,7 @@ N> This option is only available if virtualization is enabled in the pivot table - + @@ -377,7 +372,7 @@ N> This option is only available if virtualization is enabled in the pivot table - + @@ -398,18 +393,15 @@ N> This option is only available if virtualization is enabled in the pivot table private List Data { get; set; } protected override void OnInitialized() { - this.Data = ProductDetails.GetProductData().ToList(); //Bind the data source collection here. Refer "Assigning sample data to the pivot table" section in getting started for more details. + this.Data = ProductDetails.GetProductData().ToList(); } - private async Task OnPdfExport(Microsoft.AspNetCore.Components.Web.MouseEventArgs args) + private async Task OnExcelExport(Microsoft.AspNetCore.Components.Web.MouseEventArgs args) { System.IO.MemoryStream memoryStream = new System.IO.MemoryStream(); //Excel document as a memory stream by setting the first parameter as "true" in the "ExportToExcelAsync" method. memoryStream = await this.pivot.ExportToExcelAsync(true); // You can then process the memory stream based on your needs and save it as mentioned in the last statement. - ...... - ...... - ...... await JSRuntime.InvokeVoidAsync("saveAsFile", new object[] { "default.xlsx", Convert.ToBase64String(memoryStream.ToArray()),true }); } } @@ -419,13 +411,12 @@ N> This option is only available if virtualization is enabled in the pivot table ### ExcelQueryCellInfo -The event [ExcelQueryCellInfo](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewEvents-1.html#Syncfusion_Blazor_PivotView_PivotViewEvents_1_ExcelQueryCellInfo) triggers while framing each row and value cell during Excel export. It allows the user to customize the cell value, style, etc. of the current cell. It has the following parameters: - -* [Value](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.ExcelQueryCellInfoEventArgs-1.html#Syncfusion_Blazor_Grids_ExcelQueryCellInfoEventArgs_1_Value) : It holds the cell value. -* [Column](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.ExcelQueryCellInfoEventArgs-1.html#Syncfusion_Blazor_Grids_ExcelQueryCellInfoEventArgs_1_Column) : It holds the column information, including row and column indexes required to obtain the current cell information. **Note:** This option is applicable only when virtualization is disabled. +The [ExcelQueryCellInfo](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewEvents-1.html#Syncfusion_Blazor_PivotView_PivotViewEvents_1_ExcelQueryCellInfo) event is triggered during the creation of each row and value cell while exporting data to Excel. This event offers options to change the content and style of individual cells in the exported Excel document, improving the flexibility and appearance of exported reports. It has the following parameters: +* [Value](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.ExcelQueryCellInfoEventArgs-1.html#Syncfusion_Blazor_Grids_ExcelQueryCellInfoEventArgs_1_Value) : Represents the value of the current cell in the exported Excel sheet. +* [Column](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.ExcelQueryCellInfoEventArgs-1.html#Syncfusion_Blazor_Grids_ExcelQueryCellInfoEventArgs_1_Column) : Provides details about the column to which the current cell belongs. **Note:** This option is applicable only when virtualization is disabled. * [Cell](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.ExcelQueryCellInfoEventArgs-1.html#Syncfusion_Blazor_Grids_ExcelQueryCellInfoEventArgs_1_Cell) : It holds the current cell information. -* [Style](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.ExcelQueryCellInfoEventArgs-1.html#Syncfusion_Blazor_Grids_ExcelQueryCellInfoEventArgs_1_Style) : It holds the style properties for the cell. +* [Style](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.ExcelQueryCellInfoEventArgs-1.html#Syncfusion_Blazor_Grids_ExcelQueryCellInfoEventArgs_1_Style) : Defines the style properties (such as font, color, borders) applied to the current cell. * [RowIndex](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.ExcelQueryCellInfoEventArgs-1.html#Syncfusion_Blazor_Grids_ExcelQueryCellInfoEventArgs_1_RowIndex) : It holds the row index required to get the current cell information. **Note:** When virtualization is enabled, this option is applicable. * [ColumnIndex](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.ExcelQueryCellInfoEventArgs-1.html#Syncfusion_Blazor_Grids_ExcelQueryCellInfoEventArgs_1_ColumnIndex) : It holds the column index required to get the current cell information. **Note:** When virtualization is enabled, this option is applicable. @@ -436,27 +427,26 @@ The event [ExcelQueryCellInfo](https://help.syncfusion.com/cr/blazor/Syncfusion. - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + - @code{ private SfPivotView pivot; public List Data { get; set; } @@ -504,21 +494,19 @@ The event [ExcelQueryCellInfo](https://help.syncfusion.com/cr/blazor/Syncfusion. args.Style.Bold = args.Cell.CellStyle.Bold = true; } } - } - ``` ### ExcelHeaderQueryCellInfo N> The row header cell can be obtained by using the `ExcelQueryCellInfo` event. It can be identified using `AxisSet.Axis == "row"` and for reference, see the code snippet in the previous topic. -The event [ExcelHeaderQueryCellInfo](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewEvents-1.html#Syncfusion_Blazor_PivotView_PivotViewEvents_1_ExcelHeaderQueryCellInfo) triggers on framing each column header cell during Excel export. It allows the user to customize the cell value, style, etc. of the current cell. It has the following parameters: +The [ExcelHeaderQueryCellInfo](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewEvents-1.html#Syncfusion_Blazor_PivotView_PivotViewEvents_1_ExcelHeaderQueryCellInfo) event provides the ability to modify header cell appearance and content during Excel export, ensuring exported documents match specific formatting requirements or business standards. This event triggers while processing each header cell during the Excel export operation. It has the following parameters: -* [Value](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.ExcelHeaderQueryCellInfoEventArgs.html#Syncfusion_Blazor_Grids_ExcelHeaderQueryCellInfoEventArgs_Value) : It holds the cell value. -* [Column](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.ExcelHeaderQueryCellInfoEventArgs.html#Syncfusion_Blazor_Grids_ExcelHeaderQueryCellInfoEventArgs_Column) : It holds the column information, including row and column indexes required to obtain the current header cell information. **Note:** This option is applicable only when virtualization is disabled. -* [Cell](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.ExcelHeaderQueryCellInfoEventArgs.html#Syncfusion_Blazor_Grids_ExcelHeaderQueryCellInfoEventArgs_Cell) : It holds the current cell information. -* [Style](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.ExcelHeaderQueryCellInfoEventArgs.html#Syncfusion_Blazor_Grids_ExcelHeaderQueryCellInfoEventArgs_Style) : It holds the style properties for the cell. +* [Value](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.ExcelHeaderQueryCellInfoEventArgs.html#Syncfusion_Blazor_Grids_ExcelHeaderQueryCellInfoEventArgs_Value) : Represents the value of the current cell in the exported Excel sheet. +* [Column](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.ExcelHeaderQueryCellInfoEventArgs.html#Syncfusion_Blazor_Grids_ExcelHeaderQueryCellInfoEventArgs_Column) : Provides details about the column to which the current cell belongs. **Note:** This option is applicable only when virtualization is disabled. +* [Cell](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.ExcelHeaderQueryCellInfoEventArgs.html#Syncfusion_Blazor_Grids_ExcelHeaderQueryCellInfoEventArgs_Cell) : Contains the current cell information and properties. +* [Style](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.ExcelHeaderQueryCellInfoEventArgs.html#Syncfusion_Blazor_Grids_ExcelHeaderQueryCellInfoEventArgs_Style) : Contains the style properties that can be applied to the cell. * [RowIndex](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.ExcelHeaderQueryCellInfoEventArgs.html#Syncfusion_Blazor_Grids_ExcelHeaderQueryCellInfoEventArgs_RowIndex) : It holds the row index required to get the current cell information. **Note:** When virtualization is enabled, this option is applicable. * [ColumnIndex](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.ExcelHeaderQueryCellInfoEventArgs.html#Syncfusion_Blazor_Grids_ExcelHeaderQueryCellInfoEventArgs_ColumnIndex) : It holds the column index required to get the current cell information. **Note:** When virtualization is enabled, this option is applicable. @@ -555,7 +543,7 @@ The event [ExcelHeaderQueryCellInfo](https://help.syncfusion.com/cr/blazor/Syncf protected override void OnInitialized() { - this.Data = ProductDetails.GetProductData().ToList(); + this.data = ProductDetails.GetProductData().ToList(); // Bind the data source collection here. Refer "Assigning sample data to the pivot table" section in getting started for more details. } @@ -596,7 +584,6 @@ The event [ExcelHeaderQueryCellInfo](https://help.syncfusion.com/cr/blazor/Syncf } } } - ``` ![Customizing the Blazor Pivot Table cell values and styles while exporting](images/blazor-pivottable-excelexportevents.png) diff --git a/blazor/pivot-table/field-list.md b/blazor/pivot-table/field-list.md index ed79ac7530..093ff014af 100644 --- a/blazor/pivot-table/field-list.md +++ b/blazor/pivot-table/field-list.md @@ -9,20 +9,20 @@ documentation: ug # Field List in Blazor Pivot Table Component -The [Blazor Pivot Table](https://www.syncfusion.com/blazor-components/blazor-pivot-table) provides a built-in Field List similar to Microsoft Excel. It allows to add or remove fields and also rearrange them between different axes, including column, row, value, and filter along with sort and filter options dynamically at runtime. +The Field List makes it easy to organize and analyze data in your Pivot Table. It provides a user-friendly interface similar to Microsoft Excel that allows you to add or remove fields and move them between different axes like columns, rows, values, and filters. You can also apply sorting and filtering options while working with your data. The field list can be displayed in two different formats to interact with pivot table. They are: -* **In-built Field List (Popup)**: To display the field list icon in pivot table UI to invoke the built-in dialog. -* **Stand-alone Field List (Fixed)**: To display the field list in a static position within a web page. +* **In-built Field List (Popup)**: Shows a field list icon in the Pivot Table interface. Click this icon to open the field list in a dialog box. +* **Stand-alone Field List (Fixed)**: Displays the field list in a fixed position on your web page alongside the Pivot Table. ## In-built Field List (Popup) -To enable the field list in pivot table UI, set the [ShowFieldList](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SfPivotView-1.html#Syncfusion_Blazor_PivotView_SfPivotView_1_ShowFieldList) property in [SfPivotView](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SfPivotView-1.html) class to **true**. A small icon will appear on the top left corner of the pivot table and clicking on this icon, field list dialog will appear. +The built-in field list provides quick access to modify your Pivot Table report settings without taking up permanent space on your webpage. To enable the field list in pivot table UI, set the [ShowFieldList](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SfPivotView-1.html#Syncfusion_Blazor_PivotView_SfPivotView_1_ShowFieldList) property in [SfPivotView](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SfPivotView-1.html) class to **true**. A small icon will appear on the top left corner of the pivot table and clicking on this icon, field list dialog will appear. N> The field list icon will be displayed at the top right corner of the pivot table, when grouping bar is enabled. - ```cshtml +```cshtml @using Syncfusion.Blazor.PivotView @@ -53,21 +53,17 @@ N> The field list icon will be displayed at the top right corner of the pivot ta //Bind the data source collection here. Refer "Assigning sample data to the pivot table" section in getting started for more details. } } - ``` - ![Blazor PivotTable with FieldList Icon](images/blazor-pivottable-fieldlist-icon.png) - ![Blazor PivotTable with FieldList Dialog](images/blazor-pivottabel-fieldlist-dialog.png) - ## Stand-alone Field List (Fixed) -The field list can be rendered in a static position, anywhere in web page layout, like a separate component. To do so, you need to set the [RenderMode](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SfPivotFieldList-1.html#Syncfusion_Blazor_PivotView_SfPivotFieldList_1_RenderMode) property to [Mode.Fixed](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.Mode.html) in [SfPivotFieldList](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SfPivotFieldList-1.html). +The stand-alone Field List allows users to keep the Field List visible at a specific place on the web page, making it easy to access its options without opening a popup each time. To do so, you need to set the [RenderMode](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SfPivotFieldList-1.html#Syncfusion_Blazor_PivotView_SfPivotFieldList_1_RenderMode) property to [Mode.Fixed](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.Mode.html) in [SfPivotFieldList](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SfPivotFieldList-1.html). -N> To make a field list interact with pivot table, you need to use the [UpdateViewAsync](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SfPivotFieldList-1.html#Syncfusion_Blazor_PivotView_SfPivotFieldList_1_UpdateView_System_Object_) and [Update](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SfPivotFieldList-1.html#Syncfusion_Blazor_PivotView_SfPivotFieldList_1_Update_System_Object_) methods for data source update in both field list and pivot table simultaneously. +N> To ensure the field list works seamlessly with the Pivot Table, use the [UpdateViewAsync](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SfPivotFieldList-1.html#Syncfusion_Blazor_PivotView_SfPivotFieldList_1_UpdateViewAsync_Syncfusion_Blazor_PivotView_SfPivotView__0__) and [UpdateAsync](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SfPivotFieldList-1.html#Syncfusion_Blazor_PivotView_SfPivotFieldList_1_UpdateAsync_Syncfusion_Blazor_PivotView_SfPivotView__0__) methods. These methods synchronize data source changes between the field list and Pivot Table components, keeping both components in sync when users make modifications. ```cshtml @@ -121,18 +117,21 @@ N> To make a field list interact with pivot table, you need to use the [UpdateVi this.fieldList.UpdateViewAsync(this.pivotView); } } - ``` ![Blazor PivotTable with Static FieldList](images/blazor-pivottable-static-field-list.png) ## Search desired field -End user can search for desired field in the field list UI by typing the field name into the search box at runtime. It can be enabled by setting the [ShowFieldSearch](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SfPivotFieldList-1.html#Syncfusion_Blazor_PivotView_SfPivotFieldList_1_ShowFieldSearch) property to **true** via code-behind. +The field search option helps you quickly locate and work with specific fields in the Field List. Instead of scrolling through the entire list of available fields, you can simply type the field name in the search box to instantly filter and find the desired field. -N> By default, field search option is disabled in the field list UI. Furthermore, this option is only available for relational data sources. +You can enable the field search option in two different Field List configurations: the Stand-alone Field List or the Pivot Table's built-in popup Field List. -To enable search box in the static field list UI, set the [ShowFieldSearch](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SfPivotFieldList-1.html#Syncfusion_Blazor_PivotView_SfPivotFieldList_1_ShowFieldSearch) property to **true** in [SfPivotFieldList](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SfPivotFieldList-1.html). +**Stand-alone Field List** + +To enable the search box in the stand-alone Field List UI, set the [ShowFieldSearch](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SfPivotFieldList-1.html#Syncfusion_Blazor_PivotView_SfPivotFieldList_1_ShowFieldSearch) property to **true** in [SfPivotFieldList](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SfPivotFieldList-1.html). + +N> By default, the field search option is disabled in the Field List UI. Furthermore, this option is only available for relational data sources. ```cshtml @@ -167,11 +166,13 @@ To enable search box in the static field list UI, set the [ShowFieldSearch](http //Bind the data source collection here. Refer "Assigning sample data to the pivot table" section in getting started for more details. } } - ``` + ![Static Field List with search in Blazor Pivot Table](images/blazor-pivottable-static-fieldlist-search.png) -To enable search box in the pivot table's built-in popup field list UI, set the [ShowFieldSearch](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SfPivotView-1.html#Syncfusion_Blazor_PivotView_SfPivotView_1_ShowFieldSearch) property to **true** in [SfPivotView](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SfPivotView-1.html). +**Pivot Table's Built-in Popup Field List** + +To enable the search box in the Pivot Table's built-in popup Field List UI, set the [ShowFieldSearch](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SfPivotView-1.html#Syncfusion_Blazor_PivotView_SfPivotView_1_ShowFieldSearch) property to **true** in [SfPivotView](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SfPivotView-1.html). ```cshtml @using Syncfusion.Blazor.PivotView @@ -204,29 +205,29 @@ To enable search box in the pivot table's built-in popup field list UI, set the //Bind the data source collection here. Refer "Assigning sample data to the pivot table" section in getting started for more details. } } - ``` + ![Popup Field List with search in Blazor Pivot Table](images/blazor-pivottable-popup-fieldlist-search.png) ## Option to sort fields -End user can sort fields in the field list UI to ascending (or) descending (or) default order (as obtained from the data source) using the built-in sort icons. +The field list provides a simple way to organize fields in different orders, making it easier to locate and work with the data you need. Users can sort fields in the field list UI in ascending, descending, or default order (as obtained from the data source) using the built-in sort icons. -N> By default, fields are displayed in the default order. +N> By default, fields are displayed in the default order as they appear in the data source. ![Field list with sorting options in Blazor Pivot Table](images/blazor-pivottable-fieldlist-default-sort.png) ## Add or remove fields -Using check box besides each field, end user can select or unselect to add or remove fields respectively from the report at runtime. +The Field List allows users to quickly modify their data analysis by selecting or unselecting fields as needed. Using the checkbox beside each field, users can easily add fields to include them in the report or remove fields to exclude them from the current analysis at runtime. ![Adding or Removing Fields in Blazor PivotTable](images/blazor-pivottable-add-remove-field.png) ## Remove specific field(s) from displaying -When a data source is bound to the component, fields will be automatically populated inside the Field List. In such case, user can also restrict specific field(s) from displaying. To do so, set the appropriate field name(s) in [ExcludeFields](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html#Syncfusion_Blazor_PivotView_PivotViewDataSourceSettings_1_ExcludeFields) property belonging to [PivotViewDataSourceSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html) class. +When you connect a data source to the Pivot Table, all available fields from the data source are automatically shown in the field list. If you want to hide certain fields from the field list, you can do so easily. To hide one or more fields, add their names to the [ExcludeFields](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html#Syncfusion_Blazor_PivotView_PivotViewDataSourceSettings_1_ExcludeFields) option inside the [PivotViewDataSourceSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html) class. - ```cshtml +```cshtml @using Syncfusion.Blazor.PivotView @@ -257,20 +258,19 @@ When a data source is bound to the component, fields will be automatically popul //Bind the data source collection here. Refer "Assigning sample data to the pivot table" section in getting started for more details. } } - ``` ![Hiding Specific Field List in Blazor PivotTable](images/blazor-pivottable-hide-field-list.png) ## Re-arranging fields -In-order to re-arrange, drag any field from the field list and drop it into the column, row, value, or filter axis using the drag-and-drop holder. It helps end user to alter the report at runtime. +To rearrange fields, users can drag a field from the Field List and drop it into the desired axis (column, row, value, or filter) using the drag-and-drop holder. This allows users to modify the report dynamically during runtime, adjusting the layout to suit their needs. ![Rearranging Fields in Blazor PivotTable](images/blazor-pivottable-rearrange-fields.png) ## Filtering members -Using the filter icon besides each field in row, column and filter axes, members can be either included or excluded at runtime. To know more about member filtering, [refer](./filtering) here. +Users can filter members in the row, column, and filter axes by selecting the filter icon next to each field. This opens a dialog where users can choose to include or exclude specific members from the Pivot Table. To learn more about filtering members, [refer to the filtering documentation](./filtering). ![Filter Icon with Each Field in Blazor PivotTable](images/blazor-pivottable-field-list-with-filter-icon.png)
@@ -280,7 +280,7 @@ Using the filter icon besides each field in row, column and filter axes, members ## Sorting members -Using the sort icon besides each field in row and column axes, members can be arranged either in ascending or descending order at runtime. To know more about member sorting, [refer](./sorting) here. +The Pivot Table allows users to sort members in the row and column axes using a sort icon next to each field. By clicking this icon, users can arrange members in either ascending or descending order at runtime. This option helps users organize data in a way that suits their needs. For more details on sorting members, [refer here](./sorting). ![Sorting Icon with Each Field in Blazor PivotTable](images/blazor-pivottable-field-list-with-sort-icon.png)
@@ -288,7 +288,7 @@ Using the sort icon besides each field in row and column axes, members can be ar ## Calculated fields -The calculated field support allows end user to add a new calculated field based on the available fields from the bound data source using basic arithmetic operators. To enable this support in Field List UI, set the [AllowCalculatedField](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SfPivotView-1.html#Syncfusion_Blazor_PivotView_SfPivotView_1_AllowCalculatedField) property in [SfPivotView](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SfPivotView-1.html) class to **true** in pivot table. Now a button will be seen automatically inside the field list UI which will invoke the calculated field dialog on click. To know more about calculated field, [refer](./calculated-field) here. +The calculated field option allows users to create a new field based on existing fields from the data source using basic arithmetic operations, such as addition, subtraction, multiplication, and division. To use this option in the Field List UI, set the [AllowCalculatedField](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SfPivotView-1.html#Syncfusion_Blazor_PivotView_SfPivotView_1_AllowCalculatedField) property in [SfPivotView](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SfPivotView-1.html) class to **true**. When enabled, a button appears in the Field List UI. Clicking this button opens the calculated field dialog, where users can define a new calculated field. For more details on calculated fields, [refer to the calculated field documentation](./calculated-field). ![Blazor PivotTable with Caluclated Field Button](images/blazor-pivottable-calculate-button.png)
@@ -298,24 +298,23 @@ The calculated field support allows end user to add a new calculated field based ## Changing aggregation type of value fields at runtime -End user can perform calculations over a group of values using the aggregation option. The value fields bound to the field list, appears with a dropdown icon, helps to select an appropriate aggregation type at runtime. On selection, the values in the Pivot Table will be changed dynamically. To know more about aggregation, [refer](./aggregation) here. +Users can perform calculations on a group of values by selecting an aggregation type. Each value field in the Field List appears with a dropdown icon. Clicking this icon allows users to choose an aggregation type, such as sum, average, or count, at runtime. Once selected, the Pivot Table updates automatically to reflect the chosen aggregation type for the values. For more details on aggregation, [refer](./aggregation) here. ![Displaying Aggregation Type Icon in Blazor PivotTable](images/blazor-pivottable-aggregation-type-icon.png)
-
![Displaying Pre-defined Aggregation List in Blazor PivotTable](images/blazor-pivottable-pre-defined-aggregation.png)
![Displaying Average Aggregation Type in Blazor PivotGrid Field](images/blazor-pivotgrid-field-list-aggregation.png) ## Defer layout update -Defer layout update support to update the pivot table only on demand and not during every user action. To enable this support in Field List UI, set the [AllowDeferLayoutUpdate](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SfPivotView-1.html#Syncfusion_Blazor_PivotView_SfPivotView_1_AllowDeferLayoutUpdate) property in [SfPivotView](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SfPivotView-1.html) class to **true** in pivot table. Now a check box inside Field List UI will be seen in checked state, allowing pivot table to update only on demand. To know more about defer layout, [refer](./defer-layout-update) here. +The defer layout update option allows users to update the Pivot Table only when needed, instead of after every change in the Field List. To enable this option, set the [AllowDeferLayoutUpdate](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SfPivotView-1.html#Syncfusion_Blazor_PivotView_SfPivotView_1_AllowDeferLayoutUpdate) property in [SfPivotView](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SfPivotView-1.html) class to **true**. When enabled, a checkbox appears in the Field List, checked by default. Users can uncheck this checkbox to make changes without updating the Pivot Table immediately, and then apply all changes at once. For more details on defer layout update, [refer](./defer-layout-update) here. ![Blazor PivotTable with Defer Layout Update](images/blazor-pivottable-defer-layout-update.png) ## Show field list using toolbar -It can also be viewed in toolbar by setting [ShowFieldList](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SfPivotView-1.html#Syncfusion_Blazor_PivotView_SfPivotView_1_ShowFieldList) and [ShowToolbar](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SfPivotView-1.html#Syncfusion_Blazor_PivotView_SfPivotView_1_ShowToolbar) properties in [SfPivotView](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SfPivotView-1.html) class to **true**. Also, include the item [ToolbarItems.FieldList](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.ToolbarItems.html) within the [Toolbar](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SfPivotView-1.html#Syncfusion_Blazor_PivotView_SfPivotView_1_Toolbar) property in [SfPivotView](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SfPivotView-1.html) class. When toolbar is enabled, field list icon will be automatically added into the toolbar and the icon won't appear on top left corner in the pivot table component. +The Field List can be displayed in the toolbar by enabling specific options in the Pivot Table. To show the Field List in the toolbar, set the [ShowFieldList](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SfPivotView-1.html#Syncfusion_Blazor_PivotView_SfPivotView_1_ShowFieldList) and [ShowToolbar](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SfPivotView-1.html#Syncfusion_Blazor_PivotView_SfPivotView_1_ShowToolbar) properties to **true**. Additionally, include the [ToolbarItems.FieldList](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.ToolbarItems.html#Syncfusion_Blazor_PivotView_ToolbarItems_FieldList) item in the [Toolbar](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SfPivotView-1.html#Syncfusion_Blazor_PivotView_SfPivotView_1_Toolbar) property. When these options are enabled, the Field List icon automatically appears in the toolbar, and it will not be displayed in the top-left corner of the Pivot Table. ```cshtml @using Syncfusion.Blazor.PivotView @@ -351,7 +350,6 @@ It can also be viewed in toolbar by setting [ShowFieldList](https://help.syncfus //Bind the data source collection here. Refer "Assigning sample data to the pivot table" section in getting started for more details. } } - ``` ![Displaying FieldList using Toolbar in Blazor PivotGrid](images/blazor-pivottable-show-field-list-using-toolbar.png) @@ -360,18 +358,17 @@ It can also be viewed in toolbar by setting [ShowFieldList](https://help.syncfus ### EnginePopulated -The [EnginePopulated](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotFieldListEvents-1.html#Syncfusion_Blazor_PivotView_PivotFieldListEvents_1_EnginePopulated) event is available in both Pivot Table and Field List. +The [EnginePopulated](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotFieldListEvents-1.html#Syncfusion_Blazor_PivotView_PivotFieldListEvents_1_EnginePopulated) event is available in both Pivot Table and Field List. It triggers after the data engine is populated with the updated report settings, allowing the Pivot Table and Field List to stay in sync when changes are made. -* The event [EnginePopulated](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotFieldListEvents-1.html#Syncfusion_Blazor_PivotView_PivotFieldListEvents_1_EnginePopulated) is triggered in field list whenever the report gets modified. The updated report is passed to the pivot table via [UpdateViewAsync](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SfPivotFieldList-1.html#Syncfusion_Blazor_PivotView_SfPivotFieldList_1_UpdateView_System_Object_) method written within this event to refresh the same. +* In the Field List, the [EnginePopulated](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotFieldListEvents-1.html#Syncfusion_Blazor_PivotView_PivotFieldListEvents_1_EnginePopulated) event is triggered whenever the report is modified, such as when fields are added, removed, or rearranged. The updated report is sent to the Pivot Table using the [UpdateViewAsync](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SfPivotFieldList-1.html#Syncfusion_Blazor_PivotView_SfPivotFieldList_1_UpdateViewAsync_Syncfusion_Blazor_PivotView_SfPivotView__0__) method within this event to refresh the Pivot Table's display. -* Likewise, [EnginePopulated](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewEvents-1.html#Syncfusion_Blazor_PivotView_PivotViewEvents_1_EnginePopulated) event is triggered in pivot table whenever the report gets modified. The updated report is passed to the field list via [UpdateAsync](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SfPivotFieldList-1.html#Syncfusion_Blazor_PivotView_SfPivotFieldList_1_Update_System_Object_) method written within this event to refresh the same. +* Likewise, in the Pivot Table, the [EnginePopulated](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewEvents-1.html#Syncfusion_Blazor_PivotView_PivotViewEvents_1_EnginePopulated) event is triggered when the report is updated. The modified report is passed to the Field List using the [UpdateAsync](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SfPivotFieldList-1.html#Syncfusion_Blazor_PivotView_SfPivotFieldList_1_UpdateAsync_Syncfusion_Blazor_PivotView_SfPivotView__0__) method to ensure the Field List reflects the changes. The event [EnginePopulated](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotFieldListEvents-1.html#Syncfusion_Blazor_PivotView_PivotFieldListEvents_1_EnginePopulated) is triggered after engine is populated. It has following parameters - [DataSourceSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.EnginePopulatedEventArgs.html#Syncfusion_Blazor_PivotView_EnginePopulatedEventArgs_DataSourceSettings), [PivotFieldList](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.EnginePopulatedEventArgs.html#Syncfusion_Blazor_PivotView_EnginePopulatedEventArgs_PivotFieldList) and [PivotValues](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.EnginePopulatedEventArgs.html#Syncfusion_Blazor_PivotView_EnginePopulatedEventArgs_PivotValues). N> This event is not required for Popup field list since it is a in-built one. ```cshtml - @@ -423,15 +420,15 @@ N> This event is not required for Popup field list since it is a in-built one. this.fieldList.UpdateViewAsync(this.pivotView); } } - ``` ### FieldListRefreshed -The event [FieldListRefreshed](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewEvents-1.html#Syncfusion_Blazor_PivotView_PivotViewEvents_1_FieldListRefreshed) is triggered whenever there is any change done in the field list UI. It has following parameter - [DataSourceSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.FieldListRefreshedEventArgs.html#Syncfusion_Blazor_PivotView_FieldListRefreshedEventArgs_DataSourceSettings) and [PivotValues](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.FieldListRefreshedEventArgs.html#Syncfusion_Blazor_PivotView_FieldListRefreshedEventArgs_PivotValues). It allows the user to identify each field list update. This event is applicable only for static field list. +The [FieldListRefreshed](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewEvents-1.html#Syncfusion_Blazor_PivotView_PivotViewEvents_1_FieldListRefreshed) event triggers whenever a change occurs in the field list UI, such as adding, removing, or rearranging fields, or applying sort or filter options. This event provides two parameters: [DataSourceSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.FieldListRefreshedEventArgs.html#Syncfusion_Blazor_PivotView_FieldListRefreshedEventArgs_DataSourceSettings) and [PivotValues](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.FieldListRefreshedEventArgs.html#Syncfusion_Blazor_PivotView_FieldListRefreshedEventArgs_PivotValues). These parameters allow users to track and respond to updates in the field list. The event applies only to the static field list. -```cshtml +For example, when a user sorts a field in the field list, the field list updates, and the [FieldListRefreshed](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewEvents-1.html#Syncfusion_Blazor_PivotView_PivotViewEvents_1_FieldListRefreshed) event triggers. Users can perform custom operation inside that event. +```cshtml @@ -487,15 +484,19 @@ The event [FieldListRefreshed](https://help.syncfusion.com/cr/blazor/Syncfusion. //args -> Can get the report and engine. } } - ``` ### FieldDropped -The event [FieldDropped](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotFieldListEvents-1.html#Syncfusion_Blazor_PivotView_PivotFieldListEvents_1_FieldDropped) fires whenever a field is dropped in an axis. It has following parameters - [DroppedAxis](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.FieldDroppedEventArgs.html#Syncfusion_Blazor_PivotView_FieldDroppedEventArgs_DroppedAxis), [DroppedField](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.FieldDroppedEventArgs.html#Syncfusion_Blazor_PivotView_FieldDroppedEventArgs_DroppedField) and [DataSourceSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.FieldDroppedEventArgs.html#Syncfusion_Blazor_PivotView_FieldDroppedEventArgs_DataSourceSettings). In this illustration, the [DroppedField](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.FieldDroppedEventArgs.html#Syncfusion_Blazor_PivotView_FieldDroppedEventArgs_DroppedField) caption is modified through this event at runtime. +The [FieldDropped](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotFieldListEvents-1.html#Syncfusion_Blazor_PivotView_PivotFieldListEvents_1_FieldDropped) event triggers when a user drops a field into an axis in the Pivot Table. This event provides access to details about the dropped field and the Pivot Table's configuration through its parameters. The event includes the following parameters: -```cshtml +- [DataSourceSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.FieldDroppedEventArgs.html#Syncfusion_Blazor_PivotView_FieldDroppedEventArgs_DataSourceSettings): Represents the current report configuration of the Pivot Table, defined in the [PivotViewDataSourceSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html) property. It provides access to the Pivot Table's data structure and settings. +- [DroppedAxis](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.FieldDroppedEventArgs.html#Syncfusion_Blazor_PivotView_FieldDroppedEventArgs_DroppedAxis): Indicates the axis (such as row, column, value, or filter) where the field has been dropped. +- [DroppedField](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.FieldDroppedEventArgs.html#Syncfusion_Blazor_PivotView_FieldDroppedEventArgs_DroppedField): Contains details about the field item that was dropped, including its properties. + +In the following code example, we changed the caption of the dropped field using this event at runtime: +```cshtml @using Syncfusion.Blazor.PivotView @@ -531,34 +532,33 @@ The event [FieldDropped](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor args.DroppedField.Caption = args.DroppedField.Name + " --> " + args.DroppedAxis; } } - ``` ![Displaying Dropped Field in Blazor PivotTable FieldList](images/blazor-pivottable-field-dropped-in-field-list.png) ### OnActionBegin -The event [OnActionBegin](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewEvents-1.html#Syncfusion_Blazor_PivotView_PivotViewEvents_1_OnActionBegin) triggers when the UI actions such as sorting, filtering, aggregation or edit calculated field, that are present in the field list UI begin. This allows user to identify the current action being performed at runtime. It has the following parameters: +The [OnActionBegin](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewEvents-1.html#Syncfusion_Blazor_PivotView_PivotViewEvents_1_OnActionBegin) event triggers when UI actions such as sorting, filtering, aggregation, or editing calculated fields begin in the field list. This event allows users to identify the current action being performed at runtime and provides the following parameters: -* [DataSourceSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotActionBeginEventArgs.html#Syncfusion_Blazor_PivotView_PivotActionBeginEventArgs_DataSourceSettings) : It holds the current data source settings such as input data source, rows, columns, values, filters, format settings and so on. +* [DataSourceSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotActionBeginEventArgs.html#Syncfusion_Blazor_PivotView_PivotActionBeginEventArgs_DataSourceSettings): Contains the current data source settings, including input data source, rows, columns, values, filters, format settings, and other configurations. -* [ActionName](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotActionBeginEventArgs.html#Syncfusion_Blazor_PivotView_PivotActionBeginEventArgs_ActionName): It holds the name of the current action began. The following are the UI actions and their names: +* [ActionName](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotActionBeginEventArgs.html#Syncfusion_Blazor_PivotView_PivotActionBeginEventArgs_ActionName): Contains the name of the current action that has begun. The following table shows the UI actions and their corresponding action names: | Action | Action Name| -|----------------|-------------| +|------|-------------| | [Sort icon](./field-list#sorting-members)| Sort field| | [Filter icon](./field-list#filtering-members)| Filter field| -| [Aggregation](./field-list#changing-aggregation-type-of-value-fields-at-runtime) (Value type drop down and menu)| Aggregate field| -| [Edit icon](./calculated-field#editing-the-existing-calculated-field-formula) | Edit calculated field| +| [Aggregation](./field-list#changing-aggregation-type-of-value-fields-at-runtime) (Value type dropdown and menu)| Aggregate field| +| [Edit icon](./calculated-field#editing-the-existing-calculated-field-formula)| Edit calculated field| | [Calculated field button](./field-list#calculated-fields)| Open calculated field dialog| | [Field list](./field-list#in-built-field-list-popup)| Open field list| -| [Field list tree – Sort icon](./field-list#in-built-field-list-popup)| Sort field tree| +| [Field list tree – Sort icon](./field-list#option-to-sort-fields)| Sort field tree| -* [FieldInfo](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotActionBeginEventArgs.html#Syncfusion_Blazor_PivotView_PivotActionBeginEventArgs_FieldInfo): It holds the selected field information. +* [FieldInfo](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotActionBeginEventArgs.html#Syncfusion_Blazor_PivotView_PivotActionBeginEventArgs_FieldInfo): Contains information about the selected field. -N> This option is applicable only when the field based UI actions are performed such as filtering, sorting, removing field from grouping bar, editing and aggregation type change. +N> This parameter is available only when the action involves a specific field, such as filtering, sorting, removing a field from the grouping bar, editing, or changing the aggregation type. -* [Cancel](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotActionBeginEventArgs.html#Syncfusion_Blazor_PivotView_PivotActionBeginEventArgs_Cancel): It allows user to restrict the current action. +* [Cancel](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotActionBeginEventArgs.html#Syncfusion_Blazor_PivotView_PivotActionBeginEventArgs_Cancel): A boolean property that allows you to prevent the current action from completing. Set this to **true** to stop the action from proceeding. In the following example, opening pop-up field list can be restricted by setting the **args.Cancel** option to **true** in the `OnActionBegin` event. @@ -602,32 +602,32 @@ In the following example, opening pop-up field list can be restricted by setting args.Cancel = true; } } - } ``` + ### OnActionComplete -The event [OnActionComplete](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewEvents-1.html#Syncfusion_Blazor_PivotView_PivotViewEvents_1_OnActionComplete) triggers when a UI action such as sorting, filtering, aggregation or edit calculated field, that are present in the field list UI, is completed. This allows user to identify the current UI action being completed at runtime. It has the following parameters: +The [OnActionComplete](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewEvents-1.html#Syncfusion_Blazor_PivotView_PivotViewEvents_1_OnActionComplete) event is triggered when UI actions such as sorting, filtering, aggregation, or editing calculated fields in the field list are completed. This event allows users to identify which UI action has been completed at runtime. The event provides the following parameters: -* [DataSourceSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotActionCompleteEventArgs-1.html#Syncfusion_Blazor_PivotView_PivotActionCompleteEventArgs_1_DataSourceSettings): It holds the current data source settings such as input data source, rows, columns, values, filters, format settings and so on. +* [DataSourceSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotActionCompleteEventArgs-1.html#Syncfusion_Blazor_PivotView_PivotActionCompleteEventArgs_1_DataSourceSettings): Contains the current data source settings such as input data source, rows, columns, values, filters, format settings, and other configurations. -* [ActionName](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotActionCompleteEventArgs-1.html#Syncfusion_Blazor_PivotView_PivotActionCompleteEventArgs_1_ActionName): It holds the name of the current action completed. The following are the UI actions and their names: +* [ActionName](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotActionCompleteEventArgs-1.html#Syncfusion_Blazor_PivotView_PivotActionCompleteEventArgs_1_ActionName): Contains the name of the completed action. The following table shows the UI actions and their corresponding names: -| Action | Action Name| -|----------------|-------------| -| [Sort icon](./field-list#sorting-members)| Field sorted| -| [Filter icon](./field-list#filtering-members)| Field filtered| -| [Aggregation](./field-list#changing-aggregation-type-of-value-fields-at-runtime)(Value type drop down and menu)| Field aggregated| -| [Edit icon](./calculated-field#editing-the-existing-calculated-field-formula)| Calculated field edited| -| [Calculated field button](./field-list#calculated-fields)| Calculated field applied| -| [Field list](./field-list#in-built-field-list-popup)| Field list closed| -| [Field list tree – Sort icon](./field-list#in-built-field-list-popup)| Field tree sorted| +| Action | Action Name | +|------|-------------| +| [Sort icon](./field-list#sorting-members) | Field sorted | +| [Filter icon](./field-list#filtering-members) | Field filtered | +| [Aggregation](./field-list#changing-aggregation-type-of-value-fields-at-runtime) (Value type dropdown and menu) | Field aggregated | +| [Edit icon](./calculated-field#editing-the-existing-calculated-field-formula) | Calculated field edited | +| [Calculated field button](./field-list#calculated-fields) | Calculated field applied | +| [Field list](./field-list#in-built-field-list-popup) | Field list closed | +| [Field list tree – Sort icon](./field-list#option-to-sort-fields) | Field tree sorted | -* [FieldInfo](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotActionCompleteEventArgs-1.html#Syncfusion_Blazor_PivotView_PivotActionCompleteEventArgs_1_FieldInfo): It holds the selected field information. +* [FieldInfo](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotActionCompleteEventArgs-1.html#Syncfusion_Blazor_PivotView_PivotActionCompleteEventArgs_1_FieldInfo): Contains information about the selected field. This parameter is available only when field-based UI actions are performed, such as filtering, sorting, removing fields from the grouping bar, editing, and changing aggregation types. -N> This option is applicable only when the field based UI actions are performed such as filtering, sorting, removing field from grouping bar, editing and aggregation type change. +N> This parameter is available only when the action involves a specific field, such as filtering, sorting, removing a field from the grouping bar, editing, or changing the aggregation type. -* [ActionInfo](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotActionCompleteEventArgs-1.html#Syncfusion_Blazor_PivotView_PivotActionCompleteEventArgs_1_ActionInfo): It holds the unique information about the current UI action. For example, if sorting is completed, the event argument contains information such as sort order and the field name. +* [ActionInfo](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotActionCompleteEventArgs-1.html#Syncfusion_Blazor_PivotView_PivotActionCompleteEventArgs_1_ActionInfo): Contains specific information about the current UI action. For example, when sorting is completed, this parameter includes details such as the sort order and field name. ```cshtml @using Syncfusion.Blazor.PivotView @@ -669,24 +669,24 @@ N> This option is applicable only when the field based UI actions are performed // Triggers when the field list dialog is closed. } } - } ``` + ### OnActionFailure -The event [OnActionFailure](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewEvents-1.html#Syncfusion_Blazor_PivotView_PivotViewEvents_1_OnActionFailure) triggers when the current UI action fails to achieve the desired result. It has the following parameters: +The [OnActionFailure](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewEvents-1.html#Syncfusion_Blazor_PivotView_PivotViewEvents_1_OnActionFailure) event triggers when a UI action fails to produce the expected result. This event provides detailed information about the failure through the following parameters: * [ActionName](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotActionFailureEventArgs.html#Syncfusion_Blazor_PivotView_PivotActionFailureEventArgs_ActionName): It holds the name of the current action failed. The following are the UI actions and their names: | Action | Action Name| -|----------------|-------------| +|------|-------------| | [Sort icon](./field-list#sorting-members)| Sort field| | [Filter icon](./field-list#filtering-members)| Filter field| | [Aggregation](./field-list#changing-aggregation-type-of-value-fields-at-runtime) (Value type drop down and menu)| Aggregate field| | [Edit icon](./calculated-field#editing-the-existing-calculated-field-formula)| Edit calculated field| | [Calculated field button](./field-list#calculated-fields)| Open calculated field dialog| | [Field list](./field-list#in-built-field-list-popup)| Open field list| -| [Field list tree – Sort icon](./field-list#in-built-field-list-popup)| Sort field tree| +| [Field list tree – Sort icon](./field-list#option-to-sort-fields)| Sort field tree| * [ErrorInfo](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotActionFailureEventArgs.html#Syncfusion_Blazor_PivotView_PivotActionFailureEventArgs_ErrorInfo): It holds the error information of the current UI action. @@ -744,5 +744,4 @@ The event [OnActionFailure](https://help.syncfusion.com/cr/blazor/Syncfusion.Bla } ``` - -N> You can also explore the [Blazor Pivot Table example](https://blazor.syncfusion.com/demos/pivot-table/default-functionalities?theme=bootstrap5) to know how to render and configure the pivot table. +N> You can also explore the [Blazor Pivot Table example](https://blazor.syncfusion.com/demos/pivot-table/default-functionalities?theme=bootstrap5) to know how to render and configure the pivot table. \ No newline at end of file diff --git a/blazor/pivot-table/filtering.md b/blazor/pivot-table/filtering.md index db79487c1a..67a8cda5ed 100644 --- a/blazor/pivot-table/filtering.md +++ b/blazor/pivot-table/filtering.md @@ -11,24 +11,21 @@ documentation: ug # Filtering in Blazor Pivot Table Component -Filtering allows to view the pivot table with selective records based on the members that can be either included or excluded through UI and code-behind. +Filtering helps you focus on specific data by showing only the records you need in the Pivot Table. This allows you to analyze relevant information more effectively by including or excluding specific members through the user interface or programmatically. -The following are the three different types of filtering: +The Pivot Table offers three types of filtering options: * Member filtering * Label filtering * Value filtering -To have a quick glance about **Filtering** in the Blazor Pivot Table, watch this video: - -{% youtube -"youtube:https://www.youtube.com/watch?v=r6__Vaz4FDg"%} - -N> When all the above filtering options are disabled via code-behind, then the filter icon would be disabled in the field list or grouping bar UI. +N> When all filtering options are disabled programmatically, the filter icon will not appear in the field list or grouping bar interface. ## Member filtering -It allows to view the pivot table with selective records based on the included and excluded members in each field. By default, member filter option is enabled by the [AllowMemberFilter](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html#Syncfusion_Blazor_PivotView_PivotViewDataSourceSettings_1_AllowMemberFilter) boolean property in [PivotViewDataSourceSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html) class. This UI option helps end user to filter members by clicking the filter icon besides any field in the row, column and filter axes available in the field list or grouping bar UI at runtime. +This filtering option displays the Pivot Table with selective records based on the members you choose to include or exclude in each field. By default, member filtering is enabled through the [AllowMemberFilter](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html#Syncfusion_Blazor_PivotView_PivotViewDataSourceSettings_1_AllowMemberFilter) property in the [PivotViewDataSourceSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html) class. + +Users can apply member filters at runtime by clicking the filter icon next to any field in the row, column, and filter axes, available in both the field list and grouping bar interfaces. ![Number Filtering in Blazor PivotTable](images/blazor-pivottable-field-list-with-filter-icon.png)
@@ -38,14 +35,14 @@ It allows to view the pivot table with selective records based on the included a
![Blazor PivotGrid with Filter](images/blazor-pivotgrid-filter.png) -Meanwhile filtering can also be configured at code behind using the [PivotViewFilterSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewFilterSetting.html) class while initial rendering of the component. The basic settings required to add filter criteria are: +You can also configure filtering programmatically using the [PivotViewFilterSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewFilterSetting.html) class during the initial rendering of the component. The essential settings required to add filter criteria are: -* [Name](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewFilterSetting.html#Syncfusion_Blazor_PivotView_PivotViewFilterSetting_Name): It allows to set the appropriate field name. -* [Type](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewFilterSetting.html#Syncfusion_Blazor_PivotView_PivotViewFilterSetting_Type): It allows to set the filter type as [FilterType.Include](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.FilterType.html) or [FilterType.Exclude](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.FilterType.html) to include or exclude field members respectively. -* [Items](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewFilterSetting.html#Syncfusion_Blazor_PivotView_PivotViewFilterSetting_Items): It allows to set the members which needs to be either included or excluded from display. -* [LevelCount](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewFilterSetting.html#Syncfusion_Blazor_PivotView_PivotViewFilterSetting_LevelCount): It allows to set level count of the field to fetch data from the cube. **NOTE: This property is applicable only for OLAP data source.** +* [Name](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotFilterSetting.html#Syncfusion_Blazor_PivotView_PivotFilterSetting_Name): Sets the appropriate field name for filtering. +* [Type](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotFilterSetting.html#Syncfusion_Blazor_PivotView_PivotFilterSetting_Type): Specifies the filter type as [FilterType.Include](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.FilterType.html#Syncfusion_Blazor_PivotView_FilterType_Include) or [FilterType.Exclude](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.FilterType.html#Syncfusion_Blazor_PivotView_FilterType_Exclude) to include or exclude field members respectively. +* [Items](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotFilterSetting.html#Syncfusion_Blazor_PivotView_PivotFilterSetting_Items): Defines the members that need to be either included or excluded from the display. +* [LevelCount](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotFilterSetting.html#Syncfusion_Blazor_PivotView_PivotFilterSetting_LevelCount): Sets the level count of the field to fetch data from the cube. **NOTE: This property is applicable only for OLAP data sources.** -N> When specifying unavailable or inappropriate members to include or exclude filter items collection, they will be ignored. +N> When you specify unavailable or inappropriate members in the include or exclude filter items collection, they will be ignored. ```cshtml @using Syncfusion.Blazor.PivotView @@ -89,31 +86,37 @@ N> When specifying unavailable or inappropriate members to include or exclude fi ### Option to select and unselect all members -The member filter dialog comes with an option "All", which on checked selects all members and on unchecked deselects all members. The option "All" would appear in intermediate state mentioning that both selected and unselected child members are available. +This option lets you quickly manage all members at once, saving time when working with large datasets. The member filter dialog includes an **All** option that provides a convenient way to select or deselect all available members with a single click. + +When you check the **All** option, it selects all members in the list. When you uncheck it, all members become deselected. If you manually select some members while others remain unselected, the **All** option displays an intermediate state (partially checked) to show that the list contains both selected and unselected members. ![Displaying Select and UnSelect All Members in Blazor PivotTable](images/blazor-pivottable-select-unselect-member.png) -When all members are deselected, the "Ok" button in member filter dialog would be disabled, meaning, at least one member should be selected and bound to the pivot table component. +N> When all members are deselected, the **OK** button becomes disabled. You must select at least one member to apply the filter and display data in the Pivot Table. ![Displaying Unselected Members in Blazor PivotTable](images/blazor-pivottable-uncheck-members.png) ### Provision to search specific member(s) -By default, search option is available to quickly navigate to the desired members. It can be done by entering the starting character(s) of the actual members. +This option helps you quickly locate specific members without scrolling through long lists. The member filter dialog includes a built-in search box that allows you to find members by typing part of their name. + +Simply enter the starting characters of the member name you want to find, and the list will automatically filter to show only matching members. This makes it easy to locate and select specific members, especially when dealing with large datasets. ![Searching in Blazor PivotTable](images/blazor-pivottable-search.png) ### Option to sort members -User can sort members within the member editor either to ascending (or) descending using the built-in sort icons. When both ascending and descending options are not chosen, then members will be shown in the default order (retrieved as such from data source). +This option allows you to organize members in a logical order for easier selection and review. The member filter dialog provides built-in sort icons that let you arrange members in ascending or descending order. + +You can click the ascending sort icon to arrange members from A to Z (or lowest to highest for numerical values), or click the descending sort icon to arrange them from Z to A (or highest to lowest). When neither sorting option is selected, members appear in their original order as retrieved from the data source. ![Sorting in Blazor PivotTable](images/blazor-pivottable-sorting.png) -### Performance Tips +### Performance tips -In member filter dialog, end user can set the limit to display members while loading large data. Based on this limit, initial loading will get completed quickly without any performance constraint. Also, a message with remaining member count, which are not a part of the UI, will be displayed in the member editor. +The member filter dialog improves loading performance when working with large datasets by limiting the number of members displayed initially. This helps you work with extensive data without experiencing delays while the member list loads. -The data limit can be set using the [MaxNodeLimitInMemberEditor](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SfPivotView-1.html#Syncfusion_Blazor_PivotView_SfPivotView_1_MaxNodeLimitInMemberEditor) property in [SfPivotView](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SfPivotView-1.html) class. By default, the property holds the numeric value **1000**. +You can control how many members are displayed in the member filter dialog using the [MaxNodeLimitInMemberEditor](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SfPivotView-1.html#Syncfusion_Blazor_PivotView_SfPivotView_1_MaxNodeLimitInMemberEditor) property in [SfPivotView](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SfPivotView-1.html) class. By default, this property is set to **1000**. When your data contains more members than this limit, only the specified number will be shown initially, and a message will indicate how many additional members are available. ```cshtml @using Syncfusion.Blazor.PivotView @@ -161,20 +164,20 @@ The data limit can be set using the [MaxNodeLimitInMemberEditor](https://help.sy ![Blazor PivotTable with Maximum Node Limit](images/blazor-pivottable-maximum-node-limit.png) -Meanwhile, end user can utilize the search option to refine the members from the exceeded limit. For example, consider that there are 5000 members in the name "Node 1", "Node 2", "Node 3", and so on... and user has set the property [MaxNodeLimitInMemberEditor](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SfPivotView-1.html#Syncfusion_Blazor_PivotView_SfPivotView_1_MaxNodeLimitInMemberEditor) to **500**. In this case, only the initial 500 members will be displayed by default leaving a message "4500 more items. Search to refine further.". To get the member(s) between 501 to 5000, enter the starting character(s) in search option to bring the desired member(s) from the exceeded limit to the UI. Now, end user can either check or uncheck to continue with the filtering process. - -![Searching inside Maximum Node Limit in Blazor PivotTable](images/blazor-pivottable-search-in-max-node-limit.png) +When the member count exceeds your set limit, you can use the search option to find specific members beyond the displayed range. For example, if your data contains 5000 members named "Node 1", "Node 2", "Node 3", and so on, and you set the [MaxNodeLimitInMemberEditor](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SfPivotView-1.html#Syncfusion_Blazor_PivotView_SfPivotView_1_MaxNodeLimitInMemberEditor) property to **500**, only the first 500 members will appear by default. The dialog will show a message like "4500 more items. Search to refine further." To access members 501 to 5000, type the starting characters in the search box to locate the desired members. Once the members appear in the list, you can select or deselect them to apply your filtering preferences. ### Loading members on-demand N> This property is applicable only for OLAP data sources. -Allows to load members inside the filter dialog on-demand by setting the [LoadOnDemandInMemberEditor](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SfPivotView-1.html#Syncfusion_Blazor_PivotView_SfPivotView_1_LoadOnDemandInMemberEditor) property to **true**. By default, first level is loaded in the member editor from the OLAP cube. So, the member editor will be opened quickly, without any performance constraints. By default, this property is set to **true** and the search will only be applied to the level members that are loaded. In the meantime, the next level members can be added using either of the following methods. +This option improves the performance of the member editor by loading members only when needed, rather than loading all members at once. You can enable this by setting the [LoadOnDemandInMemberEditor](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SfPivotView-1.html#Syncfusion_Blazor_PivotView_SfPivotView_1_LoadOnDemandInMemberEditor) property to **true**. When enabled, only the first level members are loaded initially from the OLAP cube, allowing the member editor to open quickly without performance delays. -* By clicking on the expander button of the respective member, only its child members will be loaded. -* Select a level from the drop-down list that will load all members up to the chosen level from the cube. +By default, this property is set to **true** and search operations will only apply to the currently loaded level members. You can load additional level members using either of the following methods: -This will help to avoid performance lags when opening a member editor whose hierarchy has a large number of members. Once level members are queried and added one after the other, they will be maintained internally (for all operations like dialog re-opening, drag and drop, etc...) and will not be removed until the web page is refreshed. +* **Expand individual members**: Click the expander button next to any member to load only its child members. +* **Load by level selection**: Choose a specific level from the dropdown list to load all members up to that selected level from the cube. + +This approach prevents performance issues when working with hierarchies that contain large numbers of members. Once level members are loaded, they remain available for all subsequent operations (such as reopening the dialog or drag-and-drop actions) and persist until you refresh the web page. ```cshtml @@ -206,14 +209,14 @@ This will help to avoid performance lags when opening a member editor whose hier ![On-Demand Loading in Blazor PivotTable](images/blazor-pivottable-on-demand-load.png) -In the example above, "Customer Geography" dimension is loaded with first level (Country) during initial loading. The search will therefore be applied on the members of the "Country" level alone. After that, you can load members to the next level (State-Province) on-demand by expanding the "Australia" node (or) by selecting the "State-Province" level from the drop down list. +In the example above, the "Customer Geography" dimension loads with only the first level (Country) initially. Search operations will apply only to the "Country" level members. You can then load the next level members (State-Province) on-demand in two ways: -* When you expand "Australia", the "State-Province" members will be loaded to "Australia" alone. -* If you load the members by selecting the "State-Province" level from the drop-down list means, the "State-Province" members will be loaded across all countries like Australia, Canada, France, etc... +* **Expand specific countries**: When you expand "Australia", the "State-Province" members load only for Australia. +* **Load all states by level**: When you select "State-Province" from the dropdown list, all "State-Province" members load across all countries (Australia, Canada, France, etc.). -Once members are loaded, they are maintained internally and will not be removed until the page is refreshed. +Once loaded, these members are stored internally and remain available until you refresh the page. -If the property is set to **false**, all members of all levels will be queried and added during initial loading itself. Only one query is executed here to retrieve all members from all levels. Since it fetches large number of members, you can feel the performance difference while opening the member editor. But still, expand and search operation is quick here because the members have already been retrieved and populated. +When the [LoadOnDemandInMemberEditor](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SfPivotView-1.html#Syncfusion_Blazor_PivotView_SfPivotView_1_LoadOnDemandInMemberEditor) property is set to **false**, all members from all levels are loaded during the initial setup. This approach executes a single query to retrieve all members at once. While this may cause slower performance when opening the member editor due to the large number of members being fetched, expand and search operations will be faster since all members are already available. ![Blazor PivotTable with Initial Member](images/blazor-pivottable-initial-member.png) @@ -221,7 +224,9 @@ If the property is set to **false**, all members of all levels will be queried a N> This property is applicable only for OLAP data sources. -Allows user to load the members on the basis of the level number set in the [LevelCount](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewFilterSetting.html#Syncfusion_Blazor_PivotView_PivotViewFilterSetting_LevelCount) property in the [FilterSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewFilterSettings.html). By default, this property is set to **1** and the search will only take place within the members of the first level. +This option enables you to control the depth of member loading by specifying how many levels should be loaded initially. By setting the [LevelCount](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotFilterSetting.html#Syncfusion_Blazor_PivotView_PivotFilterSetting_LevelCount) property in the [PivotViewFilterSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewFilterSettings.html), you can improve performance and focus filtering operations on specific hierarchy levels. + +The [LevelCount](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotFilterSetting.html#Syncfusion_Blazor_PivotView_PivotFilterSetting_LevelCount) property is set to **1** by default, which means only the first level members are loaded initially. When you apply filters or search operations, they will only affect the members within the loaded levels. ```cshtml @@ -256,17 +261,17 @@ Allows user to load the members on the basis of the level number set in the [Lev ![Loading Member based on Level Count in Blazor PivotTable](images/blazor-pivottable-load-member-based-on-level.png) -In the example above, we set [LevelCount](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewFilterSetting.html#Syncfusion_Blazor_PivotView_PivotViewFilterSetting_LevelCount) as **2** for the "Customer Geography" dimension in [FilterSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewFilterSettings.html). So, the "Customer Geography" dimension is loaded with the "Country" and "State-Province" levels during initial loading itself. The search will therefore be applied only to the members of the "Country" and "State-Province" levels. After that, you can load members to the next level on-demand by expanding the respective "State-Province" node (or) by selecting the "City" level from the drop-down list. +In the example above, the [LevelCount](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotFilterSetting.html#Syncfusion_Blazor_PivotView_PivotFilterSetting_LevelCount) is set to **2** for the "Customer Geography" dimension in [PivotViewFilterSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewFilterSettings.html). This loads both the "Country" and "State-Province" levels during the initial loading process. Any search or filter operations will be applied only to the members within these two levels. To access members from deeper levels like "City", you can either expand the respective "State-Province" node or select the "City" level from the dropdown list. ## Label filtering -The label filtering helps to view the pivot table with selective header text in fields across row and column axes based on the applied filter criteria. The following are the three different types of label filtering available: +Label filtering allows you to display only the data with specific header text across row and column fields, making it easier to focus on relevant information in your Pivot Table. This filtering works with three types of data: -* Filtering string data type -* Filtering number data type -* Filtering date data type +* String data type +* Number data type +* Date data type -The label filtering dialog can be enabled by setting the [AllowLabelFilter](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html#Syncfusion_Blazor_PivotView_PivotViewDataSourceSettings_1_AllowLabelFilter) property in [PivotViewDataSourceSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html) class to **true**. After enabling this API, click the filter icon besides any field in row or column axis available in field list or grouping bar UI. Now a filtering dialog will appear and navigate to "Label" tab to perform label filtering operations. +To enable label filtering, set the [AllowLabelFilter](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html#Syncfusion_Blazor_PivotView_PivotViewDataSourceSettings_1_AllowLabelFilter) property to **true** in the [PivotViewDataSourceSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html) class. Once enabled, you can access the filtering options by clicking the filter icon next to any field in the row or column axis of the field list or grouping bar. This opens the filtering dialog where you can navigate to the "Label" tab to apply your label filtering criteria. ```cshtml @using Syncfusion.Blazor.PivotView @@ -316,34 +321,37 @@ N> In label filtering UI, based on the field chosen, it’s member data type is ### Filtering string data type through code -This type of filtering is exclusively applicable for fields with members in string data type. The filtering can be configured using the [PivotViewFilterSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewFilterSettings.html) class through code-behind. The properties required for label filter are: +String-based label filtering enables you to programmatically show only data that matches specific text values in your row and column fields, making it easier to focus on the exact information you need. + +This filtering approach is specifically designed for fields containing string data type members. You can configure the filtering through the [PivotViewFilterSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewFilterSetting.html) class in your code. The following properties are required for label filtering: -* [Name](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewFilterSetting.html#Syncfusion_Blazor_PivotView_PivotViewFilterSetting_Name): Sets the field name. -* [Type](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewFilterSetting.html#Syncfusion_Blazor_PivotView_PivotViewFilterSetting_Type): Sets the filter type as [FilterType.Label](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.FilterType.html#Syncfusion_Blazor_PivotView_FilterType_Label) to the field. -* [Condition](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewFilterSetting.html#Syncfusion_Blazor_PivotView_PivotViewFilterSetting_Condition): Sets the operator type such as [Operators.Equals](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.Operators.html), [Operators.GreaterThan](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.Operators.html#Syncfusion_Blazor_PivotView_Operators_GreaterThan), [Operators.LessThan](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.Operators.html#Syncfusion_Blazor_PivotView_Operators_LessThan), etc. -* [Value1](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewFilterSetting.html#Syncfusion_Blazor_PivotView_PivotViewFilterSetting_Value1): Sets the start value. -* [Value2](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewFilterSetting.html#Syncfusion_Blazor_PivotView_PivotViewFilterSetting_Value2): Sets the end value. It is applicable only for the operator such as [Operators.Between](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.Operators.html#Syncfusion_Blazor_PivotView_Operators_Between) and [Operators.NotBetween](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.Operators.html#Syncfusion_Blazor_PivotView_Operators_NotBetween). -* [SelectedField](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewFilterSetting.html#Syncfusion_Blazor_PivotView_PivotViewFilterSetting_SelectedField): Sets level name of a dimension, where the filter settings are to be applied. **NOTE: This property applicable only for OLAP data source.** +* [Name](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotFilterSetting.html#Syncfusion_Blazor_PivotView_PivotFilterSetting_Name): Specifies the field name to apply the filter. +* [Type](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotFilterSetting.html#Syncfusion_Blazor_PivotView_PivotFilterSetting_Type): Sets the filter type as [FilterType.Label](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.FilterType.html#Syncfusion_Blazor_PivotView_FilterType_Label) for the specified field. +* [Condition](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotFilterSetting.html#Syncfusion_Blazor_PivotView_PivotFilterSetting_Condition): Defines the operator type such as [Operators.Equals](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.Operators.html#Syncfusion_Blazor_PivotView_Operators_Equals), [Operators.GreaterThan](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.Operators.html#Syncfusion_Blazor_PivotView_Operators_GreaterThan), [Operators.LessThan](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.Operators.html#Syncfusion_Blazor_PivotView_Operators_LessThan), and others. +* [Value1](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotFilterSetting.html#Syncfusion_Blazor_PivotView_PivotFilterSetting_Value1): Sets the primary value for comparison. +* [Value2](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotFilterSetting.html#Syncfusion_Blazor_PivotView_PivotFilterSetting_Value2): Sets the secondary value for comparison. This property is only applicable for operators like [Operators.Between](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.Operators.html#Syncfusion_Blazor_PivotView_Operators_Between) and [Operators.NotBetween](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.Operators.html#Syncfusion_Blazor_PivotView_Operators_NotBetween). +* [SelectedField](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotFilterSetting.html#Syncfusion_Blazor_PivotView_PivotFilterSetting_SelectedField): Specifies the level name of a dimension where the filter should be applied. **NOTE: This property is applicable only for OLAP data sources.** -For example, in a "Country" field, to show countries names that contains "United" text alone, set [Value1](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewFilterSetting.html#Syncfusion_Blazor_PivotView_PivotViewFilterSetting_Value1) to "United" and [Condition](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewFilterSetting.html#Syncfusion_Blazor_PivotView_PivotViewFilterSetting_Condition) to [Operators.Contains](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.Operators.html#Syncfusion_Blazor_PivotView_Operators_Contains) for desired output in pivot table. -[Operators](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.Operators.html) that can be used in label filtering are: +For example, to display only countries containing "United" in their name from a "Country" field, set the [Value1](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotFilterSetting.html#Syncfusion_Blazor_PivotView_PivotFilterSetting_Value1) property to "United" and the [Condition](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotFilterSetting.html#Syncfusion_Blazor_PivotView_PivotFilterSetting_Condition) property to [Operators.Contains](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.Operators.html#Syncfusion_Blazor_PivotView_Operators_Contains). + +The following table shows all available operators for label filtering: | Operator | Description | |------|-------------| -| Equals| Displays the pivot table that matches with the text.| -| DoesNotEquals| Displays the pivot table that does not match with the given text.| -| BeginWith| Displays the pivot table that begins with text.| -| DoesNotBeginWith| Displays the pivot table that does not begins with text.| -| EndsWith| Displays the pivot table that ends with text.| -| DoesNotEndsWith| Displays the pivot table that does not ends with text.| -| Contains| Displays the pivot table that contains text.| -| DoesNotContains| Displays the pivot table that does not contain text.| -| GreaterThan| Displays the pivot table when the text is greater.| -| GreaterThanOrEqualTo| Displays the pivot table when the text is greater than or equal.| -| LessThan| Displays the pivot table when the text is lesser.| -| LessThanOrEqualTo| Displays the pivot table when the text is lesser than or equal.| -| Between| Displays the pivot table that records between the start and end text.| -| NotBetween| Displays the pivot table that does not record between the start and end text.| +| Equals| Shows records that exactly match the specified text.| +| DoesNotEquals| Shows records that do not match the specified text.| +| BeginWith| Shows records that start with the specified text.| +| DoesNotBeginWith| Shows records that do not start with the specified text.| +| EndsWith| Shows records that end with the specified text.| +| DoesNotEndsWith| Shows records that do not end with the specified text.| +| Contains| Shows records that contain the specified text anywhere.| +| DoesNotContains| Shows records that do not contain the specified text.| +| GreaterThan| Shows records where the text value is alphabetically greater.| +| GreaterThanOrEqualTo| Shows records where the text value is alphabetically greater than or equal.| +| LessThan| Shows records where the text value is alphabetically less.| +| LessThanOrEqualTo| Shows records where the text value is alphabetically less than or equal.| +| Between| Shows records with text values that fall between two specified values.| +| NotBetween| Shows records with text values that do not fall between two specified values.| ```cshtml @using Syncfusion.Blazor.PivotView @@ -387,13 +395,20 @@ For example, in a "Country" field, to show countries names that contains "United ### Filtering number data type through code -N> This option is applicable only for relational data source. +N> This option is applicable only for relational data sources. + +Filter numeric data programmatically to display only values that meet specific numeric conditions, helping you analyze data patterns and ranges more effectively. This filtering approach is specifically designed for fields containing numeric data types and follows the same configuration method as string data filtering, with one key difference: set the [Type](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotFilterSetting.html#Syncfusion_Blazor_PivotView_PivotFilterSetting_Type) property to [FilterType.Number](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.FilterType.html#Syncfusion_Blazor_PivotView_FilterType_Number) enumeration instead of [FilterType.Label](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.FilterType.html#Syncfusion_Blazor_PivotView_FilterType_Label). + +To filter numeric values, specify the filtering criteria using the following properties: +- [Value1](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotFilterSetting.html#Syncfusion_Blazor_PivotView_PivotFilterSetting_Value1): The primary value for comparison. +- [Condition](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotFilterSetting.html#Syncfusion_Blazor_PivotView_PivotFilterSetting_Condition): The comparison operator. +- [Value2](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotFilterSetting.html#Syncfusion_Blazor_PivotView_PivotFilterSetting_Value2): The secondary value (required for [Operators.Between](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.Operators.html#Syncfusion_Blazor_PivotView_Operators_Between) and [Operators.NotBetween](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.Operators.html#Syncfusion_Blazor_PivotView_Operators_NotBetween) conditions). -This type of filtering is exclusively applicable for fields with members in number data type. The filtering can be configured in a similar way explained in the previous section - "Filtering string data type through code", except the [Type](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewFilterSetting.html#Syncfusion_Blazor_PivotView_PivotViewFilterSetting_Type) property setting. For number data type, set the [Type](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewFilterSetting.html#Syncfusion_Blazor_PivotView_PivotViewFilterSetting_Type) property to [FilterType.Number](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.FilterType.html#Syncfusion_Blazor_PivotView_FilterType_Number) enumeration. +For example, to display only sales data where the "Sold" field values are between 90 and 100, set [Value1](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewFilterSetting.html#Syncfusion_Blazor_PivotView_PivotViewFilterSetting_Value1) to "90", [Value2](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewFilterSetting.html#Syncfusion_Blazor_PivotView_PivotViewFilterSetting_Value2) to "100", and [Condition](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewFilterSetting.html#Syncfusion_Blazor_PivotView_PivotViewFilterSetting_Condition) to [Operators.Between](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.Operators.html#Syncfusion_Blazor_PivotView_Operators_Between). -For example, in a "Sold" field, to show the values between "90" to "100", set [Value1](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewFilterSetting.html#Syncfusion_Blazor_PivotView_PivotViewFilterSetting_Value1) to "90", [Value1](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewFilterSetting.html#Syncfusion_Blazor_PivotView_PivotViewFilterSetting_Value2) to "100" and [Condition](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewFilterSetting.html#Syncfusion_Blazor_PivotView_PivotViewFilterSetting_Condition) to [Operators.Between](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.Operators.html#Syncfusion_Blazor_PivotView_Operators_Between) for desired output in pivot table. +N> The following operators are supported for number data type: [Operators.Equals](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.Operators.html#Syncfusion_Blazor_PivotView_Operators_Equals), [Operators.DoesNotEquals](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.Operators.html#Syncfusion_Blazor_PivotView_Operators_DoesNotEquals), [Operators.GreaterThan](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.Operators.html#Syncfusion_Blazor_PivotView_Operators_GreaterThan), [Operators.GreaterThanOrEqualTo](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.Operators.html#Syncfusion_Blazor_PivotView_Operators_GreaterThanOrEqualTo), [Operators.LessThan](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.Operators.html#Syncfusion_Blazor_PivotView_Operators_LessThan), [Operators.LessThanOrEqualTo](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.Operators.html#Syncfusion_Blazor_PivotView_Operators_LessThanOrEqualTo), [Operators.Between](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.Operators.html#Syncfusion_Blazor_PivotView_Operators_Between), and [Operators.NotBetween](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.Operators.html#Syncfusion_Blazor_PivotView_Operators_NotBetween). -N> Operators like [Operators.Equals](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.Operators.html#Syncfusion_Blazor_PivotView_Operators_Equals), [Operators.DoesNotEquals](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.Operators.html#Syncfusion_Blazor_PivotView_Operators_DoesNotEquals), [Operators.GreaterThan](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.Operators.html#Syncfusion_Blazor_PivotView_Operators_GreaterThan), [Operators.GreaterThanOrEqualTo](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.Operators.html#Syncfusion_Blazor_PivotView_Operators_GreaterThanOrEqualTo), [Operators.LessThan](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.Operators.html#Syncfusion_Blazor_PivotView_Operators_LessThan), [Operators.LessThanOrEqualTo](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.Operators.html#Syncfusion_Blazor_PivotView_Operators_LessThanOrEqualTo), [Operators.Between](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.Operators.html), and [Operators.NotBetween](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.Operators.html#Syncfusion_Blazor_PivotView_Operators_NotBetween) are alone applicable for number data type. +N> Number filtering is available only when the field contains numeric data format. ```cshtml @using Syncfusion.Blazor.PivotView @@ -436,11 +451,13 @@ N> Operators like [Operators.Equals](https://help.syncfusion.com/cr/blazor/Syncf ### Filtering date data type through code -This type of filtering is exclusively applicable for fields with members in date data type. The filtering can be configured in a similar way explained in the prior section - "Filtering string data type through code", except the [Type](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewFilterSetting.html#Syncfusion_Blazor_PivotView_PivotViewFilterSetting_Type) property setting. For date data type, set the [Type](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewFilterSetting.html#Syncfusion_Blazor_PivotView_PivotViewFilterSetting_Type) property to [FilterType.Date](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.FilterType.html#Syncfusion_Blazor_PivotView_FilterType_Date) enumeration. +This filtering option makes it simple to filter data based on date values in your fields, helping you quickly focus on records from specific time periods. This type of filtering is only available for fields that contain date data types and can be configured programmatically using the same approach as explained in the previous section "Filtering string data type through code", with one key difference: set the [Type](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotFilterSetting.html#Syncfusion_Blazor_PivotView_PivotFilterSetting_Type) property to [FilterType.Date](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.FilterType.html#Syncfusion_Blazor_PivotView_FilterType_Date). -For example, in a "Delivery Date" field, to show the delivery records of the first week of the year 2019, then set [Value1](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewFilterSetting.html#Syncfusion_Blazor_PivotView_PivotViewFilterSetting_Value1) to "2019-01-07" and [Condition](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewFilterSetting.html#Syncfusion_Blazor_PivotView_PivotViewFilterSetting_Condition) to [Operators.Before](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.Operators.html#Syncfusion_Blazor_PivotView_Operators_Before) for desired output in pivot table. +To apply date filtering, specify your filtering criteria using the [Value1](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotFilterSetting.html#Syncfusion_Blazor_PivotView_PivotFilterSetting_Value1) and [Condition](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotFilterSetting.html#Syncfusion_Blazor_PivotView_PivotFilterSetting_Condition) properties. For example, if you have a "Delivery Date" field and want to show delivery records from before a specific date like "2019-01-07", set the [Value1](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotFilterSetting.html#Syncfusion_Blazor_PivotView_PivotFilterSetting_Value1) property to "2019-01-07" and the [Condition](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotFilterSetting.html#Syncfusion_Blazor_PivotView_PivotFilterSetting_Condition) property to [Operators.Before](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.Operators.html#Syncfusion_Blazor_PivotView_Operators_Before). This will display only the records with delivery dates before January 7, 2019 in your Pivot Table. -N> Operators like [Operators.Equals](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.Operators.html#Syncfusion_Blazor_PivotView_Operators_Equals), [Operators.DoesNotEquals](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.Operators.html#Syncfusion_Blazor_PivotView_Operators_DoesNotEquals), [Operators.Before](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.Operators.html#Syncfusion_Blazor_PivotView_Operators_Before), [Operators.BeforeOrEqualTo](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.Operators.html#Syncfusion_Blazor_PivotView_Operators_BeforeOrEqualTo), [Operators.After](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.Operators.html#Syncfusion_Blazor_PivotView_Operators_After), [Operators.AfterOrEqualTo](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.Operators.html#Syncfusion_Blazor_PivotView_Operators_AfterQrEqualTo), [Operators.Between](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.Operators.html#Syncfusion_Blazor_PivotView_Operators_Between), and [Operators.NotBetween](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.Operators.html#Syncfusion_Blazor_PivotView_Operators_NotBetween) are alone applicable for date data type. +N> You can use the following operators with date data type filtering: [Operators.Equals](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.Operators.html#Syncfusion_Blazor_PivotView_Operators_Equals), [Operators.DoesNotEquals](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.Operators.html#Syncfusion_Blazor_PivotView_Operators_DoesNotEquals), [Operators.Before](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.Operators.html#Syncfusion_Blazor_PivotView_Operators_Before), [Operators.BeforeOrEqualTo](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.Operators.html#Syncfusion_Blazor_PivotView_Operators_BeforeOrEqualTo), [Operators.After](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.Operators.html#Syncfusion_Blazor_PivotView_Operators_After), [Operators.AfterOrEqualTo](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.Operators.html#Syncfusion_Blazor_PivotView_Operators_AfterOrEqualTo), [Operators.Between](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.Operators.html#Syncfusion_Blazor_PivotView_Operators_Between), and [Operators.NotBetween](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.Operators.html#Syncfusion_Blazor_PivotView_Operators_NotBetween). + +N> Date filtering is available only when the field has date type [FormatSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewFormatSettings.html) configured. ```cshtml @using Syncfusion.Blazor.PivotView @@ -494,17 +511,17 @@ N> Operators like [Operators.Equals](https://help.syncfusion.com/cr/blazor/Syncf ![Date Filtering in Blazor PivotTable](images/blazor-pivottable-date-filtering.png) -### Clearing the existing date filter +### Clearing the existing label filter -End user can clear the applied date filter by simply click the "Clear" option at the bottom of the filter dialog under "date" tab. +You can clear the applied label filter by clicking the **Clear** option at the bottom of the filter dialog. This option is located under the **Label** tab for string and number type filtering, and under the **Date** tab for date type filtering. ![Clearing Date Filter in Blazor PivotTable](images/blazor-pivottable-clear-filter.png) ## Value filtering -The value filtering helps to perform filter operation based only on value fields and its resultant aggregated values over other fields defined in row and column axes. +Value filtering allows you to filter data based on aggregated values from measure fields, helping you focus on specific data ranges that meet your criteria. -The value filtering dialog can be enabled by setting the [AllowValueFilter](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html#Syncfusion_Blazor_PivotView_PivotViewDataSourceSettings_1_AllowLabelFilter) property in [PivotViewDataSourceSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html) class to **true**. After enabling this API, click the filter icon besides any field in row or column axis available in field list or grouping bar UI. Now a filtering dialog will appear and navigate to "Value" tab to perform value filtering operations. +You can enable value filtering by setting the [AllowValueFilter](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html#Syncfusion_Blazor_PivotView_PivotViewDataSourceSettings_1_AllowValueFilter) property to **true** in the [PivotViewDataSourceSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html) class. Once enabled, click the filter icon next to any field in the row or column axis within the field list or grouping bar. A filtering dialog will appear where you can navigate to the "Value" tab to perform value filtering operations. ```cshtml @using Syncfusion.Blazor.PivotView @@ -550,32 +567,30 @@ The value filtering dialog can be enabled by setting the [AllowValueFilter](http
![Value Filtering in Blazor PivotGrid](images/blazor-pivotgrid-value-filtering.png) -The value filtering can also be configured using the [PivotViewFilterSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewFilterSetting.html) class through code-behind. The properties required for value filter are: - -* [Name](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewFilterSetting.html#Syncfusion_Blazor_PivotView_PivotViewFilterSetting_Name): Sets the normal field name. -* [Type](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewFilterSetting.html#Syncfusion_Blazor_PivotView_PivotViewFilterSetting_Type): Sets the filter type as [FilterType.Value](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.FilterType.html) to the field. -* [Measure](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewFilterSetting.html#Syncfusion_Blazor_PivotView_PivotViewFilterSetting_Measure): Sets the value field name. -* [Condition](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewFilterSetting.html#Syncfusion_Blazor_PivotView_PivotViewFilterSetting_Condition): Sets the operator type such as [Operators.Equals](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.Operators.html), [Operators.GreaterThan](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.Operators.html), [Operators.LessThan](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.Operators.html#Syncfusion_Blazor_PivotView_Operators_LessThan) etc. -* [Value1](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewFilterSetting.html#Syncfusion_Blazor_PivotView_PivotViewFilterSetting_Value1): Sets the start value. -* [Value2](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewFilterSetting.html#Syncfusion_Blazor_PivotView_PivotViewFilterSetting_Value2): Sets the end value. It is applicable only for the operator such as [Operators.Between](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.Operators.html#Syncfusion_Blazor_PivotView_Operators_Between) and [Operators.NotBetween](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.Operators.html#Syncfusion_Blazor_PivotView_Operators_NotBetween). -* [SelectedField](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewFilterSetting.html#Syncfusion_Blazor_PivotView_PivotViewFilterSetting_SelectedField): Sets level name of a dimension, where the filter settings are to be applied. +You can also configure value filtering programmatically using the [PivotViewFilterSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewFilterSetting.html) class. The following properties are required for value filtering: -N> [SelectedField](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewFilterSetting.html#Syncfusion_Blazor_PivotView_PivotViewFilterSetting_SelectedField) property applicable only for OLAP data source. +* [Name](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotFilterSetting.html#Syncfusion_Blazor_PivotView_PivotFilterSetting_Name): Specifies the field name to which the filter applies. +* [Type](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotFilterSetting.html#Syncfusion_Blazor_PivotView_PivotFilterSetting_Type): Sets the filter type as [FilterType.Value](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.FilterType.html#Syncfusion_Blazor_PivotView_FilterType_Value). +* [Measure](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotFilterSetting.html#Syncfusion_Blazor_PivotView_PivotFilterSetting_Measure): Specifies the value field name used for filtering. +* [Condition](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotFilterSetting.html#Syncfusion_Blazor_PivotView_PivotFilterSetting_Condition): Defines the comparison operator such as [Operators.Equals](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.Operators.html#Syncfusion_Blazor_PivotView_Operators_Equals), [Operators.GreaterThan](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.Operators.html#Syncfusion_Blazor_PivotView_Operators_GreaterThan), or [Operators.LessThan](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.Operators.html#Syncfusion_Blazor_PivotView_Operators_LessThan). +* [Value1](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotFilterSetting.html#Syncfusion_Blazor_PivotView_PivotFilterSetting_Value1): Sets the comparison value or the start value for range operations. +* [Value2](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotFilterSetting.html#Syncfusion_Blazor_PivotView_PivotFilterSetting_Value2): Sets the end value, applicable only for [Operators.Between](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.Operators.html#Syncfusion_Blazor_PivotView_Operators_Between) and [Operators.NotBetween](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.Operators.html#Syncfusion_Blazor_PivotView_Operators_NotBetween) operators. +* [SelectedField](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotFilterSetting.html#Syncfusion_Blazor_PivotView_PivotFilterSetting_SelectedField): Specifies the dimension level name where filter settings apply. **Note: This property is only applicable for OLAP data sources.** -For example, to show the data where total sum of units sold for each country exceeding 1500, set [Value1](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewFilterSetting.html#Syncfusion_Blazor_PivotView_PivotViewFilterSetting_Value1) to "1500" and [Condition](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewFilterSetting.html#Syncfusion_Blazor_PivotView_PivotViewFilterSetting_Condition) to [Operators.GreaterThan](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.Operators.html#Syncfusion_Blazor_PivotView_Operators_GreaterThan) in the "Country" field. +For example, to display data where the total sum of units sold for each country exceeds 1500, set the [Value1](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotFilterSetting.html#Syncfusion_Blazor_PivotView_PivotFilterSetting_Value1) to "1500" and [Condition](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotFilterSetting.html#Syncfusion_Blazor_PivotView_PivotFilterSetting_Condition) to [Operators.GreaterThan](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.Operators.html#Syncfusion_Blazor_PivotView_Operators_GreaterThan) for the "Country" field. -[Operators](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.Operators.html) that can be used in value filtering are: +The following table shows the available operators for value filtering: | Operator | Description | |------|-------------| -| Equals| Displays the pivot table that matches with the value.| -| DoesNotEquals| Displays the pivot table that does not match with the given value.| -| GreaterThan| Displays the pivot table when the value is greater.| -| GreaterThanOrEqualTo| Displays the pivot table when the value is greater than or equal.| -| LessThan| Displays the pivot table when the value is lesser.| -| LessThanOrEqualTo| Displays the pivot table when the value is lesser than or equal.| -| Between| Displays the pivot table that records between start and end values.| -| NotBetween| Displays the pivot table that does not record between start and end values.| +| Equals| Shows records that match the specified value.| +| DoesNotEquals| Shows records that do not match the specified value.| +| GreaterThan| Shows records where the value is greater than the specified value.| +| GreaterThanOrEqualTo| Shows records where the value is greater than or equal to the specified value.| +| LessThan| Shows records where the value is less than the specified value.| +| LessThanOrEqualTo| Shows records where the value is less than or equal to the specified value.| +| Between| Shows records with values between the specified start and end values.| +| NotBetween| Shows records with values outside the specified start and end values.| ```cshtml @using Syncfusion.Blazor.PivotView @@ -618,7 +633,7 @@ For example, to show the data where total sum of units sold for each country exc ### Clearing the existing value filter -End user can clear the applied value filter by simply click the "Clear" option at the bottom of the filter dialog under "Value" tab. +You can clear the applied value filter by clicking the "Clear" option at the bottom of the filter dialog under the "Value" tab. ![Clearing Value Filter in Blazor PivotTable](images/blazor-pivottable-clear-value-filter.png) @@ -626,18 +641,17 @@ End user can clear the applied value filter by simply click the "Clear" option a ### MemberEditorOpen -The event [MemberEditorOpen](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewEvents-1.html#Syncfusion_Blazor_PivotView_PivotViewEvents_1_MemberEditorOpen) fires while opening member editor dialog. It allows to customize the field members to be displayed in the dialog. It has the following parameters - -* [FieldName](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.MemberEditorOpenEventArgs.html#Syncfusion_Blazor_PivotView_MemberEditorOpenEventArgs_FieldName): It holds the name of the appropriate field. - -* [FieldMembers](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.MemberEditorOpenEventArgs.html#Syncfusion_Blazor_PivotView_MemberEditorOpenEventArgs_FieldMembers): It holds the members of a field. +When you open the Member Editor dialog, the [MemberEditorOpen](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewEvents-1.html#Syncfusion_Blazor_PivotView_PivotViewEvents_1_MemberEditorOpen) event is triggered. With this event, you can decide which field members are shown, making it easier to include or exclude specific items. The event provides the following options: -* [Cancel](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.MemberEditorOpenEventArgs.html#Syncfusion_Blazor_PivotView_MemberEditorOpenEventArgs_Cancel): It is a boolean property and by setting this to true, dialog won’t be created. +* [FieldName](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.MemberEditorOpenEventArgs.html#Syncfusion_Blazor_PivotView_MemberEditorOpenEventArgs_FieldName): The name of the field for which the Member Editor dialog opens. +* [FieldMembers](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.MemberEditorOpenEventArgs.html#Syncfusion_Blazor_PivotView_MemberEditorOpenEventArgs_FieldMembers): The list of all members in the selected field. +* [Cancel](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.MemberEditorOpenEventArgs.html#Syncfusion_Blazor_PivotView_MemberEditorOpenEventArgs_Cancel): If you set this property to true, the Member Editor dialog will not open. +* [FilterSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.MemberEditorOpenEventArgs.html#Syncfusion_Blazor_PivotView_MemberEditorOpenEventArgs_FilterSetting): Contains the current filter settings including filter items, types, and conditions. In the below sample, the member editor of field "Country" shows only the selected Item. ```cshtml - @using Syncfusion.Blazor.PivotView +@using Syncfusion.Blazor.PivotView @@ -683,21 +697,19 @@ In the below sample, the member editor of field "Country" shows only the selecte } } } - ``` -### OnActionBegin -The event [OnActionBegin](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewEvents-1.html#Syncfusion_Blazor_PivotView_PivotViewEvents_1_OnActionBegin) triggers when clicking the filter icon in the field button, which is present in both grouping bar and field list UI. This allows user to identify the current action being performed at runtime. It has the following parameters: - -* [DataSourceSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotActionBeginEventArgs.html#Syncfusion_Blazor_PivotView_PivotActionBeginEventArgs_DataSourceSettings) : It holds the current data source settings such as input data source, rows, columns, values, filters, format settings and so on. +### OnActionBegin -* [ActionName](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotActionBeginEventArgs.html#Syncfusion_Blazor_PivotView_PivotActionBeginEventArgs_ActionName): It holds the name of the current action began. For example, while filtering, the action name will be shown as **Filter field**. +The [OnActionBegin](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewEvents-1.html#Syncfusion_Blazor_PivotView_PivotViewEvents_1_OnActionBegin) event is triggered when a user clicks the filter icon on a field button in either the grouping bar or the field list, allowing users to monitor and control actions in the Pivot Table. The event argument includes the following properties: -* [FieldInfo](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotActionBeginEventArgs.html#Syncfusion_Blazor_PivotView_PivotActionBeginEventArgs_FieldInfo): It holds the selected field information. +* [DataSourceSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotActionBeginEventArgs.html#Syncfusion_Blazor_PivotView_PivotActionBeginEventArgs_DataSourceSettings): Contains the current data source configuration, including input data, rows, columns, values, filters, format settings, and other report settings. +* [ActionName](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotActionBeginEventArgs.html#Syncfusion_Blazor_PivotView_PivotActionBeginEventArgs_ActionName): Indicates the name of the action being initiated, such as **Filter field** for filtering. +* [FieldInfo](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotActionBeginEventArgs.html#Syncfusion_Blazor_PivotView_PivotActionBeginEventArgs_FieldInfo): Provides information about the selected field for the action. N> This option is applicable only when the field based UI actions are performed such as filtering, sorting, removing field from grouping bar, editing and aggregation type change. -* [Cancel](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotActionBeginEventArgs.html#Syncfusion_Blazor_PivotView_PivotActionBeginEventArgs_Cancel): It allows user to restrict the current action. +* [Cancel](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotActionBeginEventArgs.html#Syncfusion_Blazor_PivotView_PivotActionBeginEventArgs_Cancel): A boolean property that allows you to prevent the current action from completing. Set this to **true** to stop the action. In the following example, filter action can be restricted by setting the **args.Cancel** option to **true** in the `OnActionBegin` event. @@ -744,19 +756,20 @@ In the following example, filter action can be restricted by setting the **args. } ``` -### OnActionComplete -The event [OnActionComplete](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewEvents-1.html#Syncfusion_Blazor_PivotView_PivotViewEvents_1_OnActionComplete) triggers when the filtering action via the field button, which is present in both grouping bar and field list UI, is completed. This allows user to identify the current UI action being completed at runtime. It has the following parameters: +### OnActionComplete -* [DataSourceSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotActionCompleteEventArgs-1.html#Syncfusion_Blazor_PivotView_PivotActionCompleteEventArgs_1_DataSourceSettings): It holds the current data source settings such as input data source, rows, columns, values, filters, format settings and so on. +The [OnActionComplete](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewEvents-1.html#Syncfusion_Blazor_PivotView_PivotViewEvents_1_OnActionComplete) event triggers when filtering actions are completed through the field button in both the grouping bar and field list UI. You can use this event to monitor current UI actions and implement custom logic based on the completed operations. -* [ActionName](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotActionCompleteEventArgs-1.html#Syncfusion_Blazor_PivotView_PivotActionCompleteEventArgs_1_ActionName): It holds the name of the current action completed. For example, after filtering, the action name will be shown as **Field filtered**. +The event provides the following parameters: -* [FieldInfo](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotActionCompleteEventArgs-1.html#Syncfusion_Blazor_PivotView_PivotActionCompleteEventArgs_1_FieldInfo): It holds the selected field information. +* [DataSourceSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotActionCompleteEventArgs-1.html#Syncfusion_Blazor_PivotView_PivotActionCompleteEventArgs_1_DataSourceSettings): Contains the current data source configuration, including input data source, rows, columns, values, filters, format settings, and other report settings. +* [ActionName](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotActionCompleteEventArgs-1.html#Syncfusion_Blazor_PivotView_PivotActionCompleteEventArgs_1_ActionName): Specifies the name of the completed action. For filtering operations, the action name appears as **Field filtered**. +* [FieldInfo](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotActionCompleteEventArgs-1.html#Syncfusion_Blazor_PivotView_PivotActionCompleteEventArgs_1_FieldInfo): Contains information about the selected field that was involved in the action. N> This option is applicable only when the field based UI actions are performed such as filtering, sorting, removing field from grouping bar, editing and aggregation type change. -* [ActionInfo](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotActionCompleteEventArgs-1.html#Syncfusion_Blazor_PivotView_PivotActionCompleteEventArgs_1_ActionInfo): It holds the unique information about the current UI action. For example, if the filter action is completed, the event argument contains information such as filter members, field name, and so on. +* [ActionInfo](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotActionCompleteEventArgs-1.html#Syncfusion_Blazor_PivotView_PivotActionCompleteEventArgs_1_ActionInfo): Provides detailed information about the current UI action. For filtering operations, this includes filter members, field name, and other relevant details. ```cshtml @using Syncfusion.Blazor.PivotView @@ -801,9 +814,10 @@ N> This option is applicable only when the field based UI actions are performed } ``` + ### OnActionFailure -The event [OnActionFailure](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewEvents-1.html#Syncfusion_Blazor_PivotView_PivotViewEvents_1_OnActionFailure) triggers when the current UI action fails to achieve the desired result. It has the following parameters: +The [OnActionFailure](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewEvents-1.html#Syncfusion_Blazor_PivotView_PivotViewEvents_1_OnActionFailure) event is triggered when a UI action fails to produce the expected result. This event provides detailed information about the failure through the following parameters: * [ActionName](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotActionFailureEventArgs.html#Syncfusion_Blazor_PivotView_PivotActionFailureEventArgs_ActionName): It holds the name of the current action failed. For example, if the action fails while filtering, the action name will be shown as **Filter field**. @@ -863,4 +877,5 @@ The event [OnActionFailure](https://help.syncfusion.com/cr/blazor/Syncfusion.Bla } } ``` + N> You can refer to our [Blazor Pivot Table](https://www.syncfusion.com/blazor-components/blazor-pivot-table) feature tour page for its groundbreaking feature representations. You can also explore our [Blazor Pivot Table example](https://blazor.syncfusion.com/demos/pivot-table/default-functionalities?theme=bootstrap5) to knows how to render and configure the pivot table. \ No newline at end of file diff --git a/blazor/pivot-table/globalization.md b/blazor/pivot-table/globalization.md index d569740c9d..25d1451337 100644 --- a/blazor/pivot-table/globalization.md +++ b/blazor/pivot-table/globalization.md @@ -15,7 +15,7 @@ documentation: ug ## Right-to-left (RTL) -Right-to-left (RTL) provides an option to switch the text direction and layout of the pivot table component from right to left. It improves user experiences and accessibility for users who use right-to-left languages (Arabic, Farsi, Urdu, etc.). In the following code sample, the `EnableRtl` property is used to enable RTL in the pivot table. +Right-to-left (RTL) support makes the Pivot Table more accessible and user-friendly for people who read and write in right-to-left languages such as Arabic, Farsi, and Urdu. This feature adjusts the text direction and layout of the entire Pivot Table from a left-to-right to a right-to-left orientation. To enable RTL in the Pivot Table, set the [`EnableRtl`](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SfPivotView-1.html#Syncfusion_Blazor_PivotView_SfPivotView_1_EnableRtl) property to **true**. ```cshtml @using Syncfusion.Blazor.PivotView diff --git a/blazor/pivot-table/grouping-bar.md b/blazor/pivot-table/grouping-bar.md index c8d26b111d..73af98fe4c 100644 --- a/blazor/pivot-table/grouping-bar.md +++ b/blazor/pivot-table/grouping-bar.md @@ -14,17 +14,17 @@ To have a quick glance about **Grouping Bar** in the Blazor Pivot Table, watch t {% youtube "youtube:https://www.youtube.com/watch?v=Odkh7RkvjoY&t=109s"%} -The Grouping Bar option in pivot table automatically populates fields from the bound data source and allows end users to drag fields between different axes such as columns, rows, values, and filters, and create pivot table at runtime. It can be enabled by setting the [ShowGroupingBar](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SfPivotView-1.html#Syncfusion_Blazor_PivotView_SfPivotView_1_ShowGroupingBar) property in [SfPivotView](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SfPivotView-1.html) class to **true**. +The Grouping Bar option in the Pivot Table automatically displays fields from the bound data source. It allows users to drag and drop fields between different axes such as columns, rows, values, and filters to create a pivot table at runtime. You can enable it by setting the [ShowGroupingBar](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SfPivotView-1.html#Syncfusion_Blazor_PivotView_SfPivotView_1_ShowGroupingBar) property in [SfPivotView](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SfPivotView-1.html) class to **true**. -Similar to Field List, Grouping Bar UI also comes with basic interactions like, +The grouping bar provides intuitive interactions similar to the Field List, making report creation accessible to all users. These interactions include: -* Re-arranging fields through drag-and-drop operation between row, column, value and filter axes. -* Remove fields from the existing report using remove icon. -* Add fields to the report using fields panel option. -* Filtering members of specific fields using filter icon. -* Sorting members of specific fields using sort icon. +* Re-arranging fields through drag-and-drop operations between row, column, value, and filter axes. +* Removing fields from the existing report using the remove icon. +* Adding fields to the report using the fields panel option. +* Filtering members of specific fields using the filter icon. +* Sorting members of specific fields using the sort icon. - ```cshtml +```cshtml @using Syncfusion.Blazor.PivotView @@ -62,33 +62,35 @@ Similar to Field List, Grouping Bar UI also comes with basic interactions like, ## Show or hide fields panel -The fields panel which is positioned above the grouping bar, displays the fields that are available in the data source but are not bound in the report. The fields can be dragged and dropped into the appropriate axis. In addition, any field removed from any axes will be automatically added to the fields panel. The fields panel can be displayed by setting the [ShowFieldsPanel](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewGroupingBarSettings.html#Syncfusion_Blazor_PivotView_PivotViewGroupingBarSettings_ShowFieldsPanel) property in the [PivotViewGroupingBarSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewGroupingBarSettings.html) to **true**. +The fields panel appears above the grouping bar and shows all the fields that are available in the data source but not currently used in the Pivot Table report. Users can drag and drop these fields into the appropriate axes (rows, columns, values, or filters) to build their desired Pivot Table layout. When a field is removed from any axis, it automatically returns to the fields panel for reuse. + +To display the fields panel, set the [ShowFieldsPanel](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewGroupingBarSettings.html#Syncfusion_Blazor_PivotView_PivotViewGroupingBarSettings_ShowFieldsPanel) property to **true** within the [PivotViewGroupingBarSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewGroupingBarSettings.html) configuration. ```cshtml @using Syncfusion.Blazor.PivotView - - - - - - - - - - - - + + + + + + + + + + + + @code { - public List data { get; set; } - protected override void OnInitialized() - { - this.data = ProductDetails.GetProductData().ToList(); - //Bind the data source collection here. Refer "Assigning sample data to the pivot table" section in getting started for more details. - } + public List data { get; set; } + protected override void OnInitialized() + { + this.data = ProductDetails.GetProductData().ToList(); + //Bind the data source collection here. Refer "Assigning sample data to the pivot table" section in getting started for more details. + } } ``` @@ -96,7 +98,11 @@ The fields panel which is positioned above the grouping bar, displays the fields ## Show or hide all filter icon -The Grouping Bar has an option to filter members of particular fields at runtime in pivot table. In-order to filter members in a field, click the filter icon and check/uncheck members that needs to be displayed. By default, filter icon besides each field is enabled in the grouping bar. To disable the filter icon, set the property [ShowFilterIcon](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewGroupingBarSettings.html#Syncfusion_Blazor_PivotView_PivotViewGroupingBarSettings_ShowFilterIcon) in [PivotViewGroupingBarSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewGroupingBarSettings.html) class to **false**. +The Grouping Bar provides an option to filter members of specific fields during runtime in the Pivot Table. To filter members in a field, click the filter icon next to the field name and select or deselect the members you want to display. + +By default, the filter icon appears next to each field in the grouping bar. If you want to hide the filter icon, set the [ShowFilterIcon](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewGroupingBarSettings.html#Syncfusion_Blazor_PivotView_PivotViewGroupingBarSettings_ShowFilterIcon) property to **false** within the [PivotViewGroupingBarSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewGroupingBarSettings.html) configuration. + +> By default, the filter icon is enabled in the grouping bar. ```cshtml @using Syncfusion.Blazor.PivotView @@ -112,7 +118,7 @@ The Grouping Bar has an option to filter members of particular fields at runtime                                - +                                @@ -136,8 +142,9 @@ The Grouping Bar has an option to filter members of particular fields at runtime ## Show or hide specific filter icon -To disable the filter icon for a specific field, set the property [ShowFilterIcon](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewRow.html#Syncfusion_Blazor_PivotView_PivotViewRow_ShowFilterIcon) to **false** to the corresponding field in [PivotViewDataSourceSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html). +By default, the filter icon appears for all fields in the grouping bar. To hide the filter icon for specific fields, set the [ShowFilterIcon](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotFieldOptions.html#Syncfusion_Blazor_PivotView_PivotFieldOptions_ShowFilterIcon) property to **false** for those fields in the [PivotViewDataSourceSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html). This lets you control which fields can be filtered, providing a cleaner and more focused user interface. +In the sample below, the filter icons for the "Quarter" and "Products" fields are hidden. ```cshtml @using Syncfusion.Blazor.PivotView @@ -153,7 +160,7 @@ To disable the filter icon for a specific field, set the property [ShowFilterIco                                - +                                @@ -176,7 +183,11 @@ To disable the filter icon for a specific field, set the property [ShowFilterIco ## Show or hide all sort icon -The Grouping Bar has an option to order members of a particular fields either in ascending or descending at runtime. In order to sort a field, click the sort icon and to reverse its sort direction, once again click the same sort icon. By default, the sort icon besides each field is enabled in the grouping bar and members will be arranged in ascending order. To disable the sort option, set the property [ShowSortIcon](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewGroupingBarSettings.html#Syncfusion_Blazor_PivotView_PivotViewGroupingBarSettings_ShowSortIcon) in [PivotViewGroupingBarSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewGroupingBarSettings.html) class to **false**. +The Grouping Bar provides an option to sort members of a particular field in either ascending or descending order at runtime. To sort a field, click the sort icon next to the field name. To reverse the sort direction, click the same sort icon again. By default, the sort icon is displayed next to each field in the grouping bar, and members are arranged in ascending order. + +To disable the sort option, set the [ShowSortIcon](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewGroupingBarSettings.html#Syncfusion_Blazor_PivotView_PivotViewGroupingBarSettings_ShowSortIcon) property to **false** within the [PivotViewGroupingBarSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewGroupingBarSettings.html) configuration. + +> By default, the sort icon is enabled in the grouping bar. ```cshtml @using Syncfusion.Blazor.PivotView @@ -192,7 +203,7 @@ The Grouping Bar has an option to order members of a particular fields either in                                - +                                @@ -217,7 +228,9 @@ The Grouping Bar has an option to order members of a particular fields either in ## Show or hide specific sort icon -To disable the sort icon for a specific button, set the property [ShowSortIcon](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewRow.html#Syncfusion_Blazor_PivotView_PivotViewRow_ShowSortIcon) to **false** to the corresponding field in the [PivotViewDataSourceSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html). +You can choose to show or hide the sort icon for individual fields in the Pivot Table's grouping bar. To hide the sort icon for a particular field, set the [ShowSortIcon](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotFieldOptions.html#Syncfusion_Blazor_PivotView_PivotFieldOptions_ShowSortIcon) property to **false** for that field in the [PivotViewDataSourceSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html) property. + +In the example below, the sort icons for the "Quarter" and "Country" fields are hidden in the grouping bar. This allows users to prevent sorting for these fields while keeping other fields sortable. ```cshtml @using Syncfusion.Blazor.PivotView @@ -233,7 +246,7 @@ To disable the sort icon for a specific button, set the property [ShowSortIcon](                                - +                                @@ -257,7 +270,11 @@ To disable the sort icon for a specific button, set the property [ShowSortIcon]( ## Show or hide all remove icon -The Grouping Bar has an option to remove any field at runtime. To remove a field, just click the remove icon. By default, the remove icon besides each field is enabled in the grouping bar. To disable the remove icon, set the property [ShowRemoveIcon](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewGroupingBarSettings.html#Syncfusion_Blazor_PivotView_PivotViewGroupingBarSettings_ShowRemoveIcon) in [PivotViewGroupingBarSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewGroupingBarSettings.html) class to **false**. +The grouping bar in the Pivot Table lets users remove any field at runtime by clicking the remove icon next to the field. By default, the remove icon is visible beside each field in the grouping bar. + +If you want to hide the remove icon, set the [ShowRemoveIcon](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewGroupingBarSettings.html#Syncfusion_Blazor_PivotView_PivotViewGroupingBarSettings_ShowRemoveIcon) property to **false** within the [PivotViewGroupingBarSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewGroupingBarSettings.html) configuration. This will prevent users from removing fields directly from the grouping bar. + +> Note: The remove icon is enabled in the grouping bar by default. ```cshtml @using Syncfusion.Blazor.PivotView @@ -273,7 +290,7 @@ The Grouping Bar has an option to remove any field at runtime. To remove a field                                - +                                @@ -297,8 +314,9 @@ The Grouping Bar has an option to remove any field at runtime. To remove a field ## Show or hide specific remove icon -To disable the remove icon for a specific button, set the property [ShowRemoveIcon](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewRow.html#Syncfusion_Blazor_PivotView_PivotViewRow_ShowRemoveIcon) to **false** to the corresponding field in the [PivotViewDataSourceSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html). +You can hide the remove icon for an individual field button in the Pivot Table grouping bar. To do this, set the [ShowRemoveIcon](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotFieldOptions.html#Syncfusion_Blazor_PivotView_PivotFieldOptions_ShowRemoveIcon) property to **false** for the desired field within the [PivotViewDataSourceSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html) options. +In the example below, the remove icon for the "Year", "Sold", and "Products" fields has been hidden. This helps prevent users from accidentally removing those fields while interacting with the Pivot Table. ```cshtml @using Syncfusion.Blazor.PivotView @@ -314,7 +332,7 @@ To disable the remove icon for a specific button, set the property [ShowRemoveIc                                - +                                @@ -337,7 +355,7 @@ To disable the remove icon for a specific button, set the property [ShowRemoveIc ## Disable all fields from dragging -The Grouping Bar has an option to drag-and-drop fields between row, column, value and filter axes in-order to change report at runtime. By default, all fields are available for drag-and-drop operation in the grouping bar. To disable these fields, set the property [AllowDragAndDrop](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewGroupingBarSettings.html#Syncfusion_Blazor_PivotView_PivotViewGroupingBarSettings_AllowDragAndDrop) in [PivotViewGroupingBarSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewGroupingBarSettings.html) class to **false**. This will prevent end user from changing the current report. +In the Pivot Table, the grouping bar lets users move fields between the row, column, value, and filter axes to change the report as needed. By default, all fields can be moved using drag-and-drop in the grouping bar. To prevent users from dragging any fields, set the [AllowDragAndDrop](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewGroupingBarSettings.html#Syncfusion_Blazor_PivotView_PivotViewGroupingBarSettings_AllowDragAndDrop) option in [PivotViewGroupingBarSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewGroupingBarSettings.html) to **false**. This will lock the layout of the current report, so users cannot rearrange fields in the grouping bar. ```cshtml @using Syncfusion.Blazor.PivotView @@ -353,7 +371,7 @@ The Grouping Bar has an option to drag-and-drop fields between row, column, valu                                - +                                @@ -377,8 +395,9 @@ The Grouping Bar has an option to drag-and-drop fields between row, column, valu ## Disable specific field from dragging -To disable dragging for a specific button, set the property [AllowDragAndDrop](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewRow.html#Syncfusion_Blazor_PivotView_PivotViewRow_AllowDragAndDrop) to **false** to the corresponding field in the [PivotViewDataSourceSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html). +You can prevent users from dragging certain fields in the grouping bar of the Pivot Table. To do this, set the [AllowDragAndDrop](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotFieldOptions.html#Syncfusion_Blazor_PivotView_PivotFieldOptions_AllowDragAndDrop) property to **false** for the specific field within the [PivotViewDataSourceSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html). +In the example below, users cannot drag the "Year" and "Products" fields. This setting helps you control which fields can be arranged in the column, row, value, or filter axes at runtime. ```cshtml @using Syncfusion.Blazor.PivotView @@ -394,7 +413,7 @@ To disable dragging for a specific button, set the property [AllowDragAndDrop](h                                - +                                @@ -415,7 +434,9 @@ To disable dragging for a specific button, set the property [AllowDragAndDrop](h ## Changing aggregation type of value fields at runtime -End user can perform calculations over a group of values using the aggregation option. The value fields bound to the field list, appears with a dropdown icon, helps to select an appropriate aggregation type at runtime. On selection, the values in the Pivot Table will be changed dynamically. By default, the icon to set aggregation type is enabled in the grouping bar. To disable this icon, set the property [ShowValueTypeIcon](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewGroupingBarSettings.html#Syncfusion_Blazor_PivotView_PivotViewGroupingBarSettings_ShowValueTypeIcon) in the [PivotViewGroupingBarSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewGroupingBarSettings.html) class to **false**. To know more about aggregation, [refer](./aggregation) here. +Users can easily perform calculations on groups of values in the Pivot Table by using the aggregation option. Each value field in the Pivot Table appears in the grouping bar with a dropdown icon next to it. This icon lets users select a different aggregation type, such as Sum, Average, or Count, at runtime. When an aggregation type is selected, the Pivot Table values update immediately to reflect the new calculation. + +By default, the icon for setting the aggregation type is visible in the grouping bar. To hide this icon, set the [ShowValueTypeIcon](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewGroupingBarSettings.html#Syncfusion_Blazor_PivotView_PivotViewGroupingBarSettings_ShowValueTypeIcon) property to **false** inside [PivotViewGroupingBarSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewGroupingBarSettings.html). For more details about aggregation options, see the [aggregation](./aggregation) section. ```cshtml @using Syncfusion.Blazor.PivotView @@ -431,7 +452,7 @@ End user can perform calculations over a group of values using the aggregation o                                - +                                @@ -460,7 +481,9 @@ End user can perform calculations over a group of values using the aggregation o ## Show or hide specific dropdown icon -To disable the dropdown icon for a specific button, set the property [ShowValueTypeIcon](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewRow.html#Syncfusion_Blazor_PivotView_PivotViewRow_ShowValueTypeIcon) to **false** to the corresponding field in the [PivotViewDataSourceSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html). +You can hide the dropdown icon for a particular field button in the Pivot Table’s grouping bar. To do this, set the [ShowValueTypeIcon](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotFieldOptions.html#Syncfusion_Blazor_PivotView_PivotFieldOptions_ShowValueTypeIcon) property to **false** for the desired field within the [PivotViewDataSourceSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html). + +In the following example, the dropdown icon for the "Sold" field is hidden: ```cshtml @using Syncfusion.Blazor.PivotView @@ -497,15 +520,20 @@ To disable the dropdown icon for a specific button, set the property [ShowValueT ![Hiding Specific DropDown Icon in Blazor PivotTable](images/blazor-pivottable-hide-specific-dropdown-icon.png) - N>The property [ShowFilterIcon](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewRow.html#Syncfusion_Blazor_PivotView_PivotViewRow_ShowFilterIcon), [ShowSortIcon](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewRow.html#Syncfusion_Blazor_PivotView_PivotViewRow_ShowSortIcon), [ShowValueTypeIcon](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewRow.html#Syncfusion_Blazor_PivotView_PivotViewRow_ShowValueTypeIcon) and [AllowDragAndDrop](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewRow.html#Syncfusion_Blazor_PivotView_PivotViewRow_AllowDragAndDrop) in fields of [PivotViewDataSourceSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html) are applicable for both grouping bar and field list. +N> The properties [ShowFilterIcon](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotFieldOptions.html#Syncfusion_Blazor_PivotView_PivotFieldOptions_ShowFilterIcon), [ShowSortIcon](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotFieldOptions.html#Syncfusion_Blazor_PivotView_PivotFieldOptions_ShowSortIcon), [ShowValueTypeIcon](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotFieldOptions.html#Syncfusion_Blazor_PivotView_PivotFieldOptions_ShowValueTypeIcon), and [AllowDragAndDrop](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotFieldOptions.html#Syncfusion_Blazor_PivotView_PivotFieldOptions_AllowDragAndDrop) in fields of [PivotViewDataSourceSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html) are applicable for both grouping bar and field list. ## Events -### FieldDropped +### OnFieldDropped -The event [FieldDropped](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewEvents-1.html#Syncfusion_Blazor_PivotView_PivotViewEvents_1_FieldDropped) fires on whenever a field is dropped over an axis. +The [OnFieldDropped](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewEvents-1.html#Syncfusion_Blazor_PivotView_PivotViewEvents_1_FieldDropped) event in the Pivot Table triggers whenever a user moves and drops a field into a new axis, such as columns, rows, values, or filters. This event provides the following parameters: -It has following parameters - [DroppedAxis](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.FieldDroppedEventArgs.html#Syncfusion_Blazor_PivotView_FieldDroppedEventArgs_DroppedAxis), [DroppedField](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.FieldDroppedEventArgs.html#Syncfusion_Blazor_PivotView_FieldDroppedEventArgs_DroppedField) and [DataSourceSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.FieldDroppedEventArgs.html#Syncfusion_Blazor_PivotView_FieldDroppedEventArgs_DataSourceSettings). In this sample, the [DroppedField](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.FieldDroppedEventArgs.html#Syncfusion_Blazor_PivotView_FieldDroppedEventArgs_DroppedField) caption was modified based on the [DroppedAxis](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.FieldDroppedEventArgs.html#Syncfusion_Blazor_PivotView_FieldDroppedEventArgs_DroppedAxis). +- [DataSourceSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.FieldDroppedEventArgs.html#Syncfusion_Blazor_PivotView_FieldDroppedEventArgs_DataSourceSettings): Defines the current report in the Pivot Table. +- [DroppedAxis](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.FieldDroppedEventArgs.html#Syncfusion_Blazor_PivotView_FieldDroppedEventArgs_DroppedAxis): Defines the axis where the field has been dropped. +- [DroppedField](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.FieldDroppedEventArgs.html#Syncfusion_Blazor_PivotView_FieldDroppedEventArgs_DroppedField): Defines the dropped field item. +- [DroppedPosition](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.FieldDroppedEventArgs.html#Syncfusion_Blazor_PivotView_FieldDroppedEventArgs_DroppedPosition): Defines the position where the field has been dropped. + +For example, you can use this event to change the caption of the [DroppedField](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.FieldDroppedEventArgs.html#Syncfusion_Blazor_PivotView_FieldDroppedEventArgs_DroppedField) instantly at runtime when a user moves a field to a different axis. ```cshtml @using Syncfusion.Blazor.PivotView @@ -548,16 +576,15 @@ It has following parameters - [DroppedAxis](https://help.syncfusion.com/cr/blazo ### FieldDragStart -The event [FieldDragStart](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewEvents-1.html#Syncfusion_Blazor_PivotView_PivotViewEvents_1_FieldDragStart) fires whenever a field drag starts from its axis. It allows the user to restrict the drag operation based on its parameters. It has the following parameters - -* [FieldName](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.FieldDragStartEventArgs.html#Syncfusion_Blazor_PivotView_FieldDragStartEventArgs_FieldName): It holds the name of the appropriate field. - -* [FieldItem](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.FieldDragStartEventArgs.html#Syncfusion_Blazor_PivotView_FieldDragStartEventArgs_FieldItem): It holds the complete definition of the appropriate field mentioned in data source settings. +The [FieldDragStart](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewEvents-1.html#Syncfusion_Blazor_PivotView_PivotViewEvents_1_FieldDragStart) event is triggered when a field begins to be dragged from its axis in the Pivot Table. Users can use this event to limit or prevent the drag action based on certain conditions. The event provides the following parameters: -* [Axis](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.FieldDragStartEventArgs.html#Syncfusion_Blazor_PivotView_FieldDragStartEventArgs_Axis): It holds the axis name where the draggable field lies. - -* [Cancel](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.FieldDragStartEventArgs.html#Syncfusion_Blazor_PivotView_FieldDragStartEventArgs_Cancel): It is a boolean property and by setting this to true, user can restrict the field from dragging. +- [FieldName](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.FieldDragStartEventArgs.html#Syncfusion_Blazor_PivotView_FieldDragStartEventArgs_FieldName): This parameter contains the name of the field being dragged. +- [FieldItem](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.FieldDragStartEventArgs.html#Syncfusion_Blazor_PivotView_FieldDragStartEventArgs_FieldItem): This parameter holds the complete details of the field as described in the [PivotViewDataSourceSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html). +- [Axis](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.FieldDragStartEventArgs.html#Syncfusion_Blazor_PivotView_FieldDragStartEventArgs_Axis): This specifies the axis (such as columns, rows, values, or filters) from which the field is being dragged. +- [Cancel](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.FieldDragStartEventArgs.html#Syncfusion_Blazor_PivotView_FieldDragStartEventArgs_Cancel): This boolean property can be set to **true** by the user to prevent the selected field from being dragged. +- [DataSourceSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.FieldDragStartEventArgs.html#Syncfusion_Blazor_PivotView_FieldDragStartEventArgs_DataSourceSettings): This property returns the current [PivotViewDataSourceSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html) used in the Pivot Table. +In the following example, the drag action is prevented only for fields placed in the rows axis. Users will not be able to drag fields from the rows axis, but can still drag fields from other axes. ```cshtml @using Syncfusion.Blazor.PivotView @@ -602,22 +629,17 @@ The event [FieldDragStart](https://help.syncfusion.com/cr/blazor/Syncfusion.Bl ### FieldDrop -The event [FieldDrop](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewEvents-1.html#Syncfusion_Blazor_PivotView_PivotViewEvents_1_FieldDrop) fires whenever a field is dropped into an axis. It allows the user to restrict the drop operation based on its parameters. It has the following parameters, - -* [FieldName](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.FieldDropEventArgs.html#Syncfusion_Blazor_PivotView_FieldDropEventArgs_FieldName): It holds the name of the appropriate field. - -* [DropField](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.FieldDropEventArgs.html#Syncfusion_Blazor_PivotView_FieldDropEventArgs_DropField): It holds the complete definition of the appropriate field mentioned in data source settings. - -* [DraggedAxis](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.FieldDropEventArgs.html#Syncfusion_Blazor_PivotView_FieldDropEventArgs_DraggedAxis): It holds the axis name from where dragging was started. - -* [DropAxis](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.FieldDropEventArgs.html#Syncfusion_Blazor_PivotView_FieldDropEventArgs_DropAxis): It holds the axis name from where the field is dropped. - -* [DropPosition](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.FieldDropEventArgs.html#Syncfusion_Blazor_PivotView_FieldDropEventArgs_DropPosition): It holds the dropped index among other existing fields in the axis. +The [FieldDrop](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewEvents-1.html#Syncfusion_Blazor_PivotView_PivotViewEvents_1_FieldDrop) event is triggered whenever a user drags and drops a field into a different axis in the Pivot Table. This event helps users control whether a field should be allowed to move to a new axis by using the event’s parameters. The event provides the following information: -* [DataSourceSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.FieldDropEventArgs.html#Syncfusion_Blazor_PivotView_FieldDropEventArgs_DataSourceSettings): It holds the complete pivot report. - -* [Cancel](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.FieldDropEventArgs.html#Syncfusion_Blazor_PivotView_FieldDropEventArgs_Cancel): It is a boolean property and by setting this to true, user can restrict the field from being dropped. +- [FieldName](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.FieldDropEventArgs.html#Syncfusion_Blazor_PivotView_FieldDropEventArgs_FieldName): The name of the field being moved. +- [DraggedAxis](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.FieldDropEventArgs.html#Syncfusion_Blazor_PivotView_FieldDropEventArgs_DraggedAxis): The axis where the user started dragging the field. +- [DropAxis](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.FieldDropEventArgs.html#Syncfusion_Blazor_PivotView_FieldDropEventArgs_DropAxis): The axis where the field is dropped. +- [DropPosition](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.FieldDropEventArgs.html#Syncfusion_Blazor_PivotView_FieldDropEventArgs_DropPosition): The position where the field is dropped among the fields in the target axis. +- [DropField](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.FieldDropEventArgs.html#Syncfusion_Blazor_PivotView_FieldDropEventArgs_DropField): The complete definition of the field as defined in the [PivotViewDataSourceSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html). +- [DataSourceSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.FieldDropEventArgs.html#Syncfusion_Blazor_PivotView_FieldDropEventArgs_DataSourceSettings): The entire configuration of the Pivot Table’s data source. +- [Cancel](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.FieldDropEventArgs.html#Syncfusion_Blazor_PivotView_FieldDropEventArgs_Cancel): A boolean value. If set to **true**, this stops the field from being dropped into the axis. +In the example below, dropping any field into the "Values" axis is prevented. This is managed by setting the `Cancel` parameter to **true** when a field is dropped onto the "Values" axis. ```cshtml @using Syncfusion.Blazor.PivotView @@ -662,18 +684,17 @@ The event [FieldDrop](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor. ### FieldRemove -The event [FieldRemove](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewEvents-1.html#Syncfusion_Blazor_PivotView_PivotViewEvents_1_FieldRemove) fires when removing any field from their axis. It helps the user to limit the elimination of a field based on its parameters. It has the following parameters, - -* [FieldName](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.FieldRemoveEventArgs.html#Syncfusion_Blazor_PivotView_FieldRemoveEventArgs_FieldName): It holds the name of the field to be removed. - -* [FieldItem](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.FieldRemoveEventArgs.html#Syncfusion_Blazor_PivotView_FieldRemoveEventArgs_FieldItem): It holds the complete definition of the appropriate field mentioned in data source settings. +The [FieldRemove](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewEvents-1.html#Syncfusion_Blazor_PivotView_PivotViewEvents_1_FieldRemove) event occurs when a user tries to remove a field from an axis in the Pivot Table. This event can be used to control whether a field should be removed, based on specific conditions. -* [Axis](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.FieldRemoveEventArgs.html#Syncfusion_Blazor_PivotView_FieldRemoveEventArgs_Axis): It holds the name of the axis from where it is to remove the field. +The event provides the following parameters: -* [DataSourceSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.FieldRemoveEventArgs.html#Syncfusion_Blazor_PivotView_FieldRemoveEventArgs_DataSourceSettings): It holds the complete pivot report. - -* [Cancel](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.FieldRemoveEventArgs.html#Syncfusion_Blazor_PivotView_FieldRemoveEventArgs_Cancel): It is a boolean property and by setting this to true, user can restrict the field from removing. +- [FieldName](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.FieldRemoveEventArgs.html#Syncfusion_Blazor_PivotView_FieldRemoveEventArgs_FieldName): The name of the field that the user wants to remove. +- [FieldItem](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.FieldRemoveEventArgs.html#Syncfusion_Blazor_PivotView_FieldRemoveEventArgs_FieldItem): The full definition of the field as specified in the [PivotViewDataSourceSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html). +- [Axis](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.FieldRemoveEventArgs.html#Syncfusion_Blazor_PivotView_FieldRemoveEventArgs_Axis): The name of the axis (row, column, value, or filter) from which the field will be removed. +- [DataSourceSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.FieldRemoveEventArgs.html#Syncfusion_Blazor_PivotView_FieldRemoveEventArgs_DataSourceSettings): The complete configuration of the Pivot Table data source. +- [Cancel](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.FieldRemoveEventArgs.html#Syncfusion_Blazor_PivotView_FieldRemoveEventArgs_Cancel): A boolean property; set this to **true** to prevent the field from being removed. +In the following example, the field "Country" cannot be removed from the report by any UI action. This is achieved by handling the [FieldRemove](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewEvents-1.html#Syncfusion_Blazor_PivotView_PivotViewEvents_1_FieldRemove) event and setting the `Cancel` property to **true** if the field name matches "Country". ```cshtml @using Syncfusion.Blazor.PivotView @@ -718,13 +739,15 @@ The event [FieldRemove](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazo ### AggregateMenuOpen -The event [AggregateMenuOpen](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewEvents-1.html#Syncfusion_Blazor_PivotView_PivotViewEvents_1_AggregateMenuOpen) fires while clicking dropdown icon of the value field button UI. It allows to customize the aggregate types to be displayed in the dropdown menu. It has the following parameters, +The [AggregateMenuOpen](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewEvents-1.html#Syncfusion_Blazor_PivotView_PivotViewEvents_1_AggregateMenuOpen) event is triggered when a user clicks the dropdown icon in a value field button in the Pivot Table’s grouping bar. This event allows users to control which aggregation types appear in the dropdown menu. -* [FieldName](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.AggregateMenuOpenEventArgs.html#Syncfusion_Blazor_PivotView_AggregateMenuOpenEventArgs_FieldName): It holds the name of the field that opens the aggregate menu. +The event provides the following parameters: -* [AggregateTypes](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.AggregateMenuOpenEventArgs.html#Syncfusion_Blazor_PivotView_AggregateMenuOpenEventArgs_AggregateTypes): It holds the aggregation types set for a field. +- [FieldName](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.AggregateMenuOpenEventArgs.html#Syncfusion_Blazor_PivotView_AggregateMenuOpenEventArgs_FieldName): The name of the field for which the aggregation menu is opened. +- [AggregateTypes](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.AggregateMenuOpenEventArgs.html#Syncfusion_Blazor_PivotView_AggregateMenuOpenEventArgs_AggregateTypes): The list of aggregation types available for the selected field. +- [Cancel](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.AggregateMenuOpenEventArgs.html#Syncfusion_Blazor_PivotView_AggregateMenuOpenEventArgs_Cancel): A boolean that, when set to true, prevents the dropdown menu from opening. -* [Cancel](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.AggregateMenuOpenEventArgs.html#Syncfusion_Blazor_PivotView_AggregateMenuOpenEventArgs_Cancel): It is a boolean property and by setting this to true, dropdown menu won’t be displayed. +In the following sample, the dropdown menu for the "Amount" field is customized to show specific aggregation types. ```cshtml @using Syncfusion.Blazor.PivotView @@ -768,31 +791,30 @@ The event [AggregateMenuOpen](https://help.syncfusion.com/cr/blazor/Syncfusion.B ``` -N> The events [FieldRemove](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewEvents-1.html#Syncfusion_Blazor_PivotView_PivotViewEvents_1_FieldRemove), [FieldDrop](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewEvents-1.html#Syncfusion_Blazor_PivotView_PivotViewEvents_1_FieldDrop), [FieldDragStart](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewEvents-1.html#Syncfusion_Blazor_PivotView_PivotViewEvents_1_FieldDragStart), [FieldDropped](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewEvents-1.html#Syncfusion_Blazor_PivotView_PivotViewEvents_1_FieldDropped) and [AggregateMenuOpen](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewEvents-1.html#Syncfusion_Blazor_PivotView_PivotViewEvents_1_AggregateMenuOpen) are applicable for both grouping bar and field list. +N> The events [FieldRemove](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewEvents-1.html#Syncfusion_Blazor_PivotView_PivotViewEvents_1_FieldRemove), [FieldDrop](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewEvents-1.html#Syncfusion_Blazor_PivotView_PivotViewEvents_1_FieldDrop), [FieldDragStart](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewEvents-1.html#Syncfusion_Blazor_PivotView_PivotViewEvents_1_FieldDragStart), [OnFieldDropped](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewEvents-1.html#Syncfusion_Blazor_PivotView_PivotViewEvents_1_FieldDropped), and [AggregateMenuOpen](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewEvents-1.html#Syncfusion_Blazor_PivotView_PivotViewEvents_1_AggregateMenuOpen) are applicable for both grouping bar and field list. ### OnActionBegin -The event [OnActionBegin](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewEvents-1.html#Syncfusion_Blazor_PivotView_PivotViewEvents_1_OnActionBegin) triggers when the UI action such as as sorting, filtering, aggregation or edit calculated field, that are present in the grouping bar UI begin. This allows user to identify the current action being performed at runtime. It has the following parameters: - -* [DataSourceSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotActionBeginEventArgs.html#Syncfusion_Blazor_PivotView_PivotActionBeginEventArgs_DataSourceSettings) : It holds the current data source settings such as input data source, rows, columns, values, filters, format settings and so on. +The [OnActionBegin](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewEvents-1.html#Syncfusion_Blazor_PivotView_PivotViewEvents_1_OnActionBegin) event occurs whenever an action begins in the grouping bar of the Pivot Table. These actions include sorting, filtering, changing aggregation, removing fields, or editing a calculated field using the grouping bar UI. This event helps the user identify and manage what is happening in real time. The event provides several helpful parameters: -* [ActionName](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotActionBeginEventArgs.html#Syncfusion_Blazor_PivotView_PivotActionBeginEventArgs_ActionName): It holds the name of the current action began. The following are the UI actions and their names: +- [DataSourceSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotActionBeginEventArgs.html#Syncfusion_Blazor_PivotView_PivotActionBeginEventArgs_DataSourceSettings): This provides the current report settings, which include the input data, row fields, column fields, values, filters, formatting settings, and more. +- [ActionName](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotActionBeginEventArgs.html#Syncfusion_Blazor_PivotView_PivotActionBeginEventArgs_ActionName): This contains the name of the action that has started. The most common actions and their respective names are: -| Action | Action Name| -|----------------|-------------| -| Sort icon| Sort field| -| Filter icon| Filter field| -| Aggregation (Value type drop down and menu)| Aggregate field| -| Remove icon| Remove field| -| Edit icon| Edit calculated field| + | Action | Action Name | + |-----------------------------------------|---------------------| + | Clicking the sort icon | Sort field | + | Using the filter icon | Filter field | + | Selecting aggregation in the drop-down | Aggregate field | + | Clicking the remove icon | Remove field | + | Clicking the edit icon | Edit calculated field| -* [FieldInfo](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotActionBeginEventArgs.html#Syncfusion_Blazor_PivotView_PivotActionBeginEventArgs_FieldInfo): It holds the selected field information. +- [FieldInfo](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotActionBeginEventArgs.html#Syncfusion_Blazor_PivotView_PivotActionBeginEventArgs_FieldInfo): This provides information about the selected field on which the action is performed. -N> This option is applicable only when the field based UI actions are performed such as filtering, sorting, removing field from grouping bar, editing and aggregation type change. +N> This option applies only to actions performed through the field-based UI, such as filtering, sorting, removing a field from the grouping bar, editing, and changing the aggregation type. -* [Cancel](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotActionBeginEventArgs.html#Syncfusion_Blazor_PivotView_PivotActionBeginEventArgs_Cancel): It allows user to restrict the current action. +- [Cancel](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotActionBeginEventArgs.html#Syncfusion_Blazor_PivotView_PivotActionBeginEventArgs_Cancel): Set this property to **true** within the event to prevent the current action from being completed. -In the below example, grouping bar UI actions such as sorting and filtering can be restricted by setting the **args.Cancel** option to **true** in the `OnActionBegin` event. +In the example below, users can restrict actions like sorting or filtering from the grouping bar by setting `args.Cancel` to **true** within the [OnActionBegin](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewEvents-1.html#Syncfusion_Blazor_PivotView_PivotViewEvents_1_OnActionBegin) event. ```cshtml @using Syncfusion.Blazor.PivotView @@ -808,7 +830,7 @@ In the below example, grouping bar UI actions such as sorting and filtering can                                - +                                @@ -837,27 +859,29 @@ In the below example, grouping bar UI actions such as sorting and filtering can } ``` + ### OnActionComplete -The event [OnActionComplete](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewEvents-1.html#Syncfusion_Blazor_PivotView_PivotViewEvents_1_OnActionComplete) triggers when the UI action such as as sorting, filtering, aggregation or edit calculated field, that are present in the grouping bar UI, is completed. This allows user to identify the current UI action being completed at runtime. It has the following parameters: +The [OnActionComplete](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewEvents-1.html#Syncfusion_Blazor_PivotView_PivotViewEvents_1_OnActionComplete) event in the Pivot Table is triggered whenever a user completes a UI action in the grouping bar, such as sorting, filtering, changing the aggregation type, editing a calculated field, or removing a field. This event helps users track the specific interaction that has just been finished, supporting a smooth workflow within the Pivot Table. -* [DataSourceSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotActionCompleteEventArgs-1.html#Syncfusion_Blazor_PivotView_PivotActionCompleteEventArgs_1_DataSourceSettings): It holds the current data source settings such as input data source, rows, columns, values, filters, format settings and so on. +The event provides the following parameters: -* [ActionName](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotActionCompleteEventArgs-1.html#Syncfusion_Blazor_PivotView_PivotActionCompleteEventArgs_1_ActionName): It holds the name of the current action completed. The following are the UI actions and their names: +- [DataSourceSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotActionCompleteEventArgs-1.html#Syncfusion_Blazor_PivotView_PivotActionCompleteEventArgs_1_DataSourceSettings): Contains the current report settings, including information about the input data, rows, columns, values, filters, and format settings used in the Pivot Table. +- [ActionName](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotActionCompleteEventArgs-1.html#Syncfusion_Blazor_PivotView_PivotActionCompleteEventArgs_1_ActionName): Specifies the name of the action just completed. The table below lists possible UI actions and their corresponding action names: -| Action | Action Name| -|----------------|-------------| -| Sort icon| Field sorted| -| Filter icon| Field filtered| -| Aggregation (Value type drop down and menu)| Field aggregated| -| Remove icon| Field removed| -| Edit icon| Calculated field edited| + | Action | Action Name | + |-------------------------------------------------|--------------------------| + | Sort icon clicked | Field sorted | + | Filter icon clicked | Field filtered | + | Aggregation changed (using value type dropdown) | Field aggregated | + | Remove icon clicked | Field removed | + | Edit icon (calculated field) clicked | Calculated field edited | -* [FieldInfo](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotActionCompleteEventArgs-1.html#Syncfusion_Blazor_PivotView_PivotActionCompleteEventArgs_1_FieldInfo): It holds the selected field information. +- [FieldInfo](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotActionCompleteEventArgs-1.html#Syncfusion_Blazor_PivotView_PivotActionCompleteEventArgs_1_FieldInfo): Provides information about the field selected during the action. -N> This option is applicable only when the field based UI actions are performed such as filtering, sorting, removing field from grouping bar, editing and aggregation type change. +N> The [FieldInfo](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotActionCompleteEventArgs-1.html#Syncfusion_Blazor_PivotView_PivotActionCompleteEventArgs_1_FieldInfo) parameter is provided only for actions related to sorting, filtering, aggregation changes, removing a field, or editing a calculated field using the grouping bar. -* [ActionInfo](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotActionCompleteEventArgs-1.html#Syncfusion_Blazor_PivotView_PivotActionCompleteEventArgs_1_ActionInfo): It holds the unique information about the current UI action. For example, if sorting is completed, the event argument contains information such as sort order and the field name. +- [ActionInfo](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotActionCompleteEventArgs-1.html#Syncfusion_Blazor_PivotView_PivotActionCompleteEventArgs_1_ActionInfo): Supplies detailed information about the UI action. For example, when sorting is finished, this parameter includes the sort order and the name of the field involved. ```cshtml @using Syncfusion.Blazor.PivotView @@ -873,7 +897,7 @@ N> This option is applicable only when the field based UI actions are performed                                - +                                @@ -900,21 +924,26 @@ N> This option is applicable only when the field based UI actions are performed } ``` + ### OnActionFailure -The event [OnActionFailure](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewEvents-1.html#Syncfusion_Blazor_PivotView_PivotViewEvents_1_OnActionFailure) triggers when the current UI action fails to achieve the desired result. It has the following parameters: +The [OnActionFailure](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewEvents-1.html#Syncfusion_Blazor_PivotView_PivotViewEvents_1_OnActionFailure) event occurs when a user action in the Pivot Table does not complete as expected. This event helps users understand what went wrong during interactions with the grouping bar. -* [ActionName](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotActionFailureEventArgs.html#Syncfusion_Blazor_PivotView_PivotActionFailureEventArgs_ActionName): It holds the name of the current action failed. The following are the UI actions and their names: +**Event Parameters** -| Action | Action Name| -|----------------|-------------| -| Sort icon| Sort field| -| Filter icon| Filter field| -| Aggregation (Value type drop down and menu)| Aggregate field| -| Remove icon| Remove field| -| Edit icon| Edit calculated field| +- [ActionName](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotActionFailureEventArgs.html#Syncfusion_Blazor_PivotView_PivotActionFailureEventArgs_ActionName): Identifies which user action did not succeed. The table below lists the actions and their corresponding names: -* [ErrorInfo](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotActionFailureEventArgs.html#Syncfusion_Blazor_PivotView_PivotActionFailureEventArgs_ErrorInfo): It holds the error information of the current UI action. + | Action | Action Name | + |-------------------------------------------------------|---------------------| + | Clicking the sort icon | Sort field | + | Applying a filter using the filter icon | Filter field | + | Choosing a value type from the aggregation dropdown | Aggregate field | + | Removing a field by clicking the remove icon | Remove field | + | Editing a calculated field using the edit icon | Edit calculated field| + +- [ErrorInfo](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotActionFailureEventArgs.html#Syncfusion_Blazor_PivotView_PivotActionFailureEventArgs_ErrorInfo): Provides details about the error that occurred for the specific user action. + +When this event is triggered, users can refer to the information in these parameters to identify the action that failed and the reason for the failure. This helps users correct issues with actions such as sorting, filtering, aggregating, removing, or editing fields in the Pivot Table's grouping bar. ```cshtml @using Syncfusion.Blazor.PivotView @@ -930,7 +959,7 @@ The event [OnActionFailure](https://help.syncfusion.com/cr/blazor/Syncfusion.Bla                                - +                                diff --git a/blazor/pivot-table/grouping.md b/blazor/pivot-table/grouping.md index 0f7ce2fa88..c704304aea 100644 --- a/blazor/pivot-table/grouping.md +++ b/blazor/pivot-table/grouping.md @@ -9,11 +9,11 @@ documentation: ug # Grouping in Blazor Pivot Table Component -Grouping is the most-useful feature in pivot table and the component automatically groups date, time, number and string. For example, the date type can be formatted and displayed based on year, quarter, month, and more. Likewise, the number type can be grouped range-wise, such as 1-5, 6-10, etc. These group fields will act as individual fields and allows users to drag them between different axes such as columns, rows, values, and filters and create pivot table at runtime. +Grouping is one of the most useful features in the Pivot Table component, automatically organizing date, time, number, and string data types into meaningful categories. For example, date fields can be formatted and displayed based on year, quarter, month, and other time periods. Similarly, number fields can be grouped into ranges, such as 1-5, 6-10, and so on. These grouped fields function as individual fields, allowing users to drag them between different axes including columns, rows, values, and filters to create dynamic Pivot Tables at runtime. N> This feature is applicable only for relational data source. -The grouping can be enabled by setting the [AllowGrouping](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewModel-1.html#Syncfusion_Blazor_PivotView_PivotViewModel_1_AllowGrouping) property in [SfPivotView](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SfPivotView-1.html) class to **true**. To perform the grouping action via UI, right click on the pivot table's row or column header. Select "**Group**", a dialog will appear which must be filled with the appropriate options to group the data. To ungroup, right click on the pivot table's row or column header, select "**Ungroup**". +The grouping feature can be enabled by setting the [AllowGrouping](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SfPivotView-1.html#Syncfusion_Blazor_PivotView_SfPivotView_1_AllowGrouping) property in [SfPivotView](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SfPivotView-1.html) class to **true**. To perform grouping actions through the user interface, right-click on the Pivot Table's row or column header and select **Group**. A dialog will appear where you can configure the appropriate options to group the data. To ungroup data, right-click on the Pivot Table's row or column header and select **Ungroup**. The following are the three different types of grouping: @@ -26,7 +26,7 @@ To have a quick glance on how to group row and column field items in the Blazor {% youtube "youtube:https://www.youtube.com/watch?v=t-LDymoVUzA"%} -N> Similar to Excel, only one type of grouping can be applied for a field. +N> Similar to Excel, only one type of grouping can be applied to a field at a time. ```cshtml @using Syncfusion.Blazor.PivotView @@ -59,12 +59,11 @@ N> Similar to Excel, only one type of grouping can be applied for a field. //Bind the data source collection here. Refer "Assigning sample data to the pivot table" section in getting started for more details. } } - ``` ## Number Grouping -Number grouping allows users to organize data, which is in number format into different ranges, such as 1-5, 6-10, etc. Number grouping can be configured via UI, by right-clicking on the number based header in the pivot table. +Number grouping allows users to organize numerical data into different ranges, such as 1–5, 6–10, and so on. This can be configured via the UI by right-clicking a number-based header in the Pivot Table and selecting the **Group** option from the context menu. ```cshtml @using Syncfusion.Blazor.PivotView @@ -96,35 +95,35 @@ Number grouping allows users to organize data, which is in number format into di //Bind the data source collection here. Refer "Assigning sample data to the pivot table" section in getting started for more details. } } - ``` ![Number Grouping in Blazor PivotTable](images/blazor-pivottable-number-grouping.png) ### Range selection -The "**Starting at**" and "**Ending at**" options are used to set the number range depending on which the headers will be grouped. For example, if the "Product_ID" field holds the number from "1001" to "1010" and the user chooses to group the number range by setting "**1004**" to "**Starting at**" and "**1008**" to "**Ending at**" options on their own. Then the specified number range will be used for number grouping and the rest will be grouped as "**Out of Range**". +The "**Starting at**" and "**Ending at**" options are used to set the number range depending on which the headers will be grouped. For example, if the "Product_ID" field holds the number from "1001" to "1010" and the user chooses to group the number range by setting "**1004**" to "**Starting at**" and "**1008**" to "**Ending at**" options on their own, then the specified number range will be used for number grouping and the rest will be grouped as "**Out of Range**". ![Number Grouping within Range in Blazor PivotTable](images/blazor-pivottable-number-group-within-range.png) ### Range interval -The "**Interval by**" option is used to separate the selected number data type field into range-wise such as 1-5, 6-10, etc. -For example, if the user wants to display the "Product_ID" data field with a group interval of "**2**" by setting the "**Interval by**" option on their own. The "Product_ID" field will then be grouped by the specified range of intervals, such as "**1004-1005**", "**1006-1007**",etc. +The "**Interval by**" option is used to separate the selected number data type field into range-wise such as 1-5, 6-10, etc. For example, if the user wants to display the "Product_ID" data field with a group interval of "**2**" by setting the "**Interval by**" option on their own, the "Product_ID" field will then be grouped by the specified range of intervals, such as "**1004-1005**", "**1006-1007**", etc. ![Grouping with Blazor PivotTable Range Interval](images/blazor-pivottable-group-within-range-interval.png)
![Updating Number Group in Blazor PivotTable](images/blazor-pivottable-update-number-group.png) -Number grouping can also be configured using the [PivotViewGroupSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewGroupSetting.html) class through code-behind. The properties required are: +### Configuring Number Grouping Programmatically + +You can configure number grouping through code-behind using the [PivotViewGroupSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewGroupSetting.html) class. This allows you to define how numbers are grouped without relying on the UI. Below are the key settings you need: -* [Name](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewGroupSetting.html#Syncfusion_Blazor_PivotView_PivotViewGroupSetting_Name): Allows user to set the field name. -* [RangeInterval](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewGroupSetting.html#Syncfusion_Blazor_PivotView_PivotViewGroupSetting_RangeInterval): Allows user to set the interval between two numbers. -* [StartingAt](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewGroupSetting.html#Syncfusion_Blazor_PivotView_PivotViewGroupSetting_StartingAt): Allows user to set the starting number. -* [EndingAt](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewGroupSetting.html#Syncfusion_Blazor_PivotView_PivotViewGroupSetting_EndingAt): Allows user to set the ending number. -* [Type](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewGroupSetting.html#Syncfusion_Blazor_PivotView_PivotViewGroupSetting_Type): Allows user to set the group type. For number grouping, [GroupType.Number](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.GroupType.html#Syncfusion_Blazor_PivotView_GroupType_Number) is set. +* [Name](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotGroupSetting.html#Syncfusion_Blazor_PivotView_PivotGroupSetting_Name): Allows user to set the field name. +* [RangeInterval](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotGroupSetting.html#Syncfusion_Blazor_PivotView_PivotGroupSetting_RangeInterval): Allows user to set the interval between two numbers. +* [StartingAt](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotGroupSetting.html#Syncfusion_Blazor_PivotView_PivotGroupSetting_StartingAt): Allows user to set the starting number. +* [EndingAt](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotGroupSetting.html#Syncfusion_Blazor_PivotView_PivotGroupSetting_EndingAt): Allows user to set the ending number. +* [Type](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotGroupSetting.html#Syncfusion_Blazor_PivotView_PivotGroupSetting_Type): Allows user to set the group type. For number grouping, [GroupType.Number](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.GroupType.html#Syncfusion_Blazor_PivotView_GroupType_Number) is set. -N> If starting and ending numbers specified in [StartingAt](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewGroupSetting.html#Syncfusion_Blazor_PivotView_PivotViewGroupSetting_StartingAt) and [EndingAt](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewGroupSetting.html#Syncfusion_Blazor_PivotView_PivotViewGroupSetting_EndingAt) properties are in-between the number range, then the rest of the numbers will be grouped and placed in “Out of Range” section introduced specifically to this feature. +N> If starting and ending numbers specified in [StartingAt](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotGroupSetting.html#Syncfusion_Blazor_PivotView_PivotGroupSetting_StartingAt) and [EndingAt](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotGroupSetting.html#Syncfusion_Blazor_PivotView_PivotGroupSetting_EndingAt) properties are in-between the number range, then the rest of the numbers will be grouped and placed in “Out of Range” section introduced specifically to this feature. ```cshtml @using Syncfusion.Blazor.PivotView @@ -159,20 +158,19 @@ N> If starting and ending numbers specified in [StartingAt](https://help.syncfus //Bind the data source collection here. Refer "Assigning sample data to the pivot table" section in getting started for more details. } } - ``` ![Updating Number Group in Blazor PivotTable](images/blazor-pivottable-update-number-group.png) ### Ungrouping the existing number groups -By right-clicking the appropriate header and selecting "**Ungroup**" from the context menu in the pivot table component, users can ungroup the applied number grouping. +To remove an applied number grouping, simply right-click on the grouped header in the Pivot Table and select **Ungroup** option from the context menu. This action will break apart the grouped ranges and display the original, ungrouped values in the table. ![UnGrouping in Blazor PivotTable](images/blazor-pivottable-ungroup.png) ## Date Grouping -Date grouping allows users to organize data, which is in date format into different sections such as years, quarters, months, days, hours, minutes, and seconds. Date grouping can be configured via UI, by right-clicking on the date and time based header in the pivot table. +Date grouping organizes date and time data into hierarchical segments, such as years, quarters, months, days, hours, minutes, or seconds. Users can configure date grouping through the UI by right-clicking a date or time-based header in the Pivot Table and selecting **Group** option from the context menu. A dialog will appear, allowing users to choose the desired grouping intervals. ```cshtml @using Syncfusion.Blazor.PivotView @@ -208,22 +206,21 @@ Date grouping allows users to organize data, which is in date format into differ //Bind the data source collection here. Refer "Assigning sample data to the pivot table" section in getting started for more details. } } - ``` ![Date Grouping in Blazor PivotTable](images/blazor-pivottable-date-grouping.png) -### Range selection +### Range Selection -The "**Starting at**" and "**Ending at**" options are used to set the date range depending on which the headers will be grouped. For example, if the "Date" field holds the date from "01/01/2015" to "02/12/2018" and the user chooses to group the date range by setting "**01/07/2015**" to "**Starting at**" and "**31/07/2017**" to "**Ending at**" options on their own. Then the specified date range will be used for date grouping and the rest will be considered as "**Out of Range**". +The **Starting at** and **Ending at** options allow users to define the date range for grouping headers. For example, if the "Date" field contains data from "01/01/2015" to "02/12/2018" and the user sets **Starting at** to "**01/07/2015**" and **Ending at** to "**31/07/2017**", only records within this range will be grouped according to the selected settings. Dates outside this range are labeled as **Out of Range**. ![Range Selection in Blazor PivotTable](images/blazor-pivottable-range-selection.png) -### Group interval +### Group Interval -The "**Interval by**" option is used to separate the selected date fields into years, quarters, months, days, hours, minutes and seconds. For example, if the user wants to display the "Date" field with group intervals as "**Years**" and "**Months**" by selecting the "**Interval by**" option on their own. The "Date" field will then be separated by the specified group intervals and created as two new fields, namely "**Years (Date)**" which holds the date years and "**Months (Date)**" which holds the date months. Such fields can be used for report manipulations in the pivot table at runtime. +The **Interval by** option allows users to split date fields into years, quarters, months, days, hours, minutes, or seconds. For example, selecting **Years** and **Months** as intervals for the "Date" field results in two new fields: **Years (Date)**, containing the year values, and **Months (Date)**, containing the month values. These grouped fields can be used for report manipulations in the Pivot Table at runtime. -N> When none of the **Interval by** options are chosen, the **OK** button in the dialog will be disabled, meaning that at least one interval option should be selected in order to apply the date grouping. +N> If no options are selected in the **Interval by** section, the **OK** button in the dialog remains disabled. At least one interval must be chosen to enable date grouping. ![Interval Grouping in Blazor PivotTable](images/blazor-pivottable-interval-grouping.png)
@@ -231,15 +228,17 @@ N> When none of the **Interval by** options are chosen, the **OK** button in the
![Displaying Updated Date Group in Blazor PivotTable](images/blazor-pivottable-update-date-group.png) -Date grouping can also be configured using the [PivotViewGroupSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewGroupSetting.html) class through code-behind. The properties required are: +### Configuring Date Grouping Programmatically + +You can configure date grouping programmatically using the [PivotViewGroupSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewGroupSetting.html) class. This allows you to define how dates are grouped without using the UI. The key settings are: -* [Name](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewGroupSetting.html#Syncfusion_Blazor_PivotView_PivotViewGroupSetting_Name): Allows user to set the field name. -* [Type](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewGroupSetting.html#Syncfusion_Blazor_PivotView_PivotViewGroupSetting_Type): Allows user to set the group type. For date grouping, [GroupType.Date](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.GroupType.html) is set. -* [StartingAt](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewGroupSetting.html#Syncfusion_Blazor_PivotView_PivotViewGroupSetting_StartingAt): Allows user to set starting date. -* [EndingAt](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewGroupSetting.html#Syncfusion_Blazor_PivotView_PivotViewGroupSetting_EndingAt): Allows user to set ending date. -* [GroupInterval](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewGroupSetting.html#Syncfusion_Blazor_PivotView_PivotViewGroupSetting_GroupInterval): Allows user to set interval in year, quarter, month, day, hour, minute, or second pattern. +* [Name](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotGroupSetting.html#Syncfusion_Blazor_PivotView_PivotGroupSetting_Name): Allows user to set the field name. +* [Type](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotGroupSetting.html#Syncfusion_Blazor_PivotView_PivotGroupSetting_Type): Allows user to set the group type. For date grouping, [GroupType.Date](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.GroupType.html#Syncfusion_Blazor_PivotView_GroupType_Date) is set. +* [StartingAt](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotGroupSetting.html#Syncfusion_Blazor_PivotView_PivotGroupSetting_StartingAt): Allows user to set starting date. +* [EndingAt](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotGroupSetting.html#Syncfusion_Blazor_PivotView_PivotGroupSetting_EndingAt): Allows user to set ending date. +* [GroupInterval](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotGroupSetting.html#Syncfusion_Blazor_PivotView_PivotGroupSetting_GroupInterval): Allows user to set interval in year, quarter, month, day, hour, minute, or second pattern. -N> From the date format "YYYY-DD-MM HH:MM:SS", if the user wants to display only year and month, then the [GroupInterval](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewGroupSetting.html#Syncfusion_Blazor_PivotView_PivotViewGroupSetting_GroupInterval) property should be set with [DateGroup.Years](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.DateGroup.html#Syncfusion_Blazor_PivotView_DateGroup_Years) and [DateGroup.Months](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.DateGroup.html#Syncfusion_Blazor_PivotView_DateGroup_Months) alone. Also, the user can shuffle the order of year, quarter, month, day, hour, minute, or second based on their requirement and display the same in the pivot table. +N> For example, if your date format is "YYYY-DD-MM HH:MM:SS" and you want to group only by year and month, set the [GroupInterval](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotGroupSetting.html#Syncfusion_Blazor_PivotView_PivotGroupSetting_GroupInterval) property with just [DateGroup.Years](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.DateGroup.html#Syncfusion_Blazor_PivotView_DateGroup_Years) and [DateGroup.Months](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.DateGroup.html#Syncfusion_Blazor_PivotView_DateGroup_Months). You can also rearrange the order of the intervals (Year, Quarter, Month, Day, etc.) as needed—this order will reflect in the Pivot Table display. ```cshtml @using Syncfusion.Blazor.PivotView @@ -278,20 +277,19 @@ N> From the date format "YYYY-DD-MM HH:MM:SS", if the user wants to display only //Bind the data source collection here. Refer "Assigning sample data to the pivot table" section in getting started for more details. } } - ``` ![Displaying Updated Date Group in Blazor PivotTable](images/blazor-pivottable-update-date-group.png) ### Ungrouping the existing date groups -By right-clicking the appropriate header and selecting "**Ungroup**" from the context menu in the pivot table component, users can ungroup the applied date grouping. +To remove a previously applied date grouping, simply right-click the relevant date-based header within the Pivot Table and select the **Ungroup** option from the context menu. This action will revert the grouped dates back to their original, ungrouped state, allowing you to view and analyze the raw date values in the Pivot Table component. ![UnGrouping Date Groups in Blazor PivotTable](images/blazor-pivottable-date-ungroup.png) ## Custom Grouping -Custom grouping can group any data type such as date, time, number and string into a custom field based on the user's needs. It can be configured via the UI by right-clicking on any header in the pivot table. +Custom grouping is an option that enables users to group data types (date, time, number, or string) into custom fields based on specific requirements. This functionality can be accessed through the user interface by right-clicking a header in the Pivot Table. ```cshtml @using Syncfusion.Blazor.PivotView @@ -323,24 +321,29 @@ Custom grouping can group any data type such as date, time, number and string in //Bind the data source collection here. Refer "Assigning sample data to the pivot table" section in getting started for more details. } } - ``` -In order to create custom grouping in the pivot table, a minimum of two headers belonging to a specific field should be chosen. To select more than one header, press and hold the CTRL key or hold the SHIFT key and click the appropriate row or column headers. Once selection is done, right-click and select "**Group**". +### Creating a Custom Group -![Custom Grouping in Blazor PivotTable](images/blazor-pivottable-custom-grouping.png) +To create a custom group in the Pivot Table, select at least two headers from the same field. Hold the **CTRL** key to select multiple headers individually or the **SHIFT** key to select a range of headers. Then, right-click and choose **Group** from the context menu. -In the dialog, the "**Field caption**" is the alias name of the new custom field that will be used to show up in the pivot table component. +![Custom Grouping in Blazor PivotTable](images/blazor-pivottable-custom-grouping.png) -![Caption with Custom Grouping in Blazor PivotTable](images/blazor-pivottable-custom-group-with-caption.png) +In the dialog box: +- **Field Caption**: Set an alias name for the new custom field, which will appear in the Pivot Table. +- **Group Name**: Define the top-level name for the group that will contain the selected headers. -The "**Group Name**" option helps to set the name of the header to hold the other selected headers. For example, if the user wants to group headers such as "**Gloves**", "**Jerseys**" and "**Shorts**" in the "Products" field by setting the top level name as "**Clothings**" to "**Group Name**" on their own. The selected headers are then grouped under the name "**Clothings**" in the pivot table. +For example, to group the headers "Gloves," "Jerseys," and "Shorts" in the "Products" field under a single group, set the **Group Name** to "Clothings." The selected headers will then appear under "Clothings" in the Pivot Table. +![Caption with Custom Grouping in Blazor PivotTable](images/blazor-pivottable-custom-group-with-caption.png) +
![Blazor PivotTable with Custom Grouping](images/blazor-pivottable-custom-group.png)
![Displaying Updated Custom Grouping in Blazor PivotTable](images/blazor-pivottable-update-custom-group.png) -Users can also apply new custom grouping options to an existing custom field by right-clicking on the custom group header in the pivot table. For example, if the user wants to create a new custom group for the current custom group headers such as "**Bottles and Cages**", "**Cleaners**" and "**Fenders**" by setting the top level name as "**Accessories**" to "**Group Name**" on their own. The selected headers will then be grouped in the pivot table under the name "**Accessories**" with a new custom field called "**Product category 1**". +### Nested Custom Grouping + +Users can also apply new custom grouping options to an existing custom field by right-clicking on the custom group header in the Pivot Table. For example, if the user wants to create a new custom group for the current custom group headers such as "**Bottles and Cages**", "**Cleaners**" and "**Fenders**" by setting the top level name as "**Accessories**" to "**Group Name**" on their own. The selected headers will then be grouped in the Pivot Table under the name "**Accessories**" with a new custom field called "**Product category 1**". ![Nested Custom Grouping in Blazor PivotTable](images/blazor-pivottable-nested-custom-group.png)
@@ -348,19 +351,21 @@ Users can also apply new custom grouping options to an existing custom field by
![Displaying Updated Nested Custom Grouping in Blazor PivotTable](images/blazor-pivottable-update-nested-custom-group.png) -Custom grouping can also be configured using the [PivotViewGroupSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewGroupSetting.html) class through code-behind. The properties required are: +### Configuring Custom Grouping Programmatically -* [Name](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewGroupSetting.html#Syncfusion_Blazor_PivotView_PivotViewGroupSetting_Name): Allows user to set the field name. -* [Caption](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewGroupSetting.html#Syncfusion_Blazor_PivotView_PivotViewGroupSetting_Caption): Allows user to set the caption name for custom grouping field. +You can configure custom grouping programmatically using the [PivotViewGroupSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewGroupSetting.html) class in the Pivot Table component. This property allows you to define how fields are grouped in the Pivot Table without using the UI. The available properties are: + +* [Name](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotGroupSetting.html#Syncfusion_Blazor_PivotView_PivotGroupSetting_Name): Allows user to set the field name. +* [Caption](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotGroupSetting.html#Syncfusion_Blazor_PivotView_PivotGroupSetting_Caption): Allows user to set the caption name for custom grouping field. * [PivotViewCustomGroups](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewCustomGroups.html): Allows user to set the custom groups. -* [Type](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewGroupSetting.html#Syncfusion_Blazor_PivotView_PivotViewGroupSetting_Type): Allows user to set the group type. For custom grouping, [GroupType.Custom](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.GroupType.html#Syncfusion_Blazor_PivotView_GroupType_Custom) is set. +* [Type](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotGroupSetting.html#Syncfusion_Blazor_PivotView_PivotGroupSetting_Type): Allows user to set the group type. For custom grouping, [GroupType.Custom](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.GroupType.html#Syncfusion_Blazor_PivotView_GroupType_Custom) is set. The available custom group properties in [PivotViewCustomGroup](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewCustomGroup.html) in [PivotViewCustomGroups](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewCustomGroups.html) class are: -* [GroupName](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewCustomGroup.html#Syncfusion_Blazor_PivotView_PivotViewCustomGroup_GroupName): Allows user to set the group name (or title) for selected headers. -* [Items](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewCustomGroup.html#Syncfusion_Blazor_PivotView_PivotViewCustomGroup_Items): Allows to set the headers which needs to be grouped from display. +* [GroupName](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotCustomGroupSettings.html#Syncfusion_Blazor_PivotView_PivotCustomGroupSettings_GroupName): Allows user to set the group name (or title) for selected headers. +* [Items](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotCustomGroupSettings.html#Syncfusion_Blazor_PivotView_PivotCustomGroupSettings_Items): Allows to set the headers which needs to be grouped from display. -N> When the [GroupName](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewCustomGroup.html#Syncfusion_Blazor_PivotView_PivotViewCustomGroup_GroupName) with the headers listed in [Items](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewCustomGroup.html#Syncfusion_Blazor_PivotView_PivotViewCustomGroup_Items) in the [PivotViewCustomGroup](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewGroupSetting.html#Syncfusion_Blazor_PivotView_PivotViewGroupSetting_RangeInterval) class is grouped by the defined [GroupName](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewCustomGroup.html#Syncfusion_Blazor_PivotView_PivotViewCustomGroup_GroupName) and the rest is grouped by its own name in the pivot table. +N> Headers listed in [Items](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotCustomGroupSettings.html#Syncfusion_Blazor_PivotView_PivotCustomGroupSettings_Items) are grouped under the specified [GroupName](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotCustomGroupSettings.html#Syncfusion_Blazor_PivotView_PivotCustomGroupSettings_GroupName) in the Pivot Table. Headers not included in [Items](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotCustomGroupSettings.html#Syncfusion_Blazor_PivotView_PivotCustomGroupSettings_Items) are displayed under their original names. ```cshtml @using Syncfusion.Blazor.PivotView @@ -399,17 +404,16 @@ N> When the [GroupName](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor. //Bind the data source collection here. Refer "Assigning sample data to the pivot table" section in getting started for more details. } } - ``` ![Displaying Updated Custom Grouping in Blazor PivotTable](images/blazor-pivottable-update-custom-group.png) -### Ungrouping the existing custom groups +### Ungrouping Existing Custom Groups -By right-clicking the appropriate header and selecting "**Ungroup**" from the context menu in the pivot table component, users can ungroup the applied custom grouping. +To remove a custom group in the Pivot Table, simply right-click on the grouped header and select the "**Ungroup**" option from the context menu. This action will separate the grouped items back into their individual headers within the Pivot Table. -N> When a specific field is removed from the report after ungrouping, its custom group fields will also be removed from the pivot table. +N> After ungrouping, if you remove the related field from the report, any custom group fields associated with it will also be removed from the Pivot Table. ![Custom UnGrouping in Blazor PivotTable](images/blazor-pivottable-custom-ungroup.png) -N> Refer to the [Blazor Pivot Table](https://www.syncfusion.com/blazor-components/blazor-pivot-table) feature tour page for its groundbreaking feature representations. You can also explore our [Blazor Pivot Table example](https://blazor.syncfusion.com/demos/pivot-table/default-functionalities?theme=bootstrap5) to know how to render and configure the pivot table. \ No newline at end of file +N> Refer to the [Blazor Pivot Table](https://www.syncfusion.com/blazor-components/blazor-pivot-table) feature tour page for its groundbreaking feature representations. You can also explore our [Blazor Pivot Table example](https://blazor.syncfusion.com/demos/pivot-table/default-functionalities?theme=bootstrap5) to know how to render and configure the Pivot Table. \ No newline at end of file diff --git a/blazor/pivot-table/how-to/apply-custom-styles-to-pivot-cells.md b/blazor/pivot-table/how-to/apply-custom-styles-to-pivot-cells.md index dca081fd14..70d9b1257f 100644 --- a/blazor/pivot-table/how-to/apply-custom-styles-to-pivot-cells.md +++ b/blazor/pivot-table/how-to/apply-custom-styles-to-pivot-cells.md @@ -9,9 +9,9 @@ documentation: ug # Apply custom style to pivot cells in Blazor Pivot Table Component -The [EnginePopulated](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewEvents-1.html#Syncfusion_Blazor_PivotView_PivotViewEvents_1_EnginePopulated) event within the [PivotViewEvents](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewEvents-1.html), which is triggered whenever the report is modified and the engine is populated, allows you to apply custom styling to row, column and value cells in the pivot table. +The [EnginePopulated](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewEvents-1.html#Syncfusion_Blazor_PivotView_PivotViewEvents_1_EnginePopulated) event in the [PivotViewEvents](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewEvents-1.html) triggers each time the report changes and the engine updates. This event lets you add your own styles to row, column, and value cells in the Pivot Table. -In the following example, a custom style has been applied to the column header **"FY 2015"** and to the row header **"Germany"** and its aggregated value via the [EnginePopulated](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewEvents-1.html#Syncfusion_Blazor_PivotView_PivotViewEvents_1_EnginePopulated) event by adding the **"e-custom"** class to the `cellData.CssClass` property. +In the following example, a custom style is applied to the column header **FY 2015** the row header **Germany** and the corresponding value cell for **Amount** under **FY 2016** via the [EnginePopulated](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewEvents-1.html#Syncfusion_Blazor_PivotView_PivotViewEvents_1_EnginePopulated) event by adding the **e-custom** class to the `cellData.CssClass` property. ```cshtml @using Syncfusion.Blazor.PivotView @@ -68,7 +68,7 @@ In the following example, a custom style has been applied to the column header * { cellData.CssClass = "e-custom"; } - if ((cellData.Axis == "column" && cellData.FormattedText == "FY 2017")) + if ((cellData.Axis == "column" && cellData.FormattedText == "FY 2015")) { cellData.CssClass = "e-custom"; } diff --git a/blazor/pivot-table/how-to/bind-complex-data-to-the-pivot-table.md b/blazor/pivot-table/how-to/bind-complex-data-to-the-pivot-table.md index 095692619a..a30a779519 100644 --- a/blazor/pivot-table/how-to/bind-complex-data-to-the-pivot-table.md +++ b/blazor/pivot-table/how-to/bind-complex-data-to-the-pivot-table.md @@ -9,9 +9,9 @@ documentation: ug # Convert complex data to flat data and assign it to the Pivot Table -By default, flat data can only bind to the pivot table. However, using **ExpandoObject**, you can connect complex data to the pivot table by converting it to flat data via code-behind and binding it to the pivot table using the [DataSource](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html#Syncfusion_Blazor_PivotView_PivotViewDataSourceSettings_1_DataSource) property under [PivotViewDataSourceSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html). +The Pivot Table component requires flat data for binding. Complex data, such as nested objects or hierarchical structures, must be converted into a flat structure before it can be assigned to the Pivot Table using the [DataSource](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html#Syncfusion_Blazor_PivotView_PivotViewDataSourceSettings_1_DataSource) property within [PivotViewDataSourceSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html). -In the following example, the **ConvertToFlatData()** function is used to convert complex data to flat data and bind it to the pivot table using the [DataSource](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html#Syncfusion_Blazor_PivotView_PivotViewDataSourceSettings_1_DataSource) property, then bind the field names to the rows and columns based on the converted flat data under [PivotViewDataSourceSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html). +In the example below, the `ConvertToFlatData` function transforms complex data with nested objects (e.g., `ShipDetails`) into flat data using `ExpandoObject`. The converted data is then assigned to the Pivot Table using the [DataSource](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html#Syncfusion_Blazor_PivotView_PivotViewDataSourceSettings_1_DataSource) property. Field names are mapped to rows, columns, and values under [PivotViewDataSourceSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html) to display the data effectively. ```cshtml @using Syncfusion.Blazor.PivotView diff --git a/blazor/pivot-table/how-to/customize-number-and-date-format.md b/blazor/pivot-table/how-to/customize-number-and-date-format.md index 50351ee30c..453a51b588 100644 --- a/blazor/pivot-table/how-to/customize-number-and-date-format.md +++ b/blazor/pivot-table/how-to/customize-number-and-date-format.md @@ -9,14 +9,14 @@ documentation: ug # Customize number and date format in Blazor Pivot Table Component -User can format the number, date, and time values for each field using [PivotViewFormatSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewFilterSettings.html) option under [PivotViewDataSource](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html). It can be configured through code behind, during initial rendering. +You can format the number, date, and time values for each field using the [PivotViewFormatSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewFilterSettings.html) option under [PivotViewDataSourceSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html). This configuration is applied during component initialization to ensure consistent data presentation across the pivot table. ## Number formatting -For numbers, the formatting settings required to apply through code behind are: +For numeric fields, the formatting settings include the following properties: -* [Name](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewFormatSetting.html#Syncfusion_Blazor_PivotView_PivotViewFormatSetting_Name): It allows to set the field name. -* [Format](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewFormatSetting.html#Syncfusion_Blazor_PivotView_PivotViewFormatSetting_Format): It allows to set the format of the respective field. +* [Name](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewFormatSetting.html#Syncfusion_Blazor_PivotView_PivotViewFormatSetting_Name): Specifies the field name to which the formatting should be applied. +* [Format](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewFormatSetting.html#Syncfusion_Blazor_PivotView_PivotViewFormatSetting_Format): Defines the number format pattern for the respective field (e.g., 'N2' for two decimal places, 'C' for currency). ```cshtml @using Syncfusion.Blazor.PivotView @@ -53,17 +53,17 @@ For numbers, the formatting settings required to apply through code behind are: ``` -![Number Formatting in Blazor PivotTable](images/blazor-pivottable-number-formatting.png) +![Number Formatting in Blazor Pivot Table](images/blazor-pivottable-number-formatting.png) -## Date and time formatting +## Date and Time formatting N> This property is applicable only for relational data source. -For date and time, the formatting settings required to apply through code behind are: +For date and time fields, the formatting settings include these properties: -* [Name](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewFormatSetting.html#Syncfusion_Blazor_PivotView_PivotViewFormatSetting_Name): It allows to set the field name. -* [Format](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewFormatSetting.html#Syncfusion_Blazor_PivotView_PivotViewFormatSetting_Format): It allows to set the format of the respective field. -* [Type](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewFormatSetting.html#Syncfusion_Blazor_PivotView_PivotViewFormatSetting_Type): It allows to set the type of format to be used for the respective field. +* [Name](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewFormatSetting.html#Syncfusion_Blazor_PivotView_PivotViewFormatSetting_Name): Specifies the field name to which the formatting should be applied. +* [Format](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewFormatSetting.html#Syncfusion_Blazor_PivotView_PivotViewFormatSetting_Format): Defines the date/time format pattern for the respective field (e.g., 'dd/MM/yyyy', 'MMM yyyy'). +* [Type](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewFormatSetting.html#Syncfusion_Blazor_PivotView_PivotViewFormatSetting_Type): Specifies the format type to be used for the respective field (Date, Time, or DateTime). ```cshtml @using Syncfusion.Blazor.PivotView @@ -94,10 +94,10 @@ For date and time, the formatting settings required to apply through code behind ``` -![Date Formatting in Blazor PivotTable](images/blazor-pivottable-date-formatting.png) +![Date Formatting in Blazor Pivot Table](images/blazor-pivottable-date-formatting.png) ## Limitations of date formatting -As per Firefox and Edge browsers standards, most of the date and time formats used in data source aren’t supported. For example: Apr-2000, Apr-01-2000, 01-03-2000, 2000-Apr-01 etc. are not supported. Meanwhile [ISO formats](https://262.ecma-international.org/5.1/#sec-15.9.1.15) will be supported across all browsers. +According to Firefox and Edge browser standards, most date and time formats used in data sources are not supported. For example: Apr-2000, Apr-01-2000, 01-03-2000, 2000-Apr-01, and similar formats are not recognized. However, [ISO formats](https://262.ecma-international.org/5.1/#sec-15.9.1.15) are supported across all browsers for consistent date handling. N> You can refer to our [Blazor Pivot Table](https://www.syncfusion.com/blazor-components/blazor-pivot-table) feature tour page for its groundbreaking feature representations. You can also explore our [Blazor Pivot Table example](https://blazor.syncfusion.com/demos/pivot-table/default-functionalities?theme=bootstrap5) to know how to render and configure the pivot table. \ No newline at end of file diff --git a/blazor/pivot-table/how-to/customizing-loading-indicator.md b/blazor/pivot-table/how-to/customizing-loading-indicator.md index 86c90fc722..a1fad71980 100644 --- a/blazor/pivot-table/how-to/customizing-loading-indicator.md +++ b/blazor/pivot-table/how-to/customizing-loading-indicator.md @@ -9,7 +9,9 @@ documentation: ug # Customizing loading indicator in Blazor Pivot Table Component -You can customize the appearance of the loading indicator in the pivot table by using the [SpinnerTemplate](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SfPivotView-1.html#Syncfusion_Blazor_PivotView_SfPivotView_1_SpinnerTemplate) property. This property accepts an HTML string which can be used for appearance customization. +The pivot table displays a loading indicator during data processing operations such as filtering, sorting, and aggregation calculations. The default loading spinner can be customized to match application design requirements using the [SpinnerTemplate](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SfPivotView-1.html#Syncfusion_Blazor_PivotView_SfPivotView_1_SpinnerTemplate) property. + +The [SpinnerTemplate](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SfPivotView-1.html#Syncfusion_Blazor_PivotView_SfPivotView_1_SpinnerTemplate) property accepts an HTML string that defines the custom loading indicator appearance. This enables control over the visual presentation, including custom styling and animations. N> You can also disable the loading indicator by setting [SpinnerTemplate](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SfPivotView-1.html#Syncfusion_Blazor_PivotView_SfPivotView_1_SpinnerTemplate) to empty string. diff --git a/blazor/pivot-table/how-to/display-string-value-to-pivot-table-values.md b/blazor/pivot-table/how-to/display-string-value-to-pivot-table-values.md index 19506c31ad..0908027551 100644 --- a/blazor/pivot-table/how-to/display-string-value-to-pivot-table-values.md +++ b/blazor/pivot-table/how-to/display-string-value-to-pivot-table-values.md @@ -1,17 +1,17 @@ --- layout: post -title: Display string value to pivot table values in Blazor | Syncfusion -description: Learn here all about Display string value to pivot table values in Syncfusion Blazor Pivot Table component and more. +title: Display string values in Blazor Pivot Table value cells | Syncfusion +description: Learn how to display custom string values in Pivot Table value cells by using the CellTemplate property in the Syncfusion Blazor Pivot Table component. platform: Blazor control: Pivot Table documentation: ug --- -# Display string value to pivot table values in Blazor Pivot Table +# Display string values in Blazor Pivot Table value cells -End user can display string value to the pivot table's value cell by using the [CellTemplate](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewTemplates.html#Syncfusion_Blazor_PivotView_PivotViewTemplates_CellTemplate) property in [PivotViewTemplates](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewTemplates.html) class. +String values can be displayed in value cells by using the [CellTemplate](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewTemplates.html#Syncfusion_Blazor_PivotView_PivotViewTemplates_CellTemplate) property of the [PivotViewTemplates](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewTemplates.html) class. The template receives an [AxisSet](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.AxisSet.html) context that contains the cell information (for example, Axis, Value, ActualText, and FormattedText). Setting [AxisSet.FormattedText](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.AxisSet.html#Syncfusion_Blazor_PivotView_AxisSet_FormattedText) determines the text rendered for that cell without altering the underlying value. -In the following example, each cell value of the **Sold** field's actual value has been converted to **{hours:D2}:{minutes:D2}:{seconds:D2}** format and string values have been assigned to `data.FormattedText`. +In the following example, each value cell for the **Sold** field is converted to the string format **{hours:D2}:{minutes:D2}:{seconds:D2}** (HH:mm:ss), and the result is assigned to `data.FormattedText` so the cell displays the custom string. ```cshtml @using Syncfusion.Blazor.PivotView diff --git a/blazor/pivot-table/how-to/hide-empty-headers.md b/blazor/pivot-table/how-to/hide-empty-headers.md index 6f6fa6cfd4..81b27ad314 100644 --- a/blazor/pivot-table/how-to/hide-empty-headers.md +++ b/blazor/pivot-table/how-to/hide-empty-headers.md @@ -9,11 +9,11 @@ documentation: ug # Hide empty headers in Blazor Pivot Table Component -If the raw data for a particular field is not defined, it will be shown as 'Undefined' in the pivot table headers. You can hide those headers by setting the [ShowHeaderWhenEmpty](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html#Syncfusion_Blazor_PivotView_PivotViewDataSourceSettings_1_ShowHeaderWhenEmpty) property to **false** in the pivot table. +When the raw data for a particular field is not defined, it will be shown as 'null' in the pivot table headers. You can hide those headers by setting the [ShowHeaderWhenEmpty](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html#Syncfusion_Blazor_PivotView_PivotViewDataSourceSettings_1_ShowHeaderWhenEmpty) property to **false** in the pivot table. -For example, if the raw data for the field 'Country' is defined as **"United Kingdom"** and **"State"** is not defined means, it will be shown as **"United Kingdom >> Undefined"** in the header section. Here, you can hide those 'Undefined' header using the [ShowHeaderWhenEmpty](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html#Syncfusion_Blazor_PivotView_PivotViewDataSourceSettings_1_ShowHeaderWhenEmpty) property. +For example, when the raw data contains **"United Kingdom"** for the 'Country' field but the **"State"** field is null, the header displays as **"United Kingdom >> null"**. Here, you can hide those 'null' headers using the [ShowHeaderWhenEmpty](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html#Syncfusion_Blazor_PivotView_PivotViewDataSourceSettings_1_ShowHeaderWhenEmpty) property. -N> By default, this property is set as **true**. +N> By default, this property is set to **true**. ```cshtml @using Syncfusion.Blazor.PivotView @@ -21,12 +21,12 @@ N> By default, this property is set as **true**. + - - + @@ -39,15 +39,55 @@ N> By default, this property is set as **true**. -@code{ +@code { public List data { get; set; } protected override void OnInitialized() { this.data = ProductDetails.GetProductData().ToList(); //Bind the data source collection here. Refer "Assigning sample data to the pivot table" section in getting started for more details. } -} + public class ProductDetails + { + public int Sold { get; set; } + public double Amount { get; set; } + public string Country { get; set; } + public string Products { get; set; } + public string Year { get; set; } + public string Quarter { get; set; } + public string State { get; set; } + + public static List GetProductData() + { + List productData = new List(); + productData.Add(new ProductDetails { Sold = 2, Amount = 100, Country = "Canada", Products = "Bike", Year = "FY 2005", State = "Alberta" }); + productData.Add(new ProductDetails { Sold = 3, Amount = 0, Country = "Canada", Products = "Van", Year = "FY 2006", State = "British Columbia" }); + productData.Add(new ProductDetails { Sold = 4, Amount = 300, Products = "Car", Year = "FY 2007", State = "Brunswick" }); + productData.Add(new ProductDetails { Sold = 3, Amount = 150, Country = "Canada", Products = "Bike", State = "Manitoba" }); + productData.Add(new ProductDetails { Sold = 4, Amount = 200, Country = "Canada", Year = "FY 2006", State = "Ontario" }); + productData.Add(new ProductDetails { Sold = 0, Amount = 100, Country = "Canada", Products = "Van", Year = "FY 2007", State = "Quebec" }); + productData.Add(new ProductDetails { Sold = 2, Amount = 200, Country = "France", Products = "Bike", Year = "FY 2005" }); + productData.Add(new ProductDetails { Sold = 4, Amount = 0, Country = "France", Products = "Van", Year = "FY 2006", State = "Essonne" }); + productData.Add(new ProductDetails { Sold = 3, Amount = 300, Products = "Car", Year = "FY 2007", State = "Garonne (Haute)" }); + productData.Add(new ProductDetails { Sold = 2, Amount = 150, Country = "France", Products = "Van", State = "Gers" }); + productData.Add(new ProductDetails { Sold = 3, Amount = 200, Country = "Germany", Year = "FY 2006", State = "Bayern" }); + productData.Add(new ProductDetails { Sold = 0, Amount = 250, Country = "Germany", Products = "Car", Year = "FY 2007", State = "Brandenburg" }); + productData.Add(new ProductDetails { Sold = 4, Amount = 150, Country = "Germany", Products = "Car", Year = "FY 2008" }); + productData.Add(new ProductDetails { Sold = 4, Amount = 0, Country = "Germany", Products = "Bike", Year = "FY 2008", State = "Hessen" }); + productData.Add(new ProductDetails { Sold = 3, Amount = 150, Products = "Van", Year = "FY 2007", State = "Nordrhein-Westfalen" }); + productData.Add(new ProductDetails { Sold = 2, Amount = 100, Country = "Germany", Products = "Bike", State = "Saarland" }); + productData.Add(new ProductDetails { Sold = 5, Amount = 150, Country = "United Kingdom", Year = "FY 2008" }); + productData.Add(new ProductDetails { Sold = 0, Amount = 250, Country = "United States", Products = "Car", Year = "FY 2007", State = "Alabama" }); + productData.Add(new ProductDetails { Sold = 4, Amount = 200, Country = "United States", Products = "Van", Year = "FY 2005" }); + productData.Add(new ProductDetails { Sold = 2, Amount = 0, Country = "United States", Products = "Bike", Year = "FY 2006", State = "Colorado" }); + productData.Add(new ProductDetails { Sold = 3, Amount = 150, Products = "Car", Year = "FY 2008", State = "New Mexico" }); + productData.Add(new ProductDetails { Sold = 4, Amount = 200, Country = "United States", Products = "Bike", State = "New York" }); + productData.Add(new ProductDetails { Sold = 3, Amount = 250, Country = "United States", Year = "FY 2008", State = "North Carolina" }); + productData.Add(new ProductDetails { Sold = 0, Amount = 300, Country = "United States", Products = "Van", Year = "FY 2007", State = "South Carolina" }); + return productData; + } + } +} ``` N> You can refer to [Blazor Pivot Table](https://www.syncfusion.com/blazor-components/blazor-pivot-table) feature tour page for its groundbreaking feature representations. You can also explore [Blazor Pivot Table example](https://blazor.syncfusion.com/demos/pivot-table/default-functionalities?theme=bootstrap5) to know how to render and configure the pivot table. \ No newline at end of file diff --git a/blazor/pivot-table/how-to/images/blazor-pivottable-tooltip-for-row-and-column-headers.png b/blazor/pivot-table/how-to/images/blazor-pivottable-tooltip-for-row-and-column-headers.png index 5a87a96f903c2c7d5055adcd124a843075ec8e97..e4d15de680e7058c41460be29b3b00839f5dea30 100644 GIT binary patch literal 26459 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
  • (b0X%>SE_!@u5$wPy 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 z zUEn@B6v$gj8toSxs;~7RP46_CY(@`GX7K2HSTJxtVMi-Gx*dju+LG%-kJ`-{T-~UovpA8!wSkjHYsVm{ z|AS*6&&P$r*17H=wnL`|k6SDYl^sRc86N8TQ)J6(J^mwf+4YssG}402b#pc4xqY%(}6ckUqopguDVh zW{jk|cp5Fu!IfFmlWGFl7&Rs;t~JfZ_3iY(Z6PU9XdBPB5z9?r_^&-C?dJAkk6_OR zMmlhP)HoqXP~UvHVu2q>Z>#+YO3RN$*5gul^}0SMw$ZTxDJ)JIAhlOP*+=#oi`pg3 za8nF}hQ*I5g`yMMbaU3`e#Gy!L;1Wm^Mx8{*-#3KQC~AFUAdADH@*$35@%|rRC9g z+Nke7+1s~{(N=9XjGv=*JaR4kQ~pdZK0}cwBJS=0A8^n;eyH#Lu70C{-En|)cVI$E z!j}|K8fE;RX8`Q1J-dMU(mKk`>QwqH%%TE!-O73q`&s{###Q!U$cioJrj}T}bYswNeq&`VVN4jThD`nQY)bUp9}_a{X0TvslqN zYvx3+hSDFm)4HeLqt`@HHu`;fS^HV?kKfxIKiwZyv!`Fn*LT3t1$!qHkSWxZUT$Pf zS;-^p*5`0?nJp#&{}TMzOVM$%12v$kf`-Rb9%06e1F8yvf@JoqW4Q7Vm4o@jTu2I9tA7Um$6 zeCTG8AA0Ao)qMir6)uKpX;REb_5rPoR;n)WtRoylJepm#-9-pAxXUo#+1{fNil-;`^o-`YZ{bH zdIZ2&8;ut@;i)EbYC41ybz*vWx-gJHW2Jsc3++i6K>5H07Bin3wQ2{XrU9cm{R6p7 z$vl>MxSC%odXJTxaRHpOglO|g7w9+V5?y5%=LGFLXs8FPyTb=J#{I5uwlPo@Npzr> zJs73Tk=JI(Y4r8j1=0K{O3*u)&z_<~VfQ;<`UJlJ#2H?*tx&U@2jPhlyWWy#FtvoT z=0|~8XL}nuI}a^#9pj)Q=`}#@0PbBhY+a1KT@RBOjMbi<4(=g&{|GWv)C~@UfiXN( z%!c5;58zxfm9OiON?S75EDeN<-4QH~8pN0$vq_hfr&?~ijA48?eJM><(M>aTWJ<5J zGh8C>bwoMb8Hb)rZfhD+#)iv3kqh+ruf`|2x;Nr*m|pD&D2o@!8VbsTFxf)ccuiiX z@@;X=%Z5YOrtyz=dw=)K+P^{*`YVar!AAP-O3H*`-kgd2)LKp%2~k^9>@Z1_fC!{s zwb3K$9Uo=l5a9uV!Q2o;hDcWNqM)jS*nFu72x+S)CfoTA#$8ubiGGrhJ%K%`v*~I1 z#z)Dk3r)<12*~>8Dd<)0+;DMmrcMZ2*!z22@@zJ`oKO(VKisIX<9TBksjs&Lkt6eE zL@c@@F85q$FE0I2!5|>qp26rrBv2~X!6JRq!UPuF=YR|kXf+YZ!|uN95JWdAa4#K{ zL~S{#c~v=Igjd^8Lqv?|2E?lG>;x3aDs{JMEgHH!ouQus6L)$`pdnEo`RYLm?Nt)} z5lyQe1pSF&D%0JICEdmy6Kz6kjNfa8Em{gk%VR_tJtdQ@BqD?(vtS+CHTt6x1%D`H zfD*DBQ+s3#0Jc%nmTC>9A?#&o|+645eDpsQ31Xa|!xo>BmEfkHZP_T>)C+gi$V zfbk4UrM4ikAgxEG>Q&J!en*xQ+1@?@xo0ILqMf|;9eA)7o*Dn zM${P+wAqCNxsJZtuv_}~_keUO3Lzqnnra!o1+9G!LPbkm#)bfiKNj}1Q@C+d{y z=19kgQoZPtBt^?AxVF^QiiOlz~F$n>Cy%VWrom(eOF9f((AMGytGIMjx6t6t%dIzlF6 zwBGF8g?q%-vlqq3`HXxmtx{%;r@~SO^LYjCsrRo>01mNjiJ--?6Bm~d*`1g2OClS} z#A;w5g4PsLcx$h*v6K6=lwL~}CX<6P$m!lYC=Mp>OoOwkhCz=E^sphgT;gMXzUAvD zD5~crg6|86*+*TAjt*PL_^Hdfj*VyArq?WbG@p>jZxEtT+*@Cf5J4s^`8(6>p~sds7&^;cNwi>vDwjCSHS z`(zqGcaZIUbt~S6e1E5?wwD9hR*l1%I+hdTXLuYclm7kb z_@<#OR@Mpnu3NrzWK2w^QRv==H@9>JLrT393u`62HycE6u3lGuj;)7sWsqdVp81LVH zFL>Gp2{dNw+!yCVUQd?9B&B@Q9Id0~#YIK)EVuBCL??bLZK?!?R;)7;KQ`5;gx@&*sBRjrwcv|9uiTuhEPk^6zB1ahiXwN zVN&;ibicUpQ%-dfZr8& zYz{b{V3C3ulrSl+ZjMe|(Y*@&YrhS*#}k4a@Xf*1g72IjcL-CQV*X-9g5VhA2Z^cQ zM0HYJ>a%xmX>n3{QmSa3ugAUp2>bMIH(Hd}U(k=Q;9TD3i7o<3P2Pdb4)A)fQxxtP z2&P_fx$?!Nis=OL0+W|yk__+M#AM@y%6I*OjwqHaH+*^?GMkLUFo&gE2Do=z>4ALE zt_GV^PMAzr=$y|PA(fZn2u#3fv_~g|`0vULnygxlA-%qT+YDnVYq$~iy%4+F1*=?DS(k11wX=(6cE}p>+W^#Gnd{)5D9$LhT3{CHB zS5V)P@rbP1o_MQ52>10>sbqLBan_V&;xsK+u{e@ij5nClpUGFL-I0ezkcj}m>q5~+96DTo3bb7?FzHER50ZM z-<<_s!pD9x??MXy$i8ferlG6DO29(-WR$*zn+ zVLE{~%2(9Oca}kJT*2pNjD;$~UfzHeN*m3cRtr*Q*y^4vbeu4(Pn+CNAA?qzOcV44 zXIeXx?8rDl8P&wzs!h2Vc~D=dVH`lBgygFmo^~4h1hHod~ll^MR7%Gc92}zMtL4PMJyp&E_SB zOs9ouYOx$QjEQY?Cpme~ z_dV}9^=J3hS66qh?&_-byYJP*AzJTWs@hNhjX?%}fC(KZ6VJBADN^dswBJ8ksa6U& zIfrwa5pZVKL&#&A9=%dWwSe>Mm$QxE$aCMkrQETl4a=1m)u7WylQhUtDN@7Ku_Hqz zN`)!^YsgyWM2_~%7ikY)Y+oy2PF^{>ryfVQnN^|ENpZWT-@iH!Z!v)#RuzYUg;aZ8 zX#i^kNtifM!{Vx&_+wEfv8Mw0+`P=_SHjO#HguR_U1Xv2mrSlv&1$akwh2@$qOc|n z%+52!kvhlC#6-q3i!^6O4Lr^96j7!&2(GqU^|iF{gcwW)!aKFsG-)Aj{rxFp2+ME{ zu1CnY_D2!&2n>P9NJuMH48!(TaTjfNG!I<5;K5D`?9-;22!S!wNHUl25m`8FHOSGU zyes?6adIV?zu@N^X|=mW#eDC62R--(|>Xtbx{Usq5n%rWPDbp$b( zb?}C6+k2k_)^j3W?o%`BoWa*t*TD?M*SJf(XNU-5jD!*GvkbNaoYN$EH>%mG@YcsGJ zhRlfCc=qD5LH z&gdb~LnEg!8scqUdeZ20lip^{`}F@Z88t*!54waxMomSO_e!~AkSijGORGIlZS^ta z3zEecwSa_w+qh;@hm^eK6{BmEBKqT6q0tZRV{k|I=NDKM?8!BQYMy=Msi}H{Kf+|% zB1QP>8~^QRF*=W0A>30#g?2w=A+vZ=UTttd{bhzw8Jl@Z8dN22&fQCa=_;FZE6PAW z6S7NJl5QU{;2P_MyjVozSE6qHu;F zuTPZORV4EYzwjpy5-Dtor55F^k9p97bE^2M4g{xs8yTknhUyL4LKY9Wpqzea@#*Z} zRdkEd^c0U7@T&$3KqZ{CguSSH-d_YsLHRb7$ugEEkzM)xk9_NXC{fj(<@7Eklbjl?{)z)TUaY!I{F4j1N}{>59z|Cb$22 z%X1*Lxxpn96&Hc;;Kg2U_x^Jd@F6D87l|m!rj3*TvlDrI1XXGySkdhln+LO)Wl4J@$3ouTXxFSMOJ8seISK*!xT z_h{va(!CLLoYFu~_7H!>I(I-_wH4GY=Rl6!|FP-_$myoI87gb{&Ap|Vttg%Fv@j!C zoemOn0Xy;&C5w-%0`{#7%1;94B8_UvGjvknNF7dQK z^_GeF<}&F14TAvZou6zf;5hIL7_xumM5Sy^yL#C!?_j5lc40nTX`-?kEo)A`9bhnu zm=khW;`&I?gn){=Apm)*rkT0nzSs&d3#S^V#m=d9yz3cje>zDZh z+{%(Ia2#kR1n;=+QO8m+50Q)Z&;fQ9FG+-0WPzuZ26dv`*<=)NGx#E07? zn#4J_>@p4U#{nU}HdDPB zCMVKTETK3Uixf7WWv zvGU-VbzJv7zjBhr8~-)Zd>rm>LUybY^hTM6Wl4OHz4hplX>o(NbJ|n8WToSvMkP#@FXM5YD#CHxzQ>E@PXxO5eGQihVs$H+jlPt0n80 z?b{5;(;{ZEcTEI$UV81FL~%7s7sPI&<}t+sWN_(#a&QQSy(;0SL|6 z?5=+9fmmk&T^PYwdfkdV6Mvvb1hdCnfDSn`tiVOvBttj#B6j=xg^I_jl7zZrKwST; zG2@pU3oW1FH>6OeGWH@^5agk&u&f5WKU>h3-pilw|J{Ro$ShP|F|BkE2#D<(ua+F^ zwjI>FCgU{WydbUhCKOj}-vbkODsa2jEXc&ivdsnzPX5YJ;e}Cz_v*i2IzYi7jC`#b z7HO=bm7o&M^)X8k(QAKlUBuseD`TAP4uIAG%rjKDv+#UphRPafaaR`j`p|NpV(;Y+ z5d=Y=x@U%_>`MU0OlOk_B1~lo^qQ)E*oN8es@&pioGUEbszN{u1{73vW5QBY9AOmK zk=2kIwS!LxxZWLMq5R+W{B(yIdFlmVm+)W^kJdIu8K72{97#Kmn<&Z<`TP>LU<>V? z4)~tU@Q9r$J;tkyV$?NSI0@kBdpd1mWJ3^*9%-UIbiW~aoE-g12fH_w0a82@Htd-R z9zWnaa-W9r-dXPPYZLzctJb^8vD9r4@lUPSXOn!;Zc)Zb3ofiW)qAwNt_VRQ0n6~Z zvk0zbw%{;4SxAobmEd8RLNM|`&YNm(Z#seei`u_84xEioj0 z&FnIh94A#deEqGpUpTz$N1tbE5-{)^%FSM7Z-SZMSt$}LKKDHVwQ}yjgJR>2 z*-*5#KkY`7>i;U^-V|wT2b{MqIjO4dgwus zF@3vD#9*H}(Wyt5X1%>Pb@=YM1O4Fj1IFPGZqg#GCiuJg1R{QG?;cLg-ve8T$tlL~ z=Ry$F_HOQ%2s_Q08%iiltQQ&Ua+-;4#tT;-&WtKFOf_O3M;@SW{Qop*Vg6Y6DwZuE z9(szC>hJX9LnF4AxG&huaPMKi<$5QK3)ChB?Tb-NR>qVioxh10Uxa@9{(oEW%&4E$ zr^$Stj(>QoukK8p7-@tC!*2Rk4Cz@S9P1$2UV1@8sPHuY%@$cPch>0Z@Hzg`OhZp( z$ZAUIRfI>Vl>t2ey5M5)R6Jj7Ke1O zy$SP?t%n{3RVhjOuRVMVsqMQykg~fy*m*T$U)kxz@BTAA^s!lify%O|#+po@b#gln4>nIvWV&08urp!`6!;yRtUlb%^& z`OyBg9ajgORnQR9jvoHQF6`@&Lw2^mT2fh0;)oJy#B{fekb-v^Vw(r=cN*%!^&D1$ zi$QzXfA5~(-3`R!BM0CV7%Kn6z=BG9}nGAZ&&VkRan!nzW z<^~Hw{gRBP7bac1yP-lDBlXb%MQ!H9b3s{mNDfcEq3kDH| z2p&<;HHUxlM8!0Q(n^p}!^A{OI@$tdD&nz6adjLB(TKu2eGFp1gYk;l`;)=ix*2H% zMQZySfl?ECuKUlfU{707eSh~Lb(c!T&A#0nm`EDQIDG#eoFH|LYy6EgtOp~g6+JU) zkM3zI2IJ-|f3F`>C^y#KY96w^qvLMkKRFawP(Cx&?~!Z zPyIGxDD(y2E+n_Z>4W9}@4Xc=HWvujDj!*>oM#F809#qX5$?ZbyskIR9D2hF*Qh(2 z%;o29aoCDSx>y%4Ud(LyPjdtVBJ7T=u>+SNy2x|Adux$@TX8$BgFY$;(c%DvA5qJz!}?D9 z$G_g~&XPbV0QboMJ?ZouoEcgx5WUXo5bPXyhj!=_-TNQVk_{Y z22kAWq3@-{Iz&Y{eF?@{-1^vvp3r9ATNp#(No7F5j%h`DJ%ylRUI~|$HN~LYhjp889uyKt zXrAESm8sx7O#xj`5=D(w_9M^>RPwM|eQz;t4~Ms!*@nF>HW1RUAb+p-*r6i;y2Em# zePz%hyJ&^3-QVdL_}mFZU2HM#nP47o{+*jNu2d}I>F8!3>;l1*mf|Z}Nhd4|d(X)p@Q141n&at;Dv8J^tU#|MB1VVH)@_iIRHZ zM-~k3*s#~Xk7MQ_vlW0iS_m&!Y_HQ1;bH^4qRlVvwKj;YjhYJ-d{aN06#dWyM zP~M(nSYU(kx~sHIF2>w|?jHmoH3yZVI(l<5@JoW6D9!chJ@?=Ir@on%#Zf&87x>Gj zGdB}3-jzR;XrCeX5^X8sE=LHVn!9Ud9y)&4 z9C;(_1sSa|tbtm8iOe3xA9w;8zj+Q#^i!H?|AV*B`QU#PQVN$Y6mw?r>&Y#n*8~YH zx~}p|2Z3`PG}Um@Td!ir_86g2uo=0>2-_@#W^7S+Y%N2*6_s@5GJb&EXuov-=5PV% zR29^UdHwLtT{gGQ--DU^CLAVM+u!IqIZ}J5BW8Ao$pzt_p9^$$K%)*8?g%qn$h~DN z{-eyku{GICc{DdHG%S@Smv&zYIO#*{l3#O6sgXv8DZ0A7^;UkaSLGp06__U zu;oEMDWd}-1zOs4EC8UhIN}10ALJKlfGO8oZmo(jD!JJ3h^YnQ`mW3nU1&N~&~(DPS8vv@X>F?pz8yD0!kwwdB9uyY(kpJ*hhr#`>4-$;invU=GoA> zfp34<6luvutlU}gxMU+^6i{u*;D$T!3RDN-69GIMQCECeWB;Vhyf1;Rt49}^`Vh#16y>;C}P|(E;16!=>`&fekxg_|9Qenh==)|p$8_=kiQS2%+4wi5xY<`9v_r$!C zhI<(NJo0pv*gzbbYKC^E6M+@)m2xNYBfd->FaE6#@%oezXEM)}X$`tLN?i2@sG}`* z?$s4ceYb@}H-I=)SV>5K3} zKxxYqdkeA6z|1`8yjOl5t{VzYpEv{E1^ja0t}}vg^g+k8h#B0BD$rg=M()5AJ(;Ij zYM^pq735Bk{;|*2dek7CUVFsz?`^m1rZ^W!arwLwXaM=AC`bCEA2hSNnt9g!$W>mv zXWp|V{5FptYxB1NAbvQ)7GyROcQoLELE7>DbL;5Erb+KoSB58l35*Jj*cCtUBe=1J zaQYt?lr!`&^EMYz;LxA0LssruZ+S;~G{)0>*S)gO;fq^k7RT}Ml6?*)Cf3!aGxhvnJauLR}G%DX<;>rg4ZwnWg2VyaUH%;fXO&bHn)ch!)Qdh$YkAJp|Ku40ivBrF{`HslH&=sXrJ7sPoJ(1APwxq; z!R1M7TS_AT#?8M3;JrI#x#i9YV56uz6-cbtdYF?#?aKTz>Qn^ZHaV3i9Nl5nzR()A z`Y($9ay}LR_DwNflX-l_nQ7ktigBAj|HDzwC+>08vR3bg%^>dT)YS|-?~sE*1#^5V zpXFz^A74m9V~`H1<0fI?+#tJSg&}0^$IKpZUA3$L0gT&?GV62rW|QO@hdW@H=kh!I z;eN3}d2(pm8-sv9zIMTzZOgrp7`Z7=&Eo|ch?v3@U%T#IYku4gtCeYN6kB=BlE5+qLt7IYOBqMVuKlD`9k7B z~h31r#PH8)1g7?L#0izzOTu^5WP`SzUY%=);1 z8dh){OAy0OS->XGv~-D2~Y>fk5IqYM`%`q!TdMQ+{a-7Yq3JP1>Sky4# zN_Ai)bG(R_2VRd3s38%D^P`F0%bFC|%U~V_^#vk0A%EM#TMF9?=8~`ysc{em0!lza zXSc%`4>8D@;BayLcEXh&-T*#If{#%6Wr!W(fDY+npc$!+MA(@)$)6z@IqCEYUeS@{ zcGc`zFoyN8Mg|U_KSCi}CThMn4e>p?J7NGbM@0%X{M+X@fdskW<~X0}E)0!MtlKVu zn8qg}G7eo>H#hdWBPzb>?}Apwecgtk+xBImo-@?wXhn&yWQc{Lf3A-K-*y{4MWq-< z>g503j8uTh$S>bK*&iN9$ExCoLvU7OTp`(_>T3_9_VDX$Za~{MpM)CHxj+t-88hN0aWLM!!{nYejWlz#*M-rhk2_f>F> z7&g|3mZZT@M$;gLCe4JcH%cP?iC}ul0iDJsIPNF27M=;GNuJwSI>J?PH6Dj3P^oOF zWb%#3NT1L87z{CJW5~`+Pv850?VSjyWsJ$-k2!4bCc0o&s+=&I+_ap0c@`s<1S?d@ z)xfoaSJ=WPh>r>Q^hu%PQDC{}%fgr`&1^uno#2eIw$_=tk?5sW$R7*>ouDj{YU{$0 zTtv(3FM*hN8dd!fJ&~Qk2Ag5e7S!1E=WY06@@=Xu$%G5a0jSTBm!wh=yBBtSQ3)0l zf&$+vefCEurp*$``wGH?C~*B_iIK9jMR~Dg0kBnPq%dlSppnauc4e|c+dcCz{whn8 z%Q+EiAvv92Drqt#oE6?yC5zTCE;+W07MVh5<*gSZH}ceVHjADDGHGJOfrRque+Hvd z?dopzAef`u7Ep48y#0)KE z`X9(KK91n3g`Pr?-!L-jEWf5y$o!rc{rj})KB7}bN*E~5$t69V(J?o^3pM&Ue6A>< z5_Z~~$PPc42rh<^b02utk~0y4_+n=|yW7*t{WO>)%1(mZB>oYN(Gh@VAu-i{Pc&mk ztLaF0sZPg(Di$C)7IQBiFqp>mC#)slyZ3DVF@^`$7cZ&$4F0Sx5=AU8lKgncMQ&7a zUrfJ*knwYIJ;C&7=ZvL;IF!eNL+z5VKR#9dW_@xMXU$1qnw_;UAi6ONdWFvk=}>_% z>XIC5M{glpdhyqG)rAe{cjktWFv0mo>`aY4gNbqfs`u2ik7@+oWr)@D=kr$g50%@A z`NPSfL{V|pll^RQM1;ciIVVxHz)Ss{g=(C%S7!skXKKsooOpnEgxORahWaEyZz=C1 zCvty7X|~ILKOKY7Rg5=WTJmWf)lKvu#_<*>U*3LXIS_aTr^S>Pv8wK8Ho8!3z8WjR zpyP)7UbYk}#Pn{Mt+_e!yox;EGK0qtKO?a4T3d2{yh1ukjuhO^Q3({2}uY{n3@`*2Prt7F5GVL+vz+*#&qd zuEEB*SpRsi5kjLL(Qy4H9CS)!bEqa4=g`sNm1e!hn2xTUi{*=dwSYgd>;lwl1-KmJ z^JL2IiocZhVvC{x0X#2vhp7c2YgiSxUuZ@NY08~aW~?AzcLC8(Lr^tuKa9k z{M$U>N=&C=tJ#-glG7wZUQDluTaia(yheGigt_|DL-KqxVWk1AcJquhjKAutK2;_k zmCNq}*J>JBm!_wuzpO4fg~Rnw7Qj9smRkv>`)bKeETxB(?H%25(wLqBvj*qujj(oF zwS(10boP0kDReTBJfAXy*M4-U$tjWEm!B>EZaL#!Ehdi{QP%o=$hFKD3BStXJ!q~> z8e1saum717Q*HN?@hn}!d9_iNm_k*o#L?mB{+ld8V_eDx?B}ZEnu(Y$ z##Ys<8F)psV=Xb_Xkp}o4h7P@GCYI7eYs$q5{_K|Y9#&;a9?(3AU93^eCm&_tW=H{ zk+Wr(=Un)!O8TOkqbfr!wadf_{LC|ZciLWaM)JH|i!Pm5-rnfM)A_uMpCk(O*cNps z0)jVdS4*frI;O{m?i{GgoH6#7F|M;zb#YH8c10X+lZ(V$J7TN(P98OQQ$AtF}*yQjWmrSPtB`b!+0kdYK+#SxFFo56+{&V z`f#>FXj2k`#WmF6iqzx8Na^l{PGBCBZ`fmn?1C%BJ4vaN0FI7G9j!(p==0qls8agj zY_L(Vq}zs}q6zmANm8UG(F1~CcGDQoD4wa|fRk`Sofdz}c*e63YJH?#_n%M}Z}$BQ zg%+go@*!5MP%PZQe%=Adas$a8E#ZOsWu(~Opm^}N&XoKg0qa2n$V2!du70pw#$(@ii(fR z*e>NM#0LQDF4h))KmX{(i1%HsB@S*73R+(DRiZN<`&;`@g`|X%V7fmx=azvYE*%?PO@ZG_@Nl2qFgbz_x8Y_Udf#wOVQZ4 zat4+lDeYPZwuKl~1)OjdRvXX_4g6Ux_B12Grni*{E|`AxPYNJ!L@$e6<@*+EKWxCX z2Ys(LyPO>@y=LYmx_k8;nrzOl^HIfKN#-%G-)4<|%866`H?sZY`Ju!5%0t<-|H~<_ zD|U1ykp$+;^zx@&hEO0a)#C3EHVfZv*>fq7P9Oylje$zBRsb-Y>S9#CiB-TNSVxg`qOt4eZbLHsa^}R7Rg}by!cjs1(fxH)F zEA15jLI`FDcRYwx&tQCgtY?z8QDhG~$E-POuRtD5_wY!wJne8f;rpT4;4YOlDzJ|s z_(GPLU#BtMQ_ICGDZ;Eh0fk;xjnA=z`FIg}@_&-&jsYjCxDMGqyRyCPf$NR$>^Bp< z$_)B#-xjw{OQ(D5RTL3$cu?N)e8~N^$>e-v002r#K=s}Py^S@^DA`tK!Ner$Nfg)i zq>zeCWqgBkiilkQT>mO`ec6pKo(0NyN5|ix5t4;=7&&YfUrX#iAZH1bqQ+R$raDi_ zqJ<>E49Z}dur3B7N3H!1x3&TTUi(dpU!L&vrpVMw!Px_#DRvckk;-ttle7$>F7#XZ zrmFyov?!&h=c4y*uXSu>Vj+p+O2~@bWdc4qg?Kaxz_74HY1ugGf=gBG!_3((=)*W^ zYv`{=VZ%$>l!+a{ULBX>kR|dyu_9y#zcM0VQOzGXJ&s5@aTrEf4u*{$)f`$?_>K3{ z^6gw@b{EnparwC^Q$9A9fR)UR=c{%~dMVtri;cI-8{VanKA3V9*NVTLP$w9&*?vJc z4^bkF<}1BI9v}YeM_k3K4j#B4VIMQT(eBXDfXvdd%D=PxRKHUB<&ieoo?Y*1qLcEn z;`PeIW3>_B)RP>_>q3>efe-w2!Cpj6{S*E-uj<0EV`y#Xr$;W3wI*z%QofiOHMrXR zd?8mH^(t#U!(pBxB-k?P=kqSlLnAg??VsTvNy2-tjpl<9FQ%{IQ+1~|f(*oosoc_UMNCTpDx?dfs?*}xwrXBevm#V% z<;p7!T=3NLde=L`<6p)mM=jDa9?wL1ybDt9Rr65F)UiWZ>E>QfTqd(h+#J7C=fFs0 z3Mw@IjAY$D=aA^>KKk`*>9+9ZQup+$CGop za$`AMhQ}|`bZ$Th-1>z{BRlRs_UT%`i@OnIuEr3rXQiPaemDe2PtBbjdsh3Sg~~(E zkWrSxMzg7=c2IWHci>djQtoc#+o^O|)J)!Nf?bj0>g#C?j1tZi&PnVYR}1&5l6Tn> z!9UlYhgjNy{V1uzSpk5TO`VC}7;mQw^^i7eV!JaRh45JJMbTbOCf~Fhr!*A^&+Y|VL3wz=v0EPlZ#binSC2^vmCGM0?>%TMZGF05an380L z3=D|jPZ@?)ywK)K@yQ=5gj?PuxBDJ3dD1qCIY$GFxR%88Tt@m%)La5C^qw^tW5e4j zGb>~zlgF(m%B54KA{LotkEBeFCK+i|ir8*tB`S29$T-fpNO%qjhNr6%0E{#Z>ab0H zoD5t3ur_0?Je?OjMl1fvR|f8*gES@e;#ieGJ(Y<}E;3Czc{=cxubRbc$j%kwW~&zE zCV9{jIyyXi7wMVht{F!NhVT1#@j*SS!VA9f>cYY^h!<-)b}MIIOo?5fs%1<3r-uYd zxkIEUhd$lqtf`)6#Z-#&G6(x#R0m*Bp=P*__uV3%um&3~mpT3ALSAuch(}m%Ms3w? zL!wQ$r!>no4anTCPAtS%v(L5$CrtA%+*eN=xBCKo7o6Ri*`P@Nz-uh*RM&_zy#gBU zQxreWl)b-18;6eFCRcf<4Q<1ppH=!#ewR;_@@<19`}VEyJu`3UmY?3pHcxGH;7hIv ziu1%2f-5tKj>|u))c>Gzd)qDPiiiO#mDQ4 z%qNA*K$k7fZCn54Nd3!^nSZ_Lein$!?<3&`xmWAXzmV~*l(uj5$2BYe{ixFKp>91t zhZmB`e*U>G;Kbmyp5or#5z~gpdFEnhWxp?`G0ZZ2$6nPo?Q!b5C{4@~)=3O_OhEYC z2FZEm?19g5c&e~9aD(1lvUL#Xu#sgq*N(Xiv~jC78lW=xvqQ~p1<&)Z2U`1~gBYlK zH)B36lSmlk_lPX!=D?+0Z)#C15tX&kc{ih2NTufJ+|^Ngz*ciKWK_GBK{%|-%Y*6V zKgCn)*>%;%hnVG}y;ZM^=;gMo=QyXNwM^-@-hO|m*Wxf0u+;>)Tp>$dE4TP!fM&Ig zRBbpowdRzA*cX}S2fRae9GccIyF)n<-Pny11fFts?`a8fhFOp@o>R424zXRb3Qt9( zt+Un>dhwZ^{+#`1Pz;6Gwj^%p?A3trw$KZ1VBBzk2d?c_m`OcO^gmaRuu+TT0MtXo zbMcS{_5GX3@Q^|8tHDvpuTm{1v2CrXMyqRUE2ogc1b4Z{L;Ny=Xn^;VVgA}6cP`nVDfPt24ah$ywSFz!o_Kcm zW)YZa^C#7P#zUtqA9&JCyh!Q#7Dz0zteb$JZ&MO$;s{D~)M(}0gHjS4w@~=)=4vbN zXfNGpB_BZFVVr)IKgbgPzuP-Mcuwo7H?bJuEAh1gEoyk7_RO9>tM6M@T4SVr#jAUrA zHCzG>7udvZZMy|+^pydf@suot6^absdJ3ubME0&S+U-y4s_;^c@wtSaYoGhZqs$j$ zanV(0Wi1=~h5k#oPKkYB>))tfWzK4zK}7sO_qLvcT5mxV8EyZb;lTn%WFg>Uaf`^& z21Ng53luH)d5>NgaXsEv<>BSsF8jm$`gnoJ-Wc@g^4ddKuk&+u6ldQmAq2uTWk1FJ zxMG9fKN$Jfpg_V8vUGZTAvb>m`90xGj95u?OU^T&LB7D0ZXNd(1aZCeXL)6jEy>Uy>)a?aK83z7f4o>!b<7zI za?VLpv+`Kr{XKbJnJEPDeC|Mo{4#^TIz*D#Ksn4;(r+02$|Hq(rE<=0&jK?WMft}4 z57b1~n>6{f`)A}_La2u&M+{q;Uzh8pqPog3hv-^gIb9O(3 zMI9s&~AQG=gq zNoc}DCp%$I7sr&3rf-ig(N}-~c;BbX_}q@i-IqI(`?FmXzrh=J)yV|LtR*iYMNX{>VAasT4Y#o~+K9Wxp+8~GK@W8FN=D@>_d_Bd}vAWspV z^2mzihlCf$dT9)JZ=X6|PmhZM^SoFKovl;3KV5`}8^Xq^x+DH7wr3pg^u<_^!xZry zz3djf3P+RtcFSXC`u$n#&!qakyiQu;F084-jzAH+g}HzL{z;}5USN4_ojcW1IA^Q4 zPLt@zPQ;%#Oi_XB8$B@-kV}cQPQ9md+Cy5gRi>D&b?rP8!)dpitir7b{~tj{a-C0p zbcFqqKHu&k@9phv`f{79Qu&it@IUh5BL=4Em3{Vg1k2gOgB;LhfU@)-x$!9qq57VA zyiv(`dpMOamCa2m_`cWO`M*xe*H_zJMPK(cGZ4fd)jxAT5nos5EZ~2fP$b#q{1h+j z`0{Gm@#p%DUiejdJEph1^?DU8IOu!l7K#Gz5nzm=#4XsZ zI9cuQ*VMPqfK-|*`*Z$$tv(|Eot&2!5u4dabiNFc#rYa$)Pihfb(NgaFcgb1tAD+t z!Uj3G2b}$Oa9@LGb^X>!6n-CpAvaZy6G3Bhb$v#xZ3cIcjMa1(ZTs9>+2&oF>H*_9 zhy}H1@gz~{(caFCcEuH`&z@I^7LqH?9?oD%n7YJG2{k{Xe>pg0<_nd1PfyNL;!}bO zGk7$r>3h3+9z>qryf;$KO-@5%=Z&&0Ea>b@3XPcS^0SJ?Vg0^?x`Q*@!%U%u8c)a{ zRyY8iZ3^qpG-!SuXu$rOyKH>iS4(>ZJGBSdpzU|g~ zScw#6a;I^`6$Z19QCTTxjp%FJtCJ}P;R*)GJI#qu%+E^62{BOW7g*$#)zM%uppAGD-Q9{j5gn(yf*U1Qa&L$u3bS^7Bj|lE;rC_OH1Z}=M{A(vvQu4Ik z?1W@4m`|0xe&~t;3_t-Ee?P2Vl7l`rm5&QQ*y{4s&3wNK3asM`8Wq&&~Kw}%hg1OEjy#E1S@ zM56=DY#Y?Nq!2NfRWax^`Cji&Y~V2emjGoZjXa$ZX|$Z0Es})S(bLNk`;Qug_>ljq zNAMr)D6;KD7HRuE*ePlIg2wy_o#{m33|GJ~R*vc2Wuhs%Vyfc80K!LZd1zFz`xA7= zWK*bfua2p6_!tsVMcDp{YmK1X9)~2X5z(P7i*du0kOt00HVA~YD(4J!2;Lpl-+@*T zeoRD$?`g!Up~w8;RWFvvksCoFNDP8PUDhtjV?c&WWlR8j5nw&|Z3C_hr}fY@FnU*} zNoFIBADQE?(%=sJg+;?d=TT<2bRPDdFV&6f!<1$r44;(aQY#M6@fxa(ccC!QJxUiW zVK7{~3>x$!Q+AlWbm0VYPJ8k5EsckQ83~Q@`x6>vKMTg*SN;eY>QpVY(IyB;ZghJj z`Yc7A{MWU8cpgi&_eer|c0%@4TyKg(l&RI|YB!Gp#AHCqSHn~(Q&5$0kOP2naW--} z!BRV;2RalWpD`wo+d7f7HswTo2bG%YXnz)!Mi11BaoY#wnDG5w$8mOaY(GTGgE}TX!y2;u7#d~;*!LWbYY#ZwRn;`>@Wiftl(zEZlfS+ zG+Q{LQyAhZBaGMW|JLBrT&bW;TLkqc|Ibe^?}Rb-qA9Go+L$qDIw2$9g#S!guz?jt6{TsG%S51EpL!q># zN#j46bK@RxZ6;%pe@EZ9OEm`FM(sclpS{rDx5rqIj2Cbp&0G3rvrmUlk-mos+9Tn? z@-Sj>QQ1}rpjrPjb^$n;{zZeTSrbK^n0Ki9ok|++J)Drsjs8Y#X4X5O#+Xipy<@Bh;(77)k_(PPe20YvC~}C-x_kvEJuvK17>>UL+J0 z7)I;uX07#xrebk|=xGBp4BXYR{GC)M48BYYd#=~y8#(K62~V~C@MVF(Z`JxQ1b0Ot zi9ixz%j&Verx@PM%1C+QQ30(e7}q%bYZ-v`;i*V+VNR17`A!%h_$R+MYq10T{l+VO z^yz>zV;hepF;f40#8X{OK2lKpTKp4d=?B*gSHW8Q2JrJ7K}%sPcy%jX+|-?+hj#xJ zN&!az9J*g4F|*5oLc*7&<--N)!b?#4`d2zmULZlbOe2-Rb!f?+j)3=RgtRo(?#th9 z9(0Gb2yYiV;Uyz~FnK?C83h1tiM?I8Y}@qi&|ZZ1U-9tFDx~Wj?gU41u_zyyAlxXU z5B2(#D^1zKL)I!2UVr>Np|*t8huyl<)?%5RCzeA0AC>gtEHAx+0=zvi;|@K&+_?^s zeY*fZ)@KVA)0Wo3QuGnj*Y=AHGY}`Ed`MP|e=NQ-IZ3jNu%eE9M&w~#rMPs{*(SVU zySw#Ss2hwcu!Q^z8L9uOwK#xUh2DLT`d3O2UOF2XC^k*VPn_ zrpzSS3VAwB6w_(mmaD`-=m&M2ZGT$YKmY0*3Z`$B8ZK07r7s5BkoHs_je3YT)+22> z=zgDU$wr$$gHq6=gS26M32_^#u%c3WFzMCNgY098hNe3ew2>n?-^33&BlNL5W&T>>*8@R$Ro+fEnYLpfK0zkZxR=ib5 z<90t;fwH)WTR)FU369|U&ikk!QXX2UL5Y!Oomkx@8b*9tB!^19W+JjMfuUh1y{tyZ zoeAn#$~pEzc+$+BtxR<3>g%U`o(`{VbC(A#lr*p=s`oDS!*k(=&7s7{Obn=WyAZC} zHm|0jqBh|bw`=}haQ0+-w10-)`dQLBXUuI+6wPR*8?BOs=RRv2hnYLA0O7{1uU?*n z8c;`k*|uIpLvOCN={$WE!Qa=E6A0@Uf>*@H-zm*n0xhwt8XbL+TnwUAWkic1{c==a z4yn|6AR%-`8zhEAU&zw8UasJv;`bVyge|_gYcjfC5rPVnSA!3WADC2AC^Do=6(bw_ zi_Vlh+n%vSRd{z7qNM?&IV{ObDghZ=<$Q||kuspZ& z$S{J2@?1VQ+_&Y$4!2|nh0QLAfJ;Pw%fUr&!1`N>wZvLME(t=!+kzPbFk#A$!KKqH z_b?N$cwHfkrirXcCB2C>@op^qODR%icMv#7qf!mw|C@7&C{UeDEPq)_vT?xrA`iRv zA$(8l`0Pv@>QcIAc)G%~m9T}|Pupl{LnqEd@OOa@Dl^b?)dH?rv@*?M?(R*EMP2>X zf=kY5+h&s8{f;&c3^Jx*E9>qGAyrl`UhD#Gcx`BM3H^kO|Csi@+4QyCKCsx?bvkrS zwUXi=q)@nYM|khyn-Ptv-H&+6vJKdx#5W!fft;-m(> zJ8z=w*Ow*{Gcs+m8QHT4K5{L+(Qn!&{u#o?Z7 zTH60&%qCpAot52vJG!Jd3<5EHVp0OjP16n?A_4ybC3vlPH5hVnC~9*ZBxp>~DC2!> zNvJr*vt9tF;k(D&wHOR)TbNw5l{Xb?9LzloY~&tRJFt}WdgB@;T2F`gk#!zo7v41{ z6U2&Oha8?_m70ZLQ#V{6Jahw^L&g~C#?7r@!5E)x{gFfR-}buRSxdtFMqPE>TL?Tp z9KEN09c&SctS{QN|42A&G?28=G_j1I@f`Hfk}JcStv8-VFS3xuXS#KR4Dt++xj3oC zR$s6+SlYG+e>Hx2doedn+DWy%UW(T66Ab5Ob(mb~A*qvRna-yW)24)qCC8)r=wicf z@2bM1%HA+=@i}cq4=21140JGPwZ#wLqAqS8|IqxMyz^`MyQixjs(fJ`eLTkPg^aAI zJ0tOR0P`UiO*$1-(7UJXGw3Vir%;k)Fx^~q1WSauAb$&+!bJQ;WBk7En=nGENGzbg zfdSbWT_p37mEkvoEQ&1ECs`Gt!xT(Ki$(g!h?I(C1AG0tP8|4^+rF_A$l822k>f*b#N-$SH-8 z#_u^Kq<)ff&>>Yq(V9bH78R2ha^QsVyPrhH#70D)i+#;^jlo4n0!J=QvsL?`XOAfg zcEuzBZ#ya+HmewikNb{1a7Sk7Y)NCDm3=ft!xTLrWYbh^b+4hF=Wt9K{}yalegrUl zASy9>v};45q`^yLLG~yW1 z)BUPz>yCq(dcS(_WG$%Trwz&8Um^t4?66Gp`6@h|MT%iBanEyoJXVJA(nOmBjoa!h z{6K`__)ZQ7j(%0VaW=h;g;8wvubP3AT8caS+(I|2|ANx(=I6E^;PlclMT<+__c|VP zSUnH)DE`z!@LM6`3I`;(CSz^Gs$l+KUOO}ay$8nhX>b%mE`At(4 z|Cmi03jpQ6VR*+04im&k_IH{-`}}40&awWo&lr%uzDp@Gy797b+a8ZU_Nqt5imx$; z8^isb&>p*D^`^3g5>~sp1-QZ7bLJH)*F3d{?+1lK(=LqF+gjKW7LZJ~D)pDUcJ|Nn6H&e53!UAy*Z9 z$}grSXw^te8>-O+X{^dd>t8#e3%Yh#oVe>Oy&)!-98dDAoIj#kYdV^S`_3~nks2OU6`7H!W#MPnC>@o}4KdG#KisdU)nBRbyNa&?cvEvh zv>z?7-f*1a;d~L%`Mh-`1Y0srQpw&;NlWF70Z%#9NocNR(4IH~M^xz-8QV-Ooe`S; z#=@z&W+eqzwFkgHgWlseP1KcmA_3{`r}?tTOVUN?Ig}<6y&e%aC@7x@Mv82YpHhW1 zN9!j|!lEFD=L?=L*hav1vv-^4HU8lliLXyIMm+FK;!*1Z)EH8ZJL5j~5sXg+=O~&t z7EO)a-em@{D~vdE(>DfR&-UsSS4|HfXea~e^8^_B^E0387m7%|#$%{WaKsg84gx5s z9))G7df!$heO=&=iBx8b&lF1TnJzL*`sbi?84!pb80pZSgbbtLKE)Cd~DRYnqyiKzMk+%01UN`?<# zpON@V>W$+#3p32n7Y;%zP=?Cp*f^YqIq{nW4qU((+?k(LjT0}3du-j^u;=h~v2Gx!H;XLiJ+O1BCZvES=^w2MR znE6yG*Xsax6!3%m6ED`x?O<2KROS7W)ZnoH46g?g9@#WB`o5eXU&>CQ+9;Qm4)0n? zuElR#X9!ZL@+7^YHnn1j{}TA{I_=S_7p@2-m-F%B+Q_MSsqZyTsPnjEg#1vwr;a}2 z0y0c3Q|Un85yEyKCq5TNLHs;scz6jfY=wZStyOT^QQCpC_-uuhVYHMM1BxvlrfFNe z$Th-u`_=_O7MC!s(}XyO_c%P2#f${NweL-Xcjr(Q6bzWnXnoKrY;scH+6cVZQq@Yg z8Th=jV|REi+HFrAqSu8oa-vdxZjp3%>5+SEvz?TROI_f(rzFd-4_!F4;WATLoan88 z-mdI19Mb&`U;#m&M56+6I%C`a{Ri~lgJc*al>fg9oHcY`Kj}$`ih{g)^uf`=VYf2h zu(A2xg8d|Ah1K>x!XvJwtubgMYdU#Zu?u61*#=+(B_{ zAxTI{cioL~nly5}GE>X^_uvCwOGVDcBvvpY2=TE^werZ$ICOt)V`ADt&_z!SB-28B z#g&Gl8B7@MH_{(2QcJkF2uSK47wt<*P^mnT?)KT5l-ZdK;;TP2G0|P%$MTfSW(gs> zU`%mMiiNSRHn1U~+maGXntdsDx1@-c-TuuEngg-4zwo2(U~>w%o3pp#x4cX3AlP{H z2Fi7y8`H5N`dj{K|8BrQG zmX*IhAo<&=$^=TCJ6|9H|B8oo2{v9H_(nS!UQR<-DGrSy25F88v=J}yL7yb}HBZJz zv!yCz>6KoIIRz3vzhlA_U0_eBo5@Uqz0AD#>ONmH9 z%1tGOk#Br@Hv|>CRkZ2VZd$83Bi@L@dB!~P)hx?G%`(Om+2!ct4f&1dI9CU3oFss7 z-+XEULGBS37M;<8GW})^A9z7!=#PE3g87wr z40aC=RuL`13YrKx;><$3s{wO%ACi$+teE)yjDATCQ2q~fkfS=0ZIh|Gb}v#CTOKg& zeDJc_~`TBwI6D$Zs9x&D$ z<}kQOiX<$(AQZiJsIVtzl7*2p;Oc2qCjj<3Z+&FI$7#7jCz`OwmyR! zW<0juWklhn!5;idr>^avMq6r)UkrD_m^kassKlDvvdE%P>|BW(soP|t!K=QJZ);zu zo#^0}H-pb41q}W+NKT6Atdkx2L1LsqiHE;?HC3L}tKmwLD^Ut-ecp>ZgO3gT5S(@R zovOutY9Z6d%4sN$Wmgz>&F~Xas6y`_*9Xi^Ff+&I!L;j__z^KDs-Yp0`$q`*AD&aw zeXYqxU^d&VPNvx)d)yYm-iZBQq=|J^vA*@O28Z1RLkOEi*jaOBpBKi3V}MNe{3;F^oJG zjLnc<_z$Z0f~l*|^8kmrGY^&K3*{hydd86q70?jA(4|#2Wh;9{*Lt7BS`Kdy!ZY9H zU#b;q!teFa2uaGpkN@(@l@IBg_ch$W+kYs3RJ#g2ev>*lx6Hqxhi9;`knb^2tdWCO z*Tn(OWzto@`eF{LGbFknY3hHhGcu%BsnLW0S*DnCd=NPJ{cDtLVH9nt-cS{-mxXmO zsHIu4eOw|eQ%=Zai}9epkF%I@vk|zf<63aBW1EoPk(4tkj96yk|8ljX584tZC=Gv{ z5siFzAf)QH?JrkL&k~?RM2kK9ivx%#4wN>&3PH}Uo&_gQ!)r&qw=y77)u?ZeZ?WB& zimB+5b^Umau!O||bVQ^1r8{Ek9$6J`TLByo=0H>mCZ5i6Mok*ph^@k<18+|bA1fxX zXVyJ_b6az18y#!`*jJ-}Bgl8Q97xq(zzU;xVKP|G0t)VP4SZhpqrU1n_cUz=BY;qM zd-D+2a_)v&tf>{Y=m5w7mHr&2!=JQty{8jI2)MoKi)#qY`JTQsyE`Y1Di)Wr^jg<%JH{`kC{eRgxTCS1>d`N!@Ik zmxY$|<`p>Sg-PQ3qr8SKoh0O!1xT0!-BW&_aYoPa3z)(=@^zs7hS&CUpEIOT9$NV> zRQ<;re~p-)*?T*}5jbzzKi95{uV~8?D*?>x*j`RP`YT!!Bzz#sH$0=7dVcZaEmL@4 z?3*%qc7jG``OYUNRD_^6RDVWe?i?1u%$-uZR!yiHy?=7xVk!qe8tab-oP*SNRU>s* zbi^GEB_}G~bnQC?KQ1qxHm856yknuxbA#=pfa2?X17jg({tSboBF6|^jofp;m9%`y zfUc8oCI4(5A$4-E{iR1VUY5H2VfrGYiqE4`#l5kc!#>x5DqERyWNzdjWU@Rjw@r%p zK-EUs3C0oH>LZ^+6STBe;iHA>9|TGo=1|$nAN?C8PLzh_uYmqkY|7-yNyhS3WHd}@ zbaGFhwgX?hXuzp)reQj;sm4cxV69Q?!?s(5Ex~qSY1_pxCt1J91sM0;%xW>4_;+xS zII(R`?{gC4-67`17KKo*-dWF*F4+TD1J#!|vlt4Sjb{KCEA_zO)CsGz3LdKp9&H(q zsZh(5Qg96Rw2(RvgY!5l{ma1e5{ha!J&#-9up!Rf3 zn#L_7wk|+yL6`pgW0&`+*wzDb?yu5$L8}~eZ}iC{u;#bGfDA$VGGLlzZ<;kOT+!QH zw!!6P^j7#uaew^dzWz$0yMuc1#t~WsuUi~C?b~5|@4p2{dBbk6y-(A?3=xH}gV(Ra zVcb9goys^7==3(hN>y##!x38c*718+KNk{`L|A9;_4m{k7;un~w9tC*{j9Z(nYGJP zrtMaGb~>pZF=G)Crv}Kqz7mrdl|o`-^IoMo@?w*cveHTZe9QxZa|VisK35+jM1z*4 zy~8(URc0#`P-|hF2pAFXPyUtsbYjC&qhl$_VhEy~b=+)m_deTg4Ywq^U?$E*OgYxU z-H&bwCWHl;ajk$1LS^OM7ev8NlX~$&{ES}GGE60^jq0=)Z)pYQgM&%Qs-D6Ek^}wK zuUgS6LM$OUc8<;-_xy^wg8l#0K(@8bR~S_@IGx_(7Z(A1B^x0ndVBYU0S%ROp^1;U zkQL?bnnIfXSBj=@yV0%~z^3L)Q^pLB8S&f3&*d7*0{pP|As!M+NSDpEcvyji#BdvV z0p@i5=eG(6bmdxVOMrD`-IJj#AW1M9(sxeYr*UFQ^#4IyfKRYb+Az0a8RVQ&!3MuY z=b4sK+ICTwVH)XkTvi#cAFfTmZk(119z{AtMaVGIKb zv>WQm#In$a4+1Is^nLOJh{QA+V9R2;iK#2@GZ+&pZ%3~XYB(&dfAUdWwkMI$VhrYG z;uW(wIxUdcNjMUN7bdi%0#&4$H&l#Lp+*NPo(=_`4QDa4SEfdcj{?pML*<%OrhwOe zNivH?azm+vSNvC1*yI>=qumD{xZ3yK8P)B8GC*l{k>uuZOtpXsaO~ulH!mc4T%lf3 z#z7m|NCJn<22uFun9yAJ?+-zMd~7R76i+}%2^O<@K|`2TB~&?|c#mAxQqvIhF%h>$ z6dKBX!S9^6ye*O%tgF{j=Jq`C|$ae+#k*`{mp z$`K`4i>_6Fr`9K1?Lalx4bb&(_UVJpwQHW8__HqUK`@rha3jYXHW{>Y;g9a1U zgZRMdqEdBH;Q<{r1)n2?jn8TNVX%Z#4`u6ff8zGA!}p_gcay&%XY%x`{}rR_U3@7~ zW0Rl5cXE5{Gw`w0fVRz7)+S>}t-ck_u@}xhlTL>NdBL#Egx8uq&_w4VSZv_^kyCvc z&K~W(Yjx`c%Z9f2?+u*k(mv7uEggEF z?xmp8IM?O1JF(q8X8tWDyYY2e?=MIom~@X%ds zVl#u5sn5QV*M){L$2&yk01XjU3SA#Q$?N+y;Kvm{ly1z~>`4 zvH1pN+9U0H#}>E&FJ;6Oe`=gc9fbUSbX+rymbv$qk?)Dd&5YuI><4$uyjzg*U+aes zzRI+f9sQ>x{$p)EWV(v~HGI}gP^86A%Yz7CfsUNd!dkL@1S-*J8Q!(KOr){o>z!W2 zx|*u$4N$pzu7hmXn?`3c<%oun-dyj@XN;S^d$50Ux%gT4(~w|}F3E~DE^X(7Z2lgd z-kke0z=QMS!f8>tz+Azu?tRCzUTf;lQ$3D*TT)Muu)=NxUS@8qKiHW_o2ySuQ=`pb zAN=c?0*fXD4?p-so`O2?qEEfnVr2gUx9!7?dMuPctF@)?Q3u#&vy29UZXr$*oe`Q1 zmOWW+K<&wPT0k0jMIn-x6Q4-2p7k2y3bL3o7%78LXDGuBZWUb)+&vP2ULJuHPh7fW zwA#|_>L$IP)6)xJ!|mAVl*_I=>FOm_`B@l=<(sU_nJ+c)(v>#)FGGfNG#Li9$xpa! z@0)sf!gBk;S)Xos$n|}N+D1L~1udD+Re)&H@d0&{(h%=mwnN zV(Y07{4)si4#>t{9=O(F?}y|LgS%WS99;ox%Qc1~R{DrF1YLD#WXwc(5|7_im*{W* zvp?6PBi=-=H(#y=?{rc3Yk3c*i53W3tXXhE?Q+gx%KHB5G@L)!;QU%kts!of*L=Q) zx#v5dxx|KFT6a-q>=4y_u7j2q*`9C?=>^WmEG6un#g-R}eSUo~vH4^>`>Jx(?&E6% z=fUotqXVv3Sp05Z$Fo3sG}r!Ru`^wyPpqNS)S6rWq;@nujqPeCDQu8hyintwEzO5- z1Zhm7FDHC(wqfcSgZZ1~U-}ugA-$1tFWt$kCFpb!zltaNzE+D!V}GPQ@y7(ly;+#W zxLyXkB2ls+owTpUfA-UST*R?MUK@JZZQ@ePCi9IZVIqKZZ8%P?tqAPU`x&C!Q&t{N z4d6gixuGP<#Mzdi_4)11tQ%Z1yf$&0vB^PE=h^iR(xu5$_(%Whw8qD|ZLS!e*F7&M zJ*+4kQOm;pR?+(UH5kxAaMW|>fuwLF#@pj^jJY**#n6GBi@_4Mj@WL?!xJ`FfOW2) z53H0xGF@Z{{s$QGagAu+98z4&4R7qaOW51ewT)6cX(J(0qKXQYy8WX@%R19;aN=&(L&Vj12Ze52)7Fx_!tfy4-A zJf=O1yB`g@6d2ZppS3x1hCBYtA;~ntN9)zo$g8Si@+JMD72aJGbLp4GOg+)BhK*jlpZn=5v{W zD{DFBFDkFju=`OUsqR)yF!GP@UW>cnls%I0OlMP;<;@gR3MMC-a*DU!@DxFt0Lac) zmk~yo{-ebUlqyTpZ)*ZS%*-QpUob^f23$_Wx*VvTE2aB zb`8Q{zDYaOOa2we&^jfSbjFV-ixW`q@5LOq5c!+gUMUDMx==dZwtZc5=-abj2BpEIIMr5w*+q#Q_`qDkE&8ThdO#y`rBVa z;Gbwi=eA;zmUNOG70hOj@``724Q2zZu*arY=$}Z&#$-61ib;{C!#EbC>*|r0xtZI~ zhvBq28oWy?dJ&v;1Q#%VI`=3GUNU`|cN~r-?_V{ul+a7(5m5WS12f8|`c{cn9MzGb zwVUh83)wiT;Ol>*`f8cq2S5J-%V=8GSb^qlM1h#;Fj`1aYoGHVwhk$P(8=Hh>{pzn z@j8QQUsd5K^(}&Yn31h-Jir@QIE~*``*UYu=(E)Jwn#0Y6CqY(&}7vR(Rx2 z+i1ob(!`P+Yz>VHJL};C2Q|S#;{m5b3jOsHaJQ{rM?Cq*RiZ*s zk_bYvGYDL)dXzzpu)CFDqiE;D-h4s61g&Nx$&5JzJC!NP@OGX;aQPo=>Ti!K7<#@9 zc5EX!UyMqunuIh&YYk869BdLd8P75d;Ckp!w%#^SUa4*dQJJxIie5MPL@F4&Isz-1 zG?4M@J?LE3Z~NGCo12PuxGnPyPvD#Tdck+amC&@BtwFZ zMC6`BX681)js}m|@CIjIlwNhr){W9M*fSm*OBg#<#U=fu7O@%mpc%XM_3K@rp^l#* z?CJ_Du4LPBX#%AhF3l1H6!Umat@!Sun7<*5K5yS@SCWV`#c%RhVl4*khXJ#k<#QH#K`SS0FR9XYoStO$Jjt z@q?NTIA~iD;bN89g5gATL;~FJ{_`<&{{6~Ow{*jxi^BMy^-yeFX)40!1u)#zS_o`u zj)o9sEQ4bXp12sBkW9srRjupQj?z3)9RF6ZGj_|~gy z@c8vEHdw!CRUq|OiV!xFx}-w%%i7VKmA+u9AJ%Oqqhy%8~qPs zr8Tbf3AQmFtlitlADOa~5YX)YtX@{ASxMsEU8@*B-K$_vgFn_zVpX`$&=$DqenR$? z`nZVykddD-YF>HDSx7)Rb;-sM29a1UQ1K2aqi|@nD@1B42_+^tvtsX09@IpN4nza@ zY_|xokOS;LH;^7QFCvmRBYuvMKX~mgMs%a-N`(^WK#r5sQEH+`>VK3_9`Sghyq@HG z=7D^Fl zG@(@IUkkKeZ!wh5fh2B{xl1r`Ukd zE;?DFcR+9n^9&wY=i}{*^7~gjI-60SJh#3Abv_B{M9^jC=RA=RQFisj_~*)6|JD{z zjLTVTXSzh1bbIjWeoW!T-r!2dF{F!pS!@!={rP%dV&$w+Ka@n(s`Clnb_ZOz2ovi@H|F!him1RtsY(Gvisy*LaPLvOU0BaF(2qL?H5F@zVY(!5tyAk$ABotf)1|49!3lr5BbW6!IJ4g?}Sv zj=y?1dbVi^ia4QA7}4M`!~sbBhM|xV*qBx_UL|D3Bmd!k(2eXU5XD%TG{F~E#H|ZA zOKL^%TeJGy?rB3%BBE6cu72r>FF-Of?8bQI@Zav8v?BzS88-F{R~o$CGbMDpc^p}q zRW;$F=)Q>r1qqdH+5YyGu33SX!q{Sb6JGV$qMbdx$dYV4i)0?nIS_VB;s9Ro<%Rwy z7#IJSiQ*Jf)7mr^;lZ4S`nzrV$o z@hTBXro`aKy{eb%oUK`qqA5ALJh0@%*Yp02@?j`aa|hU3_3vDl?0@x)mnm3~8JZ|% z>2M>N{QWH$EVX#E=}$t@^z~x0VK>R?jjNoYGWrifiK0->Kx9;kLZbm^t=0>ibXZg_ z^6CR)p-LB4Pqi#U_r5hjy5z=ne{k0;2#wix@1(Zy)~L2$oxhmL=e!%&zGT!513iGu zxm>QMh3wc6jN9Ipw<*J_Y%3ogJUTOYcTtAJ>EHn$F6a&EppqF}N7G5@{m5G1*OTI@ z$eB{6BlPiUYEIFLj5)D%kV<=nA@!=2|49Da??#r~KIaTfUQSN9290({fKHiExqo`g zq0chugz1{*0oc-dVE^A{d%G;9mSLgH>}e z0LXMNB&zTEzAh1+zfU7iR$9PHDB{slUl~ExGB)36{g>G+DZfaJ)a8x$cfLAfG2`@S z7cx+aHC684mzvREG$%U1p&_3k1lc%b*{A?ki~#?^QA4LtB{wGvXkFvoF|GGnaDDab z>$xU12$UE-|LWF%Arhi{sk&2j{Kx86xCZXUcX)&^ukRxqdJbr853Z%oAP;Nkah=J7 zuAgs4Z%sZoUTzScwdt3V7MK1R)**%?O(~F>4LHaA%X)8+*fIA2^H8ndH?x1CcIeXGsFYBTq0Ow_K;g>)ldmM4z~~8IP{Ntt zv|U0g#a(4ut2Alzaop$viE@DqW=h`L*bR`FFux}~?ppeX=J@k$USrD4y#ep#4i;k3 zUaDC6Gb^MgCv^awR^x@<%sZW_k`rzhOsoksgT8)|Ae^-@@76|xm03XyjxxlASp2?! zmnn+dA?hSU;)O1k@Q1Js{Ke2`9}HNLAzsmr%&t2*TVZVnB0SMd&_{9TlPSr20)y^a z^aJ&}dN8;Qzq0Rx4MtnGZ%8&V984!%g^A+-0@y%Q<%F;LhPVvIK+Wkug>cvkBZsqt zKuIFuxGi60w&{b{#N@y>u%faXaQ#PS%>7M9(^()r9bk=~NcB&)gwr&p;U~~$hK=qp zM`ootTt0vnz$^8}D^#+IM1XSROJwh15R}1WKOrJcQo7CGq(CI*Acd7;!82`rM;>XEw zY-BX^rYW)Fj78q3HuBw;TFFep?&ew+H-Ny0(e;Jt-mo#S>%>RYvZl1z-hzL;vAr4G zbsIyPDb&4YE#r9vjj6^DS=ml8+8_UwhLXF`HM83_GT4gYP|S+A$~D-Lh27-yT(*-F zdFKv2$gYQu6R93N%`Yd`ChJqC1LzxU=N_9UJJBm5 zdQL?@p&5@|X<_92(b(Ebjwv2)c*A4zM4>;l^ud+mSOsqH+EP2)a<3$!o4a^$&M;28 zbt-tzZozJ=_)K;i#!I}O8zdnMeX3{X2?gI#Mnlh2(;$dm) zADsXKvjG4z=*a-08#jklLddXl>KhVrKhJk>PV z+gqd%O=n;f6g~`R)?gh3v@EfOMY6gcGk0+WSh`~64MEr}l*y)&L6yfPOm+MlFp+%4vP|WPqtZ4o9uArWHEZ|#piA=C zzR%OO3UFs=l#5(p${C|%Gc%*jrL3Twk|py{U){-`hozAWMwtTX}cM+DdBt;6a-CYBrZ==xN{acN3P=OLd zUMVkNc^)yqSCgha1?0@8VQ^M|d7?^ITr)`FvI#kJFV$RD3r;iusu&S-E-y1~%`)r;dKRG(0+2R+&wcs4a6 z*m-C6;j#~9Q-c+xIMZ1m?|k2qi7q@_FC=*%A%XPtU=sn_QKq;T`E4eRRT!aXb&Q*DZhbs3%9Gczl8Fs(SUYr-5z>e=br7^Rg=M-6X3DL zdRs6ypYMAAbbiT@{dRi9nzqV_go1D^v>EP7YE4AExgj%L@lo{=*dFZFUz;OVfAB)e!53rxKSr`hrVPxM_2^Y6wEFFp8RlzoRA{lbK{e;Wa#No&N6&QKF)BQYAE zfxX=y_-wPkX9552!iF_#D(Z$diYw)3qhE=!Jcc(I9zj<)`~#?^L0Z(UF3q2PlEm=6 zAjHG{QMWCPD3C_hd$Gm{Gchw#s4PRJ%i)byHlrtsYtA4I-I4NZS93KPMzHFs6qeQ7 z0bV~IKn;q6q`0*<>*8uh_N3DuSYkboFR&A+-ivYTY5@8RzwM{RPOty9vUr2FE^{%D z^Yj=0YwmObB-ukO8yqX!zk7o$csDwvCZ?_Vh&_vg2~3(EMvyzjTMB-7ywV>M;1-3R znzGl~Qf==nY1@|Q<7@v;GoYSbY)%a0TZc{Tnlo_53Xz}ODkAuA-_9zGi$PA&Kc3CmrSUss%YUjx83~_rwnEXIO>rP1p5SA$atRMUrX{N zR*t39&^LBAquC`b$hIeLvde|SyJbCLBzuHz%ZH(a`Bpp62}l_C7hLd$9M?6B4bNMt zEFaZ-CvuPF>)1o9+~~lY`H8C&!Hf!lK`sfvTKJ-;+}=yi;|i*Yz`kkm@cA%rd-(dI zgTfz1Y2$oTwIfl#o;4FRocjk+jg@62$`zBGfOktIx- zBsX`8h-<9?jYbz9y5xMdwl~~JfVD!B#rCeN{61;r=iwV*b1z5#>I{UV&VtQG)Jc3% z`$9@}wt3VbD%%loj#e$66Y#1q#u$ks#>FSE0xecVGOqa9$%pZxL)s?wa5R}iC?i>^ zzfV*w)p6!5mOOS4CsD?hWJ3}hqn4JA8BJ0zDKPJAYrvEtpsCA4j2%`c12;O=7+P8cg>H@kCih-eyH21U%p#>GQG(4Jw~@TYWXozXcsq~45Rt_x>85v8AA ziQG`usgdH&B!a6 zM!XbjD3yZcDWBJ;7q=ST-Qe;jcOEV3o-g@drR{B-FBEP(s(P<;3Tf#yIGbUu z0x3DQhEjt_(_UPG{S{>O-cv}S$dAM~L% zkVt)R8(y}mZqQ{gt+_>}5r*i0)!_Lhu_ndpW?8u^z@AICBQ@t-PPudF&AdqrB||%_ zo0VZm&C&E?wpO7#-k}CnAFy03jHB9yzcFyR;^o`wpbbu1mUoKFGQ0qm%a?%_m)GhF;~RKtE<=V+e~&^{xu*wMz1RV>t`(_Zg|>U_c-*hM}@=-aCBTpCKbRkgENchL@e5~{S}9qwrb>&)rv!db5O z__TRBKJ_p3UQu9xz0&0gBu@P&zd|k=V<9`6XTc{utR7={xt?zt4|=hI9*p1mG~7v9 z5bsf75uJgSZx;03j0}mE`LoV{e7<7P-V!QdrD3&i!hq1>6wkA z#rH*uIMeAY{O#TV*$ST4P=tney&ATdDy!aLO(cR|4n1&&Yj#5<0^#hxgu&iTg!hlH zvgU8S!zg59v^#s>2M{fy`ys)TPNZOGJha00D9r-N73yr~+WORjfjphT{8r}PHDEBN zAo7c3sfItIOe&kP<~JDQMz;lYlZ8!eqUXn~`IH0-lCZUc_k|V917J7>H zhB^hvpFMU!?;`#%Of1pI&vrvJ3+_?uIbBw__p*xd&NT^kBf2u-@5x+CPO%AZB;xTe z_t03`@={hn0NYN|Y^O6w{(M)W5E8D@f?1dCTd?dlvZqy-{hf#Vk`RxV@VQEJ~ zUF1{-%Cic_d_mr<`I4gj_PZq)G#;xD3f)}GY_lp@Yggb<`M?$JHSIwaubh7363K=x zrOLFjwEDfDS`dYS!|~QY!MjJllXFen1Y>Spylf+qtK^C9oCXE6Rcf3Fxm;$4yk)_A zTZ2g1Vo9qVRRS(Oq*~qbGJNlKcOq5 z0et52;TKiDP>*d;v{gmvO`_2GUU0Cz_|$wt_2q(2n$JTrK^GV4!^J;E4$A4JJ#v`Z zTs;bQ!%Bo&Ph|8S)kUPXyW?Qx)}M#0xQ>t31?*1`{R&WTbG44RXp@3S7fb!&}!qcU9q8qbKS^> zT+`y&eP9%O@yJHeTNJ5re(zQ)vhjCihd-NdFz?&T_C59PF6x@7Y3S#yoR?E47nZ7h zSU0u7w6`boy-WyB$E6{l%#pOkM#>B0k=DH*R_b@1{dmgjrvVtbO0_N&*vf|qj+|*; zoqym2IZC3-;asIb|BTmTCLSvwwJIQj^lOVs!7i2|k=D@i;UlXp#1utFd|_2JWCM#y7*E+}TFZ>_&{Ru$qa0WFS~lffIA2IC zNGpMQ^hXhL>06^jA?=y@AM1&S%!yJnh6kq(clCDAxWH(9SW6WXOjE34T$p#=_N8wB z^m|HNvP8L^{CSk2|J9EKb@=?wr~S7w$R)Wiu9@08!#~vd+^M2c0ECXboW1)wRf?tE z7e={Cz;A>2o2jcmP`k#cP~nseaXMV9>l#8F8iE1}6kgtKyk?|W)o`~^l6J1%W;>|l z%205T0iBV=2Prm5S(D;|aUu8AJ{!?4rfhQo%m%ou`KtvHz+TUtH7DmE zdhn-Ho;5?j<~`qw!gcmLcdu!k8l3Ex&R}Zy(_2o4HN$UoInWpWhl=^;H{M#O`u~9r zegOL7|2)B&HXHbV@EBLl9Uo-VXa*`5&J++=*fo-BSz>Ar& zS1g&J>XfL5;j!$Q@J(mze@r)KIx){N5!a{BlE8beZ!~3Ew|AO_%Ah4DBNyDPNvbyX zL;f{x6&0ZvH#Y9JWQqPfkz5p@OBEKJ2yF^k^(7~Eje(!pdJt617D*SaE*MCL#+=@U zWZna95a-sioSSZEHHD?gUbW&TbAX^qxo*FoMpCcT^-@Yumo)w}HSR?bK2@M;iBLNF z^Ig^-)&~|(t)MI=VW!S%#~7=sVjv;8*pUqz+h#%ol=_J0%+hZ6Y)#)=wvqxhEu;jcsN%M$R1~ziy1D zxwg_8`sO*IC8afMMjP-NX?;1e`416qR{8&j;oO?O^1EXu{7bDD>(RQNoUf8NiF$vyu@n9>hw0N;~%c~ z8H@R3iNm^<`hezUK*KV+CpW(j1>A-1)O%5^8JAuH-VL0)t|3l_>(f9gpmXpF-_j%hX_aIf#QQ%jb=LBz3K>QAUX>;9*x zZs{?1OAg%!h`7TLi^nMVyw{-CspQP^-usphobCHi>xY7xz^!UUmA-h7hFs5IoTnPz z296B&;^S%_3n=DM{_N=DNT0ROhza~dWobU&Y?|wX>t}>k-!Xc#i}PW(h+TXRI_Q@{ z{|GfT3+b_3feOE5q0pUCps>Q9t^*y*ZXoVWWo4m!lew&>gsX{w7VlDoMJI*KnW zCOAPxM8u0R?gpl!CM5yy=IBn?S_5lIM!-dd4=%*U zSx~yUrPqM>98sLJw{vM|4f=46OGIWF>JbWBinv$@SBf-XA}2TBL%>Upu)@QuQinBT)jSyy(8~oA~>y8c0EX9P#}Ha{vs=3TIWZAxi z+r+_WyFj&Z0yh1uW3K`i z2XYC)9+WAQ_hBI7AOurjm^jo1^>DG-@IIjSL?$mu3Y@TKgn(_kOD0{j04AXHvzm_ji$)R zC?WGNP8P^Q%dD-_ERY67%S4dzXKb@~da-PgnOOs;Y;!Y#c(O^@8(pp5DOM6je@B`b zR2BiECdO8kpd@n18MBf9ib_Z0P6BP<<3#e$XEf%P8`BxXWuj6qQX>A74>>ec9QJ&b z#EZUx0)8@%r(6(-ke-Kbw!`?hkh6g|Xmjx`Fx6C^||oNyH` zxE9@m`OCNrsThroT&jZ*H&BtHf$?F~)g(8gMB{5JLNNbYp?E8mzHx4djU=&?sH9vJ zEKq)EAtI~Y!+khxu-8dUnXu z!#b4Vg?5)U++;JKP}>V*g2757U~jqNz@&>PuCSER@&1qXo>Md^O$7m(1wm{#Fe!Ap zL0WT28|&^!P{Gvsnl{u!Xy<;gAlQ9krXHh`aYjlfhzKYkomO&Vrosh>*%DHyY7*_O zNY6*%WJUp8>6@-jR5aRZbG+r3a9KI5V>|LLajaT zmybGNqh4At>bh026U@YYHq!0k3q1b)3OO)qJ08uc^`M%?ECg43E(;Y6h-p*zyF#z_E{Q zqtAz)F}m=9mhx=I(>6T!3#46qEp+MF@1VaVVgbvn0rJmwEH>HrLQTw?GC095qS<4d z%9`=Yt%*ZM!(~Tlp3AUoQkWS}X<_-%&_I+kH|JsXE4!&tMWb9z>+JxLi8jJyD&Xt8 zZRACyvay_m9KDgXKY@(rHr5y1@63QeD#?)F7|Z+OSu(1`Zz>d0lNw=DIupb@7q%x0 zCP*+~)cwk|1ZIVbX>;w6z)MkmzZ-4yb$vK&FXJ# zduv1OK?Ez`D=#ghF2m{ReDiENeTNLTs6?!wiEM8yEl_g#>lgt3jE^@`<)LHeH0vG| zO#^Pd!901T1m7!~DyRX0gufb5I3e$S>nvxPM$=*?yUf*)hYgOGFfhS|35FHjAB9iV zKSBlMDgHP-$;_CP3zme(jn~^m9l3y#&1wDb_Q$3NzfUyGh46P4YKdoU>Y-!0v;zT3 zyebLmRXB4H(jT&MTd+aW?{n(x#h8ZjGJ`jBp85Cnf(ZqHl4*?KJ3cCNyeiSb6yh}}_DQXF+_#4sX!JxmD=Zm!=IvgZic<|OLLdmA)0lp83AE7v)7V)>#SwIk7AH8t zVFq^y?(R;I!QCaeySp>E2M_K94ek!X-QC>+T)tn{y^pt_`r*_%{ZLiCs%qCh{2@wt ztb=bifYGO^K{TYAzMdYq5kFkVCnuQ9%lp2j7dPoS(C6mwSW>Rx_OQ{?(-`M;l6!wEcVYy z`-q)cV-~+zBKgwH37`}m{X8pSwH;opV3z21RSd)^N?*BA?3QuGP*ri?wAr#rOZnc_ zj~Qq-_=Rwk$Om^0uaNTKf+v7*mAc1#mSVi)Cvx#M{-6snRCp_V?dcZd_^B3g z9OC+^dc=6hZ}y>VgBXtYhbPBrcKO^t=sAeA=yJVqla$gPHba3q*0sKN)IcB?Ui;6} zywrxQf>+8C5C2swU`q1fjjvAKmN&}5cdY#n2^)$0Mi@HlzokuJ(gm>{Rd$TVt`Cth3| zo>u77RZpYGHWUw;W?V-z!qoL-<9|PWxv!%EzwY!yArP>oKRl^P19iRQko_n;c>y}Uyt-%7AtY#>y-E=Z>RB? zj;t}BKL6Kg>rvjbmA0>08pW7%XPRYL*N#13ZdCF=m`t;DxQzP#YS9?gh)x71)tN2g z*sQW+a%A7;EvFMJbGef?8vKTPZMOS#4Rp|;MCG5`n<#_K&_CTJ%s=v*8N+4x9=Eq1 zLWcqM2n}(aL5U&P8Jqs1yZW<^V?{w(Ra(eLNucfL2}9Xj+odK8d^(++p*uC|1Y_1N zD~rbx-$poS^YE=SvDI2@7vHCI?KtNiNtz%u{dBi9dnW_Gvgn&X zwp3HH40pHk`BGzh!@X2C%LR9Sf;Rkwp~s`M)WGnK|67M`f6~PpAE(fmu8(4?R4vo zw&o^O`f^TJ58Mf}=e-vWE|^r6wrD#wx4#7w5XVQ9IsiXuw`JMi61nf^U@^Kp!{3}o z>dg^HHe_$PBw!~SY1Qo3cv3=|Me6N*e~7c2z0lYMW9yQp!gsWgI=G!)_KwrJTqy2hoP48()zaSff(R%U}Vl@NFVO;JJSY3l`g zN!2RAr|}|Dh^z9Ah&(_6)AfTzwbOvKoxp)c0#^NrXbpvYJN(TSSUy=uU%xAu z!z8mnGvh|n1y|{Fo4~S6URd`D31+i3av!=&WaLKe`jmV{idHx+5s?mcyV;eDbFh6Y zJQbx(zKAuE?&q&L%gPU5*o%Fuh%(n3a*q269aQLItz-4K>CR4gVb5<@L#F7PbE4vZmj>n}U>)Y{Rpl1^vX;{E+%Q*GQVAENK1TQh7&NWQTk zb<=UaZiEb;WTbcSw)|i4fupG1e>Ot% z7c(~7#-uHDSDbKfYOH%h7uG)umTbAH8HF42dncnbEo1NC%le)N4ht-z%UMwzd2%P} zpAR(`d7rofLr!H_!JJbr6sBXDA>yS~DViN_C@wss1)dd?r5e*;U*=Scz+EVU&2ZM7 zAPGlNYi@u`rC8RpChKWP8l?32FQ|3iEtM2HUnYlpPH=~ht;?k@bd#x5*LX)GR(VGNBc~s=bux!(=S&93l*1X0Vxstuk|saEjW({sP?ZwmXsazow0* zeUA#X`EeeB=r_meCs^4>92nHPouc?X(mIL>w59<*=Graq+t>Bz$G@Tn5z?JLK>dNkxTDL@=zP?t7WTKiQwvz^x{s!{$tVB}%!p0O9 zIT-PxRLYpO==(=G0J^_8|8(~$K?cUh&-kGlLk?<(A&c_=>|!>3+bZGtXP2awWyHc^pckWf`jnl^;?08=f z-7z{=9z-r6omu{5A~i0wPW#RoBUfgLo#9-ySpxQ!d{0Cb)c$B)F5SEnA z2Pl*zqzJ-sxpu)eN>L~vo0u@|FA~BbaPb#}WIAr<_n-p@5{=@Wo+Q=!$8QbmxAfcH7qwE%8}0#%);+&==^bug;a5cT5k4BIQC(%B?i-BP?qy-*naKtyPbkS zcn#~a`VYJ*OwbiK9XgSa{7~^&+6XL6 z#w-Vj{Gh}$VYp&a42}5gFoRG@%h4C+hM<0^R^`3wRiK?njl-4~Od{jYZiE%T2ij*V zjOOI;d5OOa?V77wG#k02H0Xnd;fJ=imY@Lk2K@!<-CLK`TMCtsqo0IuB%)O$vH3l3 zkiu{lyEB9NOJ@n^ltj)`3UCT5l$BA%s|{SHFWjM>x^B5P z(7|0@5rV&Y7@%A`)cls&`#K-~ZFxO`r#nrMZw}}O zCH0LM_e1^tLdbKzSTiwvr+T9b%(w@Hq+(v%(qhl+Q0|aW9+1QM(!rDm2>QLld?H^3 z@0F**oM_VbfPBj*80DUD<)a>ZyykZdWL9U~ig9t~W0K)9L#-`@yJ~H8Gr1x|tMfrk zT&nOKlmU({l1`>gY^i-7rJC2N(mkuZS2p4?ILndJUNBtBD}}IWEogWkuuoF6@MDl9 zX0nx-k`B2$SiE~sHnh8M_If>Upv9IZh^O#GEPp^$G4n2!s7?f zlDO7}Q`}%>HowDil>8KL`G8zPtBJZy)fEwqGxxY#LffTBP=S;0t9Gm_6A_GwG@Qwg3?o zKHSJX){yRTS($OYjma-rWG zu}_AkNLJmn%4~HCJteAPr3iA=-R;5pxb8@`uxlfVkpUp8s(!}sG37W+#MV@Y#N^n zBlY!%YlUh`79T=uGa9Ne)IB$ zfan{qS;F@>^8m8GqD2y&nF~#xc2tG;IYbmj>lt+;SnJ=3Ho<2DTj9@D(MJDJm>R1# z@naDo6sp|%K4y%Q^KY?Uf3e^Eu-gjhf|IRl67B@qcE3FrI@TQ+BikCvrN}Ng*?w=5 zGS)0BLL9biBxob@JK0GW_=C77>0g=NN^GEb5`443>PS))b(7G#FeI;r*ov+8{uk{7 zb5AKzzoE%|x7JeV`tO;)>6kk41yhceX=W)7ve&S4irBj71GoG3*U;f@olk7;TquzK zRtGFr7f4qn{P(mwOkmhdrlqz;NS0G44DL1Fl(I$!o@>G=(bH%$km$FXFe}c6Q%; zV-ffRZo@xf^rlQL*$fFJIqw5GL)XXwTq3B-Kg>|<(V|Q-_I+2@!PyW!J&2yV4I-aK zN8+-}!agPT3{gQV%;M>$(ta&S!PMXScz$5Je3(HKcoXys7OE$sHc>z=$-^t~lp8&i zHMICR!Q5;zix^ap>@nq%kM!^ewUS%4#LPcdo8v~NM@i$Y*G4ilOk1ckn+?7L3>T{!->otmG_Nr3TzTc8O_dx z=#|i+dXF9KBYP-08O_!0)yx(n8BC*(MMq61L^&M_zpZSAs!DqyoKLk!qmL@mGX+jJ z9mUY$q<7_;JLkg0t6kOrok@B~}6sP;!3En8F2oi7WX zF))zd{MCQ57>lMFu*t*aGnVV;A`ax5BCDfWPAXwbDaKOZEHyUqFTJ5D-W;#C-LrWh z@J=qzglBx8`Z^frH`Py}v;^_4bGQ{g^SY&yM`(_G9>jV9vP1zndI?k7Bow9-+U#J0 z<)!fMwJB)$6K221`h=E~$vo=XgoaQdyr`mKjZ&8!_So{oHdBOKj{O|o%?~TL(^pnn zK4c0Af>gYsVT>H_#e7T48BB4GzN%6|Z>;tNhZAx0$&={yors^I6cGvxSIQbi78~VF zrW-J~D7!b>RSs6cixj*>Blt&1De_;deKn}pyFFvZ$N&My%q3D7b4bKSs6PF2JNVh> zI)u1)pK$eNunjpd%L1i;kG!XJ#TF~P(Q(e;+ z;t8LShcuK>wd%;nt=4GvTO4I^jnP4wf=oj32aP4Vy;De5xWElgDMS@|1lGcEg<>e@ zGEwL)U&BfVUP&d{tT=}!6otB3w?C@kFI6(RoMoy&J zgT}9T2_<1HWFGB2d~DIf$C{8Xd4?CZgCKn*^CqD(!@|5U_dv4Y92b19prs~5;M=(% z&j$PNcflQ=BcX$rwb6O0z+`}?Ys$%q%WxmG#r0Y_Qbc-&jP?CqxzzquuL4)tj+h$53-Jky z5mMraGUj3$w>>w#G~l5xPE58%l@3xWx3`q?$>exIb=2nii!U%H$kPd2XmZGIK;B>o z#d9(Z(@4NifCf4z#RMf_Wf5aX$vC*J5`5$LC7vH*=v!gA-xA4Kje-$d3oWzUe79Ij zY%LI<`4{2kg^Qr->EY?d#=cx$P^w7xaDN)7?p&R43sbGv8M2gUkROr-Y(GFAe7{=5 z<8;PXZ=~&(MJ-Lz-&%AOGF+<;-*!M1~-HPHmV+;MpkKkC`RVw$g?cdxCXm=UB z@MoY&875v2BBpe{3Kg3^u#R%7-h27x6>TEYXm+buce7ZI4#i0*2~`!o zaWgcAXqI3Ah|m)92_Fb2>xtT(?b-;a*VjvSAakUB9O^BcqE!vlc(m^wqDMQkDbBDP z!wAI=$r_t!F>%+Gb||Vi2II+L*Mf+ygqRT~!kEOk>7D<@?XpMhtjaDYc(@aKxdTIz zW>l-sfYItEeo~cDQH$O~4qD2<&1BQJk3fs5pUONcUj^eTf2$yq!N3T0!84Wke9|rD z$f|Joi4G3>_Q<+!=-Q{^-)!ax3Q;8zNaFfaF(0=#3Q+(2P`st3fz(`y>MCQ!^TJob zsqRBMwMzFk#9vXr3&P$<17tajTdp9?N`KjB(m;r+ed8vUxc<@>`o)uRkDSz4?H7U5 ztHIE-Qu(f6TY!dwK_OMj#2L20A@4r^Hqc1ODn^++f`kSvvEF#<+c=N=%pY zc366=9}Dk1O>|JF9av7y;c*1PKAytnYz6jhK`2NuKhfdu=75aH|P6?Z=ZERr`g z>}a9!n!uT%?H?nwE8XGX6VIv7@+<|oJ;DI1S{&1ojG@^m$Z{PbZ@4Z z?keq{S0gEeW|JP<{WCI#NrfKROtF7gV4p^Re{GUp-92Pgr?zb%Ay~ zr&|)?*qTd)Fmun^c^2<-rAg$({D|>Ewpj>xy43KAm{5*hLq=ruYcQy$udnlj% zz3=^(yV@-w>PemytHo@YN4E-HHJ>$Is72mLD1=k~tB<*;o{e9YUHlz)OsSVoNO$Dm z1-KOc@KadyNdUNh37^q{DA8&4Wh&fRd5MpB&04;1I(T*ZuUH-i4RW)axR?fukaS7r zxfogK2v*$cV&ax*7G~UnO`8S+1r^Fad;b1ijY|3?ByBYMU}y%}=?>f;5w3EjxKcQj z;(SfijF>w<*iS|^u{&4=-r;SZ{)l~%rAS%X^zlY?pHv4NqN=;x4!|V}?*>;uPrj|d z_#zz&Zx~r9xejyBU2zIqYrv1CarS5ay|}VG4#%&MB7xsOzjGdSK3YDO9x6&7YQ$sL z=H}E2kt5#$Z!RNY`z!YE74IsIP7=)Xa`mTlrfg>laB-$&M`Bm~$yYfP?HJ{8bn?Nz zvG!!y@gX1Ak?ahiv(Lzx3=)CY>am|`o+I}$XyttQMid!tchB6pt^rOQMD%e3BuvH) zEBxkJn2)=!;iBs7e=c-SAhX;C6;N6M+zLhGvTJKFLpgLTNJ=PeqIfqM`JWVGdm4_Np?*odD{5Af>aSa*N0@FQ4=Z|3n-AO z0yzZ03GQd*)jpsv*dPY0{S~V`(E{)|?Tgoq?q01mFk5k21yIFyiR_*{8~&vMce(Ji z(8;$ndvl?#BL;00^Quo=MD_Vb^%cKRETQN}RS)b-bENc-?wU9j{-Ot#+e_>QiYb$a z|CZ=7Bh2`?#(j8^DT6x=OCd_qN8+3>9+i~f@Gpl=YB9$(XVA3~y|}9l{LY(!xS*Qy z*BV5-JYQ?_T}_e!g99pg!KzeK#f=xFqQYi5Z}G;nJQC|7&;Yg|CaqO)7a-J&MoBlm zRa(_-Tg7wnl1@H=l(A=4{#RUU{tC{g(gxyDTR+=Rs^o;hEbKHU2_vd8&ql*%M4f3) z)`!5+!XeD1`j`z$qZ&}V6&ucuE!W3+hnpHQZpRf~H9*0pnaoEh7xpk-`#mYePRXnaj z$ApRNYIZ?RHE2ji(}m`#j|{}4rpw$y+Kh_cDAu6i(%8yCB!P`?X}gXcEl_cbtd=4= zrI`FFdvv>%vHT=y`C(WFgxj$Rt?EZ8(H1@rFSD~SD#YRgo#UaT}t5ZYZAs(LbA zt5^!D4Jz|dWW59{6S!hkS8^j`?*udRzt2bPqO$HZ2)&CsHWapmzO45qL2&u#4e5*r zQ?R49g)3 zKFG;-$3DT4K4PrTa6HE-*RdV23rfR8tL;-X6Pso*Y@1UrPe=pbCw#n4$bn0U?5~~Z z`-D-=#}f?;iIW(clG4K#bis8d!=&79c2NWaYx&6yk?|9F!yms0%5-H9D`wG$%StRM zOik>Y(o02uvB-RVzJfvh87G`WM7Twn4gl)Ex?wJ->qCwbTwbqep#ON@%+94yRiHhd zluu4;1Z$6qeVyr?K#}^fU-U&yFzFjg+ht6yk zQLi=vbfe36?@~D*k6{{Pbt@u+n$c^jh=T>XUo?=972qrJ+01z0;2} z-&-~n)e`TK!B0V=0V*aSAt&P`?Ymg%$04HCdtt!N~5@Ov(ODbGh&?J>YL zgQgV!EQ|6(RU~KGL3!f8)QX=7un(24s`LMX!MO@gT(WDkTa+B*c@$5B05zvcQ_$glBUz5B}lLlkLxC17&DF^k1*^ zYhhi;YZm{U!4a{fp3a^+3!8_*1)0B5>yLA}v%3IEG68ArZ0^+AA4ncE!`lw;{|RPe zR*WQgJk%-Q#ZP250*g+6gt z7g5$oD@D2C*MCO2R@SFXw_m@Y9-4fv=IfA#a|1J)a&w9IoER&4fRi7%XB>?k9Rh1> zYaSmysE0`16w)sL46x?^MMq`(V^9TO1Q)!By;W%~rO<2SDbai*{iO77KOiyx$}1gC z<^Uvj{rAQQKDUbcI#FNp|Mg379DanMMOtxYiCS5e(_}AS-Z9U1x}6gw`(G_9|L04& zdJ+Ao%ANN|2R6=WmR0J}yF>BhEG*Xo|JxUC zX_uCk@}%O4TKqo*ZES5B^8Hb(MY%s@H7hu*b9me@fIB-o9$i2F`%XbFETDwhZjD>F z!|R?2!TQq*`JceMYQ1)J0ATD@{=fUwvyCP$dT>ubuHOs7=UVA)_9ZCVYO)Js!Jthc zhj+(7@FwTKG?SBuz3ib1C1R^hw#vn_*hlwXW2uV4{}oDAl#`vURH4pLH=l`Q{XfZ} z0l5P(uFZDq;KW2@gg2K@L*+kfBMxcKmky`>(H&%Be0kIV@mJm|Ya-pdZ~BH`thbYs zlJ;P{91c6kc5pvj;|dlN9TN8wPpC}12-l^axPQ;6YM{OM$oAN(iLnZlxooHxxnY)ZByP#FH83H52ybgwLYZj zRH@R%O7z&ZbxmQS*V~uIrZnaF=0;Vx62C*5HJsn=S`hv__W3V!%C`jJDv - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + - - - @{ - if (cellData != null) - { - if (cellData.FormattedText != "Grand Total") - { - if (cellData.Axis == "row") - { -
    -
    -

    FieldName:

    -

    @cellData.ValueSort["axis"]

    -
    -
    -

    Text:

    -

    @cellData.FormattedText

    -
    -
    - } - else - { -
    -
    -

    Text:

    -

    @cellData.FormattedText

    -
    -
    - } - } - else - { -
    -
    -

    Text:

    -

    @cellData.FormattedText

    -
    -
    - } - } - } -
    + + + @{ + if (cellData != null) + { + if (cellData.FormattedText != "Grand Total") + { + if (cellData.Axis == "row") + { +
    +
    +

    FieldName:

    +

    @cellData.ValueSort["axis"]

    +
    +
    +

    Text:

    +

    @cellData.FormattedText

    +
    +
    + } + else + { +
    +
    +

    Text:

    +

    @cellData.FormattedText

    +
    +
    + } + } + else + { +
    +
    +

    Text:

    +

    @cellData.FormattedText

    +
    +
    + } + } + } +
    @code { - private SfPivotView pivot; - private List dataSource { get; set; } - private SfTooltip tooltipRef; - private AxisSet cellData; - - protected override void OnInitialized() - { - this.dataSource = ProductDetails.GetProductData().ToList(); - } - - public void Created() - { - if (tooltipRef != null) - { - tooltipRef.RefreshAsync(); - } - } - - // Event function used to update the tooltip content while hovering each row and column headers in the pivot table. - public async void OnTooltipRender(TooltipEventArgs args) - { - Dictionary cellInfo; - string returnValue = await JSRuntime.InvokeAsync("getTableCellNode", new object[] { "PivotView", args.Left, args.Top }); - if (returnValue != null) - { - // You can get the cell information for the row and column headers here to display in the tooltip. - cellInfo = JsonSerializer.Deserialize>(returnValue); - cellData = pivot.PivotValues[cellInfo["index"]]?[cellInfo["aria-colindex"]]; - } - } + private SfPivotView pivot; + private List dataSource { get; set; } + private SfTooltip tooltipRef; + private AxisSet cellData; + + protected override void OnInitialized() + { + this.dataSource = ProductDetails.GetProductData().ToList(); + } + + public void DataBound() + { + if (tooltipRef != null) + { + tooltipRef.RefreshAsync(); + } + } + + // Event function used to update the tooltip content while hovering each row and column headers in the pivot table. + public async void OnTooltipRender(TooltipEventArgs args) + { + Dictionary cellInfo; + + string returnValue = await JSRuntime.InvokeAsync("getTableCellNode", new object[] { "PivotView", args.Left, args.Top }); + if (returnValue != null) + { + // You can get the cell information for the row and column headers here to display in the tooltip. + cellInfo = JsonSerializer.Deserialize>(returnValue); + cellData = pivot.PivotValues[cellInfo["index"]]?[cellInfo["aria-colindex"]]; + } + } } ``` diff --git a/blazor/pivot-table/how-to/switching-older-themes-style.md b/blazor/pivot-table/how-to/switching-older-themes-style.md index 3cc49419cb..b20ae3ae7a 100644 --- a/blazor/pivot-table/how-to/switching-older-themes-style.md +++ b/blazor/pivot-table/how-to/switching-older-themes-style.md @@ -12,11 +12,11 @@ documentation: ug # Switching to older themes style in Blazor Pivot Table Component -From Volume 1, 2020 onwards Syncfusion® has revised the theming and layout of the Pivot Table. So, to inherit the older theme style and layout, do the necessary changes in CSS and pivot table height. +Since Volume 1, 2020, Syncfusion® has revised the theming and layout of the Pivot Table. If you prefer the appearance of the earlier theme, you can revert to it by making specific changes. This guide explains how to restore the older theme's style by modifying the CSS to adjust cell background colors and set the row height to match the previous layout. ## CSS Selectors -In current theme, the cells can be differentiated by their background colors. To avoid it, you need to override its background colors via simple CSS coding within your application. The below CSS selectors allow to achieve the same for material, fabric, bootstrap and bootstrap v4 themes. +In the current theme, cells are differentiated by their background colors. To avoid this, you need to override these background colors via simple CSS adjustments within your application. The following CSS selectors allow achieving the same for Material, Fabric, Bootstrap, and Bootstrap v4 themes: ```html @@ -30,10 +30,9 @@ In current theme, the cells can be differentiated by their background colors. To background-color:#fff !important; } - ``` -Meanwhile for high contrast theme, set the following CSS. +For the High Contrast theme, the following CSS is required: ```html @@ -47,12 +46,11 @@ Meanwhile for high contrast theme, set the following CSS. background-color:#000 !important; } - ``` ## Adjusting Row Height -In current theme, to make the component compact the height of each pivot table rows has been reduced. But user can reset the height of the pivot table using the [RowHeight](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewGridSettings.html#Syncfusion_Blazor_PivotView_PivotViewGridSettings_RowHeight) property in [PivotViewGridSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewGridSettings.html). In older theme, the property was set to 36 pixels for desktop layout and 48 pixels for mobile layout. So reset the [RowHeight](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewGridSettings.html#Syncfusion_Blazor_PivotView_PivotViewGridSettings_RowHeight) accordingly to visualize the older theme style. +In the current theme, the height of each Pivot Table row has been reduced to make the component more compact. Users can reset the height of the Pivot Table rows using the [RowHeight](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewGridSettings.html#Syncfusion_Blazor_PivotView_PivotViewGridSettings_RowHeight) property within [PivotViewGridSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewGridSettings.html). In the older theme, this property was typically set to 36 pixels for desktop layouts and 48 pixels for mobile layouts. To replicate the older theme style, reset the [RowHeight](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewGridSettings.html#Syncfusion_Blazor_PivotView_PivotViewGridSettings_RowHeight) accordingly. ```cshtml @using Syncfusion.Blazor.PivotView @@ -100,6 +98,6 @@ In current theme, to make the component compact the height of each pivot table r ``` -![Switching Older Themes to Blazor PivotTable](images/blazor-pivottable-with-old-theme.png) +![Switching Older Themes to Blazor Pivot Table](images/blazor-pivottable-with-old-theme.png) -N> You can refer to [Blazor Pivot Table](https://www.syncfusion.com/blazor-components/blazor-pivot-table) feature tour page for its groundbreaking feature representations. You can also explore [Blazor Pivot Table example](https://blazor.syncfusion.com/demos/pivot-table/default-functionalities?theme=bootstrap4) to know how to render and configure the pivot table. \ No newline at end of file +N> You can refer to [Blazor Pivot Table](https://www.syncfusion.com/blazor-components/blazor-pivot-table) feature tour page for its groundbreaking feature representations. You can also explore [Blazor Pivot Table example](https://blazor.syncfusion.com/demos/pivot-table/default-functionalities?theme=bootstrap4) to know how to render and configure the Pivot Table. \ No newline at end of file diff --git a/blazor/pivot-table/hyper-link.md b/blazor/pivot-table/hyper-link.md index a20e7572da..97c8e146e4 100644 --- a/blazor/pivot-table/hyper-link.md +++ b/blazor/pivot-table/hyper-link.md @@ -9,7 +9,20 @@ documentation: ug # Hyperlink in Blazor Pivot Table Component -The pivot table supports to show hyperlink option to link data for individual cells that are displayed in the component. Also, the hyperlink can be enabled separately for row headers, column headers, value cells, and summary cells using the [PivotViewHyperlinkSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewHyperlinkSettings.html) class. It can be configured through the code behind, during initial rendering and the settings available to show the hyperlink are: +The Pivot Table component provides built-in support for displaying hyperlinks within individual cells. This feature allows users to link data in specific cells, enhancing interactivity and navigation. + +Hyperlinks can be selectively enabled for various cell types, including: + +- Row headers +- Column headers +- Value cells +- Summary cells + +You can control hyperlink behavior using the [PivotViewHyperlinkSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewHyperlinkSettings.html) class, which can be defined during the initial rendering through the code-behind. + +## Available Hyperlink Settings + +The following properties are available in PivotViewHyperlinkSettings: * [ShowHyperlink](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewHyperlinkSettings.html#Syncfusion_Blazor_PivotView_PivotViewHyperlinkSettings_ShowHyperlink): It allows to set the visibility of hyperlink in all cells. * [ShowRowHeaderHyperlink](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewHyperlinkSettings.html#Syncfusion_Blazor_PivotView_PivotViewHyperlinkSettings_ShowRowHeaderHyperlink): It allows to set the visibility of hyperlink in row headers. @@ -20,34 +33,36 @@ The pivot table supports to show hyperlink option to link data for individual ce * [ConditionalSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewConditionalSetting.html): It allows to set the visibility of hyperlink based on specific condition. -N> By default, the hyperlink options are disabled for all cells in the pivot table. +N> By default, the hyperlink options are disabled for all cells in the Pivot Table. N> User defined style can be applied to hyperlink using [CssClass](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewHyperlinkSettings.html#Syncfusion_Blazor_PivotView_PivotViewHyperlinkSettings_CssClass) property in [PivotViewHyperlinkSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewHyperlinkSettings.html) class. ## Hyperlink for all cells -The pivot table has an option to show hyperlink option for all cells that are currently in display. To do so, user need to set [ShowHyperlink](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewHyperlinkSettings.html#Syncfusion_Blazor_PivotView_PivotViewHyperlinkSettings_ShowHyperlink) to **true**. +The Pivot Table provides an option to display hyperlinks across **all cells** currently visible in the table. To enable this functionality, set the [ShowHyperlink](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewHyperlinkSettings.html#Syncfusion_Blazor_PivotView_PivotViewHyperlinkSettings_ShowHyperlink) property to **true** within the [PivotViewHyperlinkSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewHyperlinkSettings.html). + +Once enabled, hyperlinks will be shown consistently in row headers, column headers, value cells, and summary cells. ```cshtml @using Syncfusion.Blazor.PivotView -     -             -             -         -         -             -             -         -         -             -         - + + + + + + + + + + + + -     + @@ -75,28 +90,28 @@ The pivot table has an option to show hyperlink option for all cells that are cu ## Hyperlink for row headers -The pivot table has an option to show hyperlink option for row header cells alone that are currently in display. To do so, user need to set [ShowRowHeaderHyperlink](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewHyperlinkSettings.html#Syncfusion_Blazor_PivotView_PivotViewHyperlinkSettings_ShowRowHeaderHyperlink) to **true**. +The Pivot Table provides a way to display hyperlinks specifically in **row header cells** that are currently visible. To enable this functionality, set the [ShowRowHeaderHyperlink](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewHyperlinkSettings.html#Syncfusion_Blazor_PivotView_PivotViewHyperlinkSettings_ShowRowHeaderHyperlink) property to **true** within the [PivotViewHyperlinkSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewHyperlinkSettings.html). This ensures that only the row headers will display hyperlinks, while other cell types remain unaffected. ```cshtml @using Syncfusion.Blazor.PivotView -     -             -             -         -         -             -             -         -         -             -         - + + + + + + + + + + + + -     + @@ -124,30 +139,30 @@ The pivot table has an option to show hyperlink option for row header cells alon ## Hyperlink for column headers -The pivot table has an option to show hyperlink option for column header cells alone that are currently in display. To do so, the user need to set [ShowColumnHeaderHyperlink](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewHyperlinkSettings.html#Syncfusion_Blazor_PivotView_PivotViewHyperlinkSettings_ShowColumnHeaderHyperlink) to **true**. +The Pivot Table provides an option to display hyperlinks specifically in column header cells that are currently visible. To enable this functionality, set the [ShowColumnHeaderHyperlink](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewHyperlinkSettings.html#Syncfusion_Blazor_PivotView_PivotViewHyperlinkSettings_ShowColumnHeaderHyperlink) property to **true** within the [PivotViewHyperlinkSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewHyperlinkSettings.html) class. This ensures that only the column headers will display hyperlinks, while other cell types remain unaffected. ```cshtml @using Syncfusion.Blazor.PivotView -     -             -             -         -         -             -             -         -         -             -         + + + + + + + + + + + -     - - + + + @code{ - public List data { get; set; } - protected override void OnInitialized() - { - this.data = ProductDetails.GetProductData().ToList(); - //Bind the data source collection here. Refer "Assigning sample data to the pivot table" section in getting started for more details. - } + public List data { get; set; } + protected override void OnInitialized() + { + this.data = ProductDetails.GetProductData().ToList(); + //Bind the data source collection here. Refer "Assigning sample data to the pivot table" section in getting started for more details. + } } ``` @@ -329,28 +346,30 @@ The pivot table has an option to show hyperlink in the cells based on specific c ## Header based hyperlink -The pivot table has an option to show hyperlink in the cells based on specific row or column header. It can be configured using the [HeaderText](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewHyperlinkSettings.html#Syncfusion_Blazor_PivotView_PivotViewHyperlinkSettings_HeaderText) option through code behind, during initial rendering. +The Pivot Table supports displaying hyperlinks in cells based on specific row or column headers. This functionality can be enabled using the [HeaderText](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewHyperlinkSettings.html#Syncfusion_Blazor_PivotView_PivotViewHyperlinkSettings_HeaderText) property, which is configured through code-behind during initial rendering. + +In the below code example, the value **FY 2015** is assigned to [HeaderText](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewHyperlinkSettings.html#Syncfusion_Blazor_PivotView_PivotViewHyperlinkSettings_HeaderText), which means the Pivot Table will show hyperlinks only in cells that match this specific header combination. ```cshtml @using Syncfusion.Blazor.PivotView -     -             -             -         -         -             -             -         -         -             -         - + + + + + + + + + + + + -     + @@ -378,75 +397,83 @@ The pivot table has an option to show hyperlink in the cells based on specific r ## Event -The event [HyperlinkCellClicked](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewEvents-1.html#Syncfusion_Blazor_PivotView_PivotViewEvents_1_HyperlinkCellClicked) fires on every hyperlink cell click. +The Pivot Table triggers the [`HyperlinkCellClicked`](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewEvents-1.html#Syncfusion_Blazor_PivotView_PivotViewEvents_1_HyperlinkCellClicked) event whenever a hyperlink cell is clicked. This event allows you to either customize the clicked cell or retrieve information about it. + +It provides two parameters: -It has following parameters - [Cancel](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.HyperCellClickEventArgs.html#Syncfusion_Blazor_PivotView_HyperCellClickEventArgs_Cancel) and [CurrentCell](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.HyperCellClickEventArgs.html#Syncfusion_Blazor_PivotView_HyperCellClickEventArgs_CurrentCell). The parameter [CurrentCell](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.HyperCellClickEventArgs.html#Syncfusion_Blazor_PivotView_HyperCellClickEventArgs_CurrentCell) is used to customize the host cell element by any means. Meanwhile, when the parameter [Cancel](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.HyperCellClickEventArgs.html#Syncfusion_Blazor_PivotView_HyperCellClickEventArgs_Cancel) is set to **true**, applied customization will not be updated to the host cell element. +* [`CurrentCell`](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.HyperCellClickEventArgs.html#Syncfusion_Blazor_PivotView_HyperCellClickEventArgs_CurrentCell): Refers to the clicked cell element, which can be modified as needed. +* [`Cancel`](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.HyperCellClickEventArgs.html#Syncfusion_Blazor_PivotView_HyperCellClickEventArgs_Cancel): If set to **true**, prevents any changes from being applied to the cell. +* [`Data`](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.HyperCellClickEventArgs.html#Syncfusion_Blazor_PivotView_HyperCellClickEventArgs_Data): Contains detailed information about the clicked cell, including its value, row and column headers, position, and whether it’s a summary cell. +* [`NativeEvent`](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.HyperCellClickEventArgs.html#Syncfusion_Blazor_PivotView_HyperCellClickEventArgs_NativeEvent): Represents the original browser event triggered by the click, useful for advanced event handling. + +In the example below, when a hyperlink cell is clicked, the cell is checked to determine if it is a row header. If it is a row header (e.g., 'France'), the user is redirected to the corresponding Wikipedia page (e.g., 'https://en.wikipedia.org/wiki/France'). If the clicked cell is a column header, value cell, or summary cell, the user is redirected to 'https://syncfusion.com/'. The [`Cancel`](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.HyperCellClickEventArgs.html#Syncfusion_Blazor_PivotView_HyperCellClickEventArgs_Cancel) property is set to **false** to enable this interaction. ```cshtml @using Syncfusion.Blazor.PivotView @inject IJSRuntime JSRuntime - -     -             -             -         -         -             -             -         -         -             -         -     - - - + + + + + + + + + + + + + + + + -@code{ - public List data { get; set; } - protected override void OnInitialized() - { - this.data = ProductDetails.GetProductData().ToList(); - //Bind the data source collection here. Refer "Assigning sample data to the pivot table" section in getting started for more details. - } - public async Task OnHyperLinkClick(HyperCellClickEventArgs args) - { - int row= (args.Data as AxisSet).RowIndex; - int col= (args.Data as AxisSet).ColIndex; - string baseUrl = "https://en.wikipedia.org/wiki/"; - await JSRuntime.InvokeVoidAsync("navigateFromPivotCellCoordinates", row, col, baseUrl); - } +@code { + public List data { get; set; } + protected override void OnInitialized() + { + this.data = ProductDetails.GetProductData().ToList(); + //Bind the data source collection here. Refer "Assigning sample data to the pivot table" section in getting started for more details. + } + public async Task OnHyperLinkClick(HyperCellClickEventArgs args) + { + int row = (args.Data as AxisSet).RowIndex; + int col = (args.Data as AxisSet).ColIndex; + string baseUrl = "https://en.wikipedia.org/wiki/"; + await JSRuntime.InvokeVoidAsync("navigateFromPivotCellCoordinates", row, col, baseUrl); + } } ``` diff --git a/blazor/pivot-table/images/blazor-pivottable-show-sub-total-using-toolbar.png b/blazor/pivot-table/images/blazor-pivottable-show-sub-total-using-toolbar.png index af6968f3ed2131aa178a77858689cef53516c178..24e807b625f5c509534c2c1ea6ef047c6fa096ce 100644 GIT binary patch literal 46902 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
    a+4?a0`W7`06%;;sH~ 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 literal 37478 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

    k|?n4_-0x}WD?B7TM1YSoCX5orG_kX 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�Vy)x@~We{%?+enX{~<)Xpd6 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∋1m$Xpy*oGpW08dbWhX`xAMfj3vr!t4fj3wEH7U> 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

    i19}gBQ~E)9 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%0DnrPGd3T+1B~J2Uhs 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 z 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 Vf}Gg;sjtA7l$g9|xv-)4{{hEfU5fw! literal 0 HcmV?d00001 diff --git a/blazor/pivot-table/images/postgresql_data.png b/blazor/pivot-table/images/postgresql_data.png new file mode 100644 index 0000000000000000000000000000000000000000..fea9e9ec8890b7009e6542cad2eebc3519a2d536 GIT binary patch literal 15947 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]%+WLP?_cy>Lat!|u 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 If no format is specified it takes number as default format type. +### Essential formatting properties -Other properties include: +* [Name](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewFormatSetting.html#Syncfusion_Blazor_PivotView_PivotViewFormatSetting_Name): Specifies the field name to which the formatting should be applied. +* [Format](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewFormatSetting.html#Syncfusion_Blazor_PivotView_PivotViewFormatSetting_Format): Defines the format pattern for the respective field. -* [UseGrouping](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewFormatSetting.html#Syncfusion_Blazor_PivotView_PivotViewFormatSetting_UseGrouping): It allows to enable or disable the separator, for example, $100,000,000 or $100000000 respectively. By default, it will be set as **true**. -* [Currency](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewFormatSetting.html#Syncfusion_Blazor_PivotView_PivotViewFormatSetting_Currency): It allows to set the currency code which needs to be considered for the currency formatting. +### Format type codes + +Use these standard format codes to specify the formatting type: + +1. **N** - Numeric formatting (e.g., 1,234.56) +2. **C** - Currency formatting (e.g., $1,234.56) +3. **P** - Percentage formatting (e.g., 12.34%) + +N> When no format is specified, the component applies numeric formatting as the default. + +### Additional formatting options + +* [UseGrouping](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewFormatSetting.html#Syncfusion_Blazor_PivotView_PivotViewFormatSetting_UseGrouping): Controls the display of grouping separators. When set to **true** (default), displays values like $100,000,000; when **false**, displays as $100000000. +* [Currency](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewFormatSetting.html#Syncfusion_Blazor_PivotView_PivotViewFormatSetting_Currency): Specifies the currency code to be considered for currency formatting (e.g., USD, EUR, GBP). ```cshtml @using Syncfusion.Blazor.PivotView @@ -74,7 +84,7 @@ You can also format the values at runtime using the formatting dialog. This opti ## Custom format -You can add any custom format directly to the [Format](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewFormatSetting.html#Syncfusion_Blazor_PivotView_PivotViewFormatSetting_Format) property in the [FormatSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html#Syncfusion_Blazor_PivotView_PivotViewDataSourceSettings_1_FormatSettings). Custom format can be achieved by using one or more format specifiers listed in the following table. +Custom format lets you display numbers in your preferred pattern by setting the [Format](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewFormatSetting.html#Syncfusion_Blazor_PivotView_PivotViewFormatSetting_Format) property within the [FormatSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html#Syncfusion_Blazor_PivotView_PivotViewDataSourceSettings_1_FormatSettings). You can use one or more format specifiers (shown in the table below) to control how values appear in the Pivot Table. | Specifier | Description | Input | Format Output | | ------- |--------------- | ---------------- | --------------- | @@ -86,7 +96,7 @@ You can add any custom format directly to the [Format](https://help.syncfusion.c | ; | Denotes separate formats for positive, negative and zero values. | { format: '###.##;(###.00);-0' } | '(120.00)' | | 'String' (single Quotes) | Denotes the characters that are enclosed in the single quote (') to be replaced in the resulting string. | { format: "####.00 '@'" } | "123.00 @" | -N> If custom format is defined, certain properties such as [UseGrouping](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewFormatSetting.html#Syncfusion_Blazor_PivotView_PivotViewFormatSetting_UseGrouping) and [Currency](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewFormatSetting.html#Syncfusion_Blazor_PivotView_PivotViewFormatSetting_Currency) will not be considered. +N> When you define a custom format, certain properties such as [UseGrouping](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewFormatSetting.html#Syncfusion_Blazor_PivotView_PivotViewFormatSetting_UseGrouping) and [Currency](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewFormatSetting.html#Syncfusion_Blazor_PivotView_PivotViewFormatSetting_Currency) in the format settings will be ignored. ```cshtml @using Syncfusion.Blazor.PivotView @@ -127,7 +137,7 @@ N> If custom format is defined, certain properties such as [UseGrouping](https:/ ## Toolbar -You can enable formatting dialog option in the toolbar by adding `NumberFormatting` in the [Toolbar](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SfPivotView-1.html#Syncfusion_Blazor_PivotView_SfPivotView_1_Toolbar). After that, you can see the option to invoke the formatting dialog in the toolbar. +Number formatting can be applied instantly at runtime through the built-in dialog, accessible from the toolbar. To enable this, set both the [AllowNumberFormatting](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SfPivotView-1.html#Syncfusion_Blazor_PivotView_SfPivotView_1_AllowNumberFormatting) and [ShowToolbar](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SfPivotView-1.html#Syncfusion_Blazor_PivotView_SfPivotView_1_ShowToolbar) properties to **true**, and include the **NumberFormatting** option in the [Toolbar](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SfPivotView-1.html#Syncfusion_Blazor_PivotView_SfPivotView_1_Toolbar) property. The toolbar will then automatically display the "Number Formatting" icon. Clicking this icon opens the dialog, allowing you to specify number formats for value fields directly within the Pivot Table. ```cshtml @using Syncfusion.Blazor.PivotView diff --git a/blazor/pivot-table/paging.md b/blazor/pivot-table/paging.md index 2e1f67a2f3..03de65cb94 100644 --- a/blazor/pivot-table/paging.md +++ b/blazor/pivot-table/paging.md @@ -11,7 +11,9 @@ documentation: ug N> This feature is applicable only for relational data source. -Paging allows you to load large amounts of data that can be divided and displayed page by page in the pivot table. It can be enabled by setting the [EnablePaging](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SfPivotView-1.html#Syncfusion_Blazor_PivotView_SfPivotView_1_EnablePaging) property in [SfPivotView](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SfPivotView-1.html) class to **true**. It can be configured at code-behind by using the [PivotViewPageSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewPageSettings.html) property, during initial rendering of the component. The properties required are: +The paging feature in the Pivot Table component is designed to handle large datasets efficiently by dividing the data into manageable pages. This prevents performance issues associated with rendering large amounts of data at once, allowing users to navigate through rows and columns page by page. + +To enable paging, set the [EnablePaging](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SfPivotView-1.html#Syncfusion_Blazor_PivotView_SfPivotView_1_EnablePaging) property to **true**. Paging can be configured in the code-behind during the initial rendering of the component using the [PivotViewPageSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewPageSettings.html) property. This allows you to define the initial page setup for rows and columns. The key properties within [PivotViewPageSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewPageSettings.html) include: * [CurrentRowPage](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewPageSettings.html#Syncfusion_Blazor_PivotView_PivotViewPageSettings_CurrentRowPage): Allows user to set the current row page number to be displayed in the pivot table. * [CurrentColumnPage](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewPageSettings.html#Syncfusion_Blazor_PivotView_PivotViewPageSettings_CurrentColumnPage): Allows user to set the current column page number to be displayed in the pivot table. @@ -20,7 +22,7 @@ Paging allows you to load large amounts of data that can be divided and displaye ## Pager UI -When paging is enabled, a built-in pager UI appears at the bottom of the pivot table, allowing you to change the current page in the row and column axes by navigating to a desired page using the navigation buttons or an input text box, as well as change the page size via dropdown at runtime. +When paging is enabled, a built-in pager UI appears at the bottom of the Pivot Table by default. This user-friendly interface enables seamless navigation across row and column axis pages using navigation buttons or an input box, and allows dynamic page size adjustments via dropdown menus. You can also change the position, visibility, compact view, and template of the row and column pagers by using the [PivotViewPagerSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewPagerSettings.html). @@ -67,9 +69,9 @@ You can also change the position, visibility, compact view, and template of the ### Show pager UI at top or bottom -You can display the pager UI at top or bottom of the pivot table by using the [Position](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewPagerSettings.html#Syncfusion_Blazor_PivotView_PivotViewPagerSettings_Position) property. To show the pager UI at top of the pivot table, set the [Position](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewPagerSettings.html#Syncfusion_Blazor_PivotView_PivotViewPagerSettings_Position) property in [PivotViewPagerSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewPagerSettings.html) to [PagerPosition.Top](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PagerPosition.html#Syncfusion_Blazor_PivotView_PagerPosition_Top). +The Pivot Table component allows you to configure the placement of the pager UI to match your layout preferences. You can display the pager UI either at the top or bottom of the pivot table by setting the [Position](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewPagerSettings.html#Syncfusion_Blazor_PivotView_PivotViewPagerSettings_Position) property within the [PivotViewPagerSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewPagerSettings.html) configuration. By default, the pager UI appears at the bottom, but setting the position property to **Top** places it above the pivot table. This can be ideal for layouts where navigation controls are preferred at the top for better visibility or alignment with other UI elements. -N> By default, the pager UI appears at the bottom of the pivot table. +The following code demonstrates how to configure the pager UI to appear at the top of the pivot table: ```cshtml @using Syncfusion.Blazor.PivotView @@ -114,9 +116,7 @@ N> By default, the pager UI appears at the bottom of the pivot table. ### Inverse pager -Toggles and displays row and column pager. To show the column pager on the left side of the pager UI, set the [IsInversed](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewPagerSettings.html#Syncfusion_Blazor_PivotView_PivotViewPagerSettings_IsInversed) property in [PivotViewPagerSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewPagerSettings.html) to **true**. - -N> By default, the row pager is displayed on the left side of the pager UI, while the column pager is displayed on the right side. +The Pivot Table allows you to toggle the positions of the row and column pagers in the pager UI. By default, the row pager appears on the left side of the pager UI, and the column pager appears on the right. To swap these positions—displaying the column pager on the left and the row pager on the right—set the [IsInversed](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewPagerSettings.html#Syncfusion_Blazor_PivotView_PivotViewPagerSettings_IsInversed) property to **true** within the [PivotViewPagerSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewPagerSettings.html) configuration. ```cshtml @using Syncfusion.Blazor.PivotView @@ -161,7 +161,7 @@ N> By default, the row pager is displayed on the left side of the pager UI, whil ### Compact view -By hiding all except the previous and next navigation buttons, the pager UI can be displayed with the absolute minimum of paging options. The compact view can be enabled by setting the [EnableCompactView](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewPagerSettings.html#Syncfusion_Blazor_PivotView_PivotViewPagerSettings_EnableCompactView) property in [PivotViewPagerSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewPagerSettings.html) to **true**. +The Pivot Table provides a compact view for the pager UI, displaying only the previous and next navigation buttons to minimize the interface. To enable the compact view, set the [EnableCompactView](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewPagerSettings.html#Syncfusion_Blazor_PivotView_PivotViewPagerSettings_EnableCompactView) property to **true** within the [PivotViewPagerSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewPagerSettings.html) configuration. This streamlined layout focuses on essential navigation controls, ideal for layouts requiring a simplified paging experience. ```cshtml @using Syncfusion.Blazor.PivotView @@ -206,9 +206,9 @@ By hiding all except the previous and next navigation buttons, the pager UI can ### Show or hide paging option -By using the [ShowRowPager](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewPagerSettings.html#Syncfusion_Blazor_PivotView_PivotViewPagerSettings_ShowRowPager) and [ShowColumnPager](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewPagerSettings.html#Syncfusion_Blazor_PivotView_PivotViewPagerSettings_ShowColumnPager) properties in [PivotViewPagerSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewPagerSettings.html), you can show or hide row and column pager separately in the pager UI. +The Pivot Table allows you to control the visibility of the row and column pagers in the pager UI using the [ShowRowPager](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewPagerSettings.html#Syncfusion_Blazor_PivotView_PivotViewPagerSettings_ShowRowPager) and [ShowColumnPager](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewPagerSettings.html#Syncfusion_Blazor_PivotView_PivotViewPagerSettings_ShowColumnPager) properties within the [PivotViewPagerSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewPagerSettings.html) configuration. By default, both row and column pagers are visible in the pager UI. To hide either the row pager or the column pager, set the corresponding property to **false**. This allows you to display only the necessary navigation controls based on your layout requirements. -In the following example, row pager has been disabled by setting the [ShowRowPager](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewPagerSettings.html#Syncfusion_Blazor_PivotView_PivotViewPagerSettings_ShowRowPager) property in [PivotViewPagerSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewPagerSettings.html) to **false**. +The following code demonstrates how to hide the row pager by setting the [ShowRowPager](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewPagerSettings.html#Syncfusion_Blazor_PivotView_PivotViewPagerSettings_ShowRowPager) property to **false**: ```cshtml @using Syncfusion.Blazor.PivotView @@ -253,7 +253,7 @@ In the following example, row pager has been disabled by setting the [ShowRowPag ### Show or hide page size -By using the [ShowRowPageSize](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewPagerSettings.html#Syncfusion_Blazor_PivotView_PivotViewPagerSettings_ShowRowPageSize) and [ShowColumnPageSize](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewPagerSettings.html#Syncfusion_Blazor_PivotView_PivotViewPagerSettings_ShowColumnPageSize) properties in [PivotViewPagerSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewPagerSettings.html), you can show or hide "Rows per page" and "Columns per page" dropdown menu. The dropdown menu contains a list of pre-defined or user-defined page sizes, which will be displayed in the "Rows per page" and "Columns per page" dropdowns, allowing you to change the page size for the row and column axes at runtime. +The Pivot Table allows you to control the visibility of the "Rows per page" and "Columns per page" dropdowns in the pager UI using the [ShowRowPageSize](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewPagerSettings.html#Syncfusion_Blazor_PivotView_PivotViewPagerSettings_ShowRowPageSize) and [ShowColumnPageSize](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewPagerSettings.html#Syncfusion_Blazor_PivotView_PivotViewPagerSettings_ShowColumnPageSize) properties within the [PivotViewPagerSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewPagerSettings.html) configuration. These dropdowns display a list of predefined or user-defined page sizes, enabling you to adjust the number of rows or columns displayed per page at runtime. By default, both dropdowns are visible in the pager UI. To hide either the "Rows per page" or "Columns per page" dropdown, set the corresponding property to **false**. ```cshtml @using Syncfusion.Blazor.PivotView @@ -298,11 +298,9 @@ By using the [ShowRowPageSize](https://help.syncfusion.com/cr/blazor/Syncfusion. ### Customize page size -By using the [RowPageSizes](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewPagerSettings.html#Syncfusion_Blazor_PivotView_PivotViewPagerSettings_RowPageSizes) and [ColumnPageSizes](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewPagerSettings.html#Syncfusion_Blazor_PivotView_PivotViewPagerSettings_ColumnPageSizes) properties in [PivotViewPagerSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewPagerSettings.html), you can specify a set of desired page sizes, which will be displayed in the "Rows per page" and "Columns per page" dropdowns, allowing you to change the page size for the row and column axes at runtime. +The Pivot Table allows you to specify a list of page sizes for the "Rows per page" and "Columns per page" dropdowns in the pager UI using the [RowPageSizes](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewPagerSettings.html#Syncfusion_Blazor_PivotView_PivotViewPagerSettings_RowPageSizes) and [ColumnPageSizes](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewPagerSettings.html#Syncfusion_Blazor_PivotView_PivotViewPagerSettings_ColumnPageSizes) properties within the [PivotViewPagerSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewPagerSettings.html) configuration. By default, the "Rows per page" dropdown includes page sizes of 10, 50, 100, and 200, while the "Columns per page" dropdown includes page sizes of 5, 10, 20, 50, and 100. To define a different set of page sizes, assign an array of numbers to the [RowPageSizes](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewPagerSettings.html#Syncfusion_Blazor_PivotView_PivotViewPagerSettings_RowPageSizes) or [ColumnPageSizes](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewPagerSettings.html#Syncfusion_Blazor_PivotView_PivotViewPagerSettings_ColumnPageSizes) properties. -N> By default, the "Rows per page" dropdown have pre-defined page sizes of **10, 50, 100, and 200**, while the "Columns per page" dropdown have pre-defined page sizes of **5, 10, 20, 50, and 100**. - -In the following example, the "Rows per page" dropdown is set with user-defined page sizes of **10, 20, 30, 40, and 50** and the "Columns per page" dropdown is set with user-defined page sizes of **5, 10, 15, 20, and 30**. +The following example sets the "Rows per page" dropdown with page sizes of 10, 20, 30, 40, and 50, and the "Columns per page" dropdown with page sizes of 5, 10, 15, 20, and 30: ```cshtml @using Syncfusion.Blazor.PivotView @@ -347,7 +345,9 @@ In the following example, the "Rows per page" dropdown is set with user-defined ### Template -The [Template](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewPagerSettings.html#Syncfusion_Blazor_PivotView_PivotViewPagerSettings_Template) property allows to change the appearance of the pager UI by displaying user-defined HTML elements instead of built-in HTML elements. +The Pivot Table allows you to define a custom layout for the pager UI using the [Template](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewPagerSettings.html#Syncfusion_Blazor_PivotView_PivotViewPagerSettings_Template) property within the [PivotViewPagerSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewPagerSettings.html) configuration. By default, the pager UI displays built-in navigation controls. To replace these with custom HTML elements, define the custom elements within the [Template](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewPagerSettings.html#Syncfusion_Blazor_PivotView_PivotViewPagerSettings_Template) property in the Razor page. This enables you to create a unique pager interface that aligns with your application’s design requirements. + +This following example shows how to create a custom template for both row and column pagers directly within the Razor page. The Syncfusion [Pager](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Navigations.SfPager.html) control is used within the [Template](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewPagerSettings.html#Syncfusion_Blazor_PivotView_PivotViewPagerSettings_Template) property to define the custom layout. You can configure the pager by setting properties like [PageSize](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Navigations.SfPager.html#Syncfusion_Blazor_Navigations_SfPager_PageSize), [TotalItemsCount](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Navigations.SfPager.html#Syncfusion_Blazor_Navigations_SfPager_TotalItemsCount), and [CurrentPage](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Navigations.SfPager.html#Syncfusion_Blazor_Navigations_SfPager_CurrentPage). When you click on a custom row or column pager, the [CurrentRowPage](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewPageSettings.html#Syncfusion_Blazor_PivotView_PivotViewPageSettings_CurrentRowPage) and [CurrentColumnPage](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewPageSettings.html#Syncfusion_Blazor_PivotView_PivotViewPageSettings_CurrentColumnPage) properties in [PivotViewPageSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewPageSettings.html) are updated, enabling navigation with the custom pager. ```cshtml @using Syncfusion.Blazor.PivotView diff --git a/blazor/pivot-table/pdf-export.md b/blazor/pivot-table/pdf-export.md index a13aa412df..555ac29aa5 100644 --- a/blazor/pivot-table/pdf-export.md +++ b/blazor/pivot-table/pdf-export.md @@ -9,9 +9,11 @@ documentation: ug # PDF Export in Blazor Pivot Table Component -The PDF export allows Pivot Table data to be exported as PDF document. To enable PDF export in the pivot table, set the [AllowPdfExport](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SfPivotView-1.html#Syncfusion_Blazor_PivotView_SfPivotView_1_AllowPdfExport) in [SfPivotView](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SfPivotView-1.html) as **true**. Once the API is set, the user needs to call the [ExportToPdfAsync](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SfPivotView-1.html#Syncfusion_Blazor_PivotView_SfPivotView_1_ExportToPdfAsync_Syncfusion_Blazor_Grids_PdfExportProperties_) method for exporting, on external button click. +The PDF export allows users to easily export their Pivot Table data as a PDF document. To enable PDF export in the Pivot Table, set the [AllowPdfExport](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SfPivotView-1.html#Syncfusion_Blazor_PivotView_SfPivotView_1_AllowPdfExport) property to **true** in the [SfPivotView](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SfPivotView-1.html) configuration. Once enabled, you can use the [ExportToPdfAsync](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SfPivotView-1.html#Syncfusion_Blazor_PivotView_SfPivotView_1_ExportToPdfAsync_Syncfusion_Blazor_Grids_PdfExportProperties_) method to generate and download the PDF file. -N> The pivot table component can be exported to PDF format using options available in the toolbar. For more details [refer](./tool-bar) here. +In the following example, an external button is used to start the PDF export process. When the user clicks the button, the [ExportToPdfAsync](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SfPivotView-1.html#Syncfusion_Blazor_PivotView_SfPivotView_1_ExportToPdfAsync_Syncfusion_Blazor_Grids_PdfExportProperties_) method is called so that the Pivot Table data can be saved as a PDF file. + +N> The Pivot Table component can be exported to PDF format using options available in the toolbar. For more details [refer](./tool-bar) here. ```cshtml @using Syncfusion.Blazor.PivotView @@ -57,7 +59,7 @@ N> The pivot table component can be exported to PDF format using options availab ## Export table and chart into the same document -When the [View](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDisplayOption.html#Syncfusion_Blazor_PivotView_PivotViewDisplayOption_View) property is set to [View.Both](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.View.html#Syncfusion_Blazor_PivotView_View_Both) within the [PivotViewDisplayOption](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDisplayOption.html) tag, you can export both the table and the chart into the same PDF document. To achieve this, use the [ExportToPdfAsync](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SfPivotView-1.html#Syncfusion_Blazor_PivotView_SfPivotView_1_ExportToPdfAsync_Syncfusion_Blazor_Grids_PdfExportProperties_System_Nullable_System_Boolean__) method and set the **exportTableAndChart** parameter to **true**. +If you want to export both the table and the chart from the Pivot Table into a single PDF file, set the [View](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDisplayOption.html#Syncfusion_Blazor_PivotView_PivotViewDisplayOption_View) property to [View.Both](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.View.html#Syncfusion_Blazor_PivotView_View_Both) within the [PivotViewDisplayOption](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDisplayOption.html) tag. Then, when you use the [ExportToPdfAsync](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SfPivotView-1.html#Syncfusion_Blazor_PivotView_SfPivotView_1_ExportToPdfAsync_Syncfusion_Blazor_Grids_PdfExportProperties_System_Nullable_System_Boolean__) method, make sure to set the **exportTableAndChart** parameter to **true**. This will include both the data table and its chart in one PDF document when you export. N> This support is applicable only when the virtual scrolling is enabled. @@ -111,22 +113,29 @@ N> This support is applicable only when the virtual scrolling is enabled. } ``` +Additionally, we recommend configuring the maximum incoming SignalR message size in your **Program.cs** file, as shown in the code snippet below. This configuration helps ensure smooth handling of large data operations, especially when exporting data from the Pivot Table component. + +```csharp +builder.Services.AddServerSideBlazor().AddHubOptions(options => { options.MaximumReceiveMessageSize = 1024 * 128; }); +``` + ## To add header and footer while exporting -You can customize text, page number, line, page size and changing orientation in header and footer of the exported document. +When exporting data from the Pivot Table to a PDF document, you can include additional information in the header or footer. You can add text, lines, page numbers, or images to ensure your exported document includes important details, such as your organization's name or branding, and to improve readability. + +To do this, you can use the [Header](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.PdfHeader.html) or [Footer](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.PdfFooter.html) options in the [PdfExportProperties](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.PdfExportProperties.html). These options allow you to specify what content to display at the top or bottom of each PDF page when exporting. ### To add a text in header/footer -You can add text either in header or footer of the exported PDF document like in the below code example. +You can include custom text in the header or footer of the exported PDF document. Set the [Type](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.PdfHeaderFooterElement.html#Syncfusion_Blazor_Grids_PdfHeaderFooterElement_Type) property to **Text** in the contents array to add text. The following example shows how to add the text "Northwind Traders" to the header: ```cshtml @code { private List headerContent = new List { new PdfHeaderFooterContent() { - // Here you can set the content type, value, and other properties for customizing the header or footer of the exported PDF document. Type = ContentType.Text, - Value = "Pivot Table", + Value = "Northwind Traders", Position = new PdfPosition() { X = 0, Y = 50 }, Style = new PdfContentStyle() { TextBrushColor = "#000000", FontSize = 13 } } @@ -148,10 +157,9 @@ You can add text either in header or footer of the exported PDF document like in ### To draw a line in header/footer -You can add line either in header or footer of the exported PDF document like in the below code example. - -Supported line styles are, +You can draw lines in the header or footer to create visual separators or decorative elements. Set the [Type](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.PdfHeaderFooterElement.html#Syncfusion_Blazor_Grids_PdfHeaderFooterElement_Type) property to **Line** in the contents array to add line elements. The line can be styled with different dash patterns and colors. +**Supported line styles:** * Dash * Dot * DashDot @@ -186,15 +194,14 @@ Supported line styles are, ### Add page number in header/footer -You can add page number either in header or footer of the exported PDF document like in the below code example. +You can display page numbers in the header or footer using various numbering formats. Set the [Type](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.PdfHeaderFooterElement.html#Syncfusion_Blazor_Grids_PdfHeaderFooterElement_Type) property to **PageNumber** in the contents array to add page number elements. This helps users navigate through multi-page PDF documents easily. -Supported page number types are, - -* LowerLatin - a, b, c, -* UpperLatin - A, B, C, -* LowerRoman - i, ii, iii, -* UpperRoman - I, II, III, -* Number - 1,2,3. +**Supported page number types:** +* LowerLatin - a, b, c +* UpperLatin - A, B, C +* LowerRoman - i, ii, iii +* UpperRoman - I, II, III +* Arabic - 1, 2, 3 ```cshtml @code { @@ -225,7 +232,7 @@ Supported page number types are, ### Add an image in header/footer -You can add image (Base64 string) either in header or footer of the exported PDF document like in the below code example. +You can include images in the header or footer by providing a Base64 encoded string. Set the [Type](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.PdfHeaderFooterElement.html#Syncfusion_Blazor_Grids_PdfHeaderFooterElement_Type) property to **Image** in the contents array to add image elements. This allows you to add logos, watermarks, or other visual elements to your PDF documents. ```cshtml @code { @@ -297,7 +304,7 @@ The below code illustrates the PDF export customization options. { new PdfHeaderFooterContent() { Type = ContentType.Text, - Value = "Pivot Table", + Value = "Northwind Traders", Position = new PdfPosition() { X = 0, Y = 50 }, Style = new PdfContentStyle() { TextBrushColor = "#000000", FontSize = 13 } } @@ -335,9 +342,9 @@ The below code illustrates the PDF export customization options. ## Changing the pivot table style while exporting -The PDF export provides an option to change colors for headers, caption and records in the pivot table before exporting. In-order to apply colors, define **theme** settings in **pdfExportProperties** object and pass it as a parameter to the [ExportToPdfAsync](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SfPivotView-1.html#Syncfusion_Blazor_PivotView_SfPivotView_1_ExportToPdfAsync_Syncfusion_Blazor_Grids_PdfExportProperties_) method. +When you export the Pivot Table as a PDF document, you can change the colors used for headers, captions, and records. To do this, use the [Theme](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.PdfTheme.html) property inside the [PdfExportProperties](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.PdfExportProperties.html) class. Pass this object to the [ExportToPdfAsync](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SfPivotView-1.html#Syncfusion_Blazor_PivotView_SfPivotView_1_ExportToPdfAsync_Syncfusion_Blazor_Grids_PdfExportProperties_) method. This allows you to adjust how the Pivot Table looks in the exported PDF. -N> By default, material theme will be applied to the pivot table during PDF exporting. +N> By default, the Material theme is applied to the exported PDF document. ```cshtml @using Syncfusion.Blazor.PivotView @@ -409,7 +416,7 @@ N> By default, material theme will be applied to the pivot table during PDF expo ## Changing the file name while exporting -The PDF export provides an option to change the file name of the document before exporting. In-order to change the file name, define **fileName** property in **pdfExportProperties** object and pass it as a parameter to the [ExportToPdfAsync](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SfPivotView-1.html#Syncfusion_Blazor_PivotView_SfPivotView_1_ExportToPdfAsync_Syncfusion_Blazor_Grids_PdfExportProperties_) method. +The PDF export provides an option to change the file name of the document before exporting. To change the file name, define the [FileName](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.PdfExportPropertiesBase.html#Syncfusion_Blazor_Grids_PdfExportPropertiesBase_FileName) property in the [PdfExportProperties](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.PdfExportProperties.html) class and pass it as a parameter to the [ExportToPdfAsync](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SfPivotView-1.html#Syncfusion_Blazor_PivotView_SfPivotView_1_ExportToPdfAsync_Syncfusion_Blazor_Grids_PdfExportProperties_) method. ```cshtml @using Syncfusion.Blazor.PivotView @@ -417,38 +424,38 @@ The PDF export provides an option to change the file name of the document before - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + @code { - SfPivotView pivot; - public List data { get; set; } - protected override void OnInitialized() - { - this.data = ProductDetails.GetProductData().ToList(); - //Bind your dataSource collection here, refer the getting started section. for more information. - } - public void OnPdfExport(Microsoft.AspNetCore.Components.Web.MouseEventArgs args) - { - Syncfusion.Blazor.Grids.PdfExportProperties pdfExportProperties = new Syncfusion.Blazor.Grids.PdfExportProperties() { FileName = "sample.pdf" }; - this.pivot.ExportToPdfAsync(pdfExportProperties); - } + SfPivotView pivot; + public List data { get; set; } + protected override void OnInitialized() + { + this.data = ProductDetails.GetProductData().ToList(); + //Bind your dataSource collection here, refer the getting started section for more information. + } + public void OnPdfExport(Microsoft.AspNetCore.Components.Web.MouseEventArgs args) + { + Syncfusion.Blazor.Grids.PdfExportProperties pdfExportProperties = new Syncfusion.Blazor.Grids.PdfExportProperties() { FileName = "sample.pdf" }; + this.pivot.ExportToPdfAsync(pdfExportProperties); + } } ``` @@ -456,9 +463,11 @@ The PDF export provides an option to change the file name of the document before ## Changing page size while exporting -The PDF export provides an option to change page size of the document before exporting. In-order to change the page size, define **pageSize** property in **pdfExportProperties** object and pass it as a parameter to the [ExportToPdfAsync](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SfPivotView-1.html#Syncfusion_Blazor_PivotView_SfPivotView_1_ExportToPdfAsync_Syncfusion_Blazor_Grids_PdfExportProperties_) method. +When exporting Pivot Table data to PDF, users can select a specific page size for the PDF document. To set the page size, define the [PageSize](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.PdfExportPropertiesBase.html#Syncfusion_Blazor_Grids_PdfExportPropertiesBase_PageSize) property within the [PdfExportProperties](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.PdfExportProperties.html) class, and pass this object as a parameter to the [ExportToPdfAsync](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SfPivotView-1.html#Syncfusion_Blazor_PivotView_SfPivotView_1_ExportToPdfAsync_Syncfusion_Blazor_Grids_PdfExportProperties_) method. -**Supported page sizes are:** Letter, Note, Legal, A0, A1, A2, A3, A5, A6, A7, A8, A9, B0, B1, B2, B3, B4, B5, Archa, Archb, Archc, Archd, Arche, Flsa, HalfLetter, Letter11x17, Ledger. +You can choose from various page sizes, such as Letter, Note, Legal, A0, A1, A2, A3, A5, A6, A7, A8, A9, B0, B1, B2, B3, B4, B5, Archa, Archb, Archc, Archd, Arche, Flsa, HalfLetter, Letter11x17, and Ledger. + +This option lets users easily adjust the PDF layout to fit their specific needs before exporting the data from the Pivot Table. ```cshtml @using Syncfusion.Blazor.PivotView @@ -505,7 +514,7 @@ The PDF export provides an option to change page size of the document before exp ## Changing page orientation while exporting -The PDF export provides an option to change page orientation of the document before exporting. In-order to change the page orientation, define **pageOrientation** property in **pdfExportProperties** object and pass it as a parameter to the [ExportToPdfAsync](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SfPivotView-1.html#Syncfusion_Blazor_PivotView_SfPivotView_1_ExportToPdfAsync_Syncfusion_Blazor_Grids_PdfExportProperties_) method. By default, the page orientation will be in **Portrait** and it can be changed to **Landscape** based on the user requirement. +When exporting the Pivot Table as a PDF, users can choose the page orientation of the document. By default, the PDF is exported in **Portrait** orientation. If you want to change the orientation to **Landscape**, set the [PageOrientation](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.PdfExportPropertiesBase.html#Syncfusion_Blazor_Grids_PdfExportPropertiesBase_PageOrientation) property in the [PdfExportProperties](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.PdfExportProperties.html) class. Then, pass this object as a parameter to the [ExportToPdfAsync](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SfPivotView-1.html#Syncfusion_Blazor_PivotView_SfPivotView_1_ExportToPdfAsync_Syncfusion_Blazor_Grids_PdfExportProperties_) method. This lets you select either Portrait or Landscape orientation based on your needs before saving the exported PDF. ```cshtml @using Syncfusion.Blazor.PivotView @@ -513,38 +522,38 @@ The PDF export provides an option to change page orientation of the document bef - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + @code { - SfPivotView pivot; - public List data { get; set; } - protected override void OnInitialized() - { - this.data = ProductDetails.GetProductData().ToList(); - //Bind the data source collection here. Refer "Assigning sample data to the pivot table" section in getting started for more details. - } - public void OnPdfExport() - { - Syncfusion.Blazor.Grids.PdfExportProperties pdfExportProperties = new Syncfusion.Blazor.Grids.PdfExportProperties() { PageOrientation = Syncfusion.Blazor.Grids.PageOrientation.Landscape }; - this.pivot.ExportToPdfAsync(pdfExportProperties); - } + SfPivotView pivot; + public List data { get; set; } + protected override void OnInitialized() + { + this.data = ProductDetails.GetProductData().ToList(); + //Bind the data source collection here. Refer "Assigning sample data to the pivot table" section in getting started for more details. + } + public void OnPdfExport(Microsoft.AspNetCore.Components.Web.MouseEventArgs args) + { + Syncfusion.Blazor.Grids.PdfExportProperties pdfExportProperties = new Syncfusion.Blazor.Grids.PdfExportProperties() { PageOrientation = Syncfusion.Blazor.Grids.PageOrientation.Landscape }; + this.pivot.ExportToPdfAsync(pdfExportProperties); + } } ``` @@ -552,9 +561,9 @@ The PDF export provides an option to change page orientation of the document bef ## Saving PDF document to stream -Rather than exporting the Pivot Table as a downloadable file, user can save the PDF document as a memory stream. This is achieved by setting the **asBlob** option to **true** in the [ExportToPdfAsync](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SfPivotView-1.html#Syncfusion_Blazor_PivotView_SfPivotView_1_ExportToPdfAsync_Syncfusion_Blazor_Grids_PdfExportProperties_System_Nullable_System_Boolean__System_Nullable_System_Boolean__) method. The resulting memory stream can then be further processed and customized by the user before being exported as a document. +Rather than exporting the Pivot Table as a downloadable file, users can save the PDF document as a memory stream. This is achieved by setting the **asBlob** option to **true** in the [ExportToPdfAsync](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SfPivotView-1.html#Syncfusion_Blazor_PivotView_SfPivotView_1_ExportToPdfAsync_Syncfusion_Blazor_Grids_PdfExportProperties_System_Nullable_System_Boolean__System_Nullable_System_Boolean__) method. The resulting memory stream can then be further processed and customized by the user before being exported as a document. -N> This option is only available if virtualization is enabled in the pivot table. +N> This option is only available if virtualization is enabled in the Pivot Table. ```cshtml @using Syncfusion.Blazor.PivotView @@ -611,9 +620,6 @@ N> This option is only available if virtualization is enabled in the pivot table // Here you can obtain the PDF document as a memory stream by setting the last parameter as "true" in the "ExportToPdfAsync" method. memoryStream = await this.pivot.ExportToPdfAsync(null, false, true); // You can then process the memory stream based on your needs and save it as mentioned in the last statement. - ...... - ...... - ...... await JSRuntime.InvokeVoidAsync("saveAsFile", new object[] { "default.pdf", Convert.ToBase64String(memoryStream.ToArray()) }); } } @@ -623,14 +629,16 @@ N> This option is only available if virtualization is enabled in the pivot table ### PdfQueryCellInfo -The event [PdfQueryCellInfo](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewEvents-1.html#Syncfusion_Blazor_PivotView_PivotViewEvents_1_PdfQueryCellInfo) triggers on framing each row and value cell during PDF export. It allows the user customize the cell value, style, etc. of the current cell. It has the following parameters. +The [PdfQueryCellInfo](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewEvents-1.html#Syncfusion_Blazor_PivotView_PivotViewEvents_1_PdfQueryCellInfo) event occurs for each row and value cell while exporting the Pivot Table to a PDF. This event allows users to change the value, appearance, or other details of the current cell in the PDF file. The following parameters are available in this event: + +- [Value](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.PdfQueryCellInfoEventArgs-1.html#Syncfusion_Blazor_Grids_PdfQueryCellInfoEventArgs_1_Value): The content displayed in the cell. +- [Column](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.PdfQueryCellInfoEventArgs-1.html#Syncfusion_Blazor_Grids_PdfQueryCellInfoEventArgs_1_Column): The column information for the current cell. **Note:** This option is applicable only when virtualization is disabled. +- [Cell](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.PdfQueryCellInfoEventArgs-1.html#Syncfusion_Blazor_Grids_PdfQueryCellInfoEventArgs_1_Cell): The complete cell information for the cell. +- [Style](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.PdfQueryCellInfoEventArgs-1.html#Syncfusion_Blazor_Grids_PdfQueryCellInfoEventArgs_1_Style): The style properties that control how the cell looks in the PDF. +- [RowIndex](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.PdfQueryCellInfoEventArgs-1.html#Syncfusion_Blazor_Grids_PdfQueryCellInfoEventArgs_1_RowIndex): It holds the row index required to get the current cell information. **Note:** When virtualization is enabled, this option is applicable. +- [ColumnIndex](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.PdfQueryCellInfoEventArgs-1.html#Syncfusion_Blazor_Grids_PdfQueryCellInfoEventArgs_1_ColumnIndex): It holds the column index required to get the current cell information. **Note:** When virtualization is enabled, this option is applicable. -* [Value](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.PdfQueryCellInfoEventArgs-1.html#Syncfusion_Blazor_Grids_PdfQueryCellInfoEventArgs_1_Value) : It holds the cell value. -* [Column](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.PdfQueryCellInfoEventArgs-1.html#Syncfusion_Blazor_Grids_PdfQueryCellInfoEventArgs_1_Column) : It holds the column information, including row and column indexes required to obtain the current cell information. **Note:** This option is applicable only when virtualization is disabled. -* [Cell](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.PdfQueryCellInfoEventArgs-1.html#Syncfusion_Blazor_Grids_PdfQueryCellInfoEventArgs_1_Cell) : It holds the current cell information. -* [Style](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.PdfQueryCellInfoEventArgs-1.html#Syncfusion_Blazor_Grids_PdfQueryCellInfoEventArgs_1_Style) : It holds the style properties for the cell. -* [RowIndex](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.PdfQueryCellInfoEventArgs-1.html#Syncfusion_Blazor_Grids_PdfQueryCellInfoEventArgs_1_RowIndex) : It holds the row index required to get the current cell information. **Note:** When virtualization is enabled, this option is applicable. -* [ColumnIndex](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.PdfQueryCellInfoEventArgs-1.html#Syncfusion_Blazor_Grids_PdfQueryCellInfoEventArgs_1_ColumnIndex) : It holds the column index required to get the current cell information. **Note:** When virtualization is enabled, this option is applicable. +By using this event, users can easily update the cell text, apply different styles such as font or background color, or adjust other settings as needed during PDF export. ```cshtml @using Syncfusion.Blazor.PivotView @@ -639,71 +647,71 @@ The event [PdfQueryCellInfo](https://help.syncfusion.com/cr/blazor/Syncfusion.Bl - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + @code { - private SfPivotView pivot; - public List data { get; set; } - - protected override void OnInitialized() - { - this.data = ProductDetails.GetProductData().ToList(); - // Bind the data source collection here. Refer "Assigning sample data to the pivot table" section in getting started for more details. - } - - public void OnPdfExport(Microsoft.AspNetCore.Components.Web.MouseEventArgs args) - { - this.pivot.ExportToPdfAsync(); - } - - // Triggers every time for row header and value cells during exporting. - public void PdfQueryCellEvent(PdfQueryCellInfoEventArgs args) - { - Matrix> pivotValues = pivot?.PivotValues; - AxisSet cellInfo = null; - if (pivot?.EnableVirtualization == true) - { - if (pivotValues != null) - { - cellInfo = pivotValues[args.RowIndex]?[args.ColumnIndex]; - } - } - else - { - IDictionary cellCoordinates = args.Column?.CustomAttributes; - if (pivotValues != null && cellCoordinates != null && cellCoordinates.ContainsKey("aria-colindex") && cellCoordinates.ContainsKey("aria-rowindex")) - { - // You will get the row index required to find the current cell information from the pivot value collection here. - int rowIndex = int.Parse(cellCoordinates["aria-rowindex"].ToString(), System.Globalization.NumberStyles.None); - // You will get the column index required to find the current cell information from the pivot value collection here. - int colIndex = int.Parse(cellCoordinates["aria-colindex"].ToString(), System.Globalization.NumberStyles.None); - cellInfo = pivotValues[rowIndex]?[colIndex]; - } - } - if (cellInfo?.IsGrandSum == true || cellInfo?.Axis == "row") - { - args.Style.BackgroundBrush = new Syncfusion.PdfExport.PdfSolidBrush(cellInfo?.Axis == "row" ? new Syncfusion.PdfExport.PdfColor(System.Drawing.Color.LightGoldenrodYellow) : new Syncfusion.PdfExport.PdfColor(System.Drawing.Color.LightYellow)); - args.Style.TextPen = new Syncfusion.PdfExport.PdfPen(System.Drawing.Color.IndianRed); - } - } + private SfPivotView pivot; + public List data { get; set; } + + protected override void OnInitialized() + { + this.data = ProductDetails.GetProductData().ToList(); + // Bind the data source collection here. Refer "Assigning sample data to the pivot table" section in getting started for more details. + } + + public void OnPdfExport(Microsoft.AspNetCore.Components.Web.MouseEventArgs args) + { + this.pivot.ExportToPdfAsync(); + } + + // Triggers every time for row header and value cells during exporting. + public void PdfQueryCellEvent(PdfQueryCellInfoEventArgs args) + { + Matrix> pivotValues = pivot?.PivotValues; + AxisSet cellInfo = null; + if (pivot?.EnableVirtualization == true) + { + if (pivotValues != null) + { + cellInfo = pivotValues[args.RowIndex]?[args.ColumnIndex]; + } + } + else + { + IDictionary cellCoordinates = args.Column?.CustomAttributes; + if (pivotValues != null && cellCoordinates != null && cellCoordinates.ContainsKey("aria-colindex") && cellCoordinates.ContainsKey("aria-rowindex")) + { + // You will get the row index required to find the current cell information from the pivot value collection here. + int rowIndex = int.Parse(cellCoordinates["aria-rowindex"].ToString(), System.Globalization.NumberStyles.None); + // You will get the column index required to find the current cell information from the pivot value collection here. + int colIndex = int.Parse(cellCoordinates["aria-colindex"].ToString(), System.Globalization.NumberStyles.None); + cellInfo = pivotValues[rowIndex]?[colIndex]; + } + } + if (cellInfo?.IsGrandSum == true || cellInfo?.Axis == "row") + { + args.Style.BackgroundBrush = new Syncfusion.PdfExport.PdfSolidBrush(cellInfo?.Axis == "row" ? new Syncfusion.PdfExport.PdfColor(System.Drawing.Color.LightGoldenrodYellow) : new Syncfusion.PdfExport.PdfColor(System.Drawing.Color.LightYellow)); + args.Style.TextPen = new Syncfusion.PdfExport.PdfPen(System.Drawing.Color.IndianRed); + } + } } ``` @@ -711,13 +719,15 @@ The event [PdfQueryCellInfo](https://help.syncfusion.com/cr/blazor/Syncfusion.Bl N> The row header cell can be obtained by using the `PdfQueryCellInfo` event. It can be identified using `AxisSet.Axis == "row"` and for reference, see the code snippet in the previous topic. -The event [PdfHeaderQueryCellInfo](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewEvents-1.html#Syncfusion_Blazor_PivotView_PivotViewEvents_1_PdfHeaderQueryCellInfo) triggers on framing each column header cell during PDF export. It allows the user to customize the cell value, style, etc. of the current cell. It has the following parameters: +The [PdfHeaderQueryCellInfo](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewEvents-1.html#Syncfusion_Blazor_PivotView_PivotViewEvents_1_PdfHeaderQueryCellInfo) event is triggered for each column header cell when exporting the Pivot Table to a PDF document. This event allows users to easily change values or apply styles to the column header cells in the exported PDF file. + +The event provides the following parameters: -* [Column](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.PdfHeaderQueryCellInfoEventArgs.html#Syncfusion_Blazor_Grids_PdfHeaderQueryCellInfoEventArgs_Column) : It holds the column information, including row and column indexes required to obtain the current cell information. **Note:** This option is applicable only when virtualization is disabled. -* [Cell](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.PdfHeaderQueryCellInfoEventArgs.html#Syncfusion_Blazor_Grids_PdfHeaderQueryCellInfoEventArgs_Cell) : It holds the current cell information. -* [Style](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.PdfHeaderQueryCellInfoEventArgs.html#Syncfusion_Blazor_Grids_PdfHeaderQueryCellInfoEventArgs_Style) : It holds the style properties for the cell. -* [RowIndex](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.PdfHeaderQueryCellInfoEventArgs.html#Syncfusion_Blazor_Grids_PdfHeaderQueryCellInfoEventArgs_RowIndex) : It holds the row index required to get the current cell information. **Note:** When virtualization is enabled, this option is applicable. -* [ColumnIndex](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.PdfHeaderQueryCellInfoEventArgs.html#Syncfusion_Blazor_Grids_PdfHeaderQueryCellInfoEventArgs_ColumnIndex) : It holds the column index required to get the current cell information. **Note:** When virtualization is enabled, this option is applicable. +- [Column](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.PdfHeaderQueryCellInfoEventArgs.html#Syncfusion_Blazor_Grids_PdfHeaderQueryCellInfoEventArgs_Column): Gives information about the current header cell being exported. **Note:** This option is applicable only when virtualization is disabled. +- [Cell](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.PdfHeaderQueryCellInfoEventArgs.html#Syncfusion_Blazor_Grids_PdfHeaderQueryCellInfoEventArgs_Cell): Contains the current cell information. +- [Style](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.PdfHeaderQueryCellInfoEventArgs.html#Syncfusion_Blazor_Grids_PdfHeaderQueryCellInfoEventArgs_Style): Contains style properties that can be used to format the cell. +- [RowIndex](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.PdfHeaderQueryCellInfoEventArgs.html#Syncfusion_Blazor_Grids_PdfHeaderQueryCellInfoEventArgs_RowIndex): It holds the row index required to get the current cell information. **Note:** When virtualization is enabled, this option is applicable. +- [ColumnIndex](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.PdfHeaderQueryCellInfoEventArgs.html#Syncfusion_Blazor_Grids_PdfHeaderQueryCellInfoEventArgs_ColumnIndex): It holds the column index required to get the current cell information. **Note:** When virtualization is enabled, this option is applicable. ```cshtml @using Syncfusion.Blazor.PivotView @@ -797,4 +807,4 @@ The event [PdfHeaderQueryCellInfo](https://help.syncfusion.com/cr/blazor/Syncfus ![Customizing the Blazor Pivot Table cell values and styles while exporting](images/blazor-pivottable-pdfexportevents.png) -N> You can refer to the [Blazor Pivot Table](https://www.syncfusion.com/blazor-components/blazor-pivot-table) feature tour page for its groundbreaking feature representations. You can also explore the [Blazor Pivot Table example](https://blazor.syncfusion.com/demos/pivot-table/default-functionalities?theme=bootstrap5) to know how to render and configure the pivot table. +N> You can refer to the [Blazor Pivot Table](https://www.syncfusion.com/blazor-components/blazor-pivot-table) feature tour page for its groundbreaking feature representations. You can also explore the [Blazor Pivot Table example](https://blazor.syncfusion.com/demos/pivot-table/default-functionalities?theme=bootstrap5) to know how to render and configure the Pivot Table. \ No newline at end of file diff --git a/blazor/pivot-table/pivot-chart.md b/blazor/pivot-table/pivot-chart.md index cc71fb8374..63d1aedaa3 100644 --- a/blazor/pivot-table/pivot-chart.md +++ b/blazor/pivot-table/pivot-chart.md @@ -9,17 +9,17 @@ documentation: ug # Pivot Chart in Blazor Pivot Table Component -In [Blazor Pivot Table](https://www.syncfusion.com/blazor-components/blazor-pivot-table) component, pivot chart would act as an additional visualization component with its basic and important characteristic like drill down and drill up, 15+ chart types, series customization, axis customization, legend customization, export, print and tooltip. Its main purpose is to show the pivot data in graphical format. +The Pivot Chart in the [Blazor Pivot Table](https://www.syncfusion.com/blazor-components/blazor-pivot-table) component helps users visualize aggregated values in a clear and graphical format. It provides essential options like drill down and drill up operations, over 15 chart types, and various display settings for series, axes, legends, export, print, and tooltips. The main purpose of the Pivot Chart is to present Pivot Table data in a way that is easy to understand and interact with. -To have a quick glance about Pivot Chart in the Blazor Pivot Table, watch this video: +To have a quick glance about Pivot Chart in the [Blazor Pivot Table](https://www.syncfusion.com/blazor-components/blazor-pivot-table), watch this video: {% youtube "youtube:https://www.youtube.com/watch?v=-R-aoblUd1k&t=1s"%}. -If the user prefers, the pivot chart component can also be displayed individually with pivot values and can change the report dynamically with the help of field list and grouping bar. Using the [PivotViewDisplayOption](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDisplayOption.html) property in [SfPivotView](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SfPivotView-1.html) class, user can set the visibility of grid and chart in pivot table component. It holds the following properties, +Users can display the pivot chart component individually with pivot values and modify the report dynamically using the field list and grouping bar. The [PivotViewDisplayOption](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDisplayOption.html) property in [SfPivotView](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SfPivotView-1.html) class allows users to control the visibility of both the grid and chart components. This property includes the following options: -* [View](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDisplayOption.html#Syncfusion_Blazor_PivotView_PivotViewDisplayOption_View): Specifies the pivot table component to display grid alone or chart alone or both. -* [Primary](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDisplayOption.html#Syncfusion_Blazor_PivotView_PivotViewDisplayOption_Primary): Specifies the pivot table to display either grid or chart as primary component during initial loading. It is applicable only when setting the property [View](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDisplayOption.html#Syncfusion_Blazor_PivotView_PivotViewDisplayOption_View) to [View.Both](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.View.html). +* [View](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDisplayOption.html#Syncfusion_Blazor_PivotView_PivotViewDisplayOption_View): Determines whether the Pivot Table component displays only the grid, only the chart, or both components. +* [Primary](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDisplayOption.html#Syncfusion_Blazor_PivotView_PivotViewDisplayOption_Primary): Specifies which component (grid or chart) appears as the primary view during initial loading. This option applies only when the [View](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDisplayOption.html#Syncfusion_Blazor_PivotView_PivotViewDisplayOption_View) property is set to [View.Both](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.View.html#Syncfusion_Blazor_PivotView_View_Both). The following sample displays the pivot chart component based on the pivot report bound on it. @@ -58,19 +58,17 @@ The following sample displays the pivot chart component based on the pivot repor //Bind the data source collection here. Refer "Assigning sample data to the pivot table" section in getting started for more details. } } - ``` ![Blazor Pivot Chart](images/blazor-pivotchart.png) ## Data Binding -End user can bind both local and remote data binding options available in the component to feed the data. The [DataSource](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html#Syncfusion_Blazor_PivotView_PivotViewDataSourceSettings_1_DataSource) property can be assigned either with an instance of [SfDataManager](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataManager.html) or list of object. -For more information [refer](./data-binding) here. +The Pivot Table component supports both local and remote data binding options to populate data in the pivot chart. Users can bind data to the component using the [DataSource](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html#Syncfusion_Blazor_PivotView_PivotViewDataSourceSettings_1_DataSource) property, which accepts either an instance of [SfDataManager](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataManager.html) for remote data sources or a list of objects for local data. For further details, [refer](./data-binding) here. ## Chart Types -Supports 19 different types of charts as follows, +The Pivot Chart offers 19 different chart types, allowing users to visualize and analyze data in various ways. You can choose any of these chart types based on your needs: * Line * Column @@ -92,9 +90,9 @@ Supports 19 different types of charts as follows, * Polar * Radar -[ChartSeriesType.Line](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.ChartSeriesType.html) is the default pivot chart type. User can change the pivot chart type by using the property [Type](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotChartSeries.html#Syncfusion_Blazor_PivotView_PivotChartSeries_Type) in [PivotChartSeries](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotChartSettings.html#Syncfusion_Blazor_PivotView_PivotChartSettings_ChartSeries) class. +By default, the **Line** chart type is displayed in the Pivot Chart. Users can change the chart type at any time using the [Type](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotChartSeries.html#Syncfusion_Blazor_PivotView_PivotChartSeries_Type) property in [PivotChartSeries](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotChartSettings.html#Syncfusion_Blazor_PivotView_PivotChartSettings_ChartSeries) class. -In the following code sample, the pivot chart type is set as [ChartSeriesType.Bar](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.ChartSeriesType.html). +In the following code sample, the pivot chart type is set as [ChartSeriesType.Bar](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.ChartSeriesType.html#Syncfusion_Blazor_PivotView_ChartSeriesType_Bar). ```cshtml @using Syncfusion.Blazor.PivotView @@ -127,23 +125,22 @@ In the following code sample, the pivot chart type is set as [ChartSeriesType.Ba //Bind the data source collection here. Refer "Assigning sample data to the pivot table" section in getting started for more details. } } - ``` ![Blazor Pivot Bar Chart](images/blazor-pivot-bar-chart.png) ## Accumulation Charts -Supports 4 different types of accumulation charts as follows, +Pivot Chart supports four types of accumulation charts: -* Pie -* Doughnut -* Funnel -* Pyramid +- Pie +- Doughnut +- Funnel +- Pyramid -As like other chart types it can be changed using the property [Type](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotChartSeries.html#Syncfusion_Blazor_PivotView_PivotChartSeries_Type) in [PivotChartSeries](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotChartSettings.html#Syncfusion_Blazor_PivotView_PivotChartSettings_ChartSeries) class. +You can use any of these chart types to visualize your aggregated data clearly. To select a specific accumulation chart, set the [Type](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotChartSeries.html#Syncfusion_Blazor_PivotView_PivotChartSeries_Type) property in the [PivotChartSeries](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotChartSettings.html#Syncfusion_Blazor_PivotView_PivotChartSettings_ChartSeries) class. -In the following code sample, the **Pie** chart is rendered, and the other accumulation charts can be switched using the drop-down list. +In the code example below, the **Pie** chart is displayed by default. You can switch to other accumulation chart types, such as Doughnut, Funnel, or Pyramid, using the dropdown list. ```cshtml @using Syncfusion.Blazor.PivotView @@ -223,20 +220,19 @@ In the following code sample, the **Pie** chart is rendered, and the other accum public ChartSeriesType Value { get; set; } } } - ``` ![Blazor Accumulation Chart](images/blazor-accumulation-chart.png) -### Drill Down/Up +### Drill down and up -In the accumulation charts, drill down and drill up operations can be performed using the built-in context menu option. It will be shown while clicking on the chart series. The context menu has the following options: +In accumulation charts, you can use the drill down and drill up options to explore data at different levels. When you click on a chart series, a built-in context menu appears with the following options: -**Expand** - It is to drill down the corresponding series until the last level. -**Collapse** - It is to drill up the corresponding series until the first level. -**Exit** - It is to close the context menu. +- **Expand**: Drill down to view more detailed data for the selected series, continuing until the lowest level is reached. +- **Collapse**: Drill up to view higher-level, summarized information for that series, returning to the top level as needed. +- **Exit**: Close the context menu without making any changes. -N> The drill operation in accumulation charts can be performed only for row headers. +N> You can use the drill operation for row headers only in accumulation charts. ```cshtml @using Syncfusion.Blazor.PivotView @@ -266,9 +262,7 @@ N> The drill operation in accumulation charts can be performed only for row head @code{ - public ChartSeriesType ChartType = ChartSeriesType.Pie; - public List data { get; set; } protected override void OnInitialized() { @@ -276,16 +270,15 @@ N> The drill operation in accumulation charts can be performed only for row head //Bind the data source collection here. Refer "Assigning sample data to the pivot table" section in getting started for more details. } } - ``` ![Blazor Pie Chart with Drill Down and Up](images/blazor-pie-chart-drill-down-up.png) ### Column Headers and Delimiters -Unlike other chart types, the accumulation charts consider the values of a single column from the pivot table to be drawn. Preferably the first column of the pivot table is considered by default. But it can be changed by defining the column headers using the `ColumnHeader` property in the [PivotChartSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotChartSettings.html) class. +In accumulation charts, only the values from a single column in the pivot chart are displayed. By default, the first column is used. If you want to show values from a different column, you can specify the column headers with the [ColumnHeader](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotChartSettings.html#Syncfusion_Blazor_PivotView_PivotChartSettings_ColumnHeader) property in [PivotChartSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotChartSettings.html) class. -If the column has more than one header, then mention all the headers separated by the delimiter **-**, for example,**Germany-Road Bikes**. Using the property `ColumnDelimiter` in [PivotChartSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotChartSettings.html) class, one can set the desired delimiter to separate the column headers. +If the column has more than one header, enter all the headers separated by a delimiter, such as **Germany-Road Bikes**. You can set your preferred delimiter using the [ColumnDelimiter](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotChartSettings.html#Syncfusion_Blazor_PivotView_PivotChartSettings_ColumnDelimiter) property in [PivotChartSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotChartSettings.html) class. This allows you to display the correct values in your accumulation chart according to how your columns are grouped in the Pivot Table. ```cshtml @using Syncfusion.Blazor.PivotView @@ -317,16 +310,13 @@ If the column has more than one header, then mention all the headers separated b @code{ - public ChartSeriesType ChartType = ChartSeriesType.Doughnut; - public List data { get; set; } protected override void OnInitialized() { this.data = ProductDetails.GetProductData().ToList(); //Bind the data source collection here. Refer "Assigning sample data to the pivot table" section in getting started for more details. } - } ``` @@ -334,14 +324,16 @@ If the column has more than one header, then mention all the headers separated b ### Data Label Customization -The data labels are visible by default showing header name. Its visibility can be modified using the `Visible` boolean property in `DataLabel` Tag. With regard to the label arrangement, the **Smart Labels** options helps to arrange labels efficiently without overlapping. It can be disabled by setting the `EnableSmartLabels` property in [PivotChartSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotChartSettings.html) class as **false**. +By default, the data labels in accumulation charts display the header name. You can control their visibility using the [Visible](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotChartDataLabel.html#Syncfusion_Blazor_PivotView_PivotChartDataLabel_Visible) property in the [PivotChartDataLabel](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotChartDataLabel.html) settings. -The `position` property in `dataLabel` allows to specify the position of the data label. The available options are, +To improve label arrangement and prevent overlapping, the **Smart Labels** option arranges labels efficiently. You can disable this option by setting the [EnableSmartLabels](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotChartSettings.html#Syncfusion_Blazor_PivotView_PivotChartSettings_EnableSmartLabels) property to **false** in the [PivotChartSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotChartSettings.html) class. -* `Outside`: Positions the label outside the point. It is the default option. -* `Inside`: Positions the label inside the point. +The [Position](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotChartDataLabel.html#Syncfusion_Blazor_PivotView_PivotChartDataLabel_Position) property in [PivotChartDataLabel](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotChartDataLabel.html) allows you to specify where the data label appears. The available options are: -In the following code sample, the data labels are placed inside. +* `Outside`: Places the label outside the chart point. This is the default option. +* `Inside`: Places the label inside the chart point. + +In the following code sample, the data labels are placed inside the chart points. ```cshtml @using Syncfusion.Blazor.PivotView @@ -372,7 +364,6 @@ In the following code sample, the data labels are placed inside. @code{ - public ChartSeriesType ChartType = ChartSeriesType.Pyramid; public PivotChartLabelPosition Position = PivotChartLabelPosition.Inside; public List data { get; set; } @@ -382,12 +373,11 @@ In the following code sample, the data labels are placed inside. //Bind the data source collection here. Refer "Assigning sample data to the pivot table" section in getting started for more details. } } - ``` ![Blazor Pyramid Chart with Label](images/blazor-pyramid-chart-label.png) -The **Connector Line** will be visible when the data label is placed outside the chart. It can be customized using the `ConnectorStyle` property in `PivotChartDataLabel` class for its color, length, width etc. In the following code sample, the connector line is customized. +The **Connector Line** appears when data labels are positioned outside the chart. You can style this connector line using the [ConnectorStyle](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotChartDataLabel.html#Syncfusion_Blazor_PivotView_PivotChartDataLabel_ConnectorStyle) property in [PivotChartDataLabel](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotChartDataLabel.html) class to modify its color, length, width, and other properties. In the example below, the connector line appearance is changed to show a different style. ```cshtml @using Syncfusion.Blazor.PivotView @@ -421,7 +411,6 @@ The **Connector Line** will be visible when the data label is placed outside the @code{ - public ChartSeriesType ChartType = ChartSeriesType.Funnel; public PivotChartLabelPosition Position = PivotChartLabelPosition.Outside; public List data { get; set; } @@ -431,14 +420,13 @@ The **Connector Line** will be visible when the data label is placed outside the //Bind the data source collection here. Refer "Assigning sample data to the pivot table" section in getting started for more details. } } - ``` ![Blazor Funnel Chart with Connector](images/blazor-funnel-chart-connector.png) -## Data Label Template +### Data Label Template -The [Template](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotChartMarkerDataLabel.html#Syncfusion_Blazor_PivotView_PivotChartMarkerDataLabel_Template) property in the [PivotChartDataLabel](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotChartDataLabel.html) allows you to customize the appearance of data labels in the pivot chart series by using your own HTML elements for displaying the desired UI. The parameter named [AccumulationChartDataPointInfo](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Charts.AccumulationChartDataPointInfo.html) is always passed in as a context within the template, allowing it to access the data points such as x and y and display the associated data point within a customized UI, as shown in the code example below. +The [Template](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotChartMarkerDataLabel.html#Syncfusion_Blazor_PivotView_PivotChartMarkerDataLabel_Template) property in the [PivotChartDataLabel](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotChartDataLabel.html) class lets users change the look of data labels in the pivot chart series using custom HTML elements. The [AccumulationChartDataPointInfo](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Charts.AccumulationChartDataPointInfo.html) parameter is passed as context to the template, enabling access to data points like x and y for displaying them in a custom design, as shown below. ```cshtml @using Syncfusion.Blazor.PivotView @@ -492,14 +480,13 @@ The [Template](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView //Bind the data source collection here. Refer "Assigning sample data to the pivot table" section in getting started for more details. } } - ``` ![Blazor Pivot Chart with data label customization using template for accumulation chart series](images/blazor-pieChart-dataLabel-customized-by-template.png) ### Pie and Doughnut Customization -User can draw pie and doughnut charts within the specified range using the `StartAngle` and `EndAngle` properties in [PivotChartSeries](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotChartSeries.html) class. The default value of the `StartAngle` property is **0**, and the `EndAngle` property is **360**. By customizing these properties, user can draw semi pie and semi doughnut charts. +You can draw pie and doughnut charts within a specific range by using the [StartAngle](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotChartSeries.html#Syncfusion_Blazor_PivotView_PivotChartSeries_StartAngle) and [EndAngle](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotChartSeries.html#Syncfusion_Blazor_PivotView_PivotChartSeries_EndAngle) properties in the [PivotChartSeries](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotChartSeries.html) class. The default value for the [StartAngle](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotChartSeries.html#Syncfusion_Blazor_PivotView_PivotChartSeries_StartAngle) property is **0**, and the [EndAngle](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotChartSeries.html#Syncfusion_Blazor_PivotView_PivotChartSeries_EndAngle) property is **360**. By modifying these properties, you can create semi-pie and semi-doughnut charts. ```cshtml @using Syncfusion.Blazor.PivotView @@ -528,7 +515,6 @@ User can draw pie and doughnut charts within the specified range using the `Star @code{ - public ChartSeriesType ChartType = ChartSeriesType.Doughnut; public List data { get; set; } protected override void OnInitialized() @@ -537,14 +523,13 @@ User can draw pie and doughnut charts within the specified range using the `Star //Bind the data source collection here. Refer "Assigning sample data to the pivot table" section in getting started for more details. } } - ``` ![Blazor Doughnut Chart with Custom Angle](images/blazor-dougnut-chart-custom-angle.png) -Users can get doughnut chart from pie chart and vice-versa using the `InnerRadius` property in [PivotChartSeries](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotChartSeries.html) class. If the property is greater than **0** percent, the doughnut chart will appear from the pie chart. +You can convert a pie chart to a doughnut chart and vice-versa using the [InnerRadius](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotChartSeries.html#Syncfusion_Blazor_PivotView_PivotChartSeries_InnerRadius) property in the [PivotChartSeries](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotChartSeries.html) class. When this property is set to a value greater than **0** percent, the chart appears as a doughnut instead of a pie chart. -N> It takes the value only in percentage. +N> This property accepts values only in percentage format. ```cshtml @using Syncfusion.Blazor.PivotView @@ -574,7 +559,6 @@ N> It takes the value only in percentage. @code{ - public ChartSeriesType ChartType = ChartSeriesType.Pie; public List data { get; set; } protected override void OnInitialized() @@ -583,16 +567,13 @@ N> It takes the value only in percentage. //Bind the data source collection here. Refer "Assigning sample data to the pivot table" section in getting started for more details. } } - ``` ![Blazor Pie Chart with Custom Radius](images/blazor-pie-chart-custom-radius.png) #### Radius customization -You can easily customize the radius of the pie chart series using the [Radius](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotChartSeries.html#Syncfusion_Blazor_PivotView_PivotChartSeries_Radius) property of the [PivotChartSeries](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotChartSeries.html). The pie chart series has a radius of 80% of its total size by default. - -The radius of the pie chart series is set to **70%** in the following code sample. +Users can adjust the radius of a pie chart series using the [Radius](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotChartSeries.html#Syncfusion_Blazor_PivotView_PivotChartSeries_Radius) property in the [PivotChartSeries](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotChartSeries.html) class. By default, the pie chart series has a radius of 80% of its total size. For example, the following code sets the radius to 70%. ```cshtml @using Syncfusion.Blazor.PivotView @@ -616,12 +597,11 @@ The radius of the pie chart series is set to **70%** in the following code sampl - + @code{ - public List data { get; set; } protected override void OnInitialized() { @@ -629,14 +609,13 @@ The radius of the pie chart series is set to **70%** in the following code sampl //Bind the data source collection here. Refer "Assigning sample data to the pivot table" section in getting started for more details. } } - ``` ![Blazor Pivot Chart with radius customization](images/blazor-pivotChart-with-customize-radius.png) -You can also change the radius of each slice (i.e., data point) within the chart series. This can be accomplished by using the [ChartSeriesCreated](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewEvents-1.html#Syncfusion_Blazor_PivotView_PivotViewEvents_1_ChartSeriesCreated) event, which is triggered whenever a series is rendered in the chart area. Within this event, you can set the [Radius](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotChartData.html#Syncfusion_Blazor_PivotView_PivotChartData_Radius) property for each data object from the datasource, allowing the display of pie chart slices with different radii to meet your requirements. +You can adjust the radius of each slice (i.e., data point) in the chart series using the [ChartSeriesCreated](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewEvents-1.html#Syncfusion_Blazor_PivotView_PivotViewEvents_1_ChartSeriesCreated) event, which triggers when a series is rendered in the chart area. In this event, you can set the [Radius](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotChartData.html#Syncfusion_Blazor_PivotView_PivotChartData_Radius) property for each data object in the data source, enabling the display of pie chart slices with varying radii to suit your needs. -In the [ChartSeriesCreated](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewEvents-1.html#Syncfusion_Blazor_PivotView_PivotViewEvents_1_ChartSeriesCreated) event, the radius for each slice in the pie chart series is set to different values: **80%**, **85%**, and **90%** in the following code sample. To effectively use these radius values, it's essential to configure the `args.Series[0].Radius` property as **Radius**. +In the [ChartSeriesCreated](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewEvents-1.html#Syncfusion_Blazor_PivotView_PivotViewEvents_1_ChartSeriesCreated) event, the radius of each slice in the pie chart series is set to different values: **80%**, **85%**, and **90%**, as shown in the following code sample. To apply these radius values effectively, you must set the `args.Series[0].Radius` property to **Radius**. ```cshtml @using Syncfusion.Blazor.PivotView @@ -666,7 +645,6 @@ In the [ChartSeriesCreated](https://help.syncfusion.com/cr/blazor/Syncfusion.Bla @code{ - public List data { get; set; } protected override void OnInitialized() { @@ -683,14 +661,13 @@ In the [ChartSeriesCreated](https://help.syncfusion.com/cr/blazor/Syncfusion.Bla args.Series[0].Radius = "Radius"; } } - ``` ![Blazor Pivot Chart series with different radius customization for each slice](images/blazor-pivotChart-slice-with-different-radius.png) ### Exploding Series Points -Exploding can be enabled by setting the `Explode` property in [PivotChartSeries](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotChartSeries.html) class to **true**. The series points will be exploded either on mouse click or touch. +You can make an individual point in a pivot chart stand out by enabling the exploding option. To do this, set the [Explode](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotChartSeries.html#Syncfusion_Blazor_PivotView_PivotChartSeries_Explode) property in the [PivotChartSeries](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotChartSeries.html) class to **true**. When this option is turned on, a chart point will separate from the rest of the series when a user clicks it with a mouse or taps it on a touch device. This makes it easier for users to highlight and identify specific data points in accumulation charts like Pie, Doughnut, Funnel, or Pyramid. ```cshtml @using Syncfusion.Blazor.PivotView @@ -720,7 +697,6 @@ Exploding can be enabled by setting the `Explode` property in [PivotChartSeries] @code{ - public ChartSeriesType ChartType = ChartSeriesType.Pie; public List data { get; set; } protected override void OnInitialized() @@ -729,16 +705,13 @@ Exploding can be enabled by setting the `Explode` property in [PivotChartSeries] //Bind the data source collection here. Refer "Assigning sample data to the pivot table" section in getting started for more details. } } - ``` ![Blazor PivotChart with Explode Series Point](images/blazor-pivotchart-explode-series-point.png) ## Field List -User can enable the field list by setting the property [ShowFieldList](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SfPivotView-1.html#Syncfusion_Blazor_PivotView_SfPivotView_1_ShowFieldList) in [SfPivotView](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SfPivotView-1.html) class as **true**. - -By using this, user can customize the report dynamically and view the result in pivot chart. For more information regarding the field list, refer the [field list](./field-list) topic. +The field list makes it easy to add, remove, or rearrange fields in the pivot chart, so you can display exactly the data you need. To show the field list in the Pivot Chart, set the [ShowFieldList](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SfPivotView-1.html#Syncfusion_Blazor_PivotView_SfPivotView_1_ShowFieldList) property in [SfPivotView](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SfPivotView-1.html) class to **true**. When you make changes with the field list, the pivot chart updates right away to show the new results. To learn more about the field list and how it works, see the [field list](./field-list) topic in the documentation. ```cshtml @using Syncfusion.Blazor.PivotView @@ -775,16 +748,15 @@ By using this, user can customize the report dynamically and view the result in //Bind the data source collection here. Refer "Assigning sample data to the pivot table" section in getting started for more details. } } - ``` ![Blazor Pivot Chart with FieldList](images/blazor-pivotchart-field-list.png) ## Grouping Bar -User can enable the grouping bar by setting the property [ShowGroupingBar](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SfPivotView-1.html#Syncfusion_Blazor_PivotView_SfPivotView_1_ShowGroupingBar) in [SfPivotView](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SfPivotView-1.html) class as **true**. The grouping bar in pivot chart shows a dropdown list in value axis instead of buttons. The dropdown list holds list of value fields bounded in the [PivotViewDataSourceSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html) and it can be switched to draw the pivot chart with the selected value field. This has been defined as the default behavior in the pivot chart component. For more information regarding the grouping bar, refer the [grouping bar](./grouping-bar) topic. +You can display the grouping bar in the Pivot Chart by setting the [ShowGroupingBar](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SfPivotView-1.html#Syncfusion_Blazor_PivotView_SfPivotView_1_ShowGroupingBar) property in [SfPivotView](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SfPivotView-1.html) class to **true**. When enabled, the grouping bar in the pivot chart shows a drop-down list on the value axis. This drop-down lets users select from the value fields defined in [PivotViewDataSourceSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html). Users can switch between these fields to update the chart based on the selected value field. This method of selection is the default behavior in the Pivot Chart component. For more details about how the grouping bar works, refer to the [grouping bar](./grouping-bar) documentation. -N> For multiple axis support, buttons will be placed in value axis instead of dropdown list. +N> When there are multiple axes, buttons appear on the value axis instead of the drop-down list. ```cshtml @using Syncfusion.Blazor.PivotView @@ -821,12 +793,11 @@ N> For multiple axis support, buttons will be placed in value axis instead of dr //Bind the data source collection here. Refer "Assigning sample data to the pivot table" section in getting started for more details. } } - ``` ![Blazor Pivot Chart with GroupBar](images/blazor-pivotchart-groupbar.png) -For accumulation charts alone, a drop-down list will be placed in the column axis instead of the buttons. The drop-down list shows the column headers available in the pivot table. Users can dynamically switch column headers with the help of the drop-down list, and the accumulation chart will be updated accordingly. +When using accumulation charts, the drop-down list appears on the column axis. This list contains the column headers available in the Pivot Chart. Users can switch column headers using this drop-down, and the accumulation chart will update with the selected header. ```cshtml @using Syncfusion.Blazor.PivotView @@ -856,7 +827,6 @@ For accumulation charts alone, a drop-down list will be placed in the column axi @code{ - public ChartSeriesType ChartType = ChartSeriesType.Pie; public List data { get; set; } protected override void OnInitialized() @@ -865,14 +835,13 @@ For accumulation charts alone, a drop-down list will be placed in the column axi //Bind the data source collection here. Refer "Assigning sample data to the pivot table" section in getting started for more details. } } - ``` ![Grouping in Blazor Pivot Chart](images/blazor-pivotchart-group.png) ## Single Axis -By default, the pivot chart will be drawn with the value field (measure) which is set first in the report under value axis. But, user can change to specific value field using the property [Value](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotChartSettings.html#Syncfusion_Blazor_PivotView_PivotChartSettings_Value) in [PivotChartSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotChartSettings.html) class. +By default, the pivot chart uses the first value field (measure) from your report as the value axis. If you want to display data using a different value field, you can do this easily. Use the [Value](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotChartSettings.html#Syncfusion_Blazor_PivotView_PivotChartSettings_Value) property inside [PivotChartSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotChartSettings.html) class. This option lets you show a specific value field in the pivot chart, allowing you to focus on the data you need. ```cshtml @using Syncfusion.Blazor.PivotView @@ -915,32 +884,32 @@ By default, the pivot chart will be drawn with the value field (measure) which i ## Multiple Axis -User can draw the pivot chart with multiple value fields by setting the property [EnableMultipleAxis](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotChartSettings.html#Syncfusion_Blazor_PivotView_PivotChartSettings_EnableMultipleAxis) in [PivotChartSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotChartSettings.html) class as **true**. In the following code sample, the pivot chart will be drawn with both value fields **Sold** and **Amount** available in the [PivotViewDataSourceSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html). +The pivot chart can be drawn with multiple value fields by setting the [EnableMultipleAxis](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotChartSettings.html#Syncfusion_Blazor_PivotView_PivotChartSettings_EnableMultipleAxis) property to **true** in the [PivotChartSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotChartSettings.html) class. In the following code sample, the pivot chart displays both value fields **Sold** and **Amount** from the [PivotViewDataSourceSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html). -> The multiple axis support is not applicable for the accumulation chart types like pie, doughnut, pyramid, and funnel. +N> Multiple axis support is not applicable for accumulation chart types like pie, doughnut, pyramid, and funnel. ```cshtml @using Syncfusion.Blazor.PivotView - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + @code{ @@ -955,30 +924,30 @@ User can draw the pivot chart with multiple value fields by setting the property ![Blazor Pivot Chart with Multiple Axis](images/blazor-pivotchart-multi-axis.png) -If the user binds more value fields, the result will be multiple pivot charts, and each chart will shrink within the parent container height. To avoid this, set the [EnableScrollOnMultiAxis](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotChartSettings.html#Syncfusion_Blazor_PivotView_PivotChartSettings_EnableScrollOnMultiAxis) property in [PivotChartSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotChartSettings.html) to **true**. By doing so, each pivot chart will only shrink to a minimal "160px" – "180px" height showing a vertical scrollbar for a clear view. +When binding more value fields, the result displays multiple pivot charts, with each chart shrinking within the parent container height. To prevent this behavior, set the [EnableScrollOnMultiAxis](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotChartSettings.html#Syncfusion_Blazor_PivotView_PivotChartSettings_EnableScrollOnMultiAxis) property to **true** in the [PivotChartSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotChartSettings.html) class. This ensures each pivot chart maintains a minimum height of "160px" to "180px" and displays a vertical scroll bar for better visibility. ```cshtml @using Syncfusion.Blazor.PivotView - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + @code{ @@ -993,9 +962,9 @@ If the user binds more value fields, the result will be multiple pivot charts, a ![Blazor Pivot Chart with ScrollBar](images/blazor-pivotchart-scrollbar.png) -Meanwhile, there is another way to display multiple values in a chart. In this approach, the series drawn from multiple values are grouped and displayed in a single chart. And, based on the values, multiple Y axis scales will be framed with different ranges. This can be achieved by setting the properties [EnableMultipleAxis](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotChartSettings.html#Syncfusion_Blazor_PivotView_PivotChartSettings_EnableMultipleAxis) as **true** and [MultipleAxisMode](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotChartSettings.html#Syncfusion_Blazor_PivotView_PivotChartSettings_MultipleAxisMode) as **Single** in [PivotChartSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotChartSettings.html). +Alternatively, you can display multiple values in a single chart. In this approach, the series from multiple values are grouped and displayed together. Based on the values, multiple Y-axis scales are created with different ranges. This can be achieved by setting [EnableMultipleAxis](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotChartSettings.html#Syncfusion_Blazor_PivotView_PivotChartSettings_EnableMultipleAxis) to **true** and [MultipleAxisMode](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotChartSettings.html#Syncfusion_Blazor_PivotView_PivotChartSettings_MultipleAxisMode) to **Single** in the [PivotChartSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotChartSettings.html) class. -In the following code sample, the pivot chart can be seen as a single chart with multiple value fields such as **Sold** and **Amount** that are drawn as multiple Y axis. +In the following code sample, the pivot chart appears as a single chart with multiple value fields such as **Sold** and **Amount**, each represented with its own Y-axis. ```cshtml @using Syncfusion.Blazor.PivotView @@ -1033,11 +1002,11 @@ In the following code sample, the pivot chart can be seen as a single chart with ![Multiple Axis Mode in Blazor Pivot Chart](images/blazor-pivotchart-multiple-axis-mode.png) -Additionally, to display chart series for multiple values within a single y-axis, set the properties [EnableMultipleAxis](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotChartSettings.html#Syncfusion_Blazor_PivotView_PivotChartSettings_EnableMultipleAxis) to **true** and the [MultipleAxisMode](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.MultipleAxisMode.html) to **Combined**, in the [PivotChartSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotChartSettings.html). +To display multiple value fields on a single y-axis in the pivot chart, set the [EnableMultipleAxis](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotChartSettings.html#Syncfusion_Blazor_PivotView_PivotChartSettings_EnableMultipleAxis) property to **true** and the [MultipleAxisMode](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.MultipleAxisMode.html) property to **Combined** in the [PivotChartSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotChartSettings.html) class. -> The y-axis range values will be formatted using the first value field on the value axis. For example, if the first value field is in currency format and the remaining value fields are in different number formats or no format, the y-axis range values will be displayed in the currency format of the first value field. +> The y-axis range values are formatted based on the first value field in the value axis. For example, if the first value field uses currency format and other value fields use different number formats or no format, the y-axis range values will appear in the currency format of the first value field. -The pivot chart in the following code sample can be seen as a single chart with multiple value fields such as **Sold** and **Amount** drawn as a single y-axis. +The following code sample shows a pivot chart with multiple value fields, such as **Sold** and **Amount**, displayed on a single y-axis. ```cshtml @using Syncfusion.Blazor.PivotView @@ -1075,12 +1044,11 @@ The pivot chart in the following code sample can be seen as a single chart with ![Multiple axis mode set to combined in Blazor Pivot Chart](images/blazor-pivotchart-multiple-axis-Combined-mode.png) - ### Show point color based on members -When multiple axes are enabled, you can display the same color for each member in the column axis by setting the [ShowPointColorByMembers](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotChartSettings.html#Syncfusion_Blazor_PivotView_PivotChartSettings_ShowPointColorByMembers) property to **true** in the [PivotChartSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotChartSettings.html). As a result, the end user can easily identify each member across different measures in the entire chart. +When you enable multiple axes in the pivot chart, you can use the [ShowPointColorByMembers](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotChartSettings.html#Syncfusion_Blazor_PivotView_PivotChartSettings_ShowPointColorByMembers) property in the [PivotChartSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotChartSettings.html) class to display the same color for each member on the column axis across all measures. Setting this property to **true** makes it easy for users to spot and compare each member throughout the entire chart. -Furthermore, end user can see or hide specific members across different measures in the entire chart with a single click on the legend item. +In addition, users can show or hide specific members from all measures in the chart by clicking the corresponding legend item. This interaction allows users to focus on the members they want to analyze without distraction. ```cshtml @using Syncfusion.Blazor.PivotView @@ -1124,35 +1092,33 @@ Furthermore, end user can see or hide specific members across different measures ## Series Customization -User can customize series of the pivot chart using [PivotChartSeries](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotChartSettings.html#Syncfusion_Blazor_PivotView_PivotChartSettings_ChartSeries) in [PivotChartSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotChartSettings.html) class. The changes handled in the property will be reflected commonly in all chart series. +You can customize the series in the pivot chart by using the [PivotChartSeries](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotChartSettings.html#Syncfusion_Blazor_PivotView_PivotChartSettings_ChartSeries) property inside [PivotChartSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotChartSettings.html) class. Any changes you make to the [PivotChartSeries](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotChartSettings.html#Syncfusion_Blazor_PivotView_PivotChartSettings_ChartSeries) property will apply to all series in the chart. ```cshtml @using Syncfusion.Blazor.PivotView - - - - - - - - - - - - - - - - - - - - @* Other major options are: *@ - @* *@ - @* *@ - - + +   +         +             +             +         +         +             +             +         +         + +             +         +         +             +         +     + + + + @code{ @@ -1163,70 +1129,67 @@ User can customize series of the pivot chart using [PivotChartSeries](https://he //Bind the data source collection here. Refer "Assigning sample data to the pivot table" section in getting started for more details. } } - ``` ![Blazor Pivot Chart with Custom Series](images/blazor-pivotchart-custom-series.png) ## Data Label Customization -You can customize data label of the pivot chart markers in terms of angle, alignment, border, color, margin, position, visibility, and more using [PivotChartMarkerDataLabel](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotChartMarkerSettings.html#Syncfusion_Blazor_PivotView_PivotChartMarkerSettings_DataLabel) in [PivotChartMarkerSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotChartSeries.html#Syncfusion_Blazor_PivotView_PivotChartSeries_Marker) class. The changes handled in the property will be reflected commonly in all chart series. +Users can adjust data labels in the pivot chart using the [PivotChartMarkerDataLabel](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotChartMarkerSettings.html#Syncfusion_Blazor_PivotView_PivotChartMarkerSettings_DataLabel) class in [PivotChartMarkerSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotChartSeries.html#Syncfusion_Blazor_PivotView_PivotChartSeries_Marker). Options include changing the angle, alignment, border, color, margin, position, and visibility. These settings apply to all chart series, as shown in the example below. ```cshtml - @using Syncfusion.Blazor.PivotView +@using Syncfusion.Blazor.PivotView - - - -      - - - - - - - - - - - - - - -      - - - - - - - - - - - - - - - - + + + +      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - @code{ - public List data { get; set; } - protected override void OnInitialized() - { - this.data = ProductDetails.GetProductData().ToList(); - //Bind the data source collection here. Refer "Assigning sample data to the pivot table" section in getting started for more details. - } +@code{ + public List data { get; set; } + protected override void OnInitialized() + { + this.data = ProductDetails.GetProductData().ToList(); + //Bind the data source collection here. Refer "Assigning sample data to the pivot table" section in getting started for more details. } - +} ``` -![Blazor Pivot Chart with Custom Data Label](images/blazor-pivotchart-custom-data-label.png) +![Blazor Pivot Chart with custom data label](images/blazor-pivotchart-custom-data-label.png) ## Data Label Template -The [Template](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotChartMarkerDataLabel.html#Syncfusion_Blazor_PivotView_PivotChartMarkerDataLabel_Template) property in the [PivotChartMarkerDataLabel](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotChartMarkerDataLabel.html) allows you to customize the appearance of data labels in the pivot chart series by using your own HTML elements for displaying the desired UI. The parameter named [ChartDataPointInfo](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Charts.ChartDataPointInfo.html) is always passed in as a context within the template, allowing it to access the data points such as x and y and display the associated data point within a customized UI, as shown in the code example below. +The [Template](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotChartMarkerDataLabel.html#Syncfusion_Blazor_PivotView_PivotChartMarkerDataLabel_Template) property in the [PivotChartMarkerDataLabel](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotChartMarkerDataLabel.html) class allows users to change the appearance of data labels in the pivot chart series using custom HTML elements. The [ChartDataPointInfo](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Charts.ChartDataPointInfo.html) parameter provides access to data points like x and y, enabling a custom display, as shown below. ```cshtml @using Syncfusion.Blazor.PivotView @@ -1283,16 +1246,17 @@ The [Template](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView //Bind the data source collection here. Refer "Assigning sample data to the pivot table" section in getting started for more details. } } - ``` ![Blazor Pivot Chart with data label customization using template](images/blazor-pivotChart-dataLabel-customized-by-template.png) ## Axis Customization -User can customize axis of the pivot chart using [PivotChartPrimaryXAxis](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotChartPrimaryXAxis.html) and [PivotChartPrimaryYAxis](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotChartPrimaryYAxis.html) properties in [PivotChartSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotChartSettings.html) class. +Users can customize the x-axis and y-axis of the pivot chart using the [PivotChartPrimaryXAxis](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotChartPrimaryXAxis.html) and [PivotChartPrimaryYAxis](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotChartPrimaryYAxis.html) options in the [PivotChartSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotChartSettings.html) class. -N> Axis customization is not applicable for the accumulation chart types like pie, doughnut, pyramid, and funnel. +N> Please note that axis customization is not supported for accumulation chart types, such as pie, doughnut, pyramid, and funnel. + +For example, in the sample below, the titles for the y-axis and x-axis are set to custom values. ```cshtml @using Syncfusion.Blazor.PivotView @@ -1329,40 +1293,39 @@ N> Axis customization is not applicable for the accumulation chart types like pi //Bind the data source collection here. Refer "Assigning sample data to the pivot table" section in getting started for more details. } } - ``` ![Blazor Pivot Chart with Custom Axis](images/blazor-pivotchart-custom-axis.png) ## Legend Customization -User can customize legend using [PivotChartLegendSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotChartLegendSettings.html) in [PivotChartSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotChartSettings.html) class. By default, legend will be visible and it can be hidden by setting the property [Visible](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotChartLegendSettings.html#Syncfusion_Blazor_PivotView_PivotChartLegendSettings_Visible) in [PivotChartLegendSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotChartLegendSettings.html) class as **false**. +Users can easily change the legend in the pivot chart by using the [PivotChartLegendSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotChartLegendSettings.html) option inside the [PivotChartSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotChartSettings.html) class. By default, the legend is shown. If you want to hide it, set the [Visible](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotChartLegendSettings.html#Syncfusion_Blazor_PivotView_PivotChartLegendSettings_Visible) property in [PivotChartLegendSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotChartLegendSettings.html) to **false**. -The pivot chart support different types of legend shapes as follows, +The pivot chart allows users to select from various legend shapes, including: -* Circle -* Rectangle -* VerticalLine -* Pentagon -* InvertedTriangle -* SeriesType -* Triangle -* Diamond -* Cross -* HorizontalLine +- Circle +- Rectangle +- VerticalLine +- Pentagon +- InvertedTriangle +- SeriesType (default) +- Triangle +- Diamond +- Cross +- HorizontalLine -Here [PivotChartLegendShape.SeriesType](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotChartLegendShape.html) would act as the default shape and it can be changed using the property [LegendShape](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotChartSeries.html#Syncfusion_Blazor_PivotView_PivotChartSeries_LegendShape) in [PivotChartSeries](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotChartSeries.html) class. +The default shape for the legend is **SeriesType**, but you can change it by setting the [LegendShape](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotChartSeries.html#Syncfusion_Blazor_PivotView_PivotChartSeries_LegendShape) property in [PivotChartSeries](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotChartSeries.html). -Also user can set the position of the legend in pivot chart using the property [Position](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotChartLegendSettings.html#Syncfusion_Blazor_PivotView_PivotChartLegendSettings_Position) in [PivotChartLegendSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotChartLegendSettings.html) class. The available options to set the legend position are as follows, +Users can also choose where the legend appears in the pivot chart by setting the [Position](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotChartLegendSettings.html#Syncfusion_Blazor_PivotView_PivotChartLegendSettings_Position) property in [PivotChartLegendSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotChartLegendSettings.html). The available positions include: -* Auto: Places the legend based on area type. This is the default. -* Top: Displays the legend at the top of the pivot chart. -* Left: Displays the legend at the left of the pivot chart. -* Bottom: Displays the legend at the bottom of the pivot chart. -* Right: Displays the legend at the right of the pivot chart. -* Custom: Displays the legend based on the given x and y values. +- **Auto**: Places the legend based on the chart area (default). +- **Top**: Shows the legend above the pivot chart. +- **Left**: Displays the legend to the left of the chart. +- **Bottom**: Places the legend below the chart. +- **Right**: Shows the legend on the right side. +- **Custom**: Positions the legend using specific x and y values you provide. -N> By default, the legend is not visible for the accumulation chart types like pie, doughnut, pyramid, and funnel. +N> Legends are not shown by default for accumulation charts such as pie, doughnut, pyramid, and funnel. ```cshtml @using Syncfusion.Blazor.PivotView @@ -1397,7 +1360,6 @@ N> By default, the legend is not visible for the accumulation chart types like p //Bind the data source collection here. Refer "Assigning sample data to the pivot table" section in getting started for more details. } } - ``` ![Blazor Pivot Chart with Pentagon Legend](images/blazor-pivotchart-pentagon-legend.png) @@ -1406,11 +1368,11 @@ N> By default, the legend is not visible for the accumulation chart types like p ### Marker and CrossHair -User can enable and customize the marker and crosshair using [PivotChartMarkerSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotChartMarkerSettings.html) and [PivotChartCrosshairSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotChartCrosshairSettings.html) properties in [PivotChartSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotChartSettings.html) class respectively. +You can show and customize markers and crosshair's on the pivot chart. To do this, use the [PivotChartMarkerSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotChartMarkerSettings.html) and [PivotChartCrosshairSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotChartCrosshairSettings.html) options within the [PivotChartSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotChartSettings.html) class. -Also user can enable and customize the crosshair tooltip for axes using [PivotChartPrimaryXAxisCrosshairTooltip](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotChartPrimaryXAxisCrosshairTooltip.html) and [PivotChartPrimaryYAxisCrosshairTooltip](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotChartPrimaryYAxisCrosshairTooltip.html) classes. +If you want to display a tooltip when hovering over an axis crosshair, use the [PivotChartPrimaryXAxisCrosshairTooltip](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotChartPrimaryXAxisCrosshairTooltip.html) and [PivotChartPrimaryYAxisCrosshairTooltip](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotChartPrimaryYAxisCrosshairTooltip.html) options. -N> Marker and crosshair is not applicable for the accumulation chart types like pie, doughnut, pyramid, and funnel. +N> Please note, marker and crosshair options do not work with accumulation chart types, such as pie, doughnut, pyramid, or funnel. ```cshtml @using Syncfusion.Blazor.PivotView @@ -1430,17 +1392,8 @@ N> Marker and crosshair is not applicable for the accumulation chart types like               - - - - - - - - - - - + + @@ -1452,31 +1405,28 @@ N> Marker and crosshair is not applicable for the accumulation chart types like //Bind the data source collection here. Refer "Assigning sample data to the pivot table" section in getting started for more details. } } - ``` ![Blazor Pivot Chart with Marker and Crosshair](images/blazor-pivotchart-marker-crosshair.png) ### Zooming and Panning -User can customize zooming and panning option using the property [PivotChartZoomSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotChartZoomSettings.html) in [PivotChartSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotChartSettings.html) class. - -The pivot chart support four types of zooming which can be set as follows, +Users can customize the zooming and panning options in the pivot chart by using the [PivotChartZoomSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotChartZoomSettings.html) property within [PivotChartSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotChartSettings.html) class. The pivot chart supports four zooming options: -* [EnablePinchZooming](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotChartZoomSettings.html#Syncfusion_Blazor_PivotView_PivotChartZoomSettings_EnablePinchZooming) -* [EnableSelectionZooming](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotChartZoomSettings.html#Syncfusion_Blazor_PivotView_PivotChartZoomSettings_EnableSelectionZooming) -* [EnableDeferredZooming](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotChartZoomSettings.html#Syncfusion_Blazor_PivotView_PivotChartZoomSettings_EnableDeferredZooming) -* [EnableMouseWheelZooming](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotChartZoomSettings.html#Syncfusion_Blazor_PivotView_PivotChartZoomSettings_EnableMouseWheelZooming) +- [EnablePinchZooming](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotChartZoomSettings.html#Syncfusion_Blazor_PivotView_PivotChartZoomSettings_EnablePinchZooming) – Zooms by pinching on touch devices. +- [EnableSelectionZooming](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotChartZoomSettings.html#Syncfusion_Blazor_PivotView_PivotChartZoomSettings_EnableSelectionZooming) – Zooms into a selected region on the chart. +- [EnableDeferredZooming](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotChartZoomSettings.html#Syncfusion_Blazor_PivotView_PivotChartZoomSettings_EnableDeferredZooming) – Applies zooming only after the selection is complete, which helps improve performance for large data. +- [EnableMouseWheelZooming](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotChartZoomSettings.html#Syncfusion_Blazor_PivotView_PivotChartZoomSettings_EnableMouseWheelZooming) – Zooms using the mouse wheel. -Three modes of zooming direction specifies whether to zoom vertically or horizontally or in both ways and they are, +The direction of zooming can be controlled using the [Mode](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotChartZoomSettings.html#Syncfusion_Blazor_PivotView_PivotChartZoomSettings_Mode) property in [PivotChartZoomSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotChartZoomSettings.html). The available options are: -* x: Pivot chart can be zoomed horizontally. -* y: Pivot chart can be zoomed vertically. -* x,y: Pivot chart can be zoomed both vertically and horizontally. +- `x`: zooms horizontally, +- `y`: zooms vertically, +- `x,y`: zooms both horizontally and vertically. -This can be set using the property [Mode](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotChartZoomSettings.html#Syncfusion_Blazor_PivotView_PivotChartZoomSettings_Mode) in [PivotChartZoomSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotChartZoomSettings.html) class. By default, if the pivot chart is zoomed, a toolbar would display with the options - Zoom, ZoomIn, ZoomOut, Pan, and Reset. User can also customize its option using the property [ToolbarItems](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotChartZoomSettings.html#Syncfusion_Blazor_PivotView_PivotChartZoomSettings_ToolbarItems) in [PivotChartZoomSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotChartZoomSettings.html#Syncfusion_Blazor_PivotView_PivotChartZoomSettings_ToolbarItems) class. +When the pivot chart is zoomed, a toolbar appears at the top of the chart with tools for Zoom, Zoom In, Zoom Out, Pan, and Reset actions. This toolbar can be customized using the [ToolbarItems](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotChartZoomSettings.html#Syncfusion_Blazor_PivotView_PivotChartZoomSettings_ToolbarItems) property in [PivotChartZoomSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotChartZoomSettings.html). -N> Zooming and panning is not applicable for the accumulation chart types like pie, doughnut, pyramid, and funnel. +N> Zooming and panning are not available for accumulation chart types, such as pie, doughnut, pyramid, and funnel. ```cshtml @using Syncfusion.Blazor.PivotView @@ -1525,9 +1475,9 @@ N> Zooming and panning is not applicable for the accumulation chart types like p ### Tooltip -By default, tooltip for the pivot chart is enabled. User can customize it by using the property [PivotChartTooltipSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotChartTooltipSettings.html) in [PivotChartSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotChartSettings.html) class. +The tooltip in the Pivot Chart is enabled by default, showing detailed information about each data point when users move the pointer over the chart. Users can change how the tooltip looks and functions by using the [PivotChartTooltipSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotChartTooltipSettings.html) option inside the [PivotChartSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotChartSettings.html) class. -N> The tooltip can be disabled by setting the property [Enable](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotChartTooltipSettings.html#Syncfusion_Blazor_PivotView_PivotChartTooltipSettings_Enable) in [PivotChartTooltipSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotChartTooltipSettings.html) class as **false**. +If users do not want to show the tooltip, they can disable it by setting the [Enable](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotChartTooltipSettings.html#Syncfusion_Blazor_PivotView_PivotChartTooltipSettings_Enable) property in [PivotChartTooltipSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotChartTooltipSettings.html) to **false**. ```cshtml @using Syncfusion.Blazor.PivotView @@ -1570,16 +1520,20 @@ N> The tooltip can be disabled by setting the property [Enable](https://help.syn ## Export -The pivot chart can be exported using the [ExportToChartAsync](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SfPivotView-1.html#Syncfusion_Blazor_PivotView_SfPivotView_1_ExportToChartAsync_Syncfusion_Blazor_Charts_ExportType_System_String_System_Nullable_Syncfusion_PdfExport_PdfPageOrientation__System_Nullable_System_Boolean__) method which holds parameters like export type, file name, PDF orientation, and base64 string in the same order. The mandatory parameters for this method are export type and file name whereas other parameters are optional. +You can export the pivot chart to various file formats by using the [ExportToChartAsync](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SfPivotView-1.html#Syncfusion_Blazor_PivotView_SfPivotView_1_ExportToChartAsync_Syncfusion_Blazor_Charts_ExportType_System_String_System_Nullable_Syncfusion_PdfExport_PdfPageOrientation__System_Nullable_System_Boolean__) method. This method requires the `type` parameter, which specifies the file format. The supported export formats are: + +- PNG +- JPEG +- SVG +- PDF -The following are the four export types: +Other parameters for the [ExportToChartAsync](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SfPivotView-1.html#Syncfusion_Blazor_PivotView_SfPivotView_1_ExportToChartAsync_Syncfusion_Blazor_Charts_ExportType_System_String_System_Nullable_Syncfusion_PdfExport_PdfPageOrientation__System_Nullable_System_Boolean__) method include: -* PNG -* JPEG -* SVG -* PDF +- `fileName`: Specifies the file name for the exported file. The default export file name is "PivotChart". +- `orientation`: Specifies the portrait or landscape orientation of the page. +- `asBase64`: Specify whether to obtain the chart image as a base64 string or not. -In the following code sample, exporting can be done using an external button named as "Chart Export". +The example below shows how to export the pivot chart using an external button labeled "Chart Export": ```cshtml @using Syncfusion.Blazor.PivotView @@ -1625,16 +1579,15 @@ In the following code sample, exporting can be done using an external button nam //this.pivot.ExportToChartAsync(Syncfusion.Blazor.Charts.ExportType.JPEG, "sample"); } } - ``` ![Blazor Pivot Chart with PDF Export](images/blazor-pivotchart-pdf-export.png) ## Print -The rendered pivot chart can be printed directly from the browser by calling [PrintChart](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SfPivotView-1.html#Syncfusion_Blazor_PivotView_SfPivotView_1_PrintChart) method. +You can print the current view of the pivot chart directly from the browser by using the [PrintChart](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SfPivotView-1.html#Syncfusion_Blazor_PivotView_SfPivotView_1_PrintChart) method. This allows you to create a physical or digital copy of your pivot chart as displayed on the screen. -In the following code sample, printing can be done using an external button named as "Print Chart". +In the example below, clicking an external button labeled "Print Chart" calls the [PrintChart](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SfPivotView-1.html#Syncfusion_Blazor_PivotView_SfPivotView_1_PrintChart) method and prints the rendered pivot chart. ```cshtml @using Syncfusion.Blazor.PivotView @@ -1678,7 +1631,6 @@ In the following code sample, printing can be done using an external button name this.pivot.PrintChart(); } } - ``` ![Printing in Blazor Pivot Chart](images/blazor-pivotchart-printing.png) diff --git a/blazor/pivot-table/row-and-column.md b/blazor/pivot-table/row-and-column.md index da821e307f..67d904fe0a 100644 --- a/blazor/pivot-table/row-and-column.md +++ b/blazor/pivot-table/row-and-column.md @@ -18,34 +18,38 @@ To learn about how to use the row and column options effectively in the Blazor P ## Width and Height -Allows end user to set the pivot table's height and width by using [Height](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewGridSettings.html#Syncfusion_Blazor_PivotView_PivotViewGridSettings_Height) and [Width](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewGridSettings.html#Syncfusion_Blazor_PivotView_PivotViewGridSettings_Width) properties in [SfPivotView](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SfPivotView-1.html) class respectively. The supported formats to set [Height](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewGridSettings.html#Syncfusion_Blazor_PivotView_PivotViewGridSettings_Height) and [Width](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewGridSettings.html#Syncfusion_Blazor_PivotView_PivotViewGridSettings_Width) properties are, +Setting appropriate dimensions for the Pivot Table ensures optimal display and better user experience across different screen sizes and layouts. You can define the Pivot Table's dimensions using the [Height](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SfPivotView-1.html#Syncfusion_Blazor_PivotView_SfPivotView_1_Height) and [Width](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SfPivotView-1.html#Syncfusion_Blazor_PivotView_SfPivotView_1_Width) properties in [SfPivotView](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SfPivotView-1.html) class to meet your specific requirements. -* Pixel: For example - 100, 200, "100px", "200px". -* Percentage: For example - "100%", "200%". -* Auto: For example - "auto". This is the default value. It takes 100% of parent container's size to fit the pivot table component inside it. +These dimension properties support multiple formats to accommodate various layout scenarios and provide flexibility in how you define the component's size: -N> The pivot table will not be displayed less than **400px**, since it's the minimum width of the component. +**Supported formats:** + +* **Pixel**: Specify exact dimensions using numeric values or pixel units. For example: `100`, `200`, `"100px"`, or `"200px"`. +* **Percentage**: Set dimensions relative to the parent container. For example: `"100%"` or `"200%"`. +* **Auto**: This option is available only for the [Height](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SfPivotView-1.html#Syncfusion_Blazor_PivotView_SfPivotView_1_Height) property. When set to **auto**, the Pivot Table expands beyond its parent container height without showing a vertical scrollbar within the component. Instead, the parent container displays its vertical scrollbar once the component exceeds its boundaries. + +N> The Pivot Table maintains a minimum width of **400px** to ensure proper display and functionality, even if a smaller width is specified. ```cshtml @using Syncfusion.Blazor.PivotView -     -             -             -         -         -             -             -         -         -             -         - + + + + + + + + + + + + -     + @code{ @@ -56,17 +60,15 @@ N> The pivot table will not be displayed less than **400px**, since it's the min //Bind the data source collection here. Refer "Assigning sample data to the pivot table" section in getting started for more details. } } - ``` ![Setting Height and Width in Blazor PivotTable](images/blazor-pivottable-set-height-width.png) ## Row Height -Allows end user to set the height of each pivot table rows commonly using the [RowHeight](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewGridSettings.html#Syncfusion_Blazor_PivotView_PivotViewGridSettings_RowHeight) property in [PivotViewGridSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewGridSettings.html) class. +Adjusting the row height in the Pivot Table helps make your data easier to view and interact with, especially when there are many rows or large amounts of content. To make these adjustments, you can use the [RowHeight](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewGridSettings.html#Syncfusion_Blazor_PivotView_PivotViewGridSettings_RowHeight) property within the [PivotViewGridSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewGridSettings.html) class. This property allows you to control how much space each row occupies, so the Pivot Table remains clear and readable according to your needs. -N> By default, the [RowHeight](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewGridSettings.html#Syncfusion_Blazor_PivotView_PivotViewGridSettings_RowHeight) property is set as **30** pixels for desktop layout and **36** pixels for mobile layout. -
    The height of the column headers alone may vary when grouping bar feature is enabled. +N> By default, the [RowHeight](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewGridSettings.html#Syncfusion_Blazor_PivotView_PivotViewGridSettings_RowHeight) is set to **36** pixels for desktop layouts and **48** pixels for mobile layouts. However, if you enable the grouping bar option, note that only the column header height may change, while the rest of the rows maintain the specified height. In the following code sample, the [RowHeight](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewGridSettings.html#Syncfusion_Blazor_PivotView_PivotViewGridSettings_RowHeight) property is set as **60** pixels. @@ -75,21 +77,21 @@ In the following code sample, the [RowHeight](https://help.syncfusion.com/cr/bla -     -             -             -         -         -             -             -         -         -             -         + + + + + + + + + + + -     + @@ -101,16 +103,15 @@ In the following code sample, the [RowHeight](https://help.syncfusion.com/cr/bla //Bind the data source collection here. Refer "Assigning sample data to the pivot table" section in getting started for more details. } } - ``` ![Changing Row Height in Blazor PivotTable](images/blazor-pivottable-change-row-height.png) ## Column Width -Allows end user to set the width of each pivot table columns commonly using the [ColumnWidth](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewGridSettings.html#Syncfusion_Blazor_PivotView_PivotViewGridSettings_ColumnWidth) property in [PivotViewGridSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewGridSettings.html) class. +Controlling the width of columns allows users to view their data in the Pivot Table more clearly, making each column easy to read and ensuring that information is not cut off. To achieve this, you can use the [ColumnWidth](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewGridSettings.html#Syncfusion_Blazor_PivotView_PivotViewGridSettings_ColumnWidth) property, which is available under the [PivotViewGridSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewGridSettings.html) class. -N> By default, the [ColumnWidth](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewGridSettings.html#Syncfusion_Blazor_PivotView_PivotViewGridSettings_ColumnWidth) property is set as **110** pixels to each columns except the first column. For first column, **250** pixels and **200** pixels are set respectively with and without grouping bar. +N> By default, the [ColumnWidth](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewGridSettings.html#Syncfusion_Blazor_PivotView_PivotViewGridSettings_ColumnWidth) is set to **110** pixels for all columns except the first one. The first column is assigned a width of **250** pixels if the grouping bar is enabled, or **200** pixels when it is not. This ensures that the data in the row header is always easily visible. In the following example, the [ColumnWidth](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewGridSettings.html#Syncfusion_Blazor_PivotView_PivotViewGridSettings_ColumnWidth) property is set as **200** pixels. @@ -119,21 +120,21 @@ In the following example, the [ColumnWidth](https://help.syncfusion.com/cr/blazo -     -             -             -         -         -             -             -         -         -             -         - + + + + + + + + + + + + -     + @@ -145,14 +146,13 @@ In the following example, the [ColumnWidth](https://help.syncfusion.com/cr/blazo //Bind the data source collection here. Refer "Assigning sample data to the pivot table" section in getting started for more details. } } - ``` ![Changing Column Width in Blazor PivotTable](images/blazor-pivottable-change-column-width.png) ### Adjust width based on columns -By default, if the component width set in code-behind is more than the width of the total columns, then the columns will be stretched to make it fit. To avoid the stretching, set the [AutoFit](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewGridSettings.html#Syncfusion_Blazor_PivotView_PivotViewGridSettings_AutoFit) property in the [PivotViewGridSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewGridSettings.html) to **false**. By doing so, the component will be adjusted based on the width of total columns. +By default, when the component width exceeds the total width of all columns, the columns are automatically stretched to fill the available space. To prevent this stretching behavior, set the [AutoFit](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewGridSettings.html#Syncfusion_Blazor_PivotView_PivotViewGridSettings_AutoFit) property in the [PivotViewGridSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewGridSettings.html) class to **false**. This ensures that the Pivot Table adjusts its overall width to match the combined width of all columns, maintaining their original proportions and improving data readability. ```cshtml @using Syncfusion.Blazor.PivotView @@ -184,36 +184,37 @@ By default, if the component width set in code-behind is more than the width of //Bind the data source collection here. Refer "Assigning sample data to the pivot table" section in getting started for more details. } } - ``` ![AutoFit Column in Blazor PivotTable](images/blazor-pivottable-autofit-column.png) ## Reorder -Allows end user to reorder a particular column header from one index to another index within the pivot table through drag-and-drop option. It can be enabled by setting the [AllowReordering](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewGridSettings.html#Syncfusion_Blazor_PivotView_PivotViewGridSettings_AllowReordering) property in [PivotViewGridSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewGridSettings.html) class to **true**. +The reorder option provides users with the flexibility to reorganize column headers within the Pivot Table by dragging and dropping them to different positions. This allows users to customize the layout of their data for better analysis and presentation. + +To enable this option, set the [AllowReordering](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewGridSettings.html#Syncfusion_Blazor_PivotView_PivotViewGridSettings_AllowReordering) property in [PivotViewGridSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewGridSettings.html) class to **true**. Once enabled, users can simply click and drag any column header to move it to their desired position within the table. ```cshtml @using Syncfusion.Blazor.PivotView -     -             -             -         -         -             -             -         -         -             -         - + + + + + + + + + + + + -     - + + @code{ @@ -224,36 +225,36 @@ Allows end user to reorder a particular column header from one index to another //Bind the data source collection here. Refer "Assigning sample data to the pivot table" section in getting started for more details. } } - ``` ![Reordering Specific Column in Blazor PivotTable](images/blazor-pivottable-reorder-specific-column.png) ## Column Resizing -Allows end user to resize the columns by clicking and dragging the right edge of the column header. While dragging, the width of the respective column will be resized immediately. To enable column resizing option, set the [AllowResizing](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewGridSettings.html#Syncfusion_Blazor_PivotView_PivotViewGridSettings_AllowResizing) property in [PivotViewGridSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewGridSettings.html) class to **true**. +Column resizing in the Pivot Table helps users adjust the column widths to better view and compare data. Users can easily resize columns by clicking and dragging the right edge of any column header. As the user drags, the column’s width is updated immediately, offering a responsive and comfortable viewing experience. + +This option is enabled by default. To control column resizing, set the [AllowResizing](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewGridSettings.html#Syncfusion_Blazor_PivotView_PivotViewGridSettings_AllowResizing) property in [PivotViewGridSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewGridSettings.html) class to **true** or **false** as needed. -N> By default, the column resizing option is enabled. -
    In RTL mode, user can click and drag the left edge of the header cell to resize the column. +N> In right-to-left (RTL) mode, users should click and drag the left edge of the header cell to resize the column. ```cshtml @using Syncfusion.Blazor.PivotView -     -             -             -         -         -             -             -         -         -             -         -     - + + + + + + + + + + + + + @code{ @@ -264,36 +265,35 @@ N> By default, the column resizing option is enabled. //Bind the data source collection here. Refer "Assigning sample data to the pivot table" section in getting started for more details. } } - ``` ![Column Resizing in Blazor PivotTable](images/blazor-pivottable-column-resizing.png) ## Text Wrap -Allows end user to wrap the cell content to the next line when it exceeds the boundary of the cell width. To enable text wrap, set the [AllowTextWrap](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewGridSettings.html#Syncfusion_Blazor_PivotView_PivotViewGridSettings_AllowTextWrap) property in [PivotViewGridSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewGridSettings.html) class to **true**. +The Pivot Table allows users to wrap cell content to the next line when the content exceeds the boundary of the cell width. To enable text wrap, set the [AllowTextWrap](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewGridSettings.html#Syncfusion_Blazor_PivotView_PivotViewGridSettings_AllowTextWrap) property in [PivotViewGridSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewGridSettings.html) class to **true**. ```cshtml @using Syncfusion.Blazor.PivotView -     -             -             -         -         -             -             -         -         -             -         - + + + + + + + + + + + + -     - + + @code{ @@ -304,43 +304,42 @@ Allows end user to wrap the cell content to the next line when it exceeds the bo //Bind the data source collection here. Refer "Assigning sample data to the pivot table" section in getting started for more details. } } - ``` ![Text Wrapping in Blazor PivotTable](images/blazor-pivottable-text-wrap.png) ## Text Align -Allows end user to align the content of the pivot table's row headers, column headers and value cells by using both [TextAlign](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridColumn.html#Syncfusion_Blazor_Grids_GridColumn_TextAlign) and [HeaderTextAlign](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridColumn.html#Syncfusion_Blazor_Grids_GridColumn_HeaderTextAlign) properties in the [BeforeColumnsRender](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewEvents-1.html#Syncfusion_Blazor_PivotView_PivotViewEvents_1_BeforeColumnsRender) event. The following alignments are: +Text alignment provides flexibility in positioning content within cells, making the data presentation more organized and visually appealing. You can align the content of the Pivot Table's row headers, column headers, and value cells using the [TextAlign](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridColumn.html#Syncfusion_Blazor_Grids_GridColumn_TextAlign) and [HeaderTextAlign](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridColumn.html#Syncfusion_Blazor_Grids_GridColumn_HeaderTextAlign) properties in the [BeforeColumnsRender](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewEvents-1.html#Syncfusion_Blazor_PivotView_PivotViewEvents_1_BeforeColumnsRender) event. The available alignment options are: -* [Left](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.TextAlign.html#Syncfusion_Blazor_Grids_TextAlign_Left) - It allows the content to be positioned on the left. -* [Right](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.TextAlign.html#Syncfusion_Blazor_Grids_TextAlign_Right) - It allows the content to be positioned on the right. -* [Center](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.TextAlign.html#Syncfusion_Blazor_Grids_TextAlign_Center) - It allows the content to be positioned in the middle. -* [Justify](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.TextAlign.html#Syncfusion_Blazor_Grids_TextAlign_Justify) - It allows the content to be as flexible as possible, when the cell does not occupy the entire available area. +* [Left](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.TextAlign.html#Syncfusion_Blazor_Grids_TextAlign_Left) - Positions the content on the left side of the cell. +* [Right](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.TextAlign.html#Syncfusion_Blazor_Grids_TextAlign_Right) - Positions the content on the right side of the cell. +* [Center](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.TextAlign.html#Syncfusion_Blazor_Grids_TextAlign_Center) - Positions the content in the center of the cell. +* [Justify](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.TextAlign.html#Syncfusion_Blazor_Grids_TextAlign_Justify) - Distributes the content evenly across the cell width for optimal space utilization. ```cshtml @using Syncfusion.Blazor.PivotView -     -             -             -         -         -             -             -         -         + + + + + + + + + -             -         - + + + -     - + + @code{ @@ -369,48 +368,47 @@ Allows end user to align the content of the pivot table's row headers, column he } } } - ``` ![Align text inside the Blazor Pivot Table cell](images/text-align.png) ## Grid Lines -Allows end user to display cell border for each cells using [GridLines](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewGridSettings.html#Syncfusion_Blazor_PivotView_PivotViewGridSettings_GridLines) property in [PivotViewGridSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewGridSettings.html) class. +The grid lines option provides visual structure to the Pivot Table by displaying cell borders, making it easier for users to read and analyze data. You can control the display of grid lines using the [GridLines](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewGridSettings.html#Syncfusion_Blazor_PivotView_PivotViewGridSettings_GridLines) property within the [PivotViewGridSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewGridSettings.html) class. -Available mode of grid lines are: +The following grid line modes are available: -| Modes | Actions | -|-------|---------| -| Both | Displays both the horizontal and vertical grid lines.| -| None | No grid lines are displayed.| -| Horizontal | Displays the horizontal grid lines only.| -| Vertical | Displays the vertical grid lines only.| -| Default | Displays grid lines based on the theme.| +| Mode | Description | +|------|-------------| +| Both | Shows both horizontal and vertical grid lines around each cell | +| None | Hides all grid lines for a clean appearance | +| Horizontal | Shows only horizontal grid lines between rows | +| Vertical | Shows only vertical grid lines between columns | +| Default | Shows grid lines based on the applied theme settings | -N> By default, pivot table renders grid lines in [PivotGridLine.Both](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewGridSettings.html#Syncfusion_Blazor_PivotView_PivotViewGridSettings_GridLines) mode. +N> The Pivot Table displays grid lines in [PivotGridLine.Both](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotTableGridLine.html#Syncfusion_Blazor_PivotView_PivotTableGridLine_None) mode by default. ```cshtml @using Syncfusion.Blazor.PivotView -     -             -             -         -         -             -             -         -         -             -         - + + + + + + + + + + + + -     - + + @code{ @@ -421,44 +419,44 @@ N> By default, pivot table renders grid lines in [PivotGridLine.Both](https://he //Bind the data source collection here. Refer "Assigning sample data to the pivot table" section in getting started for more details. } } - ``` ![Grid lines in Blazor Pivot Table](images/blazor-pivotgrid-gridlines.png) ## Selection -Selection provides an option to highlight a row or a column or a cell. It can be done through simple mouse down or arrow keys. To enable selection in the pivot table, set the [AllowSelection](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewGridSettings.html#Syncfusion_Blazor_PivotView_PivotViewGridSettings_AllowSelection) property in [PivotViewGridSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewGridSettings.html) class to **true**. +Selection in the Pivot Table allows users to easily highlight rows, columns, or individual cells for better data focus and visualization. This makes it simple to compare and analyze specific data points within your table. -The pivot table supports two types of selection that can be set using [Type](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewSelectionSettings.html#Syncfusion_Blazor_PivotView_PivotViewSelectionSettings_Type) property in [PivotViewSelectionSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewSelectionSettings.html) class. The selection types are: +To enable selection, set the [AllowSelection](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewGridSettings.html#Syncfusion_Blazor_PivotView_PivotViewGridSettings_AllowSelection) property in [PivotViewGridSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewGridSettings.html) class to **true**. This allows users to select table elements using a mouse click or arrow keys. -* [PivotSelectionType.Single](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotTableSelectionType.html): It is set by default, and it only allows selection of a single row or a column or a cell. -* [PivotSelectionType.Multiple](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotTableSelectionType.html): Allows you to select multiple rows or columns or cells. -To perform multi-selection, press and hold "CTRL" key and click the desired rows or cells. To select range of rows or cells, press and hold the "SHIFT" key and click the rows or columns or cells. +The Pivot Table provides two selection modes, controlled by the [Type](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewSelectionSettings.html#Syncfusion_Blazor_PivotView_PivotViewSelectionSettings_Type) property in [PivotViewSelectionSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewSelectionSettings.html) class: + +* [PivotSelectionType.Single](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotTableSelectionType.html#Syncfusion_Blazor_PivotView_PivotTableSelectionType_Single): Allows you to select only one row, column, or cell at a time. This is the default mode. +* [PivotSelectionType.Multiple](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotTableSelectionType.html#Syncfusion_Blazor_PivotView_PivotTableSelectionType_Multiple): Lets you select several rows, columns, or cells. To select multiple items, hold down the "CTRL" key and click the rows or cells you wish to select. To select a range, hold the "SHIFT" key and click the first and last item in the range. ```cshtml @using Syncfusion.Blazor.PivotView -     -             -             -         -         -             -             -         -         -             -         - + + + + + + + + + + + + -     - - - + + + + @code{ @@ -469,43 +467,44 @@ To perform multi-selection, press and hold "CTRL" key and click the desired rows //Bind the data source collection here. Refer "Assigning sample data to the pivot table" section in getting started for more details. } } - ``` ![Selection in Blazor PivotTable](images/blazor-pivottable-selection.png) ### Selection Mode -The pivot table supports four types of selection mode that can be set using [Mode](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewSelectionSettings.html#Syncfusion_Blazor_PivotView_PivotViewSelectionSettings_Mode) in [PivotViewSelectionSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewSelectionSettings.html) class. The selection modes are: +You can choose how selection works by setting the [Mode](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewSelectionSettings.html#Syncfusion_Blazor_PivotView_PivotViewSelectionSettings_Mode) property within the [PivotViewSelectionSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewSelectionSettings.html) class. The Pivot Table offers four simple options for selection mode: -* [SelectionMode.Row](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SelectionMode.html): It is set by default, and allows user to select only rows. -* [SelectionMode.Column](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SelectionMode.html): Allows user to select only columns. -* [SelectionMode.Cell](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SelectionMode.html): Allows user to select only cells. -* [SelectionMode.Both](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SelectionMode.html): Allows user to select rows and columns at the same time. +* [SelectionMode.Row](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SelectionMode.html#Syncfusion_Blazor_PivotView_SelectionMode_Row): This is the default mode. It lets the user select an entire row with a single click. +* [SelectionMode.Column](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SelectionMode.html#Syncfusion_Blazor_PivotView_SelectionMode_Column): In this mode, only entire columns can be selected. +* [SelectionMode.Cell](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SelectionMode.html#Syncfusion_Blazor_PivotView_SelectionMode_Cell): This mode allows the user to select one or more individual cells. +* [SelectionMode.Both](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SelectionMode.html#Syncfusion_Blazor_PivotView_SelectionMode_Both): This option lets users select both rows and columns at the same time, providing more flexibility. + +By choosing the right selection mode, users can quickly highlight and review the data that matters most to them. ```cshtml @using Syncfusion.Blazor.PivotView -     -             -             -         -         -             -             -         -         -             -         - + + + + + + + + + + + + -     - - - + + + + @code{ @@ -516,41 +515,44 @@ The pivot table supports four types of selection mode that can be set using [Mod //Bind the data source collection here. Refer "Assigning sample data to the pivot table" section in getting started for more details. } } - ``` ![Blazor PivotTable with Row and Column Selection](images/blazor-pivottable-row-column-selection.png) ### Cell Selection Mode -The pivot table supports two types of cell selection mode that can be set using [PivotCellSelectionMode](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewSelectionSettings.html#Syncfusion_Blazor_PivotView_PivotViewSelectionSettings_CellSelectionMode) in [PivotViewSelectionSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewSelectionSettings.html) class. The cell selection modes are: +To set the cell selection mode, use the [PivotCellSelectionMode](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewSelectionSettings.html#Syncfusion_Blazor_PivotView_PivotViewSelectionSettings_CellSelectionMode) option within the [PivotViewSelectionSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewSelectionSettings.html) class. The available modes are: + +* [PivotCellSelectionMode.Flow](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotCellSelectionMode.html#Syncfusion_Blazor_PivotView_PivotCellSelectionMode_Flow): Selects a continuous range of cells from the starting cell to the ending cell, including all rows in between. +* [PivotCellSelectionMode.Box](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotCellSelectionMode.html#Syncfusion_Blazor_PivotView_PivotCellSelectionMode_Box): Selects a rectangular block of cells that spans from the starting cell to the ending cell, covering all intermediate rows and columns within the range. -* [PivotCellSelectionMode.Flow](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotCellSelectionMode.html): It is set by default. The range of cells are selected between the start index and end index that includes in-between cells of rows. -* [PivotCellSelectionMode.Box](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotCellSelectionMode.html): Range of cells are selected from the start and end column indexes that includes in-between cells of rows within the range. +* [PivotCellSelectionMode.BoxWithBorder](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotCellSelectionMode.html#Syncfusion_Blazor_PivotView_PivotCellSelectionMode_BoxWithBorder): This mode works like Box mode but also highlights the selected cells with borders for better visibility. + +N> Cell selection requires [Mode](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewSelectionSettings.html#Syncfusion_Blazor_PivotView_PivotViewSelectionSettings_Mode) property in [PivotViewSelectionSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewSelectionSettings.html) class to be [SelectionMode.Cell](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SelectionMode.html#Syncfusion_Blazor_PivotView_SelectionMode_Cell) or [SelectionMode.Both](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SelectionMode.html#Syncfusion_Blazor_PivotView_SelectionMode_Both), and [Type](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewSelectionSettings.html#Syncfusion_Blazor_PivotView_PivotViewSelectionSettings_Type) property should be [PivotSelectionType.Multiple](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotTableSelectionType.html#Syncfusion_Blazor_PivotView_PivotTableSelectionType_Multiple). ```cshtml @using Syncfusion.Blazor.PivotView -     -             -             -         -         -             -             -         -         -             -         + + + + + + + + + + + -     - - - + + + + @code{ @@ -561,48 +563,45 @@ The pivot table supports two types of cell selection mode that can be set using //Bind the data source collection here. Refer "Assigning sample data to the pivot table" section in getting started for more details. } } - ``` -N> Cell selection requires [Mode](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewSelectionSettings.html#Syncfusion_Blazor_PivotView_PivotViewSelectionSettings_Mode) property in [PivotViewSelectionSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewSelectionSettings.html) class to be [SelectionMode.Cell](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SelectionMode.html) or [SelectionMode.Both](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SelectionMode.html), and [Type](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewSelectionSettings.html#Syncfusion_Blazor_PivotView_PivotViewSelectionSettings_Type) property should be [PivotSelectionType.Multiple](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotTableSelectionType.html). - ![Cell Selection in Blazor PivotTable](images/blazor-pivottable-cell-selection.png) ### Changing background color of the selected cell -The background-color of the selected cell can be changed using built-in CSS names. To do so, refer to the code sample below, which shows that the selected cells are changed to a **green yellow** color. +Highlighting selected cells in the Pivot Table with a different background color helps users quickly identify and focus on important data. To achieve this effect seamlessly, you can apply built-in CSS classes that customize the appearance of selected cells. + +In the example below, selected cells appear with a **green-yellow** background. Simply add the custom styles to your stylesheet, and they will be applied when you select a cell using the mouse or arrow keys. ```cshtml @using Syncfusion.Blazor.PivotView -     -             -             -         -         -             -             -         -         + + + + + + + + + -             -         -     - - - + + + + + + @code{ public List data { get; set; } @@ -612,63 +611,63 @@ background-color: greenYellow !important; //Bind the data source collection here. Refer "Assigning sample data to the pivot table" section in getting started for more details. } } - ``` ![Changing Cell Selection Background Color in Blazor PivotTable](images/blazor-pivottable-cell-selection-color.png) ### Event -The event `CellSelected` is triggered when cell selection gets completed. It provides selected cells information with its corresponding column and row headers. This event includes a parameter named [SelectedCellsInfo](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotCellSelectedEventArgs.html#Syncfusion_Blazor_PivotView_PivotCellSelectedEventArgs_SelectedCellsInfo). This event allows user to view selected cells information and user can pass those selected cells information to any external component for data binding. +#### CellSelected -```cshtml +When a user finishes selecting cells, the [CellSelected](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewEvents-1.html#Syncfusion_Blazor_PivotView_PivotViewEvents_1_CellSelected) event is triggered. This event provides details about the selected cells, including the related row and column headers. The event holds important parameters, including [SelectedCellsInfo](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotCellSelectedEventArgs.html#Syncfusion_Blazor_PivotView_PivotCellSelectedEventArgs_SelectedCellsInfo). Users can use this information to easily identify the selected data and share it with other parts of their application, such as for data binding or additional processing. +```cshtml @using Syncfusion.Blazor.PivotView

    @code{ @@ -684,41 +683,40 @@ The event `CellSelected` is triggered when cell selection gets completed. It pro //args.SelectedCellsInfo -> get selected cells information } } - ``` ![Displaying Selection Event Details in Blazor PivotTable](images/blazor-pivottable-selection-event-details.png) ## Clip Mode -The clip mode provides options to display its overflow cell content in the pivot table. It can be configured using the [ClipMode](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewGridSettings.html#Syncfusion_Blazor_PivotView_PivotViewGridSettings_ClipMode) property in [PivotViewGridSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewGridSettings.html) class. The pivot table supports three types of clip modes, +The clip mode option in the Pivot Table determines how cell content is displayed when it exceeds the cell’s boundaries. You can set this option using the [ClipMode](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewGridSettings.html#Syncfusion_Blazor_PivotView_PivotViewGridSettings_ClipMode) property within the [PivotViewGridSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewGridSettings.html) class. The Pivot Table provides the following clip mode options: -* [PivotClipMode.Clip](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotTableSelectionType.html): Truncates the cell content when it overflows its area. -* [PivotClipMode.Ellipsis](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotTableSelectionType.html): Displays ellipsis when the cell content overflows its area. -* [PivotClipMode.EllipsisWithTooltip](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotTableSelectionType.html): Displays ellipsis when the cell content overflows its area, also it will display the tooltip while hovering over the ellipsis. +* [PivotClipMode.Clip](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotTableClipMode.html#Syncfusion_Blazor_PivotView_PivotTableClipMode_Clip): Cuts off any part of the cell content that does not fit within the cell. +* [PivotClipMode.Ellipsis](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotTableClipMode.html#Syncfusion_Blazor_PivotView_PivotTableClipMode_Ellipsis): Shows an ellipsis (`...`) at the end of the cell if the content is too long to fit. +* [PivotClipMode.EllipsisWithTooltip](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotTableClipMode.html#Syncfusion_Blazor_PivotView_PivotTableClipMode_EllipsisWithTooltip): Shows an ellipsis (`...`) for overflowing content, and also displays the full content in a tooltip when the user hovers over the ellipsis. -N>By default, [ClipMode](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewGridSettings.html#Syncfusion_Blazor_PivotView_PivotViewGridSettings_ClipMode) value is set to [PivotClipMode.Ellipsis](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotTableSelectionType.html). +N> By default, the [ClipMode](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewGridSettings.html#Syncfusion_Blazor_PivotView_PivotViewGridSettings_ClipMode) property is set to [PivotClipMode.Ellipsis](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotTableClipMode.html#Syncfusion_Blazor_PivotView_PivotTableClipMode_Ellipsis). This helps users quickly identify when there is more content hidden and easily view the complete information by hovering over the cell. ```cshtml @using Syncfusion.Blazor.PivotView -     -             -             -         -         -             -             -         -         -             -         - + + + + + + + + + + + + -     + @@ -734,20 +732,18 @@ N>By default, [ClipMode](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor ![Blazor PivotTable with Clip Mode](images/blazor-pivottable-clip-mode.png) - ## Cell Template -You can customize the pivot table cell element by using the `CellTemplate` property in `PivotViewTemplates` class. The `CellTemplate` property accepts either an HTML string or the element's ID, which can be used to append additional HTML elements to showcase each cell with custom format. +You can change how each cell in the Pivot Table looks by using the [CellTemplate](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewTemplates.html#Syncfusion_Blazor_PivotView_PivotViewTemplates_CellTemplate) property in [PivotViewTemplates](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewTemplates.html) class. With [CellTemplate](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewTemplates.html#Syncfusion_Blazor_PivotView_PivotViewTemplates_CellTemplate), you can use either an HTML string or the ID of an HTML element to add custom content to every cell. This helps you display cell values in any format you prefer, such as adding icons, colors, or other elements for better understanding. To know about **Cell Template** in Blazor Pivot Table Component, you can check this video. {% youtube "youtube:https://www.youtube.com/watch?v=C2w2KWKc0f8"%} -In this demo, the revenue cost for each year is represented with trend icons. - -N>The model type for datasource needs to be specified from which the context will be generated and accessed in the CellTemplate. Using the context, define the conditions based on the templates that will be appended to the cell element. +In this demo, each year’s revenue cost is displayed along with trend icons, giving users a clear and quick way to view changes in the data at a glance. +N> Specify the model type for the data source, as it determines the context that will be generated and accessed within the [CellTemplate](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewTemplates.html#Syncfusion_Blazor_PivotView_PivotViewTemplates_CellTemplate). Using this context, define the conditions based on the templates that will be appended to the cell element ```cshtml @using Syncfusion.Blazor.PivotView @@ -769,7 +765,6 @@ N>The model type for datasource needs to be specified from which the context wil { } - } @@ -793,15 +788,12 @@ N>The model type for datasource needs to be specified from which the context wil @code{ - public List dataSource { get; set; } - protected override void OnInitialized() { this.dataSource = TemplateData.GetTemplateData(); } } - ``` ![Blazor PivotTable with Cell Template](images/blazor-pivottable-cell-template.png) diff --git a/blazor/pivot-table/server-side-pivot-engine.md b/blazor/pivot-table/server-side-pivot-engine.md index 7247ba6e5b..d22e01e23a 100644 --- a/blazor/pivot-table/server-side-pivot-engine.md +++ b/blazor/pivot-table/server-side-pivot-engine.md @@ -7,33 +7,36 @@ control: Pivot Table documentation: ug --- -> In general, the Blazor Pivot Table is created using the built-in engine for the given data source. This is an optional feature that allows you to create the Blazor Pivot Table with a server-side pivot engine and external data binding. This server-side pivot engine improves the rendering performance of the pivot table, particularly in Blazor WebAssembly application. And this option is applicable only for relational data source. +> By default, the Pivot Table processes and displays data using its built‑in engine with the given data source. Alternatively, you can use a server‑side pivot engine to connect external data to the Pivot Table, which is especially useful when working with large datasets. This option is applicable only for relational data sources. The server‑side pivot engine improves rendering performance, particularly in Blazor WebAssembly applications. -# Getting Started with Syncfusion® Server-side Pivot Engine +# Getting Started with the Server-Side Engine in Blazor Pivot Table -This section briefs the Syncfusion® assembly [Syncfusion.Pivot.Engine](https://www.nuget.org/packages/Syncfusion.Pivot.Engine), which is used in a server-side application to perform all pivot calculations such as aggregation, filtering, sorting, grouping, and so on, and only the information to be displayed in the pivot table's viewport is passed to the client-side (browser) via web service (Web API) rather than the entire data source. It reduces network traffic and improves the rendering performance of the pivot table, especially when dealing with large amounts of data. It also works best with virtual scrolling enabled and supports all the pivot table's existing features. +This section explains how to use the Syncfusion® assembly [Syncfusion.Pivot.Engine](https://www.nuget.org/packages/Syncfusion.Pivot.Engine) in a server-side application. The server-side engine performs operations such as aggregation, filtering, sorting, and grouping on the server. Only the information required for the Pivot Table viewport is sent to the client through a web service (Web API), instead of transferring the entire data source. This approach helps reduce network traffic and improves Pivot Table rendering performance when working with large data sets. It works efficiently with the virtual scrolling option and supports all existing features in the Pivot Table. ## Quick steps to render the Blazor Pivot Table by using the server-side Pivot Engine ### Download and installing Server-side Pivot Engine -**1.** Download the ASP.NET Core-based stand-alone [application](https://github.com/SyncfusionExamples/server-side-pivot-engine-for-blazor-pivot-table.git) from the GitHub repository. +1. Download the ASP.NET Core-based standalone [application](https://github.com/SyncfusionExamples/server-side-pivot-engine-for-blazor-pivot-table.git) from the GitHub repository. This application includes all necessary files to set up and use the server-side Pivot Engine. -**2.** The **PivotController** (Server-side) application that is downloaded includes the following files. +2. The downloaded **PivotController** application contains the following files to support data communication and processing: + - **PivotController.cs** in the **Controllers** folder: Handles data communication between the server and the Pivot Table. + - **DataSource.cs** in the **DataSource** folder: Defines the structure of the data sources using model classes. + - Sample data source files, **sales.csv** and **sales-analysis.json**, in the **DataSource** folder: Provide example data for testing the Pivot Table. -* **PivotController.cs** file under **Controllers** folder – This helps to do data communication with pivot table. -* **DataSource.cs** file under **DataSource** folder – This file has model classes to define the structure of the data sources. -* The sample data source files **sales.csv** and **sales-analysis.json** under **DataSource** folder. - -**3.** Open the **PivotController** application in Visual Studio where the Syncfusion® library [Syncfusion.Pivot.Engine](https://www.nuget.org/packages/Syncfusion.Pivot.Engine) will be downloaded automatically from the nuget.org site. +3. Open the **PivotController** application in Visual Studio. The Syncfusion [Syncfusion.Pivot.Engine](https://www.nuget.org/packages/Syncfusion.Pivot.Engine) library will automatically download from nuget.org, enabling server-side calculations such as aggregation, filtering, and sorting for the Pivot Table. ![Solution Explorer](./images/blazor-pivotcontroller-solution-explorer.png) ### Connecting Blazor Pivot Table to Server-side Pivot Engine -**1.** Run the **PivotController** (Server-side) application which will be hosted in IIS shortly. +This section explains how to connect the Pivot Table to the server-side Pivot Engine to display data efficiently. Follow these steps to set up the connection and configure the Pivot Table using the server-side application created in the previous section. + +1. **Start the server-side application** +Run the **PivotController** application (downloaded and installed in the previous section) in Visual Studio. This hosts the server-side Pivot Engine on a local server, typically at a URL like `http://localhost:61379/api/pivot/post`. Ensure the application is running before proceeding. -**2.** Then in the Pivot Table [sample](https://github.com/SyncfusionExamples/server-side-pivot-engine-for-blazor-pivot-table/tree/master/Sample/PivotTable), set the [EnableServerSideAggregation](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html#Syncfusion_Blazor_PivotView_PivotViewDataSourceSettings_1_EnableServerSideAggregation) property under [PivotViewDataSourceSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html) to **true** and map the URL of the hosted Server-side application in [Url](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html#Syncfusion_Blazor_PivotView_PivotViewDataSourceSettings_1_Url) property of [PivotViewDataSourceSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html). +2. **Configure the Pivot Table for server-side mode** +In your Blazor application, update the Pivot Table’s settings to connect to the server-side Pivot Engine. Set the [EnableServerSideAggregation](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html#Syncfusion_Blazor_PivotView_PivotViewDataSourceSettings_1_EnableServerSideAggregation) property under [PivotViewDataSourceSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html) to **true** and map the URL of the hosted Server-side application in [Url](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html#Syncfusion_Blazor_PivotView_PivotViewDataSourceSettings_1_Url) property of [PivotViewDataSourceSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html). ```cshtml @using Syncfusion.Blazor.PivotView @@ -55,10 +58,10 @@ This section briefs the Syncfusion® assembl public string Year { get; set; } } } - ``` -**3.** Frame and set the report based on the data source available in the **PivotController** application. +3. **Set up the Pivot Table report** +Define the report to organize and display data from the server-side Pivot Engine. Use the [PivotViewDataSourceSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html) properties to specify rows, columns, values, and formatting based on the data source in the **PivotController** application (e.g., `sales.csv` or `sales-analysis.json`). For example, you can configure the report to show product details, sales amounts, and production years. ```cshtml @using Syncfusion.Blazor.PivotView @@ -92,29 +95,31 @@ This section briefs the Syncfusion® assembl public string Year { get; set; } } } - ``` -**4.** Run the sample to get the following result. +4. **Run the Blazor application** +Launch your Blazor application to view the Pivot Table. The Pivot Table will connect to the server-side Pivot Engine, retrieve the processed data, and display the results based on the configured report. ![Pivot Table demo using server-side pivot engine](./images/blazor-server-side-demo.png) ## Available configurations in Server-side application +This section explains how to set up and use different data sources with the server-side Pivot Engine in the Blazor [Pivot Table](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.html). + ### Supportive Data Sources -The server-side pivot engine supports the following data sources, -* Collection -* JSON -* CSV -* DataTable -* Dynamic +The server-side Pivot Engine supports the following data sources: +- Collection +- JSON +- CSV +- DataTable +- Dynamic #### Collection -The collection data sources such as List, IEnumerable, and so on are supported. This can be bound using the **GetData** method in the Web API controller **PivotController.cs**. +The server-side pivot engine supports collection-based data sources, such as List or IEnumerable. You can bind these data sources using the `GetData` method in the server-side controller. In the Pivot Table, set the [Type](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html#Syncfusion_Blazor_PivotView_PivotViewDataSourceSettings_1_Type) property in the [PivotViewDataSourceSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html) to `JSON`, which is the default value. -In the server-side application **(PivotController)**, a collection type data source is framed in the **DataSource.cs** file as shown in the following. +In the server-side application, define the collection data source in the **DataSource.cs** file, as shown below: ```csharp public class PivotViewData @@ -146,17 +151,15 @@ public class PivotViewData return VirtualData; } } - ``` -To bind the data source, set its model type **PivotViewData** to **TValue** of the **PivotEngine** class. +To bind this data source, set the model type **PivotViewData** to the **TValue** parameter of the **PivotEngine** class, as shown below: ```csharp private PivotEngine PivotEngine = new PivotEngine(); - ``` -Then call the data source in **GetData** method of **PivotController.cs** file. +Next, call the data source in the **GetData** method within the **PivotController.cs** file: ```csharp public async Task GetData(FetchData param) @@ -167,15 +170,13 @@ public async Task GetData(FetchData param) cacheEntry.SetSize(1); cacheEntry.AbsoluteExpiration = DateTimeOffset.UtcNow.AddMinutes(60); - // Here bind the collection type data source. + // Bind the collection-based data source here. return new DataSource.PivotViewData().GetVirtualData(); - }); } - ``` -Finally set the appropriate report to the pivot table sample based on the above data source. +Finally, configure the Pivot Table by setting the appropriate report in the [PivotViewDataSourceSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html) to match the data source, as shown below: ```cshtml @using Syncfusion.Blazor.PivotView @@ -209,16 +210,15 @@ Finally set the appropriate report to the pivot table sample based on the above public string Year { get; set; } } } - ``` ![Server-Side Pivot Engine using collection](./images/blazor-server-side-with-collection-data.png) #### JSON -The JSON data from a local *.json file type can be connected to the pivot table. Here, the file can be read by the **StreamReader** option, which will give the result in the string format. The resultant string needs to be converted to collection data that can be bound to the Server-side pivot engine. +You can use JSON data from a local *.json file to connect to the Pivot Table. The file can be read using the **StreamReader**, which returns the content as a string. This string should then be converted into a collection that can be used with the server-side pivot engine. -In the Server-side application, **sales-analysis.json** file is available under **DataSource** folder and its model type is defined in **DataSource.cs** file. +In your server-side application, the **sales-analysis.json** file is located in the **DataSource** folder, and its model type is defined in the **DataSource.cs** file: ```csharp public class PivotJSONData @@ -240,16 +240,15 @@ public class PivotJSONData return Newtonsoft.Json.JsonConvert.DeserializeObject>(result); } } - ``` -To bind the data source, set its model type **PivotJSONData** to **TValue** of the **PivotEngine** class. +To use this data with the Pivot Table, assign the model type **PivotJSONData** to the **TValue** parameter of the **PivotEngine** class. ```csharp -private PivotEngine PivotEngine = new PivotEngine(); +private PivotEngine PivotEngine = new PivotEngine(); ``` -Then call the data source in **GetData** method of **PivotController.cs** file. +Next, retrieve the JSON data in the **GetData** method of the **PivotController.cs** file. This example shows how to load the **sales-analysis.json** file from the local server: ```csharp public async Task GetData(FetchData param) @@ -260,14 +259,13 @@ public async Task GetData(FetchData param) cacheEntry.SetSize(1); cacheEntry.AbsoluteExpiration = DateTimeOffset.UtcNow.AddMinutes(60); - // Here bind JSON type data source from the sales-analysis.json file. + // Bind JSON data source from the sales-analysis.json file. return new DataSource.PivotJSONData().ReadJSONData(_hostingEnvironment.ContentRootPath + "\\DataSource\\sales-analysis.json"); }); } - ``` -Finally set the appropriate report to the pivot table sample based on the above data source. +Then, configure the [PivotViewDataSourceSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html) property in the Pivot Table to use the JSON data source: ```cshtml @using Syncfusion.Blazor.PivotView @@ -301,12 +299,11 @@ Finally set the appropriate report to the pivot table sample based on the above public int ProCost { get; set; } } } - ``` ![Server-Side Pivot Engine with JSON data](./images/blazor-server-side-with-json-data.png) -JSON data from any remote server, like a local JSON file, can also be supported. It accepts both directly downloadable files (*.json) and web service URLs. To bind this, the URL of the *.json file of a remote server has to be mapped under the **GetData** method. The rest of the configurations are the same as described above. +You can also use JSON data from a remote server in the same way as a local JSON file. Both directly downloadable *.json files and web service URLs are supported. To do this, specify the URL of the remote *.json file in the **GetData** method. The remaining configurations stay the same. In the server-side application, the CDN link is used to connect the same **sales-analysis.json** file which is already hosted in the Syncfusion® server. @@ -319,18 +316,17 @@ public async Task GetData(FetchData param) cacheEntry.SetSize(1); cacheEntry.AbsoluteExpiration = DateTimeOffset.UtcNow.AddMinutes(60); - // Here bind JSON type data source from remote server. + // Bind JSON data source from a remote server. return new DataSource.PivotJSONData().ReadJSONData("http://cdn.syncfusion.com/data/sales-analysis.json"); }); } - ``` #### CSV -The CSV data from a local *.csv file type can be connected to the pivot table. Here, the file can be read by the **StreamReader** option, which will give the result in the string format. The resultant string needs to be converted to collection data that can be bound to the server-side pivot engine. +The server-side Pivot Engine supports CSV data from a local *.csv file or a remote server. To use a local CSV file, read the file using the **StreamReader** class, which converts the file content into a string. This string is then split into a collection that can be bound to the server-side Pivot Engine. In the Pivot Table, set the [Type](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html#Syncfusion_Blazor_PivotView_PivotViewDataSourceSettings_1_Type) property in the [PivotViewDataSourceSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html) to **CSV**. -In the server application, the **sales.csv** file is available under the **DataSource** folder, and its model type is defined in the **DataSource.cs** file. +In the server application, the **sales.csv** file is located in the **DataSource** folder, and its data model is defined in the **DataSource.cs** file as shown below: ```csharp public class PivotCSVData @@ -350,7 +346,6 @@ public class PivotCSVData public double TotalCost { get; set; } public double TotalProfit { get; set; } - public List ReadCSVData(string url) { List data = new List(); @@ -369,16 +364,15 @@ public class PivotCSVData } } } - ``` -To bind the data source, set its model type **PivotCSVData** to **TValue** of the **PivotEngine** class. +To bind the CSV data, set the **PivotCSVData** model as the **TValue** type for the **PivotEngine** class: ```csharp -private PivotEngine PivotEngine = new PivotEngine(); +private PivotEngine PivotEngine = new PivotEngine(); ``` -Then call the data source in **GetData** method of **PivotController.cs** file. +Next, retrieve the CSV data in the **GetData** method of the **PivotController.cs** file: ```csharp public async Task GetData(FetchData param) @@ -389,14 +383,13 @@ public async Task GetData(FetchData param) cacheEntry.SetSize(1); cacheEntry.AbsoluteExpiration = DateTimeOffset.UtcNow.AddMinutes(60); - // Here bind CSV type data source from sales.csv file. + // Bind CSV data from the local sales.csv file. return new DataSource.PivotCSVData().ReadCSVData(_hostingEnvironment.ContentRootPath + "\\DataSource\\sales.csv"); }); } - ``` -Finally set the appropriate report to the pivot table sample based on the above data source. +Finally, configure the Pivot Table with the appropriate report settings based on the CSV data source: ```cshtml @using Syncfusion.Blazor.PivotView @@ -438,14 +431,13 @@ Finally set the appropriate report to the pivot table sample based on the above public double TotalProfit { get; set; } } } - ``` ![Server-Side Pivot Engine using CSV data](./images/blazor-server-side-with-csv-data.png) -CSV data from any remote server, like a local CSV file, can also be supported. It accepts both directly downloadable files (*.csv) and web service URLs. To bind this, the URL of the *.csv file of a remote server has to be mapped under **GetData** method. The rest of the configurations are the same as described above. +You can also use CSV data from a remote server, such as a downloadable file or a web service URL. To do this, provide the CSV file URL in the **GetData** method. The process for setting up the Pivot Table remains the same as described above. -In the server application, the CDN link is used to connect the same **sales.csv** file which is already hosted in the Syncfusion® server. +Here is an example of using a remote CSV file hosted on the Syncfusion server: ```csharp public async Task GetData(FetchData param) @@ -456,16 +448,15 @@ public async Task GetData(FetchData param) cacheEntry.SetSize(1); cacheEntry.AbsoluteExpiration = DateTimeOffset.UtcNow.AddMinutes(60); - // Here bind CSV type data source from remote server. + // Bind the CSV-type data source from remote server. return new DataSource.PivotCSVData().ReadCSVData("http://cdn.syncfusion.com/data/sales-analysis.csv"); }); } - ``` #### DataTable -In the server-side application, there is a manually created DataTable **BusinessObjectsDataView** by mapping the model type **PivotViewData** in **DataSource.cs** file. +In a server-side application, you can create a DataTable named **BusinessObjectsDataView** by mapping it to the **PivotViewData** model type defined in the **DataSource.cs** file. The following code demonstrates how to generate this DataTable from a collection of `PivotViewData` objects: ```csharp public class BusinessObjectsDataView @@ -491,17 +482,15 @@ public class BusinessObjectsDataView return dt; } } - ``` -To bind the data source, set its model type **PivotViewData** to **TValue** of the **PivotEngine** class. +To bind the data source, set the model type **PivotViewData** to the **TValue** property of the **PivotEngine** class, as shown below: ```csharp private PivotEngine PivotEngine = new PivotEngine(); - ``` -Then call the data source in **GetData** method of **PivotController.cs** file. +Next, retrieve the data source by calling the **GetData** method in the **PivotController.cs** file. This method uses caching to improve performance: ```csharp public async Task GetData(FetchData param) @@ -512,14 +501,13 @@ public async Task GetData(FetchData param) cacheEntry.SetSize(1); cacheEntry.AbsoluteExpiration = DateTimeOffset.UtcNow.AddMinutes(60); - // Here bind the DataTable. + // Bind the DataTable here. return new DataSource.BusinessObjectsDataView().GetDataTable(); }); } - ``` -Finally set the appropriate report to the pivot table sample based on the above data source. +Finally, configure the Pivot Table by setting the appropriate report using the [PivotViewDataSourceSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html) property. Below is an example configuration that connects to the server-side data source: ```cshtml @using Syncfusion.Blazor.PivotView @@ -553,18 +541,17 @@ Finally set the appropriate report to the pivot table sample based on the above public string Year { get; set; } } } - ``` ![Server-Side Pivot Engine using DataTable](./images/blazor-server-side-with-data-table.png) #### Dynamic -The model type has to be defined in the aforementioned data sources. However, there is no need to define a model type for the following data sources, which are also supported by the server-side pivot engine. +Usually, the model type must be defined for most data sources in the server-side pivot engine. However, when using certain data sources, such as dynamic types, it is not necessary to define a model type. The server-side pivot engine supports these data sources as well. ##### ExpandoObject -In the server-side application, an **ExpandoObject** type data source is available under the class **PivotExpandoData** in **DataSource.cs** file. +In a server-side application, users can use an **ExpandoObject** as a data source. This type of data source is managed by the `PivotExpandoData` class found in the **DataSource.cs** file. The following code shows how to create a list of **ExpandoObject** items: ```csharp public class PivotExpandoData @@ -587,17 +574,15 @@ public class PivotExpandoData return Orders; } } - ``` -To bind the data source, set its model type as **ExpandoObject** to **TValue** of the **PivotEngine** class. +To use this data source with the server-side pivot engine, specify **ExpandoObject** as the model type for `TValue` in the `PivotEngine` class: ```csharp private PivotEngine PivotEngine = new PivotEngine(); - ``` -Then call the data source in **GetData** method of **PivotController.cs** file. +Next, in the **GetData** method of the **PivotController.cs** file, return the ExpandoObject data source: ```csharp public async Task GetData(FetchData param) @@ -608,14 +593,13 @@ public async Task GetData(FetchData param) cacheEntry.SetSize(1); cacheEntry.AbsoluteExpiration = DateTimeOffset.UtcNow.AddMinutes(60); - // Here returns ExpandoObject type data source. + // Returns ExpandoObject type data source. return new DataSource.PivotExpandoData().GetExpandoData(); }); } - ``` -Finally set the appropriate report to the pivot table sample based on the above data source. +Finally, configure the [PivotViewDataSourceSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html) property for the Pivot Table on the client side. Set the appropriate fields for rows, columns, and values to match the ExpandoObject properties: ```cshtml @using Syncfusion.Blazor.PivotView @@ -638,14 +622,13 @@ Finally set the appropriate report to the pivot table sample based on the above @code { //other codes here... } - ``` ![Server-Side Pivot Engine using ExpandoObject](./images/blazor-server-side-with-expandoobject.png) ##### Dynamic Objects -In the server-side application, a data source is framed by dynamic objects which is available under the class **PivotDynamicData** in the **DataSource.cs** file. +A dynamic object allows users to bind data to the [Pivot Table](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.html) without having to define a fixed model type. In a server-side application, a data source is created using dynamic objects which are available under the **PivotDynamicData** class in the **DataSource.cs** file. ```csharp public class PivotDynamicData @@ -687,17 +670,15 @@ public class PivotDynamicData } } } - ``` -To bind the data source, set its class **PivotDynamicData** to **TValue** of the **PivotEngine** class. +To use this data source in the server-side code, assign the **PivotDynamicData** class to the **TValue** of the `PivotEngine` class: ```csharp private PivotEngine PivotEngine = new PivotEngine(); - ``` -Then call the data source in **GetData** method of **PivotController.cs** file. +When loading data in the **GetData** method of the **PivotController.cs** file, return the dynamic data source as shown below: ```csharp public async Task GetData(FetchData param) @@ -712,10 +693,9 @@ public async Task GetData(FetchData param) return new DataSource.PivotDynamicData().GetDynamicData(); }); } - ``` -Finally set the appropriate report to the pivot table sample based on the above data source. +Finally, configure the [PivotViewDataSourceSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html) property for the Pivot Table on the client side. ```cshtml @using Syncfusion.Blazor.PivotView @@ -738,7 +718,6 @@ Finally set the appropriate report to the pivot table sample based on the above @code { //other codes here... } - ``` ![Server-Side Pivot Engine using Dynamic Objects](./images/blazor-server-side-with-dynamic-object.png) @@ -747,7 +726,7 @@ Finally set the appropriate report to the pivot table sample based on the above #### Memory Cache -In the server-side application, the [`Memory Cache`](https://learn.microsoft.com/en-us/dotnet/api/system.runtime.caching.memorycache?view=net-9.0-pp) option is used to store the data source and engine properties in RAM, which will be used for UI operations. To improve performance, this limits the execution of all initial rendering code to regenerate the aggregated values during each UI operation. The codes below show how we use the memory cache option in the **GetEngine** method to store engine properties. +In a server-side application, the [`Memory Cache`](https://learn.microsoft.com/en-us/dotnet/api/system.runtime.caching.memorycache?view=net-9.0) option helps store the data source and engine properties in RAM for use during UI actions in the Pivot Table. This approach improves performance by preventing the need to recalculate aggregated values every time the user interacts with the Pivot Table. The following example shows how the memory cache is used in the **GetEngine** method to store engine properties: ```csharp public async Task GetEngine(FetchData param) @@ -765,21 +744,20 @@ public async Task GetEngine(FetchData param) return await PivotEngine.GetEngine(param); }); } - ``` -The engine properties are stored in RAM as a cache with a unique ID (GUID) that is transferred from the client-side source code. The GUID is generated at random and will be changed if the page containing the pivot table is refreshed or opened in a new tab/window. As a result, each GUID's memory cache contains unique information, and the component operates independently. +Engine properties are saved in RAM using a unique ID (GUID) that is received from the client-side source code. This GUID is randomly generated and changes if the user refreshes the page or opens the Pivot Table in a new browser tab or window. Because of this, each GUID in the memory cache holds information unique to that session, allowing each Pivot Table instance to work independently. -Meanwhile, the memory cache is set to expire after 60 minutes from RAM to free its memory. If the component is still running, the data will be generated and stored for another 60 minutes. +The memory cache is configured to expire after 60 minutes to help free up RAM. If the user is still working with the Pivot Table after this period, the required data will be generated and cached for another 60 minutes. #### Methods and its needs -* **Post:** Allows to get the information from the client-side source and calls appropriate controller methods. -* **GetEngine:** Allows to store the engine properties in RAM as a cache which fires on initial rendering or when the memory cache is expired. -* **GetData:** Allows to store data source in RAM as a cache which fires on initial rendering or when the memory cache is expired. -* **GetMembers:** Allows to get the members of a field. This fires when the member editor is opened to do a filtering operation. -* **GetRawData:** Allows to get raw data of an aggregated value cell. This fires when the drill-through or editing dialog is opened. -* **GetPivotValues:** Allows to update the stored engine properties in-memory cache and returns the aggregated values to browser to render the pivot table. Here, the return value can be modified. The pivot table will be rendered in the browser based on this. +- **Post:** This method receives requests from the client side of the Pivot Table and forwards them to the appropriate server-side method for processing. +- **GetEngine:** Stores engine properties in RAM as a cache. This method is triggered during the initial rendering of the Pivot Table or when the memory cache expires. +- **GetData:** This method stores the Pivot Table’s data source in a cache on the server. Like **GetEngine**, it is triggered on the first load or after the memory cache is cleared. This enables faster retrieval of the Pivot Table’s data and allows the table to respond quickly to changes. +- **GetMembers:** Allows retrieval of the members of a field. This method is triggered when the member editor is opened for a filtering operation. +- **GetRawData:** Fetches the raw, unaggregated data behind a value cell. This method is used when the user opens the drill-through dialog or starts editing a value in the Pivot Table. +- **GetPivotValues:** Updates the stored engine properties in the in-memory cache and returns the aggregated values to the browser to render the Pivot Table. The return value can be modified, and the Pivot Table will be rendered in the browser based on this. ## Excel Export @@ -1145,4 +1123,4 @@ Then, based on the **Action** parameter (**onPivotExcelExport** or **onPivotCsvE ``` -![Export as Pivot](images/export-as-pivot.png) \ No newline at end of file +![Export as Pivot](images/export-as-pivot.png) diff --git a/blazor/pivot-table/show-hide-totals.md b/blazor/pivot-table/show-hide-totals.md index 070582862b..c3b690e54c 100644 --- a/blazor/pivot-table/show-hide-totals.md +++ b/blazor/pivot-table/show-hide-totals.md @@ -1,21 +1,25 @@ --- layout: post -title: Hide Totals in Blazor Pivot Table Component | Syncfusion -description: Checkout and learn here all about hide totals in Syncfusion Blazor Pivot Table component and much more. +title: Show or hide Totals in Blazor Pivot Table Component | Syncfusion +description: Check out and learn all about showing or hiding totals in the Syncfusion Blazor Pivot Table component and much more. platform: Blazor control: Pivot Table documentation: ug --- -# Hide Totals in Blazor Pivot Table Component +# Show or Hide Totals in Blazor Pivot Table Component + +The Pivot Table component allows users to easily customize the display of grand totals and sub-totals. This documentation explains how to control their visibility and positioning to suit your data analysis needs. ## Show or hide grand totals -Allows to show or hide grand totals in rows and columns using the [ShowGrandTotals](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html#Syncfusion_Blazor_PivotView_PivotViewDataSourceSettings_1_ShowGrandTotals) property. To hide the grand totals in rows and columns, set the property [ShowGrandTotals](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html#Syncfusion_Blazor_PivotView_PivotViewDataSourceSettings_1_ShowGrandTotals) in [PivotViewDataSourceSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html) class to **false**. +The Pivot Table component provides options to display or hide grand totals for rows, columns, or both. These options are configured using the following properties within the [PivotViewDataSourceSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html) class: -End user can also hide grand totals for row or columns separately by setting the property [ShowRowGrandTotals](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html#Syncfusion_Blazor_PivotView_PivotViewDataSourceSettings_1_ShowRowGrandTotals) or [ShowColumnGrandTotals](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html#Syncfusion_Blazor_PivotView_PivotViewDataSourceSettings_1_ShowColumnGrandTotals) in [PivotViewDataSourceSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html) class to **false** respectively. +- [ShowGrandTotals](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html#Syncfusion_Blazor_PivotView_PivotViewDataSourceSettings_1_ShowGrandTotals): Controls the visibility of grand totals for both rows and columns. Set this property to **false** to hide grand totals in both directions. +- [ShowRowGrandTotals](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html#Syncfusion_Blazor_PivotView_PivotViewDataSourceSettings_1_ShowRowGrandTotals): When set to **false**, this property hides only the row grand totals. +- [ShowColumnGrandTotals](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html#Syncfusion_Blazor_PivotView_PivotViewDataSourceSettings_1_ShowColumnGrandTotals): When set to **false**, this property hides only the column grand totals. -N> By default, [ShowGrandTotals](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html#Syncfusion_Blazor_PivotView_PivotViewDataSourceSettings_1_ShowGrandTotals), [ShowRowGrandTotals](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html#Syncfusion_Blazor_PivotView_PivotViewDataSourceSettings_1_ShowRowGrandTotals) and [ShowColumnGrandTotals](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html#Syncfusion_Blazor_PivotView_PivotViewDataSourceSettings_1_ShowColumnGrandTotals) properties in [PivotViewDataSourceSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html) class are set as **true**. +N> By default, all of these properties—[ShowGrandTotals](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html#Syncfusion_Blazor_PivotView_PivotViewDataSourceSettings_1_ShowGrandTotals), [ShowRowGrandTotals](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html#Syncfusion_Blazor_PivotView_PivotViewDataSourceSettings_1_ShowRowGrandTotals), and [ShowColumnGrandTotals](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html#Syncfusion_Blazor_PivotView_PivotViewDataSourceSettings_1_ShowColumnGrandTotals)—are set to **true** in the [PivotViewDataSourceSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html) class. ```cshtml @using Syncfusion.Blazor.PivotView @@ -53,9 +57,11 @@ N> By default, [ShowGrandTotals](https://help.syncfusion.com/cr/blazor/Syncfusio ![Hiding Grand Total in Blazor PivotTable](images/blazor-pivottable-hide-grand-total.png) -## Show grand totals at top or bottom +## Set grand totals position + +You can specify the position of grand totals for rows and columns in a Pivot Table by configuring the [GrandTotalsPosition](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.GrandTotalsPosition.html) property within the [PivotViewDataSourceSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html) class. You can choose to place the grand totals either at the top or at the bottom of the pivot table, depending on your preference. -Allows to show grand totals either at top or bottom in rows and columns using the [GrandTotalsPosition](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.GrandTotalsPosition.html) property. To show grand totals at top in rows and columns, set the [GrandTotalsPosition](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.GrandTotalsPosition.html) property in [PivotViewDataSourceSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html) to **Top**. +To display grand totals at the top of both rows and columns, set the [GrandTotalsPosition](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.GrandTotalsPosition.html) property to **Top**. To show grand totals at the bottom (which is the default setting), set it to **Bottom**. This property applies to both row and column grand totals simultaneously. ```cshtml @using Syncfusion.Blazor.PivotView @@ -96,9 +102,13 @@ Allows to show grand totals either at top or bottom in rows and columns using th ## Show or hide sub-totals -Allows to show or hide sub-totals in rows and columns using the [ShowSubTotals](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html#Syncfusion_Blazor_PivotView_PivotViewDataSourceSettings_1_ShowSubTotals) property. To hide all the sub-totals in rows and columns, set the property [ShowSubTotals](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html#Syncfusion_Blazor_PivotView_PivotViewDataSourceSettings_1_ShowSubTotals) in [PivotViewDataSourceSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html) class to **false**. End user can also hide sub-totals for rows or columns separately by setting the property [ShowRowSubTotals](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html#Syncfusion_Blazor_PivotView_PivotViewDataSourceSettings_1_ShowRowSubTotals) or [ShowColumnSubTotals](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html#Syncfusion_Blazor_PivotView_PivotViewDataSourceSettings_1_ShowColumnSubTotals) in [PivotViewDataSourceSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html) class to **false** respectively. +The Pivot Table component enables showing or hiding sub-totals for rows, columns, or both. Use the following properties in the [PivotViewDataSourceSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html) class to configure these options: -N> By default, [ShowSubTotals](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html#Syncfusion_Blazor_PivotView_PivotViewDataSourceSettings_1_ShowSubTotals), [ShowRowSubTotals](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html#Syncfusion_Blazor_PivotView_PivotViewDataSourceSettings_1_ShowRowSubTotals) and [ShowColumnSubTotals](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html#Syncfusion_Blazor_PivotView_PivotViewDataSourceSettings_1_ShowColumnSubTotals) properties in [PivotViewDataSourceSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html) class are set as **true**. +* [ShowSubTotals](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html#Syncfusion_Blazor_PivotView_PivotViewDataSourceSettings_1_ShowSubTotals): Set to `false` to hide all sub-totals for rows and columns. +* [ShowRowSubTotals](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html#Syncfusion_Blazor_PivotView_PivotViewDataSourceSettings_1_ShowRowSubTotals): Set to `false` to hide row sub-totals only. +* [ShowColumnSubTotals](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html#Syncfusion_Blazor_PivotView_PivotViewDataSourceSettings_1_ShowColumnSubTotals): Set to `false` to hide column sub-totals only. + +N> By default, the [ShowSubTotals](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html#Syncfusion_Blazor_PivotView_PivotViewDataSourceSettings_1_ShowSubTotals), [ShowRowSubTotals](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html#Syncfusion_Blazor_PivotView_PivotViewDataSourceSettings_1_ShowRowSubTotals), and [ShowColumnSubTotals](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html#Syncfusion_Blazor_PivotView_PivotViewDataSourceSettings_1_ShowColumnSubTotals) properties in the [PivotViewDataSourceSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html) class are set to **true**, ensuring sub-totals are visible across the Pivot Table. ```cshtml @using Syncfusion.Blazor.PivotView @@ -139,9 +149,9 @@ N> By default, [ShowSubTotals](https://help.syncfusion.com/cr/blazor/Syncfusion. ## Show or hide sub-totals for specific fields -Allows to show or hide sub-totals for specific fields in rows and columns using the [ShowSubTotals](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewRow.html#Syncfusion_Blazor_PivotView_PivotViewRow_ShowSubTotals) property. To hide sub-totals for a specific field in row or column axis, set the property [ShowSubTotals](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewRow.html#Syncfusion_Blazor_PivotView_PivotViewRow_ShowSubTotals) in [PivotViewRow](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewRows.html) or [PivotViewColumn](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewColumn.html) class to **false** respectively. +The Pivot Table component allows users to show or hide sub-totals for specific fields in the row and column axes using the [ShowSubTotals](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewRow.html#Syncfusion_Blazor_PivotView_PivotViewRow_ShowSubTotals) property. To hide sub-totals for a specific field in either axis, set the [ShowSubTotals](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewRow.html#Syncfusion_Blazor_PivotView_PivotViewRow_ShowSubTotals) property to **false** in the corresponding field configuration within the rows or columns axis. -N> By default, [ShowSubTotals](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewRow.html#Syncfusion_Blazor_PivotView_PivotViewRow_ShowSubTotals) property in [PivotViewRow](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewRows.html) or [PivotViewColumn](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewColumn.html) class is set as **true**. +N> By default, the [ShowSubTotals](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewRow.html#Syncfusion_Blazor_PivotView_PivotViewRow_ShowSubTotals) property for fields in both the [PivotViewRow](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewRows.html) and [PivotViewColumn](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewColumn.html) classes is set to **true**. ```cshtml @using Syncfusion.Blazor.PivotView @@ -179,63 +189,97 @@ N> By default, [ShowSubTotals](https://help.syncfusion.com/cr/blazor/Syncfusion. ![Hiding Sub Total for Specific Field in Blazor PivotTable](images/blazor-pivottable-hide-sub-total-for-specific-field.png) -## Show or hide totals using toolbar +## Show sub-totals at top or bottom -It can also be achieved using built-in toolbar options by setting the [ShowToolbar](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SfPivotView-1.html#Syncfusion_Blazor_PivotView_SfPivotView_1_ShowToolbar) property in [SfPivotView](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SfPivotView-1.html) class to **true**. Also, include the items [ToolbarItems.GrandTotal](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.ToolbarItems.html#Syncfusion_Blazor_PivotView_ToolbarItems_GrandTotal) and [ToolbarItems.SubTotal](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.ToolbarItems.html#Syncfusion_Blazor_PivotView_ToolbarItems_SubTotal) within the [Toolbar](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SfPivotView-1.html#Syncfusion_Blazor_PivotView_SfPivotView_1_Toolbar) property in [SfPivotView](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SfPivotView-1.html) class. End user can now see "Show/Hide Grand totals" and "Show/Hide Sub totals" icons in toolbar UI automatically. +You can configure the position of sub-totals within header groups for both rows and columns in the Pivot Table using the [`SubTotalsPosition`](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SubTotalsPosition.html) property in the [PivotViewDataSourceSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html). By default, the [`SubTotalsPosition`](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SubTotalsPosition.html) property is set to **Auto**, which displays column sub-totals at the bottom and row sub-totals at the top of their respective header groups in the pivot table. + +To display sub-totals at the top of header groups for both rows and columns, set the [`SubTotalsPosition`](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SubTotalsPosition.html) property in [PivotViewDataSourceSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html) to **Top**. ```cshtml @using Syncfusion.Blazor.PivotView - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + -@code{ - public List toolbar = new List { - ToolbarItems.SubTotal, - ToolbarItems.GrandTotal - }; +@code { public List data { get; set; } + protected override void OnInitialized() { this.data = ProductDetails.GetProductData().ToList(); //Bind the data source collection here. Refer "Assigning sample data to the pivot table" section in getting started for more details. } } +``` + +![Show sub-totals at top](images/blazor-pivottable-show-sub-totals-at-top.png) +To display sub-totals at the bottom of header groups for both rows and columns, set the [`SubTotalsPosition`](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SubTotalsPosition.html) property in [PivotViewDataSourceSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html) to **Bottom**. + +```cshtml +@using Syncfusion.Blazor.PivotView + + + + + + + + + + + + + + + + + + + + + +@code { + public List data { get; set; } + + protected override void OnInitialized() + { + this.data = ProductDetails.GetProductData().ToList(); + //Bind the data source collection here. Refer "Assigning sample data to the pivot table" section in getting started for more details. + } +} ``` - -![Displaying Grand Total using Toolbar in Blazor PivotTable](images/blazor-pivottable-show-total-using-toolbar.png) -
    -
    -![Displaying Specific Total using Toolbar in Blazor PivotTable](images/blazor-pivottable-show-sub-total-using-toolbar.png) +![Show sub-totals at bottom](images/blazor-pivottable-show-sub-totals-at-bottom.png) + +## Show or hide totals using toolbar -## Show or hide totals using toolbar +You can show or hide grand totals and sub-totals in the Pivot Table using the built-in toolbar. To enable the toolbar, set the [ShowToolbar](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SfPivotView-1.html#Syncfusion_Blazor_PivotView_SfPivotView_1_ShowToolbar) property in [SfPivotView](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SfPivotView-1.html) class to **true**. Then, include [ToolbarItems.GrandTotal](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.ToolbarItems.html#Syncfusion_Blazor_PivotView_ToolbarItems_GrandTotal) and [ToolbarItems.SubTotal](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.ToolbarItems.html#Syncfusion_Blazor_PivotView_ToolbarItems_SubTotal) in the [Toolbar](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SfPivotView-1.html#Syncfusion_Blazor_PivotView_SfPivotView_1_Toolbar) property. This displays "Show/Hide Grand Totals" and "Show/Hide Subtotals" icons in the toolbar, allowing users to quickly manage grand totals and sub-totals in the table. -It can also be achieved using built-in toolbar options setting the [ShowToolbar](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SfPivotView-1.html#Syncfusion_Blazor_PivotView_SfPivotView_1_ShowToolbar) property in pivot table to **true** . Also,include the items `GrandTotal` and `SubTotal` within the [Toolbar](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SfPivotView-1.html#Syncfusion_Blazor_PivotView_SfPivotView_1_Toolbar) property in pivottable. End user can now see "Show/Hide Grand totals" and "Show/Hide Sub totals" icons in toolbar UI automatically. +The toolbar also includes options for "Grand Totals Position" and "Subtotals Position." These options allow users to specify whether grand totals and sub-totals appear at the top or bottom of rows and columns. This flexibility helps users position grand totals and sub-totals to best suit their reporting or data analysis needs. ```cshtml @using Syncfusion.Blazor.PivotView - + @@ -249,15 +293,15 @@ It can also be achieved using built-in toolbar options setting the [ShowToolbar] - + @code{ public List toolbar = new List { - ToolbarItems.SubTotal, - ToolbarItems.GrandTotal + ToolbarItems.GrandTotal, + ToolbarItems.SubTotal }; public List data { get; set; } protected override void OnInitialized() @@ -266,11 +310,13 @@ It can also be achieved using built-in toolbar options setting the [ShowToolbar] //Bind the data source collection here. Refer "Assigning sample data to the pivot table" section in getting started for more details. } } - ``` -Additionally, with the built-in option available in the grand totals drop down menu, the grand totals can be dynamically displayed at the top or bottom of the pivot table’s row and column axes. By default, the grand totals are displayed at the bottom of the pivot table’s row and column axes. + +![Displaying Grand Total using Toolbar in Blazor PivotTable](images/blazor-pivottable-show-total-using-toolbar.png) +
    -![Displaying Grand Total Position using Toolbar in Blazor PivotTable](images/blazor-pivottable-show-grand-total-position.png) +![Displaying Specific Total using Toolbar in Blazor PivotTable](images/blazor-pivottable-show-sub-total-using-toolbar.png) +
    N> You can refer to the [Blazor Pivot Table](https://www.syncfusion.com/blazor-components/blazor-pivot-table) feature tour page for its groundbreaking feature representations. You can also explore the [Blazor Pivot Table example](https://blazor.syncfusion.com/demos/pivot-table/default-functionalities?theme=bootstrap5) to know how to render and configure the pivot table. \ No newline at end of file diff --git a/blazor/pivot-table/sorting.md b/blazor/pivot-table/sorting.md index 7f069ff570..71a081d79e 100644 --- a/blazor/pivot-table/sorting.md +++ b/blazor/pivot-table/sorting.md @@ -18,24 +18,35 @@ To have a quick glance on how to sort data in the Blazor Pivot Table, watch this ## Member Sorting -Allows to order field members in rows and columns either in ascending or descending order. By default, field members in rows and columns are in ascending order. +The Member Sorting functionality enables you to arrange field members in the rows and columns of a pivot table in either **ascending** or **descending** order. By default, field members are sorted in ascending order. -Member sorting can be enabled by setting the [EnableSorting](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html#Syncfusion_Blazor_PivotView_PivotViewDataSourceSettings_1_EnableSorting) property in [PivotViewDataSourceSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html) class to **true**. After enabling this API, click the sort icon besides each field in row or column axis, available in the field list or grouping bar UI for re-arranging members either in ascending or descending order. +### Enabling Member Sorting -N> By default the [EnableSorting](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html#Syncfusion_Blazor_PivotView_PivotViewDataSourceSettings_1_EnableSorting) property in [PivotViewDataSourceSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html) class set as **true**. If it is set as **false**, then the field members arrange in pivot table as its data source order. And, the sort icons in grouping bar and field list buttons will be removed. +To enable member sorting, set the [EnableSorting](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html#Syncfusion_Blazor_PivotView_PivotViewDataSourceSettings_1_EnableSorting) property in [PivotViewDataSourceSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html) class to **true**. Once enabled, you can click the sort icon next to each field in the row or column axis within the **Field List** or **Grouping Bar** UI to reorder members in ascending or descending order. -![Sorting in Blazor PivotTable Field List](images/blazor-pivottable-sorting-in-field-list.png) -
    -![Sorting in Blazor PivotTable Grouping Bar](images/blazor-pivottable-sorting-in-groupbar.png) -
    -![Sorting in Blazor PivotGrid](images/blazor-pivotgrid-sorting.png) +N> By default the [EnableSorting](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html#Syncfusion_Blazor_PivotView_PivotViewDataSourceSettings_1_EnableSorting) property in [PivotViewDataSourceSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html) class set as **true**. If we set it as **false**, then the field members arrange in pivot table as its data source order. And, the sort icons in grouping bar and field list buttons will be removed. + +#### Visual Reference + +- **Field List Sort Icon**: + ![Member sorting icon in field list](images/blazor-pivottable-sorting-in-field-list.png) + +- **Grouping Bar Sort Icon**: + ![Member sorting icon in grouping bar](images/blazor-pivottable-sorting-in-groupbar.png) -Member sorting can also be configured using the [PivotViewSortSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewSortSetting.html) class through the code behind, during the initial rendering. The settings required to sort are: +- **Sorted Pivot Table**: + ![Resultant pivot table after member sorting](images/blazor-pivotgrid-sorting.png) -* [Name](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewSortSetting.html#Syncfusion_Blazor_PivotView_PivotViewSortSetting_Name): It allows to set the field name. -* [Order](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewSortSetting.html#Syncfusion_Blazor_PivotView_PivotViewSortSetting_Order): It allows to set the sort direction either to ascending or descending of the respective field. +### Configuring Member Sorting Code Behind -N> By default the [Order](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewSortSetting.html#Syncfusion_Blazor_PivotView_PivotViewSortSetting_Order) property in the [PivotViewSortSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewSortSetting.html) class set as [Sorting.Ascending](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.Sorting.html). Meanwhile, the field members can arrange its order in data source by setting it as [Sorting.None](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.Sorting.html) where the sort icons in grouping bar and field list buttons for the corresponding field will be removed. +You can also configure member sorting during initial rendering using the [PivotViewSortSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewSortSetting.html) class through code behind. The required settings are: + +* [Name](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotSortSetting.html#Syncfusion_Blazor_PivotView_PivotSortSetting_Name): Specifies the name of the field to sort. +* [Order](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotSortSetting.html#Syncfusion_Blazor_PivotView_PivotSortSetting_Order): Defines the sort direction, either **Ascending** or **Descending**. + +N> By default the [Order](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotSortSetting.html#Syncfusion_Blazor_PivotView_PivotSortSetting_Order) property in the [PivotViewSortSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewSortSetting.html) class set as [Sorting.Ascending](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.Sorting.html). Meanwhile, we can arrange the field members as its order in data source by setting it as [Sorting.None](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.Sorting.html#Syncfusion_Blazor_PivotView_Sorting_None) where the sort icons in grouping bar and field list buttons for the corresponding field will be removed. + +The following example demonstrates how to configure the Pivot Table to enable member sorting and set the "Country" field to sort in descending order: ```cshtml @using Syncfusion.Blazor.PivotView @@ -78,7 +89,9 @@ N> By default the [Order](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazo ### Alphanumeric Sorting -Usually string sorting is applied to field members even if it starts with numbers. But this kind of field members can also be sorted on the basis of the numbers that are placed at the beginning of the member name. This can be achieved by setting the [DataType](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.FieldOptions.html#Syncfusion_Blazor_PivotView_FieldOptions_DataType) property as number to the desired field. +Usually, string sorting is applied to field members even if their names start with numbers. To sort field members numerically based on the numbers at the beginning of their names, you can set the [DataType](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.FieldOptions.html#Syncfusion_Blazor_PivotView_FieldOptions_DataType) property to **number** for the specific field. This enables numeric sorting instead of alphabetical sorting, allowing for better logical ordering of numbered items. + +When [DataType](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.FieldOptions.html#Syncfusion_Blazor_PivotView_FieldOptions_DataType) is set to **number**, the component intelligently sorts members like '71-AJ', '209-FB', '36-SW' in the correct numerical sequence (36-SW, 71-AJ, 209-FB) rather than alphabetical order (209-FB, 36-SW, 71-AJ). ```cshtml @using Syncfusion.Blazor.PivotView @@ -151,17 +164,17 @@ Usually string sorting is applied to field members even if it starts with number ![Alpha Numeric Sorting in Blazor PivotTable](images/blazor-pivottable-alpha-numberic-sorting.png) -## Value sorting +## Value Sorting -Allows to sort individual value field and its aggregated values either in row or column axis in both ascending and descending order. It can be enabled by setting the [EnableValueSorting](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SfPivotView-1.html#Syncfusion_Blazor_PivotView_SfPivotView_1_EnableValueSorting) property in [SfPivotView](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SfPivotView-1.html) class to **true**. On enabling, the end user can sort the values by directly clicking the value field header positioned either in row or column axis of the pivot table component. +Value sorting allows users to sort a specific value field and its aggregated values in either the row or column axis, in ascending or descending order. To enable this functionality, set the [EnableValueSorting](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SfPivotView-1.html#Syncfusion_Blazor_PivotView_SfPivotView_1_EnableValueSorting) property in [SfPivotView](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SfPivotView-1.html) class to **true**. Once enabled, users can sort values by clicking the header of a value field in the pivot table's row or column axis. -The value sorting can also be configured using the [PivotViewValueSortSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewValueSortSettings.html) option through the code behind. The settings required to sort value fields are: +You can also configure value sorting programmatically using the [PivotViewValueSortSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewValueSortSettings.html) option. The required settings are: -* [HeaderText](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewValueSortSettings.html#Syncfusion_Blazor_PivotView_PivotViewValueSortSettings_HeaderText): It allows to set the header names with delimiters, that is used for value sorting. The header names are arranged from Level 1 to Level N, down the hierarchy with a delimiter for better specification. -* [HeaderDelimiter](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewValueSortSettings.html#Syncfusion_Blazor_PivotView_PivotViewValueSortSettings_HeaderDelimiter): It allows to set the delimiters string to separate the header text between levels. -* [SortOrder](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewValueSortSettings.html#Syncfusion_Blazor_PivotView_PivotViewValueSortSettings_SortOrder): It allows to set the sort direction of the value field. +* [HeaderText](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotValueSortSettings.html#Syncfusion_Blazor_PivotView_PivotValueSortSettings_HeaderText): It allows to set the header names with delimiters, that is used for value sorting. The header names are arranged from Level 1 to Level N, down the hierarchy with a delimiter for better specification. +* [HeaderDelimiter](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotValueSortSettings.html#Syncfusion_Blazor_PivotView_PivotValueSortSettings_HeaderDelimiter): It allows to set the delimiters string to separate the header text between levels. +* [SortOrder](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotValueSortSettings.html#Syncfusion_Blazor_PivotView_PivotValueSortSettings_SortOrder): It allows to set the sort direction of the value field. -N> Value fields are set to the column axis by default. In such cases, the value sorting applied will have an effect on the column alone. You need to place the value fields in the row axis to do so in row wise. For more information, [refer here](https://blazor.syncfusion.com/documentation/pivot-table/data-binding#values-in-row-axis). +N> Value fields are set to the column axis by default. In such cases, the value sorting applied will have an effect on the column alone. You need to place the value fields in the row axis to do so in row wise. For more information, please [refer here](https://blazor.syncfusion.com/documentation/pivot-table/data-binding#values-in-row-axis). ```cshtml @using Syncfusion.Blazor.PivotView @@ -202,15 +215,15 @@ N> Value fields are set to the column axis by default. In such cases, the value ### Multiple Axis Sorting -Users can apply value sorting to both row and column axes simultaneously for more dynamic and precise data analysis. The following settings are used to configure sorting: +Multiple axis sorting allows simultaneous sorting of value fields in both row and column axes for more flexible and precise data analysis. Apply this functionality using the following settings in [PivotViewValueSortSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewValueSortSettings.html): -* [ColumnHeaderText](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewValueSortSettings.html#Syncfusion_Blazor_PivotView_PivotViewValueSortSettings_ColumnHeaderText): Specifies the column header hierarchy for value sorting. Header levels are defined from Level 1 to N using a delimiter for clarity. -* [HeaderDelimiter](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewValueSortSettings.html#Syncfusion_Blazor_PivotView_PivotViewValueSortSettings_HeaderDelimiter): It allows to set the delimiters string to separate the header text between levels. -* [ColumnSortOrder](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewValueSortSettings.html#Syncfusion_Blazor_PivotView_PivotViewValueSortSettings_ColumnSortOrder): Sets the delimiter string used to separate levels in the column header text. -* [RowHeaderText](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewValueSortSettings.html#Syncfusion_Blazor_PivotView_PivotViewValueSortSettings_RowHeaderText): Defines the specific row header for which the value sorting should be applied. -* [RowSortOrder](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewValueSortSettings.html#Syncfusion_Blazor_PivotView_PivotViewValueSortSettings_RowSortOrder): Determines the sorting direction for the specified row header. +* [ColumnHeaderText](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotValueSortSettings.html#Syncfusion_Blazor_PivotView_PivotValueSortSettings_ColumnHeaderText): Specifies the column header hierarchy for value sorting. Header levels are defined from Level 1 to N using a delimiter for clarity. +* [HeaderDelimiter](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotValueSortSettings.html#Syncfusion_Blazor_PivotView_PivotValueSortSettings_HeaderDelimiter): It allows to set the delimiters string to separate the header text between levels. +* [ColumnSortOrder](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotValueSortSettings.html#Syncfusion_Blazor_PivotView_PivotValueSortSettings_ColumnSortOrder): Determines the sorting direction for the specified column header. +* [RowHeaderText](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotValueSortSettings.html#Syncfusion_Blazor_PivotView_PivotValueSortSettings_RowHeaderText): Defines the specific row header for which the value sorting should be applied. +* [RowSortOrder](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotValueSortSettings.html#Syncfusion_Blazor_PivotView_PivotValueSortSettings_RowSortOrder): Determines the sorting direction for the specified row header. -N> This feature is applicable only to relational data sources. +N> This feature is applicable only to relational data sources and operates exclusively with client-side engine. ```cshtml @using Syncfusion.Blazor.PivotView @@ -232,7 +245,7 @@ N> This feature is applicable only to relational data sources.                                - +     
    @@ -248,26 +261,25 @@ N> This feature is applicable only to relational data sources. ``` ## Events -### OnActionBegin - -The event [OnActionBegin](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewEvents-1.html#Syncfusion_Blazor_PivotView_PivotViewEvents_1_OnActionBegin) triggers when clicking the value sort icon or the sort icon in the field button, which is present in both grouping bar and field list UI. This allows user to identify the current action being performed at runtime. It has the following parameters: -* [DataSourceSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotActionBeginEventArgs.html#Syncfusion_Blazor_PivotView_PivotActionBeginEventArgs_DataSourceSettings) : It holds the current data source settings such as input data source, rows, columns, values, filters, format settings and so on. +### OnActionBegin -* [ActionName](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotActionBeginEventArgs.html#Syncfusion_Blazor_PivotView_PivotActionBeginEventArgs_ActionName): It holds the name of the current action began. The following are the UI actions and their names: +The [OnActionBegin](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewEvents-1.html#Syncfusion_Blazor_PivotView_PivotViewEvents_1_OnActionBegin) event is triggered when the user clicks the value sort icon or the sort icon in a field button, available in both the grouping bar and field list UI. This event allows the user to detect the current action being performed at runtime. The event argument includes the following properties: -| Action | Action Name| -|----------------|-------------| -| [Sort field](./sorting#member-sorting)| Sort field | -| [Value sort icon](./sorting#value-sorting)| Sort value| +* [DataSourceSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotActionBeginEventArgs.html#Syncfusion_Blazor_PivotView_PivotActionBeginEventArgs_DataSourceSettings): Contains the current data source settings, including input data, rows, columns, values, filters, format settings, and more. +* [ActionName](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotActionBeginEventArgs.html#Syncfusion_Blazor_PivotView_PivotActionBeginEventArgs_ActionName): Indicates the name of the action that has begun. The possible UI actions and corresponding names are: -* [FieldInfo](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotActionBeginEventArgs.html#Syncfusion_Blazor_PivotView_PivotActionBeginEventArgs_FieldInfo): It holds the selected field information. + | Action | Action Name| + |------|-------------| + | [Sort field](./sorting#member-sorting) | Sort field | + | [Value sort icon](./sorting#value-sorting) | Sort value | -N> This option is applicable only when the field based UI actions are performed such as filtering, sorting, removing field from grouping bar, editing and aggregation type change. +* [FieldInfo](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotActionBeginEventArgs.html#Syncfusion_Blazor_PivotView_PivotActionBeginEventArgs_FieldInfo): Provides information about the selected field. +* [Cancel](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotActionBeginEventArgs.html#Syncfusion_Blazor_PivotView_PivotActionBeginEventArgs_Cancel): Set this property to **true** to prevent the current action. -* [Cancel](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotActionBeginEventArgs.html#Syncfusion_Blazor_PivotView_PivotActionBeginEventArgs_Cancel): It allows user to restrict the current action. +N> This event is triggered only when field-based UI actions such as filtering, sorting, removing fields from the grouping bar, editing, or changing the aggregation type are performed. -In the following example, sort action can be restricted by setting the **args.Cancel** option to **true** in the `OnActionBegin` event. +In the sample below, the sort action is restricted by setting the **args.Cancel** property to **true** in the [OnActionBegin](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewEvents-1.html#Syncfusion_Blazor_PivotView_PivotViewEvents_1_OnActionBegin) event handler. ```cshtml @using Syncfusion.Blazor.PivotView @@ -312,24 +324,23 @@ In the following example, sort action can be restricted by setting the **args.Ca } ``` -### OnActionComplete -The event [OnActionComplete](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewEvents-1.html#Syncfusion_Blazor_PivotView_PivotViewEvents_1_OnActionComplete) triggers when the UI actions such as value sorting or sorting via the field button, which is present in both grouping bar and field list UI, is completed. This allows user to identify the current UI action being completed at runtime. It has the following parameters: - -* [DataSourceSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotActionCompleteEventArgs-1.html#Syncfusion_Blazor_PivotView_PivotActionCompleteEventArgs_1_DataSourceSettings): It holds the current data source settings such as input data source, rows, columns, values, filters, format settings and so on. +### OnActionComplete -* [ActionName](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotActionCompleteEventArgs-1.html#Syncfusion_Blazor_PivotView_PivotActionCompleteEventArgs_1_ActionName): It holds the name of the current action completed. The following are the UI actions and their names: +The event [OnActionComplete](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewEvents-1.html#Syncfusion_Blazor_PivotView_PivotViewEvents_1_OnActionComplete) triggers when the UI actions such as value sorting or sorting via the field button, which is present in both grouping bar and field list UI, is completed. This allows user to identify the current UI actions being completed at runtime. The event argument includes the following properties: -| Action | Action Name| -|----------------|-------------| -| [`Sort field`](./sorting#member-sorting)| Field sorted| -| [`Value sort icon`](./sorting#value-sorting)| Value sorted| +* [DataSourceSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotActionCompleteEventArgs-1.html#Syncfusion_Blazor_PivotView_PivotActionCompleteEventArgs_1_DataSourceSettings): Contains the current data source settings, including input data, rows, columns, values, filters, format settings, and more. +* [ActionName](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotActionCompleteEventArgs-1.html#Syncfusion_Blazor_PivotView_PivotActionCompleteEventArgs_1_ActionName): Indicates the name of the completed action. The possible UI actions and corresponding names are: -* [FieldInfo](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotActionCompleteEventArgs-1.html#Syncfusion_Blazor_PivotView_PivotActionCompleteEventArgs_1_FieldInfo): It holds the selected field information. + | Action | Action Name| + |------|-------------| + | [Sort field](./sorting#member-sorting) | Field sorted | + | [Value sort icon](./sorting#value-sorting) | Value sorted | -N> This option is applicable only when the field based UI actions are performed such as filtering, sorting, removing field from grouping bar, editing and aggregation type change. +* [FieldInfo](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotActionCompleteEventArgs-1.html#Syncfusion_Blazor_PivotView_PivotActionCompleteEventArgs_1_FieldInfo): Provides information about the selected field. +* [ActionInfo](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotActionCompleteEventArgs-1.html#Syncfusion_Blazor_PivotView_PivotActionCompleteEventArgs_1_ActionInfo): It holds the unique information about the current UI action. For example, if sorting is completed, the event argument contains information such as sort order and the field name. -* [ActionInfo](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotActionCompleteEventArgs-1.html#Syncfusion_Blazor_PivotView_PivotActionCompleteEventArgs_1_ActionInfo): It holds the unique information about the current UI action. For example, if sorting is completed, the event argument contains information such as sort order and the field name. +N> This event is triggered only when field-based UI actions such as filtering, sorting, removing fields from the grouping bar, editing, or changing the aggregation type are performed. ```cshtml @using Syncfusion.Blazor.PivotView @@ -374,16 +385,17 @@ N> This option is applicable only when the field based UI actions are performed } ``` + ### OnActionFailure -The event [OnActionFailure](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewEvents-1.html#Syncfusion_Blazor_PivotView_PivotViewEvents_1_OnActionFailure) triggers when the current UI action fails to achieve the desired result. It has the following parameters: +The [OnActionFailure](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewEvents-1.html#Syncfusion_Blazor_PivotView_PivotViewEvents_1_OnActionFailure) event is triggered when a UI action fails to produce the expected result. This event provides detailed information about the failure through the following parameters: * [ActionName](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotActionFailureEventArgs.html#Syncfusion_Blazor_PivotView_PivotActionFailureEventArgs_ActionName): It holds the name of the current action failed. The following are the UI actions and their names: -| Action | Action Name| -|----------------|-------------| -| [`Sort field`](./sorting#member-sorting)| Sort field | -| [`Value sort icon`](./sorting#value-sorting)| Sort value| + | Action | Action Name| + |------|-------------| + | [Sort field](./sorting#member-sorting)| Sort field | + | [Value sort icon](./sorting#value-sorting)| Sort value| * [ErrorInfo](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotActionFailureEventArgs.html#Syncfusion_Blazor_PivotView_PivotActionFailureEventArgs_ErrorInfo): It holds the error information of the current UI action. diff --git a/blazor/pivot-table/state-persistence.md b/blazor/pivot-table/state-persistence.md index 95a92888a0..535f4cfd1c 100644 --- a/blazor/pivot-table/state-persistence.md +++ b/blazor/pivot-table/state-persistence.md @@ -9,14 +9,13 @@ documentation: ug # State Persistence in Blazor Pivot Table Component -State persistence allows user to maintain the current state of the component along with its report bounded in the browser local storage (cookie). Even if the browser is refreshed or if you move to the next page within the browser, components state will be persisted. State persistence stores the Pivot Table object in the local storage when [EnablePersistence](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SfPivotView-1.html#Syncfusion_Blazor_PivotView_SfPivotView_1_EnablePersistence) property in [SfPivotView](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SfPivotView-1.html) class is set to **true**. +State persistence enables users to automatically retain the entire configuration of the Pivot Table component in the browser's local storage (cookies). This includes the current layout, field arrangements, sorting, applied filters, and the expanded or collapsed states of fields. By enabling the [EnablePersistence](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SfPivotView-1.html#Syncfusion_Blazor_PivotView_SfPivotView_1_EnablePersistence) property in the [SfPivotView](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SfPivotView-1.html) class, all these interactive states and settings are saved automatically. As a result, users can refresh the browser or navigate to different pages and return at any time, knowing that all modified report settings will be retained—ensuring a seamless and uninterrupted data analysis experience. -N> The state of the pivot table is retained during page refresh and navigation based on its ID set. Make sure to set **unique ID** for each pivot table to store its state in browser. On duplication of ID, the state maintained will be overridden. +N> The state of the Pivot Table is retained during page refresh and navigation based on its ID set. Make sure to set **unique ID** for each Pivot Table to store its state in browser. On duplication of ID, the state maintained will be overridden. ```cshtml @using Syncfusion.Blazor.PivotView - @@ -43,7 +42,7 @@ N> The state of the pivot table is retained during page refresh and navigation b protected override void OnInitialized() { this.data = ProductDetails.GetProductData().ToList(); - //Bind the data source collection here. Refer "Assigning sample data to the pivot table" section in getting started for more details. + //Bind the data source collection here. Refer "Assigning sample data to the Pivot Table" section in getting started for more details. } } @@ -51,7 +50,7 @@ N> The state of the pivot table is retained during page refresh and navigation b ## Save and Load Pivot Layout -You can save the current layout of the pivot table by using [GetPersistDataAsync](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SfPivotView-1.html#Syncfusion_Blazor_PivotView_SfPivotView_1_GetPersistData) in string format. The saved layout can be loaded to pivot table any time by passing the saved data as a parameter to [LoadPersistDataAsync](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SfPivotView-1.html#Syncfusion_Blazor_PivotView_SfPivotView_1_LoadPersistData_System_String_) method in the [SfPivotView](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SfPivotView-1.html). +In addition to automatic state persistence, the Pivot Table component allows you to save and restore the current layout programmatically. By using the [GetPersistDataAsync](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SfPivotView-1.html#Syncfusion_Blazor_PivotView_SfPivotView_1_GetPersistData) method, you can retrieve the complete state of the Pivot Table component as a serialized string. This string can be stored and later re-applied to the component by passing it to the [LoadPersistDataAsync](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SfPivotView-1.html#Syncfusion_Blazor_PivotView_SfPivotView_1_LoadPersistData_System_String_) method. This approach offers flexibility for saving user-specific layouts, restoring previous configurations, or implementing custom workflows for managing and reloading the component’s state as needed. ```cshtml @using Syncfusion.Blazor.PivotView @@ -87,7 +86,7 @@ You can save the current layout of the pivot table by using [GetPersistDataAsync protected override void OnInitialized() { this.data = ProductDetails.GetProductData().ToList(); - //Bind the data source collection here. Refer "Assigning sample data to the pivot table" section in getting started for more details. + //Bind the data source collection here. Refer "Assigning sample data to the Pivot Table" section in getting started for more details. } public string persistData; public async void savedata(Microsoft.AspNetCore.Components.Web.MouseEventArgs e) @@ -102,4 +101,4 @@ You can save the current layout of the pivot table by using [GetPersistDataAsync ``` -N> You can refer to the [Blazor Pivot Table](https://www.syncfusion.com/blazor-components/blazor-pivot-table) feature tour page for its groundbreaking feature representations. You can also explore the [Blazor Pivot Table example](https://blazor.syncfusion.com/demos/pivot-table/default-functionalities?theme=bootstrap5) to know how to render and configure the pivot table. \ No newline at end of file +N> You can refer to the [Blazor Pivot Table](https://www.syncfusion.com/blazor-components/blazor-pivot-table) feature tour page for its groundbreaking feature representations. You can also explore the [Blazor Pivot Table example](https://blazor.syncfusion.com/demos/pivot-table/default-functionalities?theme=bootstrap5) to know how to render and configure the Pivot Table. \ No newline at end of file diff --git a/blazor/pivot-table/tool-bar.md b/blazor/pivot-table/tool-bar.md index 1d14420b77..dff321b36b 100644 --- a/blazor/pivot-table/tool-bar.md +++ b/blazor/pivot-table/tool-bar.md @@ -9,7 +9,7 @@ documentation: ug # Toolbar in Blazor Pivot Table Component -Toolbar option allows to access the frequently used features like switching between pivot table and pivot chart, changing chart types, conditional formatting, exporting, etc. with ease at runtime. This option can be enabled by setting the [ShowToolbar](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SfPivotView-1.html#Syncfusion_Blazor_PivotView_SfPivotView_1_ShowToolbar) property in [SfPivotView](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SfPivotView-1.html) class to **true**. The [Toolbar](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SfPivotView-1.html#Syncfusion_Blazor_PivotView_SfPivotView_1_Toolbar) property in [SfPivotView](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SfPivotView-1.html) class accepts the collection of built-in toolbar options. +The toolbar in the Blazor Pivot Table component provides easy access to commonly used features, such as switching between a pivot table and a pivot chart, changing chart types, applying conditional formatting, exporting data, and more. To enable the toolbar, set the [ShowToolbar](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SfPivotView-1.html#Syncfusion_Blazor_PivotView_SfPivotView_1_ShowToolbar) property to **true**. Additionally, the [Toolbar](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SfPivotView-1.html#Syncfusion_Blazor_PivotView_SfPivotView_1_Toolbar) property accepts a collection of built-in toolbar options, allowing users to interact with the Pivot Table efficiently at runtime. To have a quick glance on how to add and customize toolbar in the Blazor Pivot Table, watch this video: @@ -18,27 +18,27 @@ To have a quick glance on how to add and customize toolbar in the Blazor Pivot T ## Built-in Toolbar Options -The following table shows built-in toolbar options and its actions. +The following table lists the built-in toolbar options and their actions: | Built-in Toolbar Options | Actions | -|------------------------|---------| +|--------------------------|---------| | New | Creates a new report | | Save | Saves the current report | -| Save As | Save as current report | -| Rename | Renames the current report | -| Delete | Deletes the current report | -| Load | Loads any report from the report list | -| Grid | Shows pivot table | -| Chart | Shows a chart in any type from the built-in list and option to enable/disable multiple axes | -| Exporting | Exports the pivot table as PDF/Excel/CSV and the pivot chart as PDF and image | -| Sub-total | Shows or hides sub totals | -| Grand Total | Shows or hides grand totals | -| Conditional Formatting | Shows the conditional formatting pop-up to apply formatting | -| Number Formatting | Shows the number formatting pop-up to apply number formatting | -| Field List | Shows the fieldlist pop-up | -| MDX | Shows the MDX query that was run to retrieve data from the OLAP data source. **NOTE: This applies only to the OLAP data source.** | - -N> The order of toolbar options can be changed by simply moving the position of items in the [ToolbarItems](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.ToolbarItems.html) collection. Also if end user wants to remove any toolbar option from getting displayed, it can be simply ignored from adding into the [ToolbarItems](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.ToolbarItems.html) collection. +| Save As | Saves the current report with a new name | +| Rename | Changes the name of the current report | +| Delete | Removes the current report | +| Load | Opens a report from the report list | +| Grid | Displays the pivot table | +| Chart | Shows a pivot chart with options to select different chart types and enable or disable multiple axes | +| Exporting | Exports the pivot table as PDF, Excel, or CSV, or the pivot chart as a PDF or image | +| Sub-total | Shows or hides subtotals in the pivot table | +| Grand Total | Shows or hides grand totals in the pivot table | +| Conditional Formatting | Opens a pop-up to apply formatting to cells based on conditions | +| Number Formatting | Opens a pop-up to apply number formatting to cells | +| Field List | Opens the field list pop-up to configure the report settings | +| MDX | Displays the MDX query used to retrieve data from an OLAP data source. **Note**: This option applies only to OLAP data sources. | + +N> The order of toolbar options can be changed by simply moving the position of items in the [ToolbarItems](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.ToolbarItems.html) collection. Also, if end user wants to remove any toolbar option from getting displayed, it can be simply ignored from adding into the [ToolbarItems](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.ToolbarItems.html) collection. ```cshtml @using Syncfusion.Blazor.PivotView @@ -165,7 +165,11 @@ N> The order of toolbar options can be changed by simply moving the position of ## Show desired chart types in the dropdown menu -By default, all the chart types are displayed in the dropdown menu included in the toolbar. However, based on the request for an application, it is required to show selective chart types on own. This can be achieved using the [ChartTypes](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SfPivotView-1.html#Syncfusion_Blazor_PivotView_SfPivotView_1_ChartTypes) property. To know more about supporting chart types, [click here](https://blazor.syncfusion.com/documentation/pivot-table/pivot-chart#chart-types). +By default, the dropdown menu in the toolbar displays all available chart types. However, you may want to show only specific chart types in the dropdown menu based on your application’s needs. To do this, use the [ChartTypes](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SfPivotView-1.html#Syncfusion_Blazor_PivotView_SfPivotView_1_ChartTypes) property. This property allows you to define a list of chart types that will appear in the dropdown menu, ensuring users see only the options you select. + +For example, if you want the dropdown menu to show only the Column, Bar, Line, and Area chart types, you can set the [ChartTypes](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SfPivotView-1.html#Syncfusion_Blazor_PivotView_SfPivotView_1_ChartTypes) property to include these specific options. This makes the pivot chart easier to use by limiting the choices to those most relevant for your data. + +To learn more about the supported chart types, see the [Pivot Chart documentation](https://blazor.syncfusion.com/documentation/pivot-table/pivot-chart#chart-types). ```cshtml @using Syncfusion.Blazor.PivotView @@ -217,14 +221,13 @@ By default, all the chart types are displayed in the dropdown menu included in t ## Switch the chart to multiple axes -In the chart, the user can switch from single axis to multiple axes with the help of the built-in checkbox available inside the chart type dropdown menu in the toolbar. For more information [refer here](https://blazor.syncfusion.com/documentation/pivot-table/pivot-chart#multi-axis). +In the pivot chart, users can switch between a single axis and multiple axes using a built-in checkbox located in the chart type dropdown menu on the toolbar. This option allows users to display data on multiple axes for better visualization. For more details, [refer here](https://blazor.syncfusion.com/documentation/pivot-table/pivot-chart#multi-axis). ![Displaying Multiple Axes in Blazor PivotTable DropDown Menu](images/blazor-pivotchart-show-multiple-axes.png) ## Show or hide legend -In the chart, legend can be shown or hidden dynamically with the help of the built-in option available in the chart type drop-down menu. -N> By default, the legend will not be visible for the accumulation chart types like pie, doughnut, pyramid, and funnel. Users can enable or disable using the built-in checkbox option. +In the pivot chart, you can show or hide the legend dynamically using an option in the chart type drop-down menu on the toolbar. This allows you to control whether the legend appears alongside the chart. For accumulation chart types, such as pie, doughnut, pyramid, and funnel, the legend is hidden by default. You can enable or disable the legend using a built-in checkbox available in the drop-down menu. ![Blazor PivotChart with Legend](images/blazor-pivotchart-legend.png) @@ -238,7 +241,7 @@ SQL Server is a relational database management system (RDBMS) that can be used t **2.** To connect a SQL Server database using the Microsoft SqlClient in our application, we need to install the [Microsoft.Data.SqlClient](https://www.nuget.org/packages/Microsoft.Data.SqlClient) NuGet package. To do so, open the NuGet package manager of the project solution, search for the package **Microsoft.Data.SqlClient** and install it. -![Add the NuGet package Microsoft.Data.SqlClient to the project](./images/ms-data-sqlclient-nuget-package-install.png) +![Add the NuGet package Microsoft.Data.SqlClient to the project](./images/ms-data-sqlclient-nuget-package-install.jpeg) **3.** Next, in the **Index.razor** page, the **OpenConnection** method is used to connect to the SQL database. The **GetDataTable** method then processes the specified SQL query string, retrieves data from the database, and converts it into a **DataTable** using **SqlCommand** and **SqlDataAdapter**. This **DataTable** can be used to retrieve saved reports and modify them further as shown in the code block below. @@ -527,7 +530,7 @@ For example, the report shown in the following code snippet will be passed to th ![The current report has been saved in the SQL database](./images/blazor_output_save_report.png) -In the meantime, you can save a duplicate of the current report to the SQL Server database with a different name by selecting **"Save as current report"** from the toolbar. The [saveReport](#savereport) event will then be triggered with the new report name **"Sample Report 1"** and the current report. You can save them to the SQL Server database after passing them to the **SaveReportToDB** method, as mentioned above. +In the meantime, you can save a duplicate of the current report to the SQL Server database with a different name by selecting **"Save as current report"** from the toolbar. The [SaveReport](#savereport) event will then be triggered with the new report name **"Sample Report 1"** and the current report. You can save them to the SQL Server database after passing them to the **SaveReportToDB** method, as mentioned above. ![Copy of the current report has been saved in the SQL database](./images/blazor_output_save_as_report.png) @@ -869,7 +872,7 @@ When you select the **"Create a new report"** option from the toolbar, the [NewR **2.** To connect a SQL Server database using the Microsoft SqlClient in our application, we need to install the [Microsoft.Data.SqlClient](https://www.nuget.org/packages/Microsoft.Data.SqlClient) NuGet package. To do so, open the NuGet package manager of the project solution, search for the package **Microsoft.Data.SqlClient** and install it. -![Add the NuGet package Microsoft.Data.SqlClient to the project](images/ms-data-sqlclient-nuget-package-install.png) +![Add the NuGet package Microsoft.Data.SqlClient to the project](images/ms-data-sqlclient-nuget-package-install.jpeg) **3.** Under the **Controllers** folder, create a Web API controller (aka, PivotController.cs) file that aids in data communication with the Pivot Table. @@ -1187,7 +1190,7 @@ namespace MyWebService.Controllers ![The current report has been saved in the SQL database](images/blazor_output_save_report.png) -In the meantime, you can save a duplicate of the current report to the SQL Server database with a different name by selecting **"Save as current report"** from the toolbar. The [saveReport](#savereport) event will then be triggered with the new report name **"Sample Report 1"** and the current report. You can save them to the SQL Server database after passing them to the Web API service, as mentioned above. +In the meantime, you can save a duplicate of the current report to the SQL Server database with a different name by selecting **"Save as current report"** from the toolbar. The [SaveReport](#savereport) event will then be triggered with the new report name **"Sample Report 1"** and the current report. You can save them to the SQL Server database after passing them to the Web API service, as mentioned above. ![Copy of the current report has been saved in the SQL database](images/blazor_output_save_as_report.png) @@ -1628,7 +1631,7 @@ Below points need to be considered when saving the report to SQL Server database ## Load desired report from the report list as default -By default, the pivot table is displayed with the report bound at the code-behind. To load a desired report from the previously saved report collection during initial rendering, set the [DefaultReportName](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.FetchReportArgs.html#Syncfusion_Blazor_PivotView_FetchReportArgs_DefaultReportName) option in the [FetchReport](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewEvents-1.html#Syncfusion_Blazor_PivotView_PivotViewEvents_1_FetchReport) event. +By default, the Pivot Table displays with the report configuration defined in the component initialization. To load a specific report from a previously saved report collection during the initial rendering process, configure the desired report name within the [FetchReport](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewEvents-1.html#Syncfusion_Blazor_PivotView_PivotViewEvents_1_FetchReport) event by setting the [DefaultReportName](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.FetchReportArgs.html#Syncfusion_Blazor_PivotView_FetchReportArgs_DefaultReportName) property. This approach allows the Pivot Table to automatically apply the selected report's configuration, including field arrangements, filters, and formatting settings, as soon as the component completes its data binding process. ```cshtml @using Syncfusion.Blazor.PivotView @@ -1771,35 +1774,33 @@ By default, the pivot table is displayed with the report bound at the code-behin ### FetchReport -The event [FetchReport](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewEvents-1.html#Syncfusion_Blazor_PivotView_PivotViewEvents_1_FetchReport) is triggered when dropdown list is clicked in the toolbar in-order to retrieve and populate saved reports. It has following parameter - [ReportName](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.FetchReportArgs.html#Syncfusion_Blazor_PivotView_FetchReportArgs_ReportName). This event allows the user to fetch the report names from the local storage and populate the dropdown list. +The [FetchReport](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewEvents-1.html#Syncfusion_Blazor_PivotView_PivotViewEvents_1_FetchReport) event is triggered when a user clicks the dropdown list in the toolbar to retrieve saved reports. It includes the [ReportName](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.FetchReportArgs.html#Syncfusion_Blazor_PivotView_FetchReportArgs_ReportName) parameter, which holds the name of the selected report. This event allows users to fetch report names from local storage and populate the dropdown list for easy selection. ### LoadReport -The event [LoadReport](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewEvents-1.html#Syncfusion_Blazor_PivotView_PivotViewEvents_1_FetchReport) is triggered when a report is selected from the dropdown list in the toolbar. It has the following parameters - [Report](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.LoadReportArgs.html#Syncfusion_Blazor_PivotView_LoadReportArgs_Report) and [ReportName](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.LoadReportArgs.html#Syncfusion_Blazor_PivotView_LoadReportArgs_ReportName). This event allows the user to load the selected report to the pivot table. +The [LoadReport](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewEvents-1.html#Syncfusion_Blazor_PivotView_PivotViewEvents_1_LoadReport) event occurs when a user selects a report from the dropdown list in the toolbar of the Pivot Table. This event allows the user to load the chosen report into the Pivot Table for viewing or analysis. It includes two parameters: [Report](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.LoadReportArgs.html#Syncfusion_Blazor_PivotView_LoadReportArgs_Report), which contains the details of the selected report, and [ReportName](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.LoadReportArgs.html#Syncfusion_Blazor_PivotView_LoadReportArgs_ReportName), which specifies the name of the report. These parameters allow the user to load the selected report into the Pivot Table, updating the displayed data based on the chosen report. ### NewReport -The event [NewReport](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewEvents-1.html#Syncfusion_Blazor_PivotView_PivotViewEvents_1_NewReport) is triggered when the new report icon is clicked in the toolbar. It has following parameter - [Report](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.NewReportArgs.html#Syncfusion_Blazor_PivotView_NewReportArgs_Report). This event allows user to create new report and add to the report list. +The [NewReport](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewEvents-1.html#Syncfusion_Blazor_PivotView_PivotViewEvents_1_NewReport) event is triggered when a user clicks the **New Report** icon in the toolbar. This event allows the user to create a new report and add it to the report list. The event provides a parameter, [Report](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.NewReportArgs.html#Syncfusion_Blazor_PivotView_NewReportArgs_Report), which contains details about the new report. By using this event, users can easily start fresh with a new set of data configurations in the Pivot Table, managed through the report settings. ### RenameReport -The event [RenameReport](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewEvents-1.html#Syncfusion_Blazor_PivotView_PivotViewEvents_1_RenameReport) is triggered when rename report icon is clicked in the toolbar. It has following parameters - [Rename](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.RenameReportArgs.html#Syncfusion_Blazor_PivotView_RenameReportArgs_Rename), [Report](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.RenameReportArgs.html#Syncfusion_Blazor_PivotView_RenameReportArgs_Report) and [ReportName](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.RenameReportArgs.html#Syncfusion_Blazor_PivotView_RenameReportArgs_ReportName). This event allows user to rename the selected report from the report list. +The [RenameReport](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewEvents-1.html#Syncfusion_Blazor_PivotView_PivotViewEvents_1_RenameReport) event is triggered when a user clicks the rename report icon in the toolbar. This event allows users to change the name of a selected report from the report list. It includes the following parameters: [Rename](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.RenameReportArgs.html#Syncfusion_Blazor_PivotView_RenameReportArgs_Rename), which holds the new report name entered by the user; [Report](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.RenameReportArgs.html#Syncfusion_Blazor_PivotView_RenameReportArgs_Report), which contains the details of the current report; and [ReportName](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.RenameReportArgs.html#Syncfusion_Blazor_PivotView_RenameReportArgs_ReportName), which stores the original name of the report. ### RemoveReport -The event [RemoveReport](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewEvents-1.html#Syncfusion_Blazor_PivotView_PivotViewEvents_1_RemoveReport) is triggered when remove report icon is clicked in the toolbar. It has following parameters - [Report](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.RemoveReportArgs.html#Syncfusion_Blazor_PivotView_RemoveReportArgs_Report) and [ReportName](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.RemoveReportArgs.html#Syncfusion_Blazor_PivotView_RemoveReportArgs_ReportName). This event allows user to remove the selected report from the report list. +The [RemoveReport](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewEvents-1.html#Syncfusion_Blazor_PivotView_PivotViewEvents_1_RemoveReport) event is triggered when a user clicks the remove report icon in the toolbar. It includes two parameters: [Report](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.RemoveReportArgs.html#Syncfusion_Blazor_PivotView_RemoveReportArgs_Report) and [ReportName](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.RemoveReportArgs.html#Syncfusion_Blazor_PivotView_RemoveReportArgs_ReportName). These parameters allow the user to identify and remove a selected report from the report list in the Pivot Table. ### SaveReport -The event [SaveReport](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewEvents-1.html#Syncfusion_Blazor_PivotView_PivotViewEvents_1_SaveReport) is triggered when save report icon is clicked in the toolbar. It has the following parameters - [Report](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SaveReportArgs.html#Syncfusion_Blazor_PivotView_SaveReportArgs_Report) and [ReportName](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SaveReportArgs.html#Syncfusion_Blazor_PivotView_SaveReportArgs_ReportName). This event allows user to save the altered report to the report list. - - +The [SaveReport](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewEvents-1.html#Syncfusion_Blazor_PivotView_PivotViewEvents_1_SaveReport) event triggers when a user clicks the save report icon in the toolbar. It allows the user to save changes made to the current report. The event includes two parameters: [Report](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SaveReportArgs.html#Syncfusion_Blazor_PivotView_SaveReportArgs_Report), which contains the report details, and [ReportName](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SaveReportArgs.html#Syncfusion_Blazor_PivotView_SaveReportArgs_ReportName), which specifies the name of the saved report. ### BeforeExport -The pivot table (or) pivot chart can be exported as a PDF, Excel, CSV, or other document via the toolbar options. And, you can customize the export settings for exporting document by using the `BeforeExport` event in the toolbar. +The Pivot Table component allows users to export data as PDF, Excel, or CSV files using the toolbar options. The [BeforeExport](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewEvents-1.html#Syncfusion_Blazor_PivotView_PivotViewEvents_1_BeforeExport) event lets users customize settings for the exported document before the export process begins. For instance, users can add a header or footer to a PDF document by setting the [Header](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.PdfHeader.html) and [Footer](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.PdfFooter.html) properties in the [PdfExportProperties](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.PdfExportProperties.html) class within this event. Similarly, for Excel exports, users can define headers using the [ExcelExportProperties](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.ExcelExportProperties.html) class. -For example, you can add the header and footer for the PDF document by setting the `header` and `footer` properties for the `PdfExportProperties` in the `BeforeExport` event. +Here’s an example of how to use the [BeforeExport](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewEvents-1.html#Syncfusion_Blazor_PivotView_PivotViewEvents_1_BeforeExport) event to customize headers and footers for both PDF and Excel exports: ```cshtml @using Syncfusion.Blazor.PivotView @@ -1958,160 +1959,158 @@ For example, you can add the header and footer for the PDF document by setting t ### OnActionBegin -The event [OnActionBegin](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewEvents-1.html#Syncfusion_Blazor_PivotView_PivotViewEvents_1_OnActionBegin) triggers when the UI actions such as switching between pivot table and pivot chart, changing chart types, conditional formatting, exporting, etc. that are present in toolbar UI begin. This allows user to identify the current action being performed at runtime. It has the following parameters: +The [OnActionBegin](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewEvents-1.html#Syncfusion_Blazor_PivotView_PivotViewEvents_1_OnActionBegin) event triggers when a user starts an action in the toolbar, such as switching between the pivot table and pivot chart, changing chart types, applying conditional formatting, or exporting data. This event helps users identify the action being performed and provides options to control it. It includes the following parameters: -* [DataSourceSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotActionBeginEventArgs.html#Syncfusion_Blazor_PivotView_PivotActionBeginEventArgs_DataSourceSettings) : It holds the current data source settings such as input data source, rows, columns, values, filters, format settings and so on. -* [ActionName](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotActionBeginEventArgs.html#Syncfusion_Blazor_PivotView_PivotActionBeginEventArgs_ActionName) : It holds the name of the current action began. The following are the UI actions and their names: +* [DataSourceSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotActionBeginEventArgs.html#Syncfusion_Blazor_PivotView_PivotActionBeginEventArgs_DataSourceSettings): Contains the current report settings of the pivot table, including the data source, rows, columns, values, filters, and format settings. +* [ActionName](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotActionBeginEventArgs.html#Syncfusion_Blazor_PivotView_PivotActionBeginEventArgs_ActionName): Indicates the name of the action being performed. Below is a list of toolbar actions and their corresponding names: -|Action | Action Name| +| Action | Action Name | | ------ | --------- | -|New report | Add new report | -|Save report | Save current report | -|Save as report | Save as current report | -|Rename report | Rename current report | -|Remove report | Remove current report | -|Report change | Report change | -|Conditional Formatting | Open conditional formatting dialog | -|Number Formatting| Open number formatting dialog| -|Export menu | PDF export, Excel export, CSV export, JPG export, PNG export | -|Show field list | Open field list | -|Show Table | Show table view | -|Chart menu | Show chart view | -|MDX query | Open MDX query dialog | -|Sub-totals menu | Hide sub-totals, Show row sub-totals, Show column sub-totals, Show sub-totals | -|Grand totals menu | Hide grand totals, Show row grand totals, Show column grand totals, Show grand totals | - - -* [Cancel](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotActionBeginEventArgs.html#Syncfusion_Blazor_PivotView_PivotActionBeginEventArgs_Cancel) : It allows user to restrict the current action. - -In the below sample, toolbar UI actions such as add new report and save current report can be restricted by setting the **args.Cancel** option to **true** in the `OnActionBegin` event. +| New report | Add new report | +| Save report | Save current report | +| Save as report | Save as current report | +| Rename report | Rename current report | +| Remove report | Remove current report | +| Report change | Report change | +| Conditional Formatting | Open conditional formatting dialog | +| Number Formatting | Open number formatting dialog | +| Export menu | PDF export, Excel export, CSV export | +| Show Fieldlist | Open field list | +| Show Table | Show table view | +| Chart menu | Show chart view | +| MDX query | Open MDX query dialog | +| Sub-totals menu | Hide sub-totals, Show row sub-totals, Show column sub-totals, Show sub-totals | +| Grand totals menu | Hide grand totals, Show row grand totals, Show column grand totals, Show grand totals | + +* [Cancel](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotActionBeginEventArgs.html#Syncfusion_Blazor_PivotView_PivotActionBeginEventArgs_Cancel): Allows users to stop the current action by setting this option to **true**. + +In the example below, the [OnActionBegin](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewEvents-1.html#Syncfusion_Blazor_PivotView_PivotViewEvents_1_OnActionBegin) event is used to prevent the "Add new report" and "Save current report" actions by setting args.Cancel to **true**. This stops these specific toolbar actions from proceeding. The code demonstrates how to control toolbar interactions effectively. ```cshtml @using Syncfusion.Blazor.PivotView;
    - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + +
    @code { - private SfPivotFieldList fieldList; - private SfPivotView pivot; - private List toolbar = new List { - ToolbarItems.New, - ToolbarItems.Save, - ToolbarItems.Grid, - ToolbarItems.Chart, - ToolbarItems.Export, - ToolbarItems.SubTotal, - ToolbarItems.GrandTotal, - ToolbarItems.ConditionalFormatting, - ToolbarItems.NumberFormatting, - ToolbarItems.FieldList - }; - private List data { get; set; } - - protected override void OnInitialized() - { - data = ProductDetails.GetProductData(); - // Bind the data source collection here. Refer "Assigning sample data to the pivot table" section in getting started for more details. - } - // Triggers when the UI action begins. - public void ActionBegin(PivotActionBeginEventArgs args) - { - if (args.ActionName == "Add new report" || args.ActionName == "Save current report") - { - args.Cancel = true; - } - } -} + private SfPivotFieldList fieldList; + private SfPivotView pivot; + private List toolbar = new List { + ToolbarItems.New, + ToolbarItems.Save, + ToolbarItems.Grid, + ToolbarItems.Chart, + ToolbarItems.Export, + ToolbarItems.SubTotal, + ToolbarItems.GrandTotal, + ToolbarItems.ConditionalFormatting, + ToolbarItems.NumberFormatting, + ToolbarItems.FieldList + }; + private List data { get; set; } + protected override void OnInitialized() + { + data = ProductDetails.GetProductData(); + // Bind the data source collection here. Refer "Assigning sample data to the pivot table" section in getting started for more details. + } + // Triggers when the UI action begins. + public void ActionBegin(PivotActionBeginEventArgs args) + { + if (args.ActionName == "Add new report" || args.ActionName == "Save current report") + { + args.Cancel = true; + } + } +} ``` ### OnActionComplete -The event [OnActionComplete](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewEvents-1.html#Syncfusion_Blazor_PivotView_PivotViewEvents_1_OnActionComplete) triggers when the UI actions such as as switching between pivot table and pivot chart, changing chart types, conditional formatting, exporting, etc. that are present in toolbar UI, is completed. This allows user to identify the current UI actions being completed at runtime. It has the following parameters: +The [OnActionComplete](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewEvents-1.html#Syncfusion_Blazor_PivotView_PivotViewEvents_1_OnActionComplete) event triggers after a toolbar action, such as switching between a pivot table and pivot chart, changing chart types, applying conditional formatting, or exporting data, is completed. This event helps users track the completion of these actions at runtime. It includes the following parameters: -* [DataSourceSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotActionCompleteEventArgs-1.html#Syncfusion_Blazor_PivotView_PivotActionCompleteEventArgs_1_DataSourceSettings) : It holds the current data source settings such as input data source, rows, columns, values, filters, format settings and so on. -* [ActionName](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotActionCompleteEventArgs-1.html#Syncfusion_Blazor_PivotView_PivotActionCompleteEventArgs_1_ActionName) : It holds the name of the current action completed. The following are the UI actions and their names: +* [DataSourceSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotActionCompleteEventArgs-1.html#Syncfusion_Blazor_PivotView_PivotActionCompleteEventArgs_1_DataSourceSettings): Contains the current report settings, including the input data, rows, columns, values, filters, and format settings. +* [ActionName](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotActionCompleteEventArgs-1.html#Syncfusion_Blazor_PivotView_PivotActionCompleteEventArgs_1_ActionName): Indicates the name of the completed action. The table below lists the toolbar actions and their corresponding names: -|Action | Action Name| +| Action | Action Name | | ------ | --------- | -|New report | New report added | -|Save report | Report saved | -|Save as report | Report re-saved | -|Rename report | Report renamed | -|Remove report | Report removed | -|Report change | Report changed | -|Conditional Formatting | Conditionally formatted | -|Number Formatting| Number formatted| -|Export menu | PDF exported, Excel exported, CSV exported, JPG exported, PNG exported | -|Show field list | Field list closed | -|Show Table | Table view shown | -|Chart menu | Chart view shown | -|MDX query | MDX query copied | -|Sub-totals menu | Sub-totals hidden, Row sub-totals shown, Column sub-totals shown, Sub-totals shown | -|Grand-totals menu | Grand totals hidden, Row grand totals shown, Column grand totals shown, Grand totals shown | - -* [ActionInfo](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotActionCompleteEventArgs-1.html#Syncfusion_Blazor_PivotView_PivotActionCompleteEventArgs_1_ActionInfo) : It holds the unique information about the current UI action. For example, while adding new report, the event argument contains information such as report name and the action name. +| New report | New report added | +| Save report | Report saved | +| Save as report | Report re-saved | +| Rename report | Report renamed | +| Remove report | Report removed | +| Report change | Report changed | +| Conditional Formatting | Conditionally formatted | +| Number Formatting | Number formatted | +| Export menu | PDF exported, Excel exported, CSV exported | +| Show Fieldlist | Field list closed | +| Show Table | Table view shown | +| Chart menu | Chart view shown | +| MDX query | Open MDX query dialog | +| Sub-totals menu | Sub-totals hidden, Row sub-totals shown, Column sub-totals shown, Sub-totals shown | +| Grand totals menu | Grand totals hidden, Row grand totals shown, Column grand totals shown, Grand totals shown | + +* [ActionInfo](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotActionCompleteEventArgs-1.html#Syncfusion_Blazor_PivotView_PivotActionCompleteEventArgs_1_ActionInfo): Provides specific details about the completed action, such as the report name when adding a new report. ```cshtml @using Syncfusion.Blazor.PivotView;
    - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + +
    @code{ @@ -2148,62 +2147,61 @@ The event [OnActionComplete](https://help.syncfusion.com/cr/blazor/Syncfusion.Bl ### OnActionFailure -The event [OnActionFailure](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewEvents-1.html#Syncfusion_Blazor_PivotView_PivotViewEvents_1_OnActionFailure) triggers when the current UI action fails to achieve the desired result. It has the following parameters: +The [OnActionFailure](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewEvents-1.html#Syncfusion_Blazor_PivotView_PivotViewEvents_1_OnActionFailure) event occurs when a user action in the Pivot Table does not complete as expected. This event helps users understand what went wrong during interactions with the toolbar. It includes the following parameters: -* [ActionName](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotActionFailureEventArgs.html#Syncfusion_Blazor_PivotView_PivotActionFailureEventArgs_ActionName) : It holds the name of the current action failed. The following are the UI actions and their names: +* [ActionName](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotActionFailureEventArgs.html#Syncfusion_Blazor_PivotView_PivotActionFailureEventArgs_ActionName): Identifies which user action did not succeed. The table below lists the actions and their corresponding names: -|Action | Action Name| +| Action | Action Name | | ------ | --------- | -|New report | Add new report | -|Save report | Save current report | -|Save as report | Save as current report | -|Rename report | Rename current report | -|Remove report | Remove current report | -|Report change | Report change | -|Conditional Formatting | Open conditional formatting dialog | -|Number Formatting| Open number formatting dialog| -|Export menu | PDF export, Excel export, CSV export, JPG export, PNG export | -|Show field list | Open field list | -|Show Table | Show table view | -|Chart menu | Show chart view | -|MDX query | Open MDX query dialog | -|Sub-totals menu | Hide sub-totals, Show row sub-totals, Show column sub-totals, Show sub-totals | -|Grand totals menu | Hide grand totals, Show row grand totals, Show column grand totals, Show grand totals| - -* [ErrorInfo](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotActionFailureEventArgs.html#Syncfusion_Blazor_PivotView_PivotActionFailureEventArgs_ErrorInfo) : It holds the error information of the current UI action. - - +| New report | Add new report | +| Save report | Save current report | +| Save as report | Save as current report | +| Rename report | Rename current report | +| Remove report | Remove current report | +| Report change | Report change | +| Conditional Formatting | Open conditional formatting dialog | +| Number Formatting | Open number formatting dialog | +| Export menu | PDF export, Excel export, CSV export | +| Show Fieldlist | Open field list | +| Show Table | Show table view | +| Chart menu | Show chart view | +| MDX query | Open MDX query dialog | +| Sub-totals menu | Hide sub-totals, Show row sub-totals, Show column sub-totals, Show sub-totals | +| Grand totals menu | Hide grand totals, Show row grand totals, Show column grand totals, Show grand totals | + +* [ErrorInfo](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotActionFailureEventArgs.html#Syncfusion_Blazor_PivotView_PivotActionFailureEventArgs_ErrorInfo): Provides details about the error that occurred for the specific user action. + ```cshtml @using Syncfusion.Blazor.PivotView;
    - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + +
    @code{ diff --git a/blazor/pivot-table/tool-tip.md b/blazor/pivot-table/tool-tip.md index 9414bee073..6bcf6b4dba 100644 --- a/blazor/pivot-table/tool-tip.md +++ b/blazor/pivot-table/tool-tip.md @@ -9,7 +9,7 @@ documentation: ug # Tooltip in Blazor Pivot Table Component -The tooltip can be enabled or disabled by setting the [ShowTooltip](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SfPivotView-1.html#Syncfusion_Blazor_PivotView_SfPivotView_1_ShowTooltip) property in [SfPivotView](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.html) class to **true**. By default, tooltip is enabled in the pivot table. +The tooltip displays contextual information when users hover over value cells in the pivot table. It can be enabled or disabled by setting the [ShowTooltip](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SfPivotView-1.html#Syncfusion_Blazor_PivotView_SfPivotView_1_ShowTooltip) property in [SfPivotView](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.html) class to **true** or **false**. By default, tooltip is enabled in the pivot table and shows the cell value along with row and column header information. ```cshtml @using Syncfusion.Blazor.PivotView diff --git a/blazor/pivot-table/virtual-scrolling.md b/blazor/pivot-table/virtual-scrolling.md index b9cffb0a1b..374769584d 100644 --- a/blazor/pivot-table/virtual-scrolling.md +++ b/blazor/pivot-table/virtual-scrolling.md @@ -11,7 +11,11 @@ documentation: ug # Virtual scrolling in Blazor Pivot Table component -Allows to load the large amounts of data without any performance degradation by rendering rows and columns only in the current content viewport. Rest of the aggregated data will be brought into viewport dynamically based on the vertical or horizontal scroll position. This feature can be enabled by setting the [EnableVirtualization](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SfPivotView-1.html#Syncfusion_Blazor_PivotView_SfPivotView_1_EnableVirtualization) property in [SfPivotView](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SfPivotView-1.html) class to **true**. +## Virtual Scrolling + +Virtual scrolling enables efficient handling of large datasets by rendering only the rows and columns visible in the current viewport. This approach prevents performance degradation when working with substantial amounts of data, as content refreshes dynamically during vertical or horizontal scrolling. This feature can be enabled by setting the [EnableVirtualization](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SfPivotView-1.html#Syncfusion_Blazor_PivotView_SfPivotView_1_EnableVirtualization) property in [SfPivotView](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SfPivotView-1.html) class to **true**. + +N> The Virtualization and [Paging](./paging) features in the Pivot Table should not be enabled simultaneously. You can use either feature at a time, but not both together, as they are designed to handle data rendering differently and may conflict when used together. ```cshtml @using Syncfusion.Blazor.PivotView @@ -47,7 +51,7 @@ Allows to load the large amounts of data without any performance degradation by protected override void OnInitialized() { - this.data =PivotVirtualData.GetVirtualData().ToList(); + this.data = PivotVirtualData.GetVirtualData().ToList(); } public class PivotVirtualData @@ -87,11 +91,11 @@ Allows to load the large amounts of data without any performance degradation by ![Virtual Scrolling in Blazor PivotTable](images/blazor-pivottable-virtual-scroll.png) -## Virtual scrolling with single page mode +## Virtual Scrolling with Single Page Mode -When virtual scrolling is enabled, the pivot table renders not only the current view page, but also the previous and next pages by default. This default behavior, however, can cause performance delays when dealing with a large number of rows and columns. This is because the same number of rows and columns from adjacent pages are also processed, resulting in additional computational load. This performance constraint can be avoided by setting the [AllowSinglePage](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewVirtualScrollSettings.html#Syncfusion_Blazor_PivotView_PivotViewVirtualScrollSettings_AllowSinglePage) property to **true** within the [PivotViewVirtualScrollSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewVirtualScrollSettings.html). +When virtual scrolling is enabled, the Pivot Table renders not only the current view page but also the adjacent previous and next pages by default. While this approach supports smooth navigation, it can increase computational load and reduce performance when working with extensive datasets, as additional rows and columns from surrounding pages are processed. -Enabling this property causes the pivot table to render only the rows and columns that are relevant to the current view page during virtual scrolling. This optimization significantly improves the performance of the pivot table, particularly in Blazor WASM applications, during initial rendering and when performing UI actions such as drill up/down, sorting, filtering, and more. +To optimize performance, set the [AllowSinglePage](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewVirtualScrollSettings.html#Syncfusion_Blazor_PivotView_PivotViewVirtualScrollSettings_AllowSinglePage) property to **true** within the [PivotViewVirtualScrollSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewVirtualScrollSettings.html). Enabling this property ensures that only the rows and columns for the current view page are rendered during virtual scrolling. This significantly enhances the performance of the Pivot Table, particularly in Blazor WASM applications, especially during initial rendering and during user interactions such as drilling up, drilling down, sorting, filtering, and other operations. ```cshtml @using Syncfusion.Blazor.PivotView @@ -120,7 +124,7 @@ Enabling this property causes the pivot table to render only the rows and column private List data { get; set; } protected override void OnInitialized() { - this.data =PivotVirtualData.GetVirtualData().ToList(); + this.data = PivotVirtualData.GetVirtualData().ToList(); } public class PivotVirtualData @@ -158,23 +162,20 @@ Enabling this property causes the pivot table to render only the rows and column ``` -**Limitations for virtual scrolling** +## Limitations for Virtual Scrolling * In virtual scrolling, the [ColumnWidth](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewGridSettings.html#Syncfusion_Blazor_PivotView_PivotViewGridSettings_ColumnWidth) property in [GridSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewGridSettings.html) should be in pixels, and percentage values are not accepted. -* Features such as auto fit, column resizing, text wrapping, and setting specific column widths through events can dynamically affect the row height and column width in the pivot table at runtime. However, these changes are not considered in the scroller calculations, particularly with large datasets. This can lead to performance issues and problems with UI functionality during scrolling. Therefore, it is not recommended to use these features alongside virtualization in the pivot table. -* Grouping, which takes additional time to splitting the raw items into the provided format. +* Features such as auto fit, column resizing, text wrapping, and setting specific column widths through events can dynamically affect the row height and column width in the Pivot Table at runtime. However, these changes are not considered in the scroller calculations, particularly with large datasets. This can lead to performance issues and problems with UI functionality during scrolling. Therefore, it is not recommended to use these features alongside virtualization in the Pivot Table. +* Grouping, which takes additional time to split the raw items into the provided format. * Date Formatting, which takes additional time to convert date format. -* Date Formatting with sorting, here additionally full date time format should be framed to perform sorting along with the provided date format which lags the performance. -* When using OLAP data, subtotals and grand totals are only displayed when measures are bound at the last position in the [rows](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html#Syncfusion_Blazor_PivotView_PivotViewDataSourceSettings_1_Rows) or [columns](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html#Syncfusion_Blazor_PivotView_PivotViewDataSourceSettings_1_Columns) axis. Otherwise, the data from the pivot table will be shown without summary totals. -* Even if virtual scrolling is enabled, not only is the current view port data retrieved, but also the data for the immediate previous page and the immediate next page. As a result, when the end user scrolls slightly ahead or behind, the next or previous page data is displayed immediately without requiring a refresh. **Note:** If the pivot table's width and height are large, the loading data count in the current, previous, and next viewport (pages) will also increase, affecting performance. - -**Overcoming the browser's height limitation** - -You can load millions of records in the Blazor Pivot Table by using virtual scrolling, where the pivot table loads and renders rows on-demand while scrolling vertically. As a result, Pivot Table lightens the browser’s load by minimizing the DOM elements and rendering elements visible in the viewport. The height of the table is calculated using the Total Records Count * [RowHeight](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewGridSettings.html#Syncfusion_Blazor_PivotView_PivotViewGridSettings_RowHeight) property. +* Date Formatting with sorting, here additionally full date time format should be framed to perform sorting along with the provided date format, which lags the performance. +* When using OLAP data, subtotals and grand totals are only displayed when measures are bound at the last position in the [rows](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html#Syncfusion_Blazor_PivotView_PivotViewDataSourceSettings_1_Rows) or [columns](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html#Syncfusion_Blazor_PivotView_PivotViewDataSourceSettings_1_Columns) axis. Otherwise, the data from the Pivot Table will be shown without summary totals. +* Even if virtual scrolling is enabled, not only is the current viewport data retrieved, but also the data for the immediate previous page and the immediate next page. As a result, when the end user scrolls slightly ahead or behind, the next or previous page data is displayed immediately without requiring a refresh. **Note:** If the Pivot Table's width and height are large, the loading data count in the current, previous, and next viewport (pages) will also increase, affecting performance. -The browser has some maximum pixel height limitations for the scroll bar element. The content placed above the maximum height can’t be scrolled if the element height is greater than the browser’s maximum height limit. The browser height limit affects the virtual scrolling of the pivot table. Even when a large number of records are bound to the pivot table, it can only display the records until the maximum height limit of the browser. Once the browser’s height limit is reached while scrolling, you won’t be able to scroll further to view the remaining records. +## Overcoming the browser's height limitation -This maximum pixel height limitation differs between browsers and is entirely dependent on the browser's default behavior. So, it is best to set the [RowHeight](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewGridSettings.html#Syncfusion_Blazor_PivotView_PivotViewGridSettings_RowHeight) to keep the virtual scroll bar element's height in the pivot table within the browser's maximum height limit. +The Pivot Table supports loading millions of records using virtual scrolling, where rows are loaded and rendered on-demand during vertical scrolling. This approach reduces the browser’s load by minimizing DOM elements, displaying only those visible in the viewport. The total height of the Pivot Table is determined by multiplying the total record count by the [RowHeight](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewGridSettings.html#Syncfusion_Blazor_PivotView_PivotViewGridSettings_RowHeight) property in [PivotViewGridSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewGridSettings.html). +However, browsers impose a maximum pixel height limit on scroll bar elements, which can restrict scrolling if the content exceeds this limit. When the Pivot Table’s height surpasses the browser’s maximum height, users may not be able to scroll further to view additional records. This limitation varies across browsers and depends on their default behavior. -> You can refer to the [Blazor Pivot Table](https://www.syncfusion.com/blazor-components/blazor-pivot-table) feature tour page for its groundbreaking feature representations. You can also explore the [Blazor Pivot Table example](https://blazor.syncfusion.com/demos/pivot-table/default-functionalities?theme=bootstrap5) to know how to render and configure the pivot table. \ No newline at end of file +To address this, set the [RowHeight](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewGridSettings.html#Syncfusion_Blazor_PivotView_PivotViewGridSettings_RowHeight) property to a value that keeps the virtual scroll bar’s height within the browser’s maximum limit. This ensures users can scroll through all records without interruption, maintaining smooth performance. \ No newline at end of file From b194b91a46d80e9e3346e1d8b93da61e3bc2a6f1 Mon Sep 17 00:00:00 2001 From: sridhar Date: Wed, 5 Nov 2025 12:46:08 +0530 Subject: [PATCH 2/2] 980754: Restoring the UG changes --- blazor/pivot-table/getting-started-webapp.md | 189 ++++++----- .../getting-started-with-server-app.md | 317 +++++++++--------- 2 files changed, 265 insertions(+), 241 deletions(-) diff --git a/blazor/pivot-table/getting-started-webapp.md b/blazor/pivot-table/getting-started-webapp.md index 5c38fb2e29..b250121d87 100644 --- a/blazor/pivot-table/getting-started-webapp.md +++ b/blazor/pivot-table/getting-started-webapp.md @@ -9,7 +9,7 @@ documentation: ug # Getting Started with Blazor Pivot Table in Blazor Web App -This section briefly explains about how to include [Blazor Pivot Table](https://www.syncfusion.com/blazor-components/blazor-pivot-table) component in your Blazor Web App using [Visual Studio](https://visualstudio.microsoft.com/vs/), Visual Studio Code and .NET CLI. +This section explains how to add a [Blazor Pivot Table](https://www.syncfusion.com/blazor-components/blazor-pivot-table) component to your Blazor Web App using [Visual Studio](https://visualstudio.microsoft.com/vs/), Visual Studio Code, or .NET CLI. Follow these steps to set up and display data in the Pivot Table with ease. > **Ready to streamline your Syncfusion® Blazor development?**
    Discover the full potential of Syncfusion® Blazor components with Syncfusion® AI Coding Assistants. Effortlessly integrate, configure, and enhance your projects with intelligent, context-aware code suggestions, streamlined setups, and real-time insights—all seamlessly integrated into your preferred AI-powered IDEs like VS Code, Cursor, Syncfusion® CodeStudio and more. [Explore Syncfusion® AI Coding Assistants](https://blazor.syncfusion.com/documentation/ai-coding-assistant/overview) @@ -19,23 +19,25 @@ This section briefly explains about how to include [Blazor Pivot Table](https:// ## Prerequisites -* [System requirements for Blazor components](https://blazor.syncfusion.com/documentation/system-requirements) +- [System requirements for Blazor components](https://blazor.syncfusion.com/documentation/system-requirements) ## Create a new Blazor Web App in Visual Studio -You can create a **Blazor Web App** using Visual Studio 2022 via [Microsoft Templates](https://learn.microsoft.com/en-us/aspnet/core/blazor/tooling?view=aspnetcore-8.0) or the [Syncfusion® Blazor Extension](https://blazor.syncfusion.com/documentation/visual-studio-integration/template-studio). For detailed instructions, refer to [this Blazor Web App Getting Started](https://blazor.syncfusion.com/documentation/getting-started/blazor-web-app) documentation. +To create a Blazor Web App in Visual Studio 2022, use [Microsoft Templates](https://learn.microsoft.com/en-us/aspnet/core/blazor/tooling?view=aspnetcore-8.0) or the [Syncfusion Blazor Extension](https://blazor.syncfusion.com/documentation/visual-studio-integration/template-studio). For detailed steps, see the [Blazor Web App Getting Started guide](https://blazor.syncfusion.com/documentation/getting-started/blazor-web-app). -You need to configure the corresponding [Interactive render mode](https://learn.microsoft.com/en-us/aspnet/core/blazor/components/render-modes?view=aspnetcore-8.0#render-modes) and [Interactivity location](https://learn.microsoft.com/en-us/aspnet/core/blazor/tooling?view=aspnetcore-8.0&pivots=windows) while creating a Blazor Web Application. +When creating the app, select the appropriate interactive render mode and interactivity location. For more information, refer to the [interactive render mode documentation](https://learn.microsoft.com/en-us/aspnet/core/blazor/components/render-modes?view=aspnetcore-8.0#render-modes) and [interactivity location documentation](https://learn.microsoft.com/en-us/aspnet/core/blazor/tooling?view=aspnetcore-8.0&pivots=windows). ![Create Blazor Web App](images/blazor-create-web-app.png) ## Install Syncfusion® Blazor PivotTable and Themes NuGet in the App -To add **Blazor Pivot Table** component in the app, open the NuGet package manager in Visual Studio (*Tools → NuGet Package Manager → Manage NuGet Packages for Solution*), search and install [Syncfusion.Blazor.PivotTable](https://www.nuget.org/packages/Syncfusion.Blazor.PivotTable) and [Syncfusion.Blazor.Themes](https://www.nuget.org/packages/Syncfusion.Blazor.Themes/). +To add the Blazor Pivot Table component, install the required NuGet packages in your project. -If you utilize `WebAssembly or Auto` render modes in the Blazor Web App need to be install Syncfusion® Blazor components NuGet packages within the client project. +1. Open the NuGet Package Manager in Visual Studio by navigating to *Tools > NuGet Package Manager > Manage NuGet Packages for Solution*. +2. Search for and install [Syncfusion.Blazor.PivotTable](https://www.nuget.org/packages/Syncfusion.Blazor.PivotTable) and [Syncfusion.Blazor.Themes](https://www.nuget.org/packages/Syncfusion.Blazor.Themes). +3. If your Blazor Web App uses `WebAssembly` or `Auto` render modes, ensure these packages are installed in the client project. -Alternatively, you can utilize the following package manager command to achieve the same. +Alternatively, run the following commands in the Package Manager Console: {% tabs %} {% highlight C# tabtitle="Package Manager" %} @@ -46,7 +48,7 @@ Install-Package Syncfusion.Blazor.Themes -Version {{ site.releaseversion }} {% endhighlight %} {% endtabs %} -N> Syncfusion® Blazor components are available in [nuget.org](https://www.nuget.org/packages?q=syncfusion.blazor). Refer to [NuGet packages](https://blazor.syncfusion.com/documentation/nuget-packages) topic for available NuGet packages list with component details. +> **Note**: Syncfusion Blazor components are available on [nuget.org](https://www.nuget.org/packages?q=syncfusion.blazor). For a complete list of available NuGet packages, see the [NuGet packages documentation](https://blazor.syncfusion.com/documentation/nuget-packages). {% endtabcontent %} @@ -54,15 +56,15 @@ N> Syncfusion® Blazor components are availa ## Prerequisites -* [System requirements for Blazor components](https://blazor.syncfusion.com/documentation/system-requirements) +- [System requirements for Blazor components](https://blazor.syncfusion.com/documentation/system-requirements) ## Create a new Blazor Web App in Visual Studio Code -You can create a **Blazor Web App** using Visual Studio Code via [Microsoft Templates](https://learn.microsoft.com/en-us/aspnet/core/blazor/tooling?view=aspnetcore-8.0&pivots=vsc) or the [Syncfusion® Blazor Extension](https://blazor.syncfusion.com/documentation/visual-studio-code-integration/create-project). For detailed instructions, refer to [this Blazor Web App Getting Started](https://blazor.syncfusion.com/documentation/getting-started/blazor-web-app?tabcontent=visual-studio-code) documentation. +To create a Blazor Web App, use Visual Studio Code with [Microsoft Templates](https://learn.microsoft.com/en-us/aspnet/core/blazor/tooling?view=aspnetcore-8.0&pivots=vsc) or the [Syncfusion Blazor Extension](https://blazor.syncfusion.com/documentation/visual-studio-code-integration/create-project). For detailed steps, see the [Blazor Web App Getting Started guide](https://blazor.syncfusion.com/documentation/getting-started/blazor-web-app?tabcontent=visual-studio-code). -Configure the appropriate interactive render mode and interactivity location when setting up a Blazor Web Application. For detailed information, refer to the [interactive render mode documentation](https://blazor.syncfusion.com/documentation/common/interactive-render-mode). +When creating the app, select the appropriate interactive render mode and interactivity location. For more details, refer to the [interactive render mode documentation](https://blazor.syncfusion.com/documentation/common/interactive-render-mode). -For example, in a Blazor Web App with the `Auto` interactive render mode, use the following commands. +For example, to create a Blazor Web App with the `Auto` interactive render mode, run these commands in the terminal: {% tabs %} {% highlight c# tabtitle="Blazor Web App" %} @@ -76,14 +78,13 @@ cd BlazorWebApp.Client ## Install Syncfusion® Blazor PivotTable and Themes NuGet in the App -If you utilize `WebAssembly` or `Auto` render modes in the Blazor Web App need to be install Syncfusion® Blazor components NuGet packages within the client project. +If your Blazor Web App uses `WebAssembly` or `Auto` render modes, install Syncfusion Blazor NuGet packages in the client project. -* Press Ctrl+` to open the integrated terminal in Visual Studio Code. -* Ensure you’re in the project root directory where your `.csproj` file is located. -* Run the following command to install a [Syncfusion.Blazor.PivotTable](https://www.nuget.org/packages/Syncfusion.Blazor.PivotTable) and [Syncfusion.Blazor.Themes](https://www.nuget.org/packages/Syncfusion.Blazor.Themes/) NuGet package and ensure all dependencies are installed. +1. Open the integrated terminal in Visual Studio Code by pressing Ctrl+`. +2. Ensure you are in the project root directory where the `.csproj` file is located. +3. Run the following commands to install the [Syncfusion.Blazor.PivotTable](https://www.nuget.org/packages/Syncfusion.Blazor.PivotTable) and [Syncfusion.Blazor.Themes](https://www.nuget.org/packages/Syncfusion.Blazor.Themes) NuGet packages: {% tabs %} - {% highlight c# tabtitle="Package Manager" %} dotnet add package Syncfusion.Blazor.PivotTable -v {{ site.releaseversion }} @@ -91,10 +92,9 @@ dotnet add package Syncfusion.Blazor.Themes -v {{ site.releaseversion }} dotnet restore {% endhighlight %} - {% endtabs %} -N> Syncfusion® Blazor components are available in [nuget.org](https://www.nuget.org/packages?q=syncfusion.blazor). Refer to [NuGet packages](https://blazor.syncfusion.com/documentation/nuget-packages) topic for available NuGet packages list with component details. +N> Syncfusion® Blazor components are available on [nuget.org](https://www.nuget.org/packages?q=syncfusion.blazor). For a complete list of available NuGet packages, see the [NuGet packages documentation](https://blazor.syncfusion.com/documentation/nuget-packages). {% endtabcontent %} @@ -102,7 +102,7 @@ N> Syncfusion® Blazor components are availa ## Prerequisites -Latest version of the [.NET Core SDK](https://dotnet.microsoft.com/en-us/download). If you previously installed the SDK, you can determine the installed version by executing the following command in a command prompt (Windows) or terminal (macOS) or command shell (Linux). +- Latest version of the [.NET Core SDK](https://dotnet.microsoft.com/en-us/download). To check the installed version, run the following command in a command prompt (Windows), terminal (macOS), or command shell (Linux): {% tabs %} {% highlight c# tabtitle=".NET CLI" %} @@ -114,11 +114,11 @@ dotnet --version ## Create a Blazor Web App using .NET CLI -Run the following command to create a new Blazor Web App in a command prompt (Windows) or terminal (macOS) or command shell (Linux). For detailed instructions, refer to [this Blazor Web App Getting Started](https://blazor.syncfusion.com/documentation/getting-started/blazor-web-app?tabcontent=.net-cli) documentation. +To create a new Blazor Web App, run the following commands in a command prompt (Windows), terminal (macOS), or command shell (Linux). For detailed steps, see the [Blazor Web App Getting Started guide](https://blazor.syncfusion.com/documentation/getting-started/blazor-web-app?tabcontent=.net-cli). -Configure the appropriate interactive render mode and interactivity location when setting up a Blazor Web Application. For detailed information, refer to the [interactive render mode documentation](https://blazor.syncfusion.com/documentation/common/interactive-render-mode). +Select the appropriate interactive render mode and interactivity location when setting up the app. For more details, refer to the [interactive render mode documentation](https://blazor.syncfusion.com/documentation/common/interactive-render-mode). -For example, in a Blazor Web App with `Auto` interactive render mode, use the following commands: +For example, to create a Blazor Web App with the `Auto` interactive render mode, run these commands: {% tabs %} {% highlight c# tabtitle=".NET CLI" %} @@ -156,7 +156,7 @@ N> Syncfusion® Blazor components are availa ## Add Import Namespaces -Open the **~/_Imports.razor** file from the client project and import the `Syncfusion.Blazor` and `Syncfusion.Blazor.PivotView` namespace. +To use the Blazor Pivot Table, add the required namespaces to the **~/_Imports.razor** file in your client project. Include `Syncfusion.Blazor` and `Syncfusion.Blazor.PivotView` to access the pivot table functionality. {% tabs %} {% highlight C# tabtitle="~/_Imports.razor" %} @@ -169,9 +169,7 @@ Open the **~/_Imports.razor** file from the client project and import the `Syncf ## Register Syncfusion® Blazor Service -Register the Syncfusion® Blazor Service in the **~/Program.cs** file of your Blazor Web App. - -If your Blazor Web App uses `WebAssembly` or `Auto` interactive render modes, you must register the Syncfusion® Blazor service in the **~/Program.cs** files of the main `server` project and associated `.Client` project. +Next, register the Syncfusion® Blazor service in the **~/Program.cs** file. This step enables the pivot table component in your Blazor Web App. If your app uses `WebAssembly` or `Auto` interactive render modes, register the service in both the main `server` project and the associated `.Client` project. {% tabs %} {% highlight c# tabtitle="Server(~/_Program.cs)" hl_lines="3 11" %} @@ -207,7 +205,7 @@ await builder.Build().RunAsync(); ## Add stylesheet and script resources -The theme stylesheet and script can be accessed from NuGet through [Static Web Assets](https://blazor.syncfusion.com/documentation/appearance/themes#static-web-assets). Include the stylesheet reference in the `` section and the script reference at the end of the `` in the **~/Components/App.razor** file as shown below: +Include the Syncfusion theme stylesheet and script in your Blazor Web App to style and enable the pivot table. Add the stylesheet in the `` section and the script at the end of the `` in the **~/Components/App.razor** file, as shown below: ```html @@ -224,19 +222,21 @@ The theme stylesheet and script can be accessed from NuGet through [Static Web A ``` -N> Check out the [Blazor Themes](https://blazor.syncfusion.com/documentation/appearance/themes) topic to discover various methods ([Static Web Assets](https://blazor.syncfusion.com/documentation/appearance/themes#static-web-assets), [CDN](https://blazor.syncfusion.com/documentation/appearance/themes#cdn-reference), and [CRG](https://blazor.syncfusion.com/documentation/common/custom-resource-generator)) for referencing themes in your Blazor application. Also, check out the [Adding Script Reference](https://blazor.syncfusion.com/documentation/common/adding-script-references) topic to learn different approaches for adding script references in your Blazor application. +N> Explore the [Blazor Themes](https://blazor.syncfusion.com/documentation/appearance/themes) topic to learn about referencing themes using [Static Web Assets](https://blazor.syncfusion.com/documentation/appearance/themes#static-web-assets), [CDN](https://blazor.syncfusion.com/documentation/appearance/themes#cdn-reference), or [CRG](https://blazor.syncfusion.com/documentation/common/custom-resource-generator). Visit the [Adding Script Reference](https://blazor.syncfusion.com/documentation/common/adding-script-references) topic for different ways to add script references. ## Initializing Blazor pivot Table component -Add the Syncfusion® Blazor Pivot Table component to a Razor page located under the Pages folder (e.g., Pages/Home.razor) in either the **Server** or **Client** project. If an interactivity location as `Per page/component` in the web app, define a render mode at the top of the `~Pages/.razor` component, as follows: +To display the [Blazor Pivot Table](https://www.syncfusion.com/blazor-components/blazor-pivot-table) in your app, add the component to a Razor page, such as **Pages/Home.razor**, in either the Server or Client project. If your app uses per-page or per-component interactivity, specify the render mode at the top of the Razor file. Choose the appropriate render mode based on your app’s setup: -| Interactivity location | RenderMode | Code | +| Interactivity Location | Render Mode | Code | | --- | --- | --- | -| Per page/component | Auto | @rendermode InteractiveAuto | -| | WebAssembly | @rendermode InteractiveWebAssembly | -| | None | --- | +| Per page/component | Auto | `@rendermode InteractiveAuto` | +| Per page/component | WebAssembly | `@rendermode InteractiveWebAssembly` | +| Per page/component | None | --- | -N> If an **Interactivity Location** is set to `Global` and the **Render Mode** is set to `Auto` or `WebAssembly`, the render mode is configured in the `App.razor` file by default. +N> If your app uses global interactivity with Auto or WebAssembly render modes, the render mode is already set in the **App.razor** file. + +Add the following code to your Razor page to include the Pivot Table component: {% tabs %} {% highlight razor %} @@ -257,7 +257,9 @@ N> If an **Interactivity Location** is set to `Global` and the **Render Mode** i ## Assigning sample data to the Blazor pivot table -The [Blazor Pivot Table](https://www.syncfusion.com/blazor-components/blazor-pivot-table) component further needs to be populated with an appropriate data source. For illustration purpose, a collection of objects mentioning the sales details of certain products over a period and region has been prepared. This sample data is assigned to the pivot table component through [DataSource](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html#Syncfusion_Blazor_PivotView_PivotViewDataSourceSettings_1_DataSource) property under [PivotViewDataSourceSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html) class. +To enable users to perform meaningful analysis and generate actionable insights, the Pivot Table component requires a well-structured data source. This data source contains the information you want to analyze and visualize. + +For demonstration purposes, a collection of objects containing sales details for various products across different periods and regions has been prepared. This sample data is assigned to the Pivot Table component through the [DataSource](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html#Syncfusion_Blazor_PivotView_PivotViewDataSourceSettings_1_DataSource) property under the [PivotViewDataSourceSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html) class. {% tabs %} {% highlight razor %} @@ -369,44 +371,45 @@ The [Blazor Pivot Table](https://www.syncfusion.com/blazor-components/blazor-piv {% endhighlight %} {% endtabs %} -## Adding fields to row, column, value and filter axes +## Adding fields to row, column, value, and filter axes -Now that pivot table is initialized and assigned with sample data, will further move to showcase the component by organizing appropriate fields in row, column, value and filter axes. +Organizing fields into appropriate axes transforms raw data into a structured, meaningful Pivot Table that enables users to analyze patterns and trends effectively. With the Pivot Table now initialized and populated with sample data, the next logical step involves organizing the appropriate fields into row, column, value, and filter axes to create a functional data analysis tool. -In [PivotViewDataSourceSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html) class, four major axes - [PivotViewRows](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewRow.html), [PivotViewColumns](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewColumn.html), [PivotViewValues](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewValue.html) and [PivotViewFilters](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewFilter.html) plays a vital role in defining and organizing fields from the bound data source, to render the entire pivot table component in a desired format. +In the [PivotViewDataSourceSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html) class, four primary axes play a crucial role in defining and organizing fields from the bound data source to render the Pivot Table component in the desired format. -[PivotViewRows](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewRow.html) – Collection of fields that needs to be displayed in row axis of the pivot table. +**Understanding the four axes:** -[PivotViewColumns](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewColumn.html) – Collection of fields that needs to be displayed in column axis of the pivot table. +- [PivotViewRows](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewRow.html) – Collection of fields that will be displayed along the row axis of the Pivot Table. +- [PivotViewColumns](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewColumn.html) – Collection of fields that will be displayed along the column axis of the Pivot Table. +- [PivotViewValues](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewValue.html) – Collection of fields that will be displayed as aggregated numeric values within the Pivot Table. +- [PivotViewFilters](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewFilter.html) – Collection of fields that act as master filters over the data bound to the row, column, and value axes of the Pivot Table. -[PivotViewValues](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewValue.html) – Collection of fields that needs to be displayed as aggregated numeric values in the pivot table. +**Essential field properties:** -[PivotViewFilters](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewFilter.html) - Collection of fields that would act as master filter over the data bound in row, column and value axes of the pivot table. +To define each field in its respective axis, configure the following basic properties: -In-order to define each field in the respective axis, the following basic properties should be set. - -* [Name](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewRow.html#Syncfusion_Blazor_PivotView_PivotViewRow_Name): It allows to set the field name from the bound data source. It’s casing should match exactly like in the data source and if not set properly, the pivot table will not be rendered. -* [Caption](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewRow.html#Syncfusion_Blazor_PivotView_PivotViewRow_Caption): It allows to set the field caption, which is the alias name of the field that needs to be displayed in the pivot table. -* [Type](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewRow.html#Syncfusion_Blazor_PivotView_PivotViewRow_Type): It allows to set the summary type of the field. By default, [SummaryTypes.Sum](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SummaryTypes.html) is applied. +* [Name](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotFieldOptions.html#Syncfusion_Blazor_PivotView_PivotFieldOptions_Name): Sets the field name from the bound data source. The casing must match exactly as it appears in the data source, otherwise the Pivot Table will not render correctly. +* [Caption](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotFieldOptions.html#Syncfusion_Blazor_PivotView_PivotFieldOptions_Caption): Sets the field caption, which serves as the display name for the field in the Pivot Table. +* [Type](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotFieldOptions.html#Syncfusion_Blazor_PivotView_PivotFieldOptions_Type): Sets the summary type for the field. By default, the [SummaryTypes.Sum](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SummaryTypes.html#Syncfusion_Blazor_PivotView_SummaryTypes_Sum) aggregation is applied. {% tabs %} {% highlight razor %} -   -         -             -             -         -         -             -             -         -         + + + + + + + + + + -             -         -     + + + @code{ @@ -421,13 +424,15 @@ In-order to define each field in the respective axis, the following basic proper {% endhighlight %} {% endtabs %} +## Applying formatting to a value field +Formatting enhances the readability and presentation of numerical data in a Pivot Table, making it more user-friendly and professional. For example, you can display values with currency symbols or adjust the number of decimal places for greater clarity. -## Applying formatting to a value field +To apply formatting to value fields in a Pivot Table, use the [PivotViewFormatSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html#Syncfusion_Blazor_PivotView_PivotViewDataSourceSettings_1_FormatSettings) class. This class accepts a list of [PivotViewFormatSetting](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewFormatSetting.html) objects, each defining formatting rules for a specific field in your data. -Formatting defines a way in which values should be displayed. For example, format **"C"** denotes the values should be displayed in currency pattern. To do so, define the [PivotViewFormatSetting](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html#Syncfusion_Blazor_PivotView_PivotViewDataSourceSettings_1_FormatSettings) class with its [Name](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewFormatSetting.html#Syncfusion_Blazor_PivotView_PivotViewFormatSetting_Name) and [Format](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewFormatSetting.html#Syncfusion_Blazor_PivotView_PivotViewFormatSetting_Format) properties and add it to [PivotViewFormatSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html#Syncfusion_Blazor_PivotView_PivotViewDataSourceSettings_1_FormatSettings). In this illustration, the [Name](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewFormatSetting.html#Syncfusion_Blazor_PivotView_PivotViewFormatSetting_Name) property is set as **Amount**, a field from value section and its format is set as currency. Likewise, we can set format for other value fields as well and add it to [PivotViewFormatSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html#Syncfusion_Blazor_PivotView_PivotViewDataSourceSettings_1_FormatSettings). +Within each [PivotViewFormatSetting](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewFormatSetting.html) object, set the [Name](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotFormatSetting.html#Syncfusion_Blazor_PivotView_PivotFormatSetting_Name) property to match the exact field name from your value section. Then, specify the desired display format using the [Format](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotFormatSetting.html#Syncfusion_Blazor_PivotView_PivotFormatSetting_Format) property. In the example below, the **Amount** field is configured to display values in currency format using the "C" pattern, which includes currency symbols. -N> Only fields from value section, which is in the form of numeric data values are applicable for formatting. +N> Formatting can only be applied to numeric fields in the value section of the Pivot Table. {% tabs %} {% highlight razor %} @@ -470,29 +475,31 @@ N> Only fields from value section, which is in the form of numeric data values a ## Enable Field List -The field list allows to add or remove fields and also rearrange the fields between different axes, including column, row, value, and filter along with filter and sort options dynamically at runtime. It can be enabled by setting the [ShowFieldList](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SfPivotView-1.html#Syncfusion_Blazor_PivotView_SfPivotView_1_ShowFieldList) property to **true**. To know more about field list, [refer](./field-list) here. +The field list enhances user interaction by allowing you to dynamically add, remove, and rearrange fields across different axes, including column, row, value, and filter axes. This user-friendly interface also provides sorting and filtering options that can be applied at runtime without requiring code changes. + +To enable the field list, set the [ShowFieldList](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SfPivotView-1.html#Syncfusion_Blazor_PivotView_SfPivotView_1_ShowFieldList) property in the [SfPivotView](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SfPivotView-1.html) class to **true**. This activates the field list interface, making it accessible to users to modify Pivot Table report settings. For comprehensive details about field list functionality, [refer](./field-list) to the dedicated field list documentation. {% tabs %} {% highlight razor %} -   -         -             -             -         -         -             -             -         -         + + + + + + + + + + -             -         + + -     +
    @code{ @@ -511,7 +518,9 @@ The field list allows to add or remove fields and also rearrange the fields betw ## Enable Grouping Bar -The grouping bar feature automatically populates fields from the bound data source and allows end users to drag fields between different axes such as columns, rows, values, and filters, and alter pivot table at runtime. It also provides option to sort, filter and remove fields. It can be enabled by setting the [ShowGroupingBar](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SfPivotView-1.html#Syncfusion_Blazor_PivotView_SfPivotView_1_ShowGroupingBar) property to **true**. To know more about grouping bar, [refer](./grouping-bar) here. +The grouping bar allows users to easily manage and modify the report settings of the Pivot Table directly through the user interface. With the grouping bar, users can instantly move fields between columns, rows, values, and filters by dragging them, allowing for quick arrangement and analysis of the data. + +Users can also use the grouping bar to sort, filter, or remove fields quickly without needing to write any code. To enable the grouping bar, set the [ShowGroupingBar](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SfPivotView-1.html#Syncfusion_Blazor_PivotView_SfPivotView_1_ShowGroupingBar) property in the [SfPivotView](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SfPivotView-1.html) class to **true**. For more details about using the grouping bar, see the [Grouping Bar documentation](./grouping-bar). {% tabs %} {% highlight razor %} @@ -552,7 +561,9 @@ The grouping bar feature automatically populates fields from the bound data sour ## Exploring Filter Axis -The filter axis contains collection of fields that would act as master filter over the data bound in row, column and value axes of the pivot table. The fields along with filter members could be set to filter axis either through report via code behind or by dragging and dropping fields from other axes to filter axis via grouping bar or field list at runtime. +The filter axis lets you show only the data you need in the Blazor Pivot Table, making analysis simpler. You can add fields to the filter axis to control what data appears in the [PivotViewRows](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewRow.html), [PivotViewColumns](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewColumn.html), and [PivotViewValues](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewValue.html) axes. You can set up these fields in two ways: by adding them to the [PivotViewFilters](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewFilter.html) collection in your code, or by dragging and dropping fields from other axes to the filter axis using the grouping bar or field list during runtime. This helps you focus on specific data without changing the Pivot Table’s structure. + +The following example shows how to add a field to the filter axis in a Blazor Pivot Table: {% tabs %} {% highlight razor %} @@ -595,9 +606,15 @@ The filter axis contains collection of fields that would act as master filter ov ## Calculated Field -The calculated field feature allows user to insert or add a new calculated field based on the available fields from the bound data source using basic arithmetic operators. The calculated field can be included in pivot table using the [PivotViewCalculatedFieldSetting](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewCalculatedFieldSetting.html) class from code behind. Or else, calculated fields can be added at run time through the built-in dialog by just setting the [AllowCalculatedField](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SfPivotView-1.html#Syncfusion_Blazor_PivotView_SfPivotView_1_AllowCalculatedField) property to **true** in pivot table. You will see a button enabled in the Field List UI automatically to invoke the calculated field dialog and perform necessary operation. To know more about calculated field, [refer](./calculated-field) here. +The calculated field feature enables users to create custom value fields using mathematical formulas and existing fields from their data source. Users can perform complex calculations with basic arithmetic operators and seamlessly integrate these custom fields into their Pivot Table for enhanced data visualization and reporting. + +Users can add calculated fields in two ways: +- **Using code:** Set up calculated fields through the [PivotViewCalculatedFieldSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewCalculatedFieldSetting.html) class when configuring the Pivot Table. +- **Using the user interface:** Alternatively, calculated fields can be added at runtime through a built-in dialog by setting the [AllowCalculatedField](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SfPivotView-1.html#Syncfusion_Blazor_PivotView_SfPivotView_1_AllowCalculatedField) property in the [SfPivotView](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SfPivotView-1.html) class to **true**. When enabled, a button appears in the Field List UI. Clicking this button opens a dialog that allows users to create, edit, or remove calculated fields at runtime. To learn more about calculated fields, [refer](./calculated-field) here. -> By default, the calculated fields created through code-behind are only added to the field list and calculated field dialog UI. To display the calculated field in the pivot table UI, it must be added to the [`PivotViewValues`](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewValue.html) class, as shown in the code below. Additionally, calculated fields can only be added to the value axis. +N> By default, the calculated fields created through code-behind are only added to the field list and calculated field dialog UI. To display the calculated field in the Pivot Table UI, it must be added to the [PivotViewValues](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewValue.html) class, as shown in the code below. Additionally, calculated fields can only be added to the value axis. + +Below is a sample code that shows how to set up calculated fields both through code-behind and using the popup dialog: {% tabs %} {% highlight razor %} @@ -644,13 +661,9 @@ The calculated field feature allows user to insert or add a new calculated field ## Handling exceptions -Exceptions occurred during pivot table actions can be handled without stopping application. These error messages or exception details can be acquired using the [OnActionFailure](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewEvents-1.html#Syncfusion_Blazor_PivotView_PivotViewEvents_1_OnActionFailure) event. - -The argument passed to the [OnActionFailure](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewEvents-1.html#Syncfusion_Blazor_PivotView_PivotViewEvents_1_OnActionFailure) event contains the error details returned from the server. - -N> Recommend you to bind `OnActionFailure` event during your application development phase, this helps you to find any exceptions. You can pass these exception details to our support team to get solution as early as possible. +You can handle errors that occur during Pivot Table actions without stopping your application. Use the [OnActionFailure](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewEvents-1.html#Syncfusion_Blazor_PivotView_PivotViewEvents_1_OnActionFailure) event to capture error messages or details from the server. We recommend binding this event while building your app, as it helps you identify issues early. You can share these error details with our support team to get help quickly. -The following sample code demonstrates notifying user when server-side exception has occurred during data operation, +The following code example shows how to display a server-side error message to the user when a data operation fails: {% tabs %} {% highlight razor %} diff --git a/blazor/pivot-table/getting-started-with-server-app.md b/blazor/pivot-table/getting-started-with-server-app.md index 6ec6265dd9..e499218c55 100644 --- a/blazor/pivot-table/getting-started-with-server-app.md +++ b/blazor/pivot-table/getting-started-with-server-app.md @@ -9,11 +9,11 @@ documentation: ug # Getting Started with Blazor Pivot Table Component in Server App -This section briefly explains about how to include [Blazor Pivot Table](https://www.syncfusion.com/blazor-components/blazor-pivot-table) component in your Blazor Server App using Visual Studio, Visual Studio Code and .NET CLI. +This section explains how to add the [Blazor Pivot Table](https://www.syncfusion.com/blazor-components/blazor-pivot-table) component to your Blazor Server App using Visual Studio, Visual Studio Code, or the .NET CLI. > **Ready to streamline your Syncfusion® Blazor development?**
    Discover the full potential of Syncfusion® Blazor components with Syncfusion® AI Coding Assistants. Effortlessly integrate, configure, and enhance your projects with intelligent, context-aware code suggestions, streamlined setups, and real-time insights—all seamlessly integrated into your preferred AI-powered IDEs like VS Code, Cursor, Syncfusion® CodeStudio and more. [Explore Syncfusion® AI Coding Assistants](https://blazor.syncfusion.com/documentation/ai-coding-assistant/overview) -To get start quickly with Blazor Pivot Table, you can check on this [GitHub](https://github.com/SyncfusionExamples/Blazor-Getting-Started-Examples/tree/main/PivotTable) sample: +To quickly get started with the Blazor Pivot Table, check out this [GitHub sample](https://github.com/SyncfusionExamples/Blazor-Getting-Started-Examples/tree/main/PivotTable). {% tabcontents %} @@ -21,15 +21,15 @@ To get start quickly with Blazor Pivot Table, you can check on this [GitHub](htt ## Prerequisites -* [System requirements for Blazor components](https://blazor.syncfusion.com/documentation/system-requirements) +- Ensure your system meets the [requirements for Blazor components](https://blazor.syncfusion.com/documentation/system-requirements). -## Create a new Blazor App in Visual Studio +## Create a new Blazor Server App in Visual Studio -You can create a **Blazor Server App** using **Blazor Web App** template in Visual Studio via [Microsoft Templates](https://learn.microsoft.com/en-us/aspnet/core/blazor/tooling?view=aspnetcore-7.0&pivots=vs) or the [Syncfusion® Blazor Extension](https://blazor.syncfusion.com/documentation/visual-studio-integration/template-studio). For detailed instructions, refer to [this Blazor Server App Getting Started](https://blazor.syncfusion.com/documentation/getting-started/blazor-server-side-visual-studio) documentation. +Create a **Blazor Server App** using the **Blazor Web App** template in Visual Studio. You can use [Microsoft Templates](https://learn.microsoft.com/en-us/aspnet/core/blazor/tooling?view=aspnetcore-7.0&pivots=vs) or the [Syncfusion® Blazor Extension](https://blazor.syncfusion.com/documentation/visual-studio-integration/template-studio). For step-by-step guidance, refer to the [Blazor Server App Getting Started guide](https://blazor.syncfusion.com/documentation/getting-started/blazor-server-side-visual-studio). -## Install Syncfusion® Blazor PivotTable and Themes NuGet in the App +## Install Syncfusion® Blazor PivotTable and Themes NuGet packages -To add **Blazor Pivot Table** component in the app, open the NuGet package manager in Visual Studio (*Tools → NuGet Package Manager → Manage NuGet Packages for Solution*), search and install [Syncfusion.Blazor.PivotTable](https://www.nuget.org/packages/Syncfusion.Blazor.PivotTable) and [Syncfusion.Blazor.Themes](https://www.nuget.org/packages/Syncfusion.Blazor.Themes/). Alternatively, you can utilize the following package manager command to achieve the same. +To include the **Blazor Pivot Table** component, open the NuGet package manager in Visual Studio (*Tools → NuGet Package Manager → Manage NuGet Packages for Solution*). Search for and install the [Syncfusion.Blazor.PivotTable](https://www.nuget.org/packages/Syncfusion.Blazor.PivotTable) and [Syncfusion.Blazor.Themes](https://www.nuget.org/packages/Syncfusion.Blazor.Themes/) packages. Alternatively, run the following commands in the Package Manager Console. {% tabs %} {% highlight C# tabtitle="Package Manager" %} @@ -40,7 +40,7 @@ Install-Package Syncfusion.Blazor.Themes -Version {{ site.releaseversion }} {% endhighlight %} {% endtabs %} -N> Syncfusion® Blazor components are available in [nuget.org](https://www.nuget.org/packages?q=syncfusion.blazor). Refer to [NuGet packages](https://blazor.syncfusion.com/documentation/nuget-packages) topic for available NuGet packages list with component details. +N> Syncfusion® Blazor components are available on [nuget.org](https://www.nuget.org/packages?q=syncfusion.blazor). See the [NuGet packages documentation](https://blazor.syncfusion.com/documentation/nuget-packages) for a complete list of available packages and component details. {% endtabcontent %} @@ -48,33 +48,30 @@ N> Syncfusion® Blazor components are availa ## Prerequisites -* [System requirements for Blazor components](https://blazor.syncfusion.com/documentation/system-requirements) +- Ensure your system meets the [requirements for Blazor components](https://blazor.syncfusion.com/documentation/system-requirements). -## Create a new Blazor App in Visual Studio Code +## Create a new Blazor Server App in Visual Studio Code -You can create a **Blazor Server App** using Visual Studio Code via [Microsoft Templates](https://learn.microsoft.com/en-us/aspnet/core/blazor/tooling?view=aspnetcore-7.0&pivots=vsc) or the [Syncfusion® Blazor Extension](https://blazor.syncfusion.com/documentation/visual-studio-code-integration/create-project). For detailed instructions, refer to [this Blazor Server App Getting Started](https://blazor.syncfusion.com/documentation/getting-started/blazor-server-side-visual-studio?tabcontent=visual-studio-code) documentation. +Create a **Blazor Server App** using Visual Studio Code with [Microsoft Templates](https://learn.microsoft.com/en-us/aspnet/core/blazor/tooling?view=aspnetcore-7.0&pivots=vsc) or the [Syncfusion® Blazor Extension](https://blazor.syncfusion.com/documentation/visual-studio-code-integration/create-project). For detailed instructions, see the [Blazor Server App Getting Started guide](https://blazor.syncfusion.com/documentation/getting-started/blazor-server-side-visual-studio?tabcontent=visual-studio-code). -Alternatively, you can create a server application using the following command in the terminal(Ctrl+`). +Alternatively, use the following commands in the integrated terminal (Ctrl+`) to create a new Blazor Server App. {% tabs %} - {% highlight c# tabtitle="Blazor Server App" %} dotnet new blazor -o BlazorApp -int Server cd BlazorApp {% endhighlight %} - {% endtabs %} -## Install Syncfusion® Blazor PivotTable and Themes NuGet in the App +## Install Syncfusion® Blazor PivotTable and Themes NuGet packages -* Press Ctrl+` to open the integrated terminal in Visual Studio Code. -* Ensure you’re in the project root directory where your `.csproj` file is located. -* Run the following command to install a [Syncfusion.Blazor.PivotTable](https://www.nuget.org/packages/Syncfusion.Blazor.PivotTable) and [Syncfusion.Blazor.Themes](https://www.nuget.org/packages/Syncfusion.Blazor.Themes/) NuGet package and ensure all dependencies are installed. +1. Open the integrated terminal in Visual Studio Code with Ctrl+`. +2. Ensure you are in the project root directory where the `.csproj` file is located. +3. Run the following commands to install the [Syncfusion.Blazor.PivotTable](https://www.nuget.org/packages/Syncfusion.Blazor.PivotTable) and [Syncfusion.Blazor.Themes](https://www.nuget.org/packages/Syncfusion.Blazor.Themes/) NuGet packages and restore dependencies. {% tabs %} - {% highlight c# tabtitle="Package Manager" %} dotnet add package Syncfusion.Blazor.PivotTable -v {{ site.releaseversion }} @@ -82,10 +79,9 @@ dotnet add package Syncfusion.Blazor.Themes -v {{ site.releaseversion }} dotnet restore {% endhighlight %} - {% endtabs %} -N> Syncfusion® Blazor components are available in [nuget.org](https://www.nuget.org/packages?q=syncfusion.blazor). Refer to [NuGet packages](https://blazor.syncfusion.com/documentation/nuget-packages) topic for available NuGet packages list with component details. +N> Syncfusion® Blazor components are available on [nuget.org](https://www.nuget.org/packages?q=syncfusion.blazor). See the [NuGet packages documentation](https://blazor.syncfusion.com/documentation/nuget-packages) for a complete list of available packages and component details. {% endtabcontent %} @@ -93,7 +89,7 @@ N> Syncfusion® Blazor components are availa ## Prerequisites -Latest version of the [.NET Core SDK](https://dotnet.microsoft.com/en-us/download). If you previously installed the SDK, you can determine the installed version by executing the following command in a command prompt (Windows) or terminal (macOS) or command shell (Linux). +- Install the latest version of the [.NET Core SDK](https://dotnet.microsoft.com/en-us/download). To check the installed version, run the following command in a command prompt (Windows), terminal (macOS), or command shell (Linux). {% tabs %} {% highlight c# tabtitle=".NET CLI" %} @@ -105,7 +101,7 @@ dotnet --version ## Create a Blazor Server App using .NET CLI -Run the `dotnet new blazorserver` command to create a new Blazor Server App in a command prompt (Windows) or terminal (macOS) or command shell (Linux). +Run the following command in a command prompt (Windows), terminal (macOS), or command shell (Linux) to create a new Blazor Server App. {% tabs %} {% highlight c# tabtitle=".NET CLI" %} @@ -116,11 +112,11 @@ cd BlazorApp {% endhighlight %} {% endtabs %} -This command creates new Blazor Server App and places it in a new directory called `BlazorApp` inside your current location. See [Create Blazor app topic](https://dotnet.microsoft.com/en-us/learn/aspnet/blazor-tutorial/create) and [dotnet new CLI command](https://learn.microsoft.com/en-us/dotnet/core/tools/dotnet-new) topics for more details. +This command creates a new Blazor Server App in a directory named `BlazorApp`. For more details, see the [Create Blazor app](https://dotnet.microsoft.com/en-us/learn/aspnet/blazor-tutorial/create) and [dotnet new CLI command](https://learn.microsoft.com/en-us/dotnet/core/tools/dotnet-new) documentation. -## Install Syncfusion® Blazor PivotTable and Themes NuGet in the App +## Install Syncfusion® Blazor PivotTable and Themes NuGet packages -Here's an example of how to add **Blazor Pivot Table** component in the application using the following command in the command prompt (Windows) or terminal (Linux and macOS) to install a [Syncfusion.Blazor.PivotTable](https://www.nuget.org/packages/Syncfusion.Blazor.PivotTable/) and [Syncfusion.Blazor.Themes](https://www.nuget.org/packages/Syncfusion.Blazor.Themes/) NuGet package. See [Install and manage packages using the dotnet CLI](https://learn.microsoft.com/en-us/nuget/consume-packages/install-use-packages-dotnet-cli) topics for more details. +Run the following commands in the command prompt (Windows), terminal (macOS), or command shell (Linux) to install the [Syncfusion.Blazor.PivotTable](https://www.nuget.org/packages/Syncfusion.Blazor.PivotTable/) and [Syncfusion.Blazor.Themes](https://www.nuget.org/packages/Syncfusion.Blazor.Themes/) NuGet packages and restore dependencies. {% tabs %} {% highlight c# tabtitle=".NET CLI" %} @@ -132,30 +128,27 @@ dotnet restore {% endhighlight %} {% endtabs %} -N> Syncfusion® Blazor components are available in [nuget.org](https://www.nuget.org/packages?q=syncfusion.blazor). Refer to [NuGet packages](https://blazor.syncfusion.com/documentation/nuget-packages) topic for available NuGet packages list with component details. +N> Syncfusion® Blazor components are available on [nuget.org](https://www.nuget.org/packages?q=syncfusion.blazor). See the [NuGet packages documentation](https://blazor.syncfusion.com/documentation/nuget-packages) for a complete list of available packages and component details. {% endtabcontent %} {% endtabcontents %} -## Add Import Namespaces +## Add import namespaces -Open the **~/_Imports.razor** file and import the `Syncfusion.Blazor` and `Syncfusion.Blazor.PivotTable` namespace. +To use the Pivot Table component, open the **~/_Imports.razor** file and include the `Syncfusion.Blazor` and `Syncfusion.Blazor.PivotView` namespaces. This allows your app to access the necessary Pivot Table classes and options. ```cshtml - @using Syncfusion.Blazor -@using Syncfusion.Blazor.PivotTable - +@using Syncfusion.Blazor.PivotView ``` -## Register Syncfusion® Blazor Service +## Register Syncfusion® Blazor service -Register the Syncfusion® Blazor Service in the **~/Program.cs** file of your Blazor Server App. +Next, register the Syncfusion® Blazor service in the **~/Program.cs** file of your Blazor Server App. This step enables the pivot table component in your Blazor Server App. {% tabs %} {% highlight C# tabtitle="~/Program.cs" hl_lines="3 10" %} - .... .... using Syncfusion.Blazor; @@ -168,13 +161,12 @@ var builder = WebApplication.CreateBuilder(args); builder.Services.AddSyncfusionBlazor(); .... - {% endhighlight %} {% endtabs %} ## Add stylesheet and script resources -The theme stylesheet and script can be accessed from NuGet through [Static Web Assets](https://blazor.syncfusion.com/documentation/appearance/themes#static-web-assets). Include the stylesheet and script in the `` and the script reference at the end of the `` in the **App.razor** file as shown below: +To style and enable the Blazor Pivot Table, include the theme stylesheet and script from NuGet via [Static Web Assets](https://blazor.syncfusion.com/documentation/appearance/themes#static-web-assets). Add the stylesheet in the `` section and the script at the end of the `` section in the **App.razor** file, as shown below: ```html @@ -192,18 +184,22 @@ The theme stylesheet and script can be accessed from NuGet through [Static Web A ``` -N> Check out the [Blazor Themes](https://blazor.syncfusion.com/documentation/appearance/themes) topic to discover various methods ([Static Web Assets](https://blazor.syncfusion.com/documentation/appearance/themes#static-web-assets), [CDN](https://blazor.syncfusion.com/documentation/appearance/themes#cdn-reference), and [CRG](https://blazor.syncfusion.com/documentation/common/custom-resource-generator)) for referencing themes in your Blazor application. Also, check out the [Adding Script Reference](https://blazor.syncfusion.com/documentation/common/adding-script-references) topic to learn different approaches for adding script references in your Blazor application. +N> Visit the [Blazor Themes](https://blazor.syncfusion.com/documentation/appearance/themes) section to learn about referencing themes using [Static Web Assets](https://blazor.syncfusion.com/documentation/appearance/themes#static-web-assets), [CDN](https://blazor.syncfusion.com/documentation/appearance/themes#cdn-reference), or [CRG](https://blazor.syncfusion.com/documentation/common/custom-resource-generator). Also, explore the [Adding Script Reference](https://blazor.syncfusion.com/documentation/common/adding-script-references) section for different ways to include script references in your Blazor application. ## Add Blazor Pivot Table component -Add the Syncfusion® Blazor Pivot Table component in the **~/Components/Pages/Home.razor** file. If an interactivity location as `per page/component`, define a render mode at the top of the `Home.razor` page. +To include the Syncfusion® Blazor Pivot Table component, add it to the **~/Components/Pages/Home.razor** file. If your app uses per-page or per-component interactivity, specify the render mode at the top of the **Home.razor** file, as shown below: -N> If an Interactivity Location is set to `Global` and the **Render Mode** is set to `Server`, the render mode is configured in the `App.razor` file by default. +N> If your app uses global interactivity with the **Server** render mode, this is configured by default in the **App.razor** file. -``` -@* desired render mode define here *@ +{% tabs %} +{% highlight razor %} + +@* Specify the render mode for the page *@ @rendermode InteractiveServer -``` + +{% endhighlight %} +{% endtabs %} {% tabs %} {% highlight razor %} @@ -215,14 +211,16 @@ N> If an Interactivity Location is set to `Global` and the **Render Mode** is se ## Assigning sample data to the Blazor pivot table -The [Blazor Pivot Table](https://www.syncfusion.com/blazor-components/blazor-pivot-table) component further needs to be populated with an appropriate data source. For illustration purpose, a collection of objects mentioning the sales details of certain products over a period and region has been prepared. This sample data is assigned to the pivot table component through [DataSource](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html#Syncfusion_Blazor_PivotView_PivotViewDataSourceSettings_1_DataSource) property under [PivotViewDataSourceSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html) class. +To enable users to perform meaningful analysis and generate actionable insights, the Pivot Table component requires a well-structured data source. This data source contains the information you want to analyze and visualize. + +For demonstration purposes, a collection of objects containing sales details for various products across different periods and regions has been prepared. This sample data is assigned to the Pivot Table component through the [DataSource](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html#Syncfusion_Blazor_PivotView_PivotViewDataSourceSettings_1_DataSource) property under the [PivotViewDataSourceSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html) class. {% tabs %} {% highlight razor %} -   -     + + @code{ @@ -327,44 +325,45 @@ The [Blazor Pivot Table](https://www.syncfusion.com/blazor-components/blazor-piv {% endhighlight %} {% endtabs %} -## Adding fields to row, column, value and filter axes +## Adding fields to row, column, value, and filter axes -Now that pivot table is initialized and assigned with sample data, will further move to showcase the component by organizing appropriate fields in row, column, value and filter axes. +Organizing fields into appropriate axes transforms raw data into a structured, meaningful Pivot Table that enables users to analyze patterns and trends effectively. With the Pivot Table now initialized and populated with sample data, the next logical step involves organizing the appropriate fields into row, column, value, and filter axes to create a functional data analysis tool. -In [PivotViewDataSourceSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html) class, four major axes - [PivotViewRows](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewRow.html), [PivotViewColumns](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewColumn.html), [PivotViewValues](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewValue.html) and [PivotViewFilters](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewFilter.html) plays a vital role in defining and organizing fields from the bound data source, to render the entire pivot table component in a desired format. +In the [PivotViewDataSourceSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html) class, four primary axes play a crucial role in defining and organizing fields from the bound data source to render the Pivot Table component in the desired format. -[PivotViewRows](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewRow.html) – Collection of fields that needs to be displayed in row axis of the pivot table. +**Understanding the four axes:** -[PivotViewColumns](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewColumn.html) – Collection of fields that needs to be displayed in column axis of the pivot table. +- [PivotViewRows](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewRow.html) – Collection of fields that will be displayed along the row axis of the Pivot Table. +- [PivotViewColumns](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewColumn.html) – Collection of fields that will be displayed along the column axis of the Pivot Table. +- [PivotViewValues](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewValue.html) – Collection of fields that will be displayed as aggregated numeric values within the Pivot Table. +- [PivotViewFilters](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewFilter.html) – Collection of fields that act as master filters over the data bound to the row, column, and value axes of the Pivot Table. -[PivotViewValues](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewValue.html) – Collection of fields that needs to be displayed as aggregated numeric values in the pivot table. +**Essential field properties:** -[PivotViewFilters](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewFilter.html) - Collection of fields that would act as master filter over the data bound in row, column and value axes of the pivot table. +To define each field in its respective axis, configure the following basic properties: -In-order to define each field in the respective axis, the following basic properties should be set. - -* [Name](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewRow.html#Syncfusion_Blazor_PivotView_PivotViewRow_Name): It allows to set the field name from the bound data source. It’s casing should match exactly like in the data source and if not set properly, the pivot table will not be rendered. -* [Caption](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewRow.html#Syncfusion_Blazor_PivotView_PivotViewRow_Caption): It allows to set the field caption, which is the alias name of the field that needs to be displayed in the pivot table. -* [Type](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewRow.html#Syncfusion_Blazor_PivotView_PivotViewRow_Type): It allows to set the summary type of the field. By default, [SummaryTypes.Sum](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SummaryTypes.html) is applied. +* [Name](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotFieldOptions.html#Syncfusion_Blazor_PivotView_PivotFieldOptions_Name): Sets the field name from the bound data source. The casing must match exactly as it appears in the data source, otherwise the Pivot Table will not render correctly. +* [Caption](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotFieldOptions.html#Syncfusion_Blazor_PivotView_PivotFieldOptions_Caption): Sets the field caption, which serves as the display name for the field in the Pivot Table. +* [Type](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotFieldOptions.html#Syncfusion_Blazor_PivotView_PivotFieldOptions_Type): Sets the summary type for the field. By default, the [SummaryTypes.Sum](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SummaryTypes.html#Syncfusion_Blazor_PivotView_SummaryTypes_Sum) aggregation is applied. {% tabs %} {% highlight razor %} -   -         -             -             -         -         -             -             -         -         + + + + + + + + + + -             -         -     + + + @code{ @@ -381,31 +380,35 @@ In-order to define each field in the respective axis, the following basic proper ## Applying formatting to a value field -Formatting defines a way in which values should be displayed. For example, format **"C"** denotes the values should be displayed in currency pattern. To do so, define the [PivotViewFormatSetting](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html#Syncfusion_Blazor_PivotView_PivotViewDataSourceSettings_1_FormatSettings) class with its [Name](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewFormatSetting.html#Syncfusion_Blazor_PivotView_PivotViewFormatSetting_Name) and [Format](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewFormatSetting.html#Syncfusion_Blazor_PivotView_PivotViewFormatSetting_Format) properties and add it to [PivotViewFormatSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html#Syncfusion_Blazor_PivotView_PivotViewDataSourceSettings_1_FormatSettings). In this illustration, the [Name](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewFormatSetting.html#Syncfusion_Blazor_PivotView_PivotViewFormatSetting_Name) property is set as **Amount**, a field from value section and its format is set as currency. Likewise, we can set format for other value fields as well and add it to [PivotViewFormatSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html#Syncfusion_Blazor_PivotView_PivotViewDataSourceSettings_1_FormatSettings). +Formatting enhances the readability and presentation of numerical data in a Pivot Table, making it more user-friendly and professional. For example, you can display values with currency symbols or adjust the number of decimal places for greater clarity. + +To apply formatting to value fields in a Pivot Table, use the [PivotViewFormatSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewDataSourceSettings-1.html#Syncfusion_Blazor_PivotView_PivotViewDataSourceSettings_1_FormatSettings) class. This class accepts a list of [PivotViewFormatSetting](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewFormatSetting.html) objects, each defining formatting rules for a specific field in your data. -N> Only fields from value section, which is in the form of numeric data values are applicable for formatting. +Within each [PivotViewFormatSetting](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewFormatSetting.html) object, set the [Name](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotFormatSetting.html#Syncfusion_Blazor_PivotView_PivotFormatSetting_Name) property to match the exact field name from your value section. Then, specify the desired display format using the [Format](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotFormatSetting.html#Syncfusion_Blazor_PivotView_PivotFormatSetting_Format) property. In the example below, the **Amount** field is configured to display values in currency format using the "C" pattern, which includes currency symbols. + +N> Formatting can only be applied to numeric fields in the value section of the Pivot Table. {% tabs %} {% highlight razor %} -   -         -             -             -         -         -             -             -         -         + + + + + + + + + + -             -         + + -     + @code{ @@ -426,29 +429,31 @@ N> Only fields from value section, which is in the form of numeric data values a ## Enable Field List -The field list allows to add or remove fields and also rearrange the fields between different axes, including column, row, value, and filter along with filter and sort options dynamically at runtime. It can be enabled by setting the [ShowFieldList](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SfPivotView-1.html#Syncfusion_Blazor_PivotView_SfPivotView_1_ShowFieldList) property to **true**. To know more about field list, [refer](./field-list) here. +The field list enhances user interaction by allowing you to dynamically add, remove, and rearrange fields across different axes, including column, row, value, and filter axes. This user-friendly interface also provides sorting and filtering options that can be applied at runtime without requiring code changes. + +To enable the field list, set the [ShowFieldList](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SfPivotView-1.html#Syncfusion_Blazor_PivotView_SfPivotView_1_ShowFieldList) property in the [SfPivotView](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SfPivotView-1.html) class to **true**. This activates the field list interface, making it accessible to users to modify Pivot Table report settings. For comprehensive details about field list functionality, [refer](./field-list) to the dedicated field list documentation. {% tabs %} {% highlight razor %} -   -         -             -             -         -         -             -             -         -         + + + + + + + + + + -             -         + + -     + @code{ @@ -467,29 +472,31 @@ The field list allows to add or remove fields and also rearrange the fields betw ## Enable Grouping Bar -The grouping bar feature automatically populates fields from the bound data source and allows end users to drag fields between different axes such as columns, rows, values, and filters, and alter pivot table at runtime. It also provides option to sort, filter and remove fields. It can be enabled by setting the [ShowGroupingBar](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SfPivotView-1.html#Syncfusion_Blazor_PivotView_SfPivotView_1_ShowGroupingBar) property to **true**. To know more about grouping bar, [refer](./grouping-bar) here. +The grouping bar allows users to easily manage and modify the report settings of the Pivot Table directly through the user interface. With the grouping bar, users can instantly move fields between columns, rows, values, and filters by dragging them, allowing for quick arrangement and analysis of the data. + +Users can also use the grouping bar to sort, filter, or remove fields quickly without needing to write any code. To enable the grouping bar, set the [ShowGroupingBar](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SfPivotView-1.html#Syncfusion_Blazor_PivotView_SfPivotView_1_ShowGroupingBar) property in the [SfPivotView](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SfPivotView-1.html) class to **true**. For more details about using the grouping bar, see the [Grouping Bar documentation](./grouping-bar). {% tabs %} {% highlight razor %} -   -         -             -             -         -         -             -             -         -         + + + + + + + + + + -             -         + + -     + @code{ @@ -508,31 +515,33 @@ The grouping bar feature automatically populates fields from the bound data sour ## Exploring Filter Axis -The filter axis contains collection of fields that would act as master filter over the data bound in row, column and value axes of the pivot table. The fields along with filter members could be set to filter axis either through report via code behind or by dragging and dropping fields from other axes to filter axis via grouping bar or field list at runtime. +The filter axis lets you show only the data you need in the Blazor Pivot Table, making analysis simpler. You can add fields to the filter axis to control what data appears in the [PivotViewRows](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewRow.html), [PivotViewColumns](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewColumn.html), and [PivotViewValues](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewValue.html) axes. You can set up these fields in two ways: by adding them to the [PivotViewFilters](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewFilter.html) collection in your code, or by dragging and dropping fields from other axes to the filter axis using the grouping bar or field list during runtime. This helps you focus on specific data without changing the Pivot Table’s structure. + +The following example shows how to add a field to the filter axis in a Blazor Pivot Table: {% tabs %} {% highlight razor %} -   -         -             -             -         -       + + + + + + -         + -             -         + + -     + @code{ @@ -551,36 +560,42 @@ The filter axis contains collection of fields that would act as master filter ov ## Calculated Field -The calculated field feature allows user to insert or add a new calculated field based on the available fields from the bound data source using basic arithmetic operators. The calculated field can be included in pivot table using the [PivotViewCalculatedFieldSetting](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewCalculatedFieldSetting.html) class from code behind. Or else, calculated fields can be added at run time through the built-in dialog by just setting the [AllowCalculatedField](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SfPivotView-1.html#Syncfusion_Blazor_PivotView_SfPivotView_1_AllowCalculatedField) property to **true** in pivot table. You will see a button enabled in the Field List UI automatically to invoke the calculated field dialog and perform necessary operation. To know more about calculated field, [refer](./calculated-field) here. +The calculated field feature enables users to create custom value fields using mathematical formulas and existing fields from their data source. Users can perform complex calculations with basic arithmetic operators and seamlessly integrate these custom fields into their Pivot Table for enhanced data visualization and reporting. + +Users can add calculated fields in two ways: +- **Using code:** Set up calculated fields through the [PivotViewCalculatedFieldSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewCalculatedFieldSetting.html) class when configuring the Pivot Table. +- **Using the user interface:** Alternatively, calculated fields can be added at runtime through a built-in dialog by setting the [AllowCalculatedField](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SfPivotView-1.html#Syncfusion_Blazor_PivotView_SfPivotView_1_AllowCalculatedField) property in the [SfPivotView](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.SfPivotView-1.html) class to **true**. When enabled, a button appears in the Field List UI automatically to open a dialog that allows users to create, edit, or remove calculated fields at runtime. To learn more about calculated fields, [refer](./calculated-field) here. -> By default, the calculated fields created through code-behind are only added to the field list and calculated field dialog UI. To display the calculated field in the pivot table UI, it must be added to the [`PivotViewValues`](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewValue.html) class, as shown in the code below. Additionally, calculated fields can only be added to the value axis. +N> By default, the calculated fields created through code-behind are only added to the field list and calculated field dialog UI. To display the calculated field in the Pivot Table UI, it must be added to the [PivotViewValues](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewValue.html) class, as shown in the code below. Additionally, calculated fields can only be added to the value axis. + +Below is a sample code that shows how to set up calculated fields both through code-behind and using the popup dialog: {% tabs %} {% highlight razor %} -   -         -             -             -         -         -             -             -         -         + + + + + + + + + + -             + -         -         -             + + + -         -   -             -         -     + + + + + @code{ @@ -600,13 +615,9 @@ The calculated field feature allows user to insert or add a new calculated field ## Handling exceptions -Exceptions occurred during pivot table actions can be handled without stopping application. These error messages or exception details can be acquired using the [OnActionFailure](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewEvents-1.html#Syncfusion_Blazor_PivotView_PivotViewEvents_1_OnActionFailure) event. - -The argument passed to the [OnActionFailure](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewEvents-1.html#Syncfusion_Blazor_PivotView_PivotViewEvents_1_OnActionFailure) event contains the error details returned from the server. - -N> Recommend you to bind `OnActionFailure` event during your application development phase, this helps you to find any exceptions. You can pass these exception details to our support team to get solution as early as possible. +You can handle errors that occur during Pivot Table actions without stopping your application. Use the [OnActionFailure](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.PivotView.PivotViewEvents-1.html#Syncfusion_Blazor_PivotView_PivotViewEvents_1_OnActionFailure) event to capture error messages or details from the server. We recommend binding this event while building your app, as it helps you identify issues early. You can share these error details with our support team to get help quickly. -The following sample code demonstrates notifying user when server-side exception has occurred during data operation, +The following code example shows how to display a server-side error message to the user when a data operation fails: {% tabs %} {% highlight razor %} @@ -660,7 +671,7 @@ The following sample code demonstrates notifying user when server-side exception {% endhighlight %} {% endtabs %} -N> [View Sample in GitHub.](https://github.com/SyncfusionExamples/Blazor-Getting-Started-Examples/tree/main/PivotTable) +N> [View Sample in GitHub.](https://github.com/SyncfusionExamples/Blazor-Getting-Started-Examples/tree/main/PivotTable/BlazorWebApp) ## See also

    31qZX z!JGG1-Np!#YZPd2>nD-;TaQq4_3_;>fq-ePPj@M!);hl#k3@fjpTtu~Z5y+X!X9S& z#n_poZXc!ZyWa5uwY^4Yie#mBrv0nsn(oYP5u_zQSM2$ST)| z5&_tn>%kAy*xUHABbWLaUl=~#W%j{Q4Peb*ZCzhuCF@*NP@(>xoQ{~(VHxnHuU!MztuW@k1ud(uAN3V|Cmj%I}QD>Jhlcx7*#%Y2X z_&EFp{GJNah>dT-OEU&{9Q23E?F}rdVm-+*0gL(EE4W)iMOLI*hCM5Z>@jV*r04ox z`4YK88Pu~vpv$UiF|woXYR0TJZArq(bk#J|rD1w3pJW=QNMP)yN%?sb&x07fy1tCr zj^1kLmP-y_2g?r==_DHH9*ed=>=jE+>VAab=2luruT%y4r1u6r7K*WW+iKGlv6^XV zTBh7(16hE%Kk_2eugB1R8oIOiBZc_ecnrRJHOCe~a`Fte;ot6?Qo4C0^R46 zxJIZY#eRw#w6`R1gKcjZ@k&-M7r? zUX8O_`v{@8#}OltEAvnv?V3?j-@D|@^w`2@m;JsqufK(~)ua2Y&;<@B8C1~?@4f1C z!VLLL9R15fwiB1*45!3&D~Rn{IW?q65#cYC$<6ZqzJ-L@y9kGVPcDfRejp~42^)lO ze)+kKDy;LEI+&7 zVZr9njtks(J=pyiSjgEYZSkeKA*u|(;gAW-IQ%vl$6o}qxc%V|sjJ2vg2y38L?Rhi z`%dqxxOjFTQ#JfG1;k6)iC*K|ZN$nl$QxO)y!Cjv;90OrE5a#^0%V?++Nn8>coCmY z_+a<|;455;Bm(i!<5ykK&C>I^%>L1;#c!8zD~q=oI9M@;8*`^Xi)RUDvADgcQK949 zj>JpSJ%oc_!Fzbr3eB+OD%0316KaJu$G;(Lnq9<)w2M`;i9t!HPb8b6S#I*TZKZHPX$ zs#`KZx;sURF$IT%2*3*OdS6`0h+Q5WH4?DCax^vL#M0m+jkM=c41&9#ZNf7&i015j z?UL~d?L_G>PiUNdO33)zlPrP=iLH}g7A7ETs`U&iCaDA+;d}8PDNcLFejeAZ;n_R2 z@M)FCcZyV*ZG_NmpJO*+?91W*upZz&zoIBIp}=P8yB5;iKBb+~r_yUx`v`Ge5$Li# zO&X9fsRz6ucMfa*x9q-V5{*dxcg*$ghyIIG94|$bRJ8uI`KW)0IbQ6|pv-L3!sGI4C)_9sdi2{B1b@ha>!dZcOa% zY^)iHuQ!gE{%6_0P!)s}XdgEk_+IH!0?0JzvTrE{1SS(aohPgIhhqF!>6(7={(~I6 zNx!|*fAtJ-kDLwde>AjPYI6ZyrQyA$^$0nJOPzR0!M=Qi-S>G0KuFmY*4_T;qdjrd zw}jVgG(O%{mD!Lo&syxBqydySN6cYjE>v>HOx(H$J~38l3x#?O0KUx|Zj)NSOiJi| zyxl{+EM`6fq#(n7<#)On&eY741s431MZ6>vx;uhz74RO#HndK$+5zOlUU+VV{r%!_ z!?ya0;cj0Yy4x-FaL^Jj9d90fHw(eY0Z{3My$MSQx�NZd1F=(>HBWjTFa+?;leR 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≫VC9H^zRwQnHo+v*ra7IAg`G9N5c)x(M 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 AeE+Y@Y^q9)P_YxEsx=aO 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̺r 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 literal 37663 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 diff --git a/blazor/pivot-table/images/code-web-app.jpeg b/blazor/pivot-table/images/code-web-app.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..0c9c04448b82bf9030a894595d721bc008c91412 GIT binary patch literal 99615 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 literal 0 HcmV?d00001 diff --git a/blazor/pivot-table/images/ms-data-sqlclient-nuget-package-install.jpeg b/blazor/pivot-table/images/ms-data-sqlclient-nuget-package-install.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..d7732fdaefb7c5495e47dbced880d6c853afbf9e GIT binary patch literal 100447 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