From 73646a6b6d89c992c80bbe5de7d8124db10837db Mon Sep 17 00:00:00 2001 From: Vinoth2562000 <104135878+Vinoth2562000@users.noreply.github.com> Date: Fri, 26 Sep 2025 12:44:36 +0530 Subject: [PATCH 001/266] 982433: Add Authorization Header Support for Word Import and PDF/Word Export in Rich Text Editor --- blazor/rich-text-editor/import-export.md | 68 +++++++++++++++++++++++- 1 file changed, 67 insertions(+), 1 deletion(-) diff --git a/blazor/rich-text-editor/import-export.md b/blazor/rich-text-editor/import-export.md index 9d3529a995..96442cb90d 100644 --- a/blazor/rich-text-editor/import-export.md +++ b/blazor/rich-text-editor/import-export.md @@ -420,4 +420,70 @@ public WordDocument GetDocument(string htmlText) {% endhighlight %} {% endtabs %} -N> [View Sample in GitHub](https://github.com/SyncfusionExamples/blazor-rich-text-editor-export-to-html). \ No newline at end of file +N> [View Sample in GitHub](https://github.com/SyncfusionExamples/blazor-rich-text-editor-export-to-html). + +## Export Document/PDF with Authentication + +You can add additional data while exporting a document from the Rich Text Editor. When exporting, the OnExport event is triggered, allowing you to: + +- Add custom headers to the request using the `CurrentRequest` property (for example, passing an authentication token). + +- Send custom form data to the server using the `CustomFormData` property. + +On the server side, you can fetch the authentication token from the request headers and retrieve the custom form data. + +The following example demonstrates how to achieve this: + +{% tabs %} +{% highlight razor %} + +@using Syncfusion.Blazor.RichTextEditor + + + + + + Rich Text Editor + +@code { + private string exportWordServiceUrl = "https://blazor.syncfusion.com/services/production/api/RichTextEditor/ExportToDocx"; + private string exportPdfServiceUrl = "https://blazor.syncfusion.com/services/production/api/RichTextEditor/ExportToPdf"; + private List Items = new List() + { + new ToolbarItemModel() { Command = ToolbarCommand.ExportPdf }, + new ToolbarItemModel() { Command = ToolbarCommand.ExportWord }, + }; + private void Export(ExportingEventArgs args) + { + args.CurrentRequest = new Dictionary + { + { "Authorization", "Bearer token" } + }; + args.CustomFormData = new Dictionary + { + { "userId", "12345" } + }; + } +} + +{% endhighlight %} +{% endtabs %} + +{% tabs %} +{% highlight cshtml tabtitle="~/ExportService.cs" %} + public class ExportParam + { + public string? html { get; set; } + public object? formData { get; set; } + } + [AcceptVerbs("Post")] + [EnableCors("AllowAllOrigins")] + [Route("ExportToPdf")] + public async Task ExportToPdf([FromBody] ExportParam args) + { + var authorization = Request.Headers["Authorization"]; + Console.WriteLine(args.formData); + Console.WriteLine(args.html); + } +{% endhighlight %} +{% endtabs %} From 96c5b1722a51f4fbc88227cb48b4c11323efb33f Mon Sep 17 00:00:00 2001 From: SadhanaBaskaran Date: Tue, 30 Sep 2025 10:58:53 +0530 Subject: [PATCH 002/266] 984045: Updated the UG content and samples for Aggregate section in DataGrid --- blazor/datagrid/aggregates.md | 54 ++++++++++--------- blazor/datagrid/custom-aggregate.md | 39 +++++++------- blazor/datagrid/footer-aggregate.md | 22 ++++---- .../datagrid/group-and-caption-aggregate.md | 22 ++++---- blazor/datagrid/reactive-aggregate.md | 18 +++---- 5 files changed, 81 insertions(+), 74 deletions(-) diff --git a/blazor/datagrid/aggregates.md b/blazor/datagrid/aggregates.md index d73c25b175..5089e6df4f 100644 --- a/blazor/datagrid/aggregates.md +++ b/blazor/datagrid/aggregates.md @@ -1,7 +1,7 @@ --- layout: post title: Aggregates in Blazor DataGrid Component | Syncfusion -description: Checkout and learn here all about Aggregates in the Syncfusion Blazor DataGrid component and much more. +description: Learn how to configure and display aggregates (sum, average, min, max, count, true/false count) in the Syncfusion Blazor DataGrid footer, group footer, and group caption using templates and formatting. platform: Blazor control: DataGrid documentation: ug @@ -9,17 +9,19 @@ documentation: ug # Aggregates in Blazor DataGrid -The Aggregates feature in the Syncfusion® Blazor DataGrid allows you to display aggregate values in the footer, group footer, and group caption of the Grid. With this feature, you can easily perform calculations on specific columns and show summary information.This feature can be configured using the **GridAggregates** component.To represent an aggregate column, you need to specify the minimum required properties, such as [Field](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridAggregateColumn.html#Syncfusion_Blazor_Grids_GridAggregateColumn_Field) and [Type](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridAggregateColumn.html#Syncfusion_Blazor_Grids_GridAggregateColumn_Type). +The aggregates feature in the Syncfusion Blazor DataGrid displays summary values in the footer, group footer, and group caption. It enables computing summary information for specific columns and presenting it at key locations in the DataGrid. Configure aggregates with the GridAggregates component. For each aggregate column, specify at least the [Field](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridAggregateColumn.html#Syncfusion_Blazor_Grids_GridAggregateColumn_Field) and [Type](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridAggregateColumn.html#Syncfusion_Blazor_Grids_GridAggregateColumn_Type) properties. -**Displaying aggregate values** +For customized rendering, use aggregate templates and access values via AggregateTemplateContext (for example, Sum, Average, Min, Max, Count, TrueCount, and FalseCount). See: [AggregateTemplateContext](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.AggregateTemplateContext.html) and [AggregateType](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.AggregateType.html). -By default, the aggregate values are displayed in the footer, group, and caption cells of the Grid. However, you can choose to display the aggregate value in any of these cells by using the following properties: +**Displaying aggregate values** -* [FooterTemplate](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridAggregateColumn.html#Syncfusion_Blazor_Grids_GridAggregateColumn_FooterTemplate): Use this property to display the aggregate value in the footer cell. You can define a custom template to format the aggregate value as per your requirements. +By default, aggregate values can be shown in the footer, group footer, and group caption cells. Control where and how the values are displayed using these properties: -* [GroupFooterTemplate](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridAggregateColumn.html#Syncfusion_Blazor_Grids_GridAggregateColumn_GroupFooterTemplate): Use this property to display the aggregate value in the group footer cell. Similar to the footerTemplate, you can provide a custom template to format the aggregate value. +* [FooterTemplate](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridAggregateColumn.html#Syncfusion_Blazor_Grids_GridAggregateColumn_FooterTemplate): Display and format the aggregate value in the footer cell with a custom template. +* [GroupFooterTemplate](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridAggregateColumn.html#Syncfusion_Blazor_Grids_GridAggregateColumn_GroupFooterTemplate): Display and format the aggregate value in the group footer cell with a custom template. +* [GroupCaptionTemplate](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridAggregateColumn.html#Syncfusion_Blazor_Grids_GridAggregateColumn_GroupCaptionTemplate): Display and format the aggregate value in the group caption cell with a custom template. -* [GroupCaptionTemplate](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridAggregateColumn.html#Syncfusion_Blazor_Grids_GridAggregateColumn_GroupCaptionTemplate): Use this property to display the aggregate value in the group caption cell. You can define a custom template to format the aggregate value. +N> Group footer and group caption aggregates appear when grouping is enabled and data is grouped. {% tabs %} {% highlight razor tabtitle="Index.razor" %} @@ -125,27 +127,26 @@ By default, the aggregate values are displayed in the footer, group, and caption {% endhighlight %} {% endtabs %} -{% previewsample "https://blazorplayground.syncfusion.com/embed/hZrACXUDUeyrfGOs?appbar=false&editor=false&result=true&errorlist=false&theme=bootstrap5" %} +{% previewsample "https://blazorplayground.syncfusion.com/embed/BtrIDaLdIjQgCsmJ?appbar=false&editor=false&result=true&errorlist=false&theme=bootstrap5" %} -> * When using local data, the total summary is calculated based on the entire dataset available in the Grid. The aggregate values will reflect calculations across all the rows in the Grid. -> * When working with remote data, the total summary is calculated based on the current page records. This means that if you have enabled pagination and are displaying data in pages, the aggregate values in the footer will represent calculations only for the visible page. +> - With local data, total summaries are calculated over the entire bound dataset. Footer aggregates reflect calculations across all rows. +> - With remote data, footer summaries typically reflect only the current page unless the data adaptor or server returns total summaries. When paging is enabled, the footer shows aggregates for visible page records by default. ## Built-in aggregate types -The Syncfusion® Blazor DataGrid provides several built-in aggregate types that can be specified in the [Type](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridAggregateColumn.html#Syncfusion_Blazor_Grids_GridAggregateColumn_Type) property to configure an aggregate column. +The Syncfusion® Blazor DataGrid provides several built-in aggregate types that can be assigned via the [Type](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridAggregateColumn.html#Syncfusion_Blazor_Grids_GridAggregateColumn_Type) property on an aggregate column. The available built-in aggregate types are : -* **Sum:** Calculates the sum of the values in the column. - -* **Average:** Calculates the average of the values in the column. -* **Min:** Finds the minimum value in the column. -* **Max:** Finds the maximum value in the column. -* **Count:** Counts the number of values in the column. -* **TrueCount:** Counts the number of true values in the column. -* **FalseCount:** Counts the number of false values in the column. +* Sum: Calculates the sum of values in the column. +* Average: Calculates the average of values in the column. +* Min: Finds the minimum value in the column. +* Max: Finds the maximum value in the column. +* Count: Counts the number of values in the column. +* TrueCount: Counts the number of true values in the column. +* FalseCount: Counts the number of false values in the column. -Here is an example that demonstrates how to use built-in aggregates types in the Grid: +The following example demonstrates built-in aggregate types with footer templates. Access aggregate values through AggregateTemplateContext using the matching type property (for example, Max, Min, TrueCount): {% tabs %} {% highlight razor tabtitle="Index.razor" %} @@ -289,11 +290,16 @@ Here is an example that demonstrates how to use built-in aggregates types in the {% endhighlight %} {% endtabs %} -{% previewsample "https://blazorplayground.syncfusion.com/embed/LNrgCDAjUmunNwOO?appbar=false&editor=false&result=true&errorlist=false&theme=bootstrap5" %} +{% previewsample "https://blazorplayground.syncfusion.com/embed/rDVeturxIXlkRbPO?appbar=false&editor=false&result=true&errorlist=false&theme=bootstrap5" %} -> * Multiple types for a column are supported only when one of the aggregate templates is used. -> * The aggregate values must be accessed inside the template using their corresponding [Type](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridAggregateColumn.html#Syncfusion_Blazor_Grids_GridAggregateColumn_Type) name. +> - Multiple aggregate types for a single column are supported only when one of the aggregate templates is used. +> - Access aggregate values inside the template using the corresponding [Type](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridAggregateColumn.html#Syncfusion_Blazor_Grids_GridAggregateColumn_Type) name (for example, Sum, Average, Min, Max, Count, TrueCount, FalseCount). +> - Use the Format property (for example, C2 or d) to apply culture-aware currency and date formatting to aggregate values. ## See also -* [Handling Aggregates in Custom Adaptor](https://blazor.syncfusion.com/documentation/datagrid/custom-binding#handling-aggregates-in-custom-adaptor) \ No newline at end of file +* [Handling aggregates in custom adaptor](https://blazor.syncfusion.com/documentation/datagrid/custom-binding#handling-aggregates-in-custom-adaptor) +* [AggregateTemplateContext API reference](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.AggregateTemplateContext.html) +* [AggregateType enumeration](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.AggregateType.html) +* [Grouping in DataGrid](https://blazor.syncfusion.com/documentation/datagrid/grouping) +* [Column templates](https://blazor.syncfusion.com/documentation/datagrid/column-template) \ No newline at end of file diff --git a/blazor/datagrid/custom-aggregate.md b/blazor/datagrid/custom-aggregate.md index 406c9f2ad3..56d2512e04 100644 --- a/blazor/datagrid/custom-aggregate.md +++ b/blazor/datagrid/custom-aggregate.md @@ -1,7 +1,7 @@ --- layout: post title: Custom aggregate in Blazor DataGrid Component | Syncfusion -description: Checkout and learn here all about Custom aggregate in Syncfusion Blazor DataGrid component and much more details. +description: Learn how to create and display custom aggregates in the Syncfusion Blazor DataGrid, including footer and group aggregates, using the CustomAggregate callback and AggregateTemplateContext.Custom. platform: Blazor control: DataGrid documentation: ug @@ -9,19 +9,17 @@ documentation: ug # Custom aggregate in Blazor DataGrid -The custom aggregate feature in Syncfusion’s Blazor DataGrid allows you to calculate aggregate values using your own aggregate function. This feature can be useful in scenarios where the built-in aggregate functions do not meet your specific requirements. To use the custom aggregate option, follow the steps below: +The custom aggregate feature in the Syncfusion Blazor DataGrid enables calculating summary values with a user-defined function when built-in aggregate types do not meet specific requirements. Configure a custom aggregate by setting the aggregate type and providing a delegate that computes the value. -* Set the **AggregateType** as Custom in **GridAggregateColumn** component. +To use the custom aggregate option: +* Set the `AggregateType` as Custom in the `GridAggregateColumn` component. +* Provide a custom aggregate function using the `CustomAggregate` property on the GridAggregateColumn. -* Provide your custom aggregate function in the **customAggregate** property. +The custom aggregate function is invoked differently based on the context: +- **Total Aggregation:** The function receives the entire dataset and the current aggregate column object. +- **Group Aggregation:** The function receives the current group details and the aggregate column object. -The custom aggregate function will be invoked differently for total and group aggregations: - -**Total Aggregation:** The custom aggregate function will be called with the whole dataset and the current aggregate column object as arguments. - -**Group Aggregation:** The custom aggregate function will be called with the current group details and the aggregate column object as arguments. - -Here’s an example that demonstrates how to use the custom aggregate feature in the Grid: +Here’s an example that demonstrates how to use the custom aggregate feature in the DataGrid: {% tabs %} {% highlight razor tabtitle="Index.razor" %} @@ -60,9 +58,8 @@ Here’s an example that demonstrates how to use the custom aggregate feature in } private int CustomAggregateFunction() { - int Count = Queryable.Count(Orders.Where(x => x.ShipCountry.Contains("Brazil")).AsQueryable()); - return Count; - } + return Orders.Count(x => x.ShipCountry.Contains("Brazil")); + } } {% endhighlight %} {% highlight c# tabtitle="OrderData.cs" %} @@ -111,15 +108,15 @@ Here’s an example that demonstrates how to use the custom aggregate feature in {% endhighlight %} {% endtabs %} -{% previewsample "https://blazorplayground.syncfusion.com/embed/VDBAsZUjTrNSVYmc?appbar=false&editor=false&result=true&errorlist=false&theme=bootstrap5" %} +{% previewsample "https://blazorplayground.syncfusion.com/embed/VZVIXkVRertPQOeX?appbar=false&editor=false&result=true&errorlist=false&theme=bootstrap5" %} -> To access the custom aggregate value inside template, use the key as **Custom** +> To access a custom aggregate value inside a template, use the `Custom` key (AggregateTemplateContext.Custom). **Show the count of distinct values in aggregate row** -You can calculate the count of distinct values in an aggregate row by using custom aggregate functions. By specifying the [Type](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridAggregateColumn.html#Syncfusion_Blazor_Grids_GridAggregateColumn_Type) as **Custom** and providing a custom aggregate function in the `CustomAggregate` property, you can achieve this behavior. +Custom aggregate functions can also compute distinct counts or other domain-specific summaries. Specify the [Type](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridAggregateColumn.html#Syncfusion_Blazor_Grids_GridAggregateColumn_Type) as Custom and provide a function via the [CustomAggregate](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridAggregateColumn.html#Syncfusion_Blazor_Grids_GridAggregateColumn_CustomAggregate) property. The result can be rendered in the footer, group footer, or group caption by using the corresponding template and accessing AggregateTemplateContext.Custom. -Here’s an example that demonstrates how to show the count of distinct values for the **ShipCountry** column using a custom aggregate: +Here’s an example that shows the count of distinct values for the ShipCountry column using a custom aggregate: {% tabs %} {% highlight razor tabtitle="Index.razor" %} @@ -213,6 +210,6 @@ Here’s an example that demonstrates how to show the count of distinct values f {% previewsample "https://blazorplayground.syncfusion.com/embed/BZVUDvBkVInESEoB?appbar=false&editor=false&result=true&errorlist=false&theme=bootstrap5" %} -> To display the aggregate value of the current column in another column, you can use the [ColumnName](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridAggregateColumn.html#Syncfusion_Blazor_Grids_GridAggregateColumn_ColumnName) property. If the `ColumnName` property is not defined, the field name value will be assigned to the `ColumnName` property. - -> You can refer to the [Syncfusion® Blazor DataGrid](https://www.syncfusion.com/blazor-components/blazor-datagrid) feature tour page for its groundbreaking feature representations. You can also explore [Syncfusion® Blazor DataGrid example](https://blazor.syncfusion.com/demos/datagrid/overview?theme=bootstrap4) to understand how to present and manipulate data. \ No newline at end of file +> To display the aggregate value of the current column in another column, use the [ColumnName](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridAggregateColumn.html#Syncfusion_Blazor_Grids_GridAggregateColumn_ColumnName) property. If ColumnName is not defined, the value of Field is used. +> +> Refer to the [Syncfusion® Blazor DataGrid](https://www.syncfusion.com/blazor-components/blazor-datagrid) feature tour page for feature overviews. Explore the [Syncfusion® Blazor DataGrid examples](https://blazor.syncfusion.com/demos/datagrid/overview?theme=bootstrap4) to see data presentation and manipulation in action. \ No newline at end of file diff --git a/blazor/datagrid/footer-aggregate.md b/blazor/datagrid/footer-aggregate.md index f6a54ce2ea..33da269505 100644 --- a/blazor/datagrid/footer-aggregate.md +++ b/blazor/datagrid/footer-aggregate.md @@ -1,17 +1,17 @@ --- layout: post -title: Footer aggregate in Blazor DataGrid Component | Syncfusion -description: Checkout and learn here all about Footer aggregate in Syncfusion Blazor DataGrid component and much more details. +title: Footer aggregates in Blazor DataGrid Component | Syncfusion +description: Learn how to configure and display footer aggregates in the Syncfusion Blazor DataGrid using FooterTemplate, AggregateTemplateContext, and formatting options. platform: Blazor control: DataGrid documentation: ug --- -# Footer aggregate in Blazor DataGrid +# Footer aggregates in Blazor DataGrid -The Syncfusion® Blazor DataGrid allows you to calculate and display aggregate values in the footer cells. The footer aggregate value is calculated from all the rows in the Grid. You can use the [FooterTemplate](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridAggregateColumn.html#Syncfusion_Blazor_Grids_GridAggregateColumn_FooterTemplate) property to render the aggregate value in the footer cells. +The Syncfusion® Blazor DataGrid supports calculating and displaying aggregate values in footer cells. Footer aggregates summarize column values across rows and render in the DataGrid footer. Use the [FooterTemplate](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridAggregateColumn.html#Syncfusion_Blazor_Grids_GridAggregateColumn_FooterTemplate) property to render aggregate values in footer cells. -To access the aggregate values inside the **FooterTemplate**, you can use the implicit named parameter **context**. You can type cast the **context** as **AggregateTemplateContext** to get aggregate values inside template. +Access aggregate values inside `FooterTemplate` through the implicit template parameter `context`. Cast `context` to [AggregateTemplateContext](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.AggregateTemplateContext.html) to read properties such as Sum, Average, Min, Max, Count, TrueCount, and FalseCount. {% tabs %} {% highlight razor tabtitle="Index.razor" %} @@ -113,11 +113,15 @@ To access the aggregate values inside the **FooterTemplate**, you can use the im {% endhighlight %} {% endtabs %} -{% previewsample "https://blazorplayground.syncfusion.com/embed/BjLAMWXqUpZEyoPc?appbar=false&editor=false&result=true&errorlist=false&theme=bootstrap5" %} +{% previewsample "https://blazorplayground.syncfusion.com/embed/LtByDEqjMQrYOURq?appbar=false&editor=false&result=true&errorlist=false&theme=bootstrap5" %} -## Format the aggregate value +> Data source behavior: +> - With local data, footer aggregates are calculated over the entire bound dataset. +> - With remote data and paging, footer aggregates typically reflect only the current page unless the adaptor or server provides total summaries. -To format the aggregate value result in the Syncfusion® Blazor DataGrid, you can use the [Format](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridAggregateColumn.html#Syncfusion_Blazor_Grids_GridAggregateColumn_Format) property of the **AggregateColumn**. The `Format` property allows you to specify a format string that determines how the aggregate value will be displayed. +## Format aggregate values + +To format footer aggregate results in the Syncfusion® Blazor DataGrid, use the [Format](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridAggregateColumn.html#Syncfusion_Blazor_Grids_GridAggregateColumn_Format) property of the aggregate column. The Format string determines how the aggregate value is displayed and supports culture-aware currency, numeric, and date formats. {% tabs %} {% highlight razor tabtitle="Index.razor" %} @@ -219,4 +223,4 @@ To format the aggregate value result in the Syncfusion® Blazor DataGrid allow you to calculate aggregate values based on the current group items. These aggregate values can be displayed in the group footer cells and group caption cells, respectively. To achieve this, you can use the [GroupFooterTemplate](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridAggregateColumn.html#Syncfusion_Blazor_Grids_GridAggregateColumn_GroupFooterTemplate) and [GroupCaptionTemplate](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridAggregateColumn.html#Syncfusion_Blazor_Grids_GridAggregateColumn_GroupCaptionTemplate) properties of the [GridAggregateColumn](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridAggregateColumn.html#Syncfusion_Blazor_Grids_GridAggregateColumn__ctor) component. +Group footer and group caption aggregates in the Syncfusion® Blazor DataGrid calculate values based on items in each group and display results in group footer cells and group caption cells. Configure these using the [GroupFooterTemplate](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridAggregateColumn.html#Syncfusion_Blazor_Grids_GridAggregateColumn_GroupFooterTemplate) and [GroupCaptionTemplate](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridAggregateColumn.html#Syncfusion_Blazor_Grids_GridAggregateColumn_GroupCaptionTemplate) properties of the [GridAggregateColumn](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridAggregateColumn.html#Syncfusion_Blazor_Grids_GridAggregateColumn__ctor) component. Aggregate values inside templates can be accessed through AggregateTemplateContext (for example, Sum, Min, Max). -> When working with group aggregates in Grid, it is important to set the property **AllowGrouping** of the column to true.To maintain grouped columns in the Grid after grouping, set [showGroupedColumn](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridGroupSettings.html#Syncfusion_Blazor_Grids_GridGroupSettings_ShowGroupedColumn) to true. +> For group aggregates, ensure grouping is enabled at the grid level with AllowGrouping set to true, and maintain grouped columns by setting [ShowGroupedColumn](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridGroupSettings.html#Syncfusion_Blazor_Grids_GridGroupSettings_ShowGroupedColumn) to true. ## Group footer aggregates -Group footer aggregates are displayed in the footer cells of each group. These cells appear at the bottom of each group and provide aggregate values based on the grouped data. To display group footer aggregates, you need to provide a template using the [GroupFooterTemplate](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridAggregateColumn.html#Syncfusion_Blazor_Grids_GridAggregateColumn_GroupFooterTemplate) property. The template will be used to render the aggregate values in the group footer cells. +Group footer aggregates appear in the footer cells of each group and provide per-group summary values. To display group footer aggregates, define a template with the [GroupFooterTemplate](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridAggregateColumn.html#Syncfusion_Blazor_Grids_GridAggregateColumn_GroupFooterTemplate) property. The template renders the aggregate value for each group’s footer row. Apply the Format property to present currency or date values using culture-aware formatting as needed. -Here’s an example that demonstrates how to use group footer aggregates in the Grid: +The following example demonstrates group footer aggregates in the DataGrid: {% tabs %} {% highlight razor tabtitle="Index.razor" %} @@ -110,13 +110,13 @@ Here’s an example that demonstrates how to use group footer aggregates in the {% endhighlight %} {% endtabs %} -{% previewsample "https://blazorplayground.syncfusion.com/embed/LDhKCXUDfMsXaMrj?appbar=true&editor=false&result=true&errorlist=false&theme=bootstrap5" %} +{% previewsample "https://blazorplayground.syncfusion.com/embed/VDheZEVxysGhsjjP?appbar=false&editor=false&result=true&errorlist=false&theme=bootstrap5" %} ## Group caption aggregates -Group caption aggregates are displayed in the caption cells of each group. These cells appear at the top of each group and provide a summary of the grouped data. To display group caption aggregates, you can use the [GroupCaptionTemplate](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridAggregateColumn.html#Syncfusion_Blazor_Grids_GridAggregateColumn_GroupCaptionTemplate) property. This property allows you to define a template that will be used to display the aggregate values in the group caption cells. +Group caption aggregates appear in the caption cells at the top of each group and provide a concise summary. To display group caption aggregates, define a template using the [GroupCaptionTemplate](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridAggregateColumn.html#Syncfusion_Blazor_Grids_GridAggregateColumn_GroupCaptionTemplate) property. The template renders the aggregate value in the caption area of each group. Apply the Format property to aggregate values to present culture-aware currency or date results. -Here’s an example that demonstrates how to use group and caption aggregates in the Grid: +The following example demonstrates group caption aggregates in the DataGrid: {% tabs %} {% highlight razor tabtitle="Index.razor" %} @@ -209,6 +209,6 @@ Here’s an example that demonstrates how to use group and caption aggregates in {% endhighlight %} {% endtabs %} -{% previewsample "https://blazorplayground.syncfusion.com/embed/VZrAsjqWAiLCkcxM?appbar=false&editor=false&result=true&errorlist=false&theme=bootstrap5" %} +{% previewsample "https://blazorplayground.syncfusion.com/embed/LZVyDaVxoilKLoVU?appbar=false&editor=false&result=true&errorlist=false&theme=bootstrap5" %} > The group total summary in Grid is calculated based on the current page records for each group by default. \ No newline at end of file diff --git a/blazor/datagrid/reactive-aggregate.md b/blazor/datagrid/reactive-aggregate.md index e2f88b27f6..109b38282a 100644 --- a/blazor/datagrid/reactive-aggregate.md +++ b/blazor/datagrid/reactive-aggregate.md @@ -1,21 +1,21 @@ --- layout: post -title: Reactive aggregate in Blazor DataGrid Component | Syncfusion -description: Checkout and learn here all about Reactive aggregate in Syncfusion Blazor DataGrid component and much more details. +title: Reactive aggregates in Blazor DataGrid Component | Syncfusion +description: Learn how reactive aggregates in the Syncfusion Blazor DataGrid auto-update summary values in the footer, group footer, and group caption during batch editing. platform: Blazor control: DataGrid documentation: ug --- -# Reactive aggregate in Blazor DataGrid +# Reactive aggregates in Blazor DataGrid -The Syncfusion® Blazor DataGrid provides support for reactive aggregates, which allow you to update the aggregate values dynamically as the data changes. Reactive aggregates automatically recalculate their values when there are changes in the underlying data, providing real-time updates to the aggregate values in the Grid. +The Syncfusion® Blazor DataGrid supports reactive aggregates that update dynamically as data changes. Aggregate values are recalculated when underlying data is edited, providing real-time updates to footer, group footer, and group caption summaries. -## Auto update aggregate value in batch editing +## Auto-update aggregate values in batch editing -When the Grid is in batch editing mode, the aggregate values in the footer, group footer, and group caption are automatically refreshed every time a cell is saved. This ensures that the aggregate values accurately reflect the edited data. +When the DataGrid is in batch editing mode, aggregate values in the footer, group footer, and group caption are refreshed each time a cell edit is saved. This ensures that summaries reflect the most recent edits. -Here’s an example code snippet demonstrating how to auto update aggregate value in batch editing: +The following example demonstrates automatic aggregate value updates in batch editing: {% tabs %} {% highlight razor tabtitle="Index.razor" %} @@ -123,6 +123,6 @@ Here’s an example code snippet demonstrating how to auto update aggregate valu {% endhighlight %} {% endtabs %} -{% previewsample "https://blazorplayground.syncfusion.com/embed/hjVgCtAjJfZhemgh?appbar=false&editor=false&result=true&errorlist=false&theme=bootstrap5" %} +{% previewsample "https://blazorplayground.syncfusion.com/embed/LtLSNYqjWbvJQVPF?appbar=false&editor=false&result=true&errorlist=false&theme=bootstrap5" %} -> Adding a new record to the grouped Grid will not refresh the aggregate values. \ No newline at end of file +> Aggregate values refresh after batch changes are saved (Update). Adding a new record does not update aggregates until the changes are saved. \ No newline at end of file From 60c4d28dbb3d3060625e84d9de4c4523eff6071f Mon Sep 17 00:00:00 2001 From: SadhanaBaskaran Date: Tue, 30 Sep 2025 11:16:47 +0530 Subject: [PATCH 003/266] 984045: Updated the UG content and samples for Aggregate section in DataGrid --- blazor/datagrid/aggregates.md | 3 ++- blazor/datagrid/custom-aggregate.md | 2 +- blazor/datagrid/group-and-caption-aggregate.md | 2 +- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/blazor/datagrid/aggregates.md b/blazor/datagrid/aggregates.md index 5089e6df4f..6f81278594 100644 --- a/blazor/datagrid/aggregates.md +++ b/blazor/datagrid/aggregates.md @@ -1,7 +1,8 @@ --- layout: post title: Aggregates in Blazor DataGrid Component | Syncfusion -description: Learn how to configure and display aggregates (sum, average, min, max, count, true/false count) in the Syncfusion Blazor DataGrid footer, group footer, and group caption using templates and formatting. +description: Learn how to configure and display aggregates in Syncfusion Blazor DataGrid using templates for footer, group footer, and caption. + platform: Blazor control: DataGrid documentation: ug diff --git a/blazor/datagrid/custom-aggregate.md b/blazor/datagrid/custom-aggregate.md index 56d2512e04..0a2b3e2326 100644 --- a/blazor/datagrid/custom-aggregate.md +++ b/blazor/datagrid/custom-aggregate.md @@ -1,7 +1,7 @@ --- layout: post title: Custom aggregate in Blazor DataGrid Component | Syncfusion -description: Learn how to create and display custom aggregates in the Syncfusion Blazor DataGrid, including footer and group aggregates, using the CustomAggregate callback and AggregateTemplateContext.Custom. +description: Learn how to create and display custom aggregates in Syncfusion Blazor DataGrid using CustomAggregate callback and template context. platform: Blazor control: DataGrid documentation: ug diff --git a/blazor/datagrid/group-and-caption-aggregate.md b/blazor/datagrid/group-and-caption-aggregate.md index ef927ed68f..70607c044a 100644 --- a/blazor/datagrid/group-and-caption-aggregate.md +++ b/blazor/datagrid/group-and-caption-aggregate.md @@ -1,7 +1,7 @@ --- layout: post title: Group and caption aggregates in Blazor DataGrid Component | Syncfusion -description: Learn how to configure group footer aggregates and group caption aggregates in the Syncfusion Blazor DataGrid using GroupFooterTemplate and GroupCaptionTemplate with AggregateTemplateContext. +description: Learn how to configure group footer and caption aggregates in Syncfusion Blazor DataGrid using templates and AggregateTemplateContext. platform: Blazor control: DataGrid documentation: ug From ca3678598194c2ee67530a79d19001a6f0c82325 Mon Sep 17 00:00:00 2001 From: SadhanaBaskaran Date: Wed, 1 Oct 2025 12:10:12 +0530 Subject: [PATCH 004/266] 984711: Updated the UG content and samples for Toolbar in DataGrid --- blazor/datagrid/custom-toolbar.md | 78 +++++++++--------- blazor/datagrid/tool-bar.md | 44 ++++++----- blazor/datagrid/toolbar-items.md | 127 +++++++++++++++++------------- 3 files changed, 135 insertions(+), 114 deletions(-) diff --git a/blazor/datagrid/custom-toolbar.md b/blazor/datagrid/custom-toolbar.md index 6c76758b65..3ed3993f90 100644 --- a/blazor/datagrid/custom-toolbar.md +++ b/blazor/datagrid/custom-toolbar.md @@ -1,18 +1,18 @@ --- layout: post title: Custom Toolbar Items in Blazor DataGrid Component | Syncfusion -description: Checkout and learn here all about Custom Toolbar Items in Syncfusion Blazor DataGrid component and much more details. +description: Learn how to create and use custom toolbar items in the Syncfusion Blazor DataGrid, including templates, images with text, dropdowns, autocomplete, and export actions. platform: Blazor control: DataGrid documentation: ug --- # Custom toolbar in Blazor DataGrid -Custom toolbar in Syncfusion® Blazor DataGrid allows you to create a distinctive toolbar layout, style, and functionality that aligns with the specific needs of your application, providing a personalized experience within the Grid. +The custom toolbar in the Syncfusion® Blazor DataGrid enables a distinctive toolbar layout, style, and behavior tailored to application requirements, delivering a personalized Grid experience. -This can be achieved by utilizing the `Template` property, which offers extensive customization options for the Toolbar. You can define a custom Template for the Toolbar and handle the actions of the ToolbarItems in the **OnClick** event. +This is implemented by using the `Template` property, which provides extensive customization options for the toolbar. Define a custom template for the toolbar and handle toolbar item actions in the **OnClick** event. -The following example demonstrates, how to render the custom Toolbar using `Template`: +The following example demonstrates how to render a custom toolbar using `Template`: {% tabs %} {% highlight razor tabtitle="Index.razor" %} @@ -117,11 +117,11 @@ The following example demonstrates, how to render the custom Toolbar using `Temp ## Render image with text in custom Toolbar -Render an image with text in custom Toolbar in Syncfusion® Blazor DataGrid allows easily render an image along with text in the Toolbar of the Grid. This feature enhances the visual presentation of the Grid, providing additional context and improving the overall experience. +Rendering an image with text in the custom toolbar of the Syncfusion® Blazor DataGrid helps provide context and improves visual clarity for actions. -To render an image with text in Custom Toolbar, you can utilize the Template in [SfToolbar](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Navigations.SfToolbar.html) in your code. +To render an image with text in the custom toolbar, use the `Template` in [SfToolbar](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Navigations.SfToolbar.html). -The following example demonstrates how to render an image in the Toolbar of the Grid using `Template`: +The following example demonstrates how to render images and text in the Grid toolbar using `Template`: {% tabs %} {% highlight razor tabtitle="Index.razor" %} @@ -160,13 +160,13 @@ The following example demonstrates how to render an image in the Toolbar of the { Orders = OrderData.GetAllRecords(); } - public void AddButton() + public async Task AddButton() { - this.Grid.AddRecordAsync(); + await this.Grid.AddRecordAsync(); } - public void DeleteButton() + public async Task DeleteButton() { - this.Grid.DeleteRecordAsync(); + await this.Grid.DeleteRecordAsync(); } } ``` -The following example demonstrates how to remove the context menu option in the Excel filter dialog using above mentioned CSS: +The following example demonstrates how to remove the context menu option in the Excel filter dialog using the above CSS. {% tabs %} {% highlight razor tabtitle="Index.razor" %} @@ -625,9 +630,9 @@ public class OrderData **2.Customize the height and width of filter popup** -You can customize the height and width of each column’s filter dialog using the CSS style in the [FilterDialogOpening](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridEvents-1.html#Syncfusion_Blazor_Grids_GridEvents_1_FilterDialogOpening) event of the Grid. +The height and width of each column’s filter dialog can be customized using CSS within the [FilterDialogOpening](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridEvents-1.html#Syncfusion_Blazor_Grids_GridEvents_1_FilterDialogOpening) event. This event is triggered before the filter dialog opens, allowing conditional styling based on column configuration. -Before opening a filter dialog for each column, the `FilterDialogOpening` event will be triggered. At that point, based on the boolean value, we have set the height and width of the **CustomerID** and **OrderDate** columns using the CSS style in the following sample. +The following example demonstrates how to set custom height and width for the **CustomerID** and **OrderDate** columns using CSS styles. {% tabs %} {% highlight razor tabtitle="Index.razor" %} @@ -642,7 +647,7 @@ Before opening a filter dialog for each column, the `FilterDialogOpening` event - + @@ -750,7 +755,7 @@ public class OrderData **3.Customize filter icon for filtered columns** -After filtering the column, the Grid will display the in-built filtered icon with predefined styles by default. The filtered icon can also be customized using .e-grid .e-filtered::before class. +After applying a filter, the DataGrid displays a built-in filtered icon with default styles. This icon can be customized using the **.e-grid .e-filtered::before** CSS class. {% tabs %} {% highlight razor tabtitle="Index.razor" %} @@ -835,13 +840,14 @@ public class OrderData ## Add current selection to filter -By default, the CheckBox/Excel filter can only filter the selected items. If filtering is done multiple times on the same column, the previously filtered values in the column will be cleared. Now, it is possible to retain those previous values by using the "Add current selection to filter" option. This checkbox is displayed when data is searched in the search bar of the CheckBox or Excel filter type. +By default, the CheckBox and Excel filter types apply filtering only to the currently selected items. When filtering is performed multiple times on the same column, previously selected values are cleared. +To retain previously filtered values, enable the Add current selection to filter option. This checkbox appears when data is searched using the search bar in the CheckBox or Excel filter dialog. -The following image describes the above mentioned behavior. +The following image illustrates this behavior: -![Add current selection to filter in Blazor DataGrid.](./images/blazor-datagrid-add-current-selection-to-filter.png) +![Add current selection to filter in Blazor DataGrid.](images/blazor-datagrid-add-current-selection-to-filter.png) {% previewsample "https://blazorplayground.syncfusion.com/embed/VDBfNLDBsuTLPqvx?appbar=false&editor=false&result=true&errorlist=false&theme=bootstrap5" %} -N> You can refer to our [Blazor DataGrid](https://www.syncfusion.com/blazor-components/blazor-datagrid) feature tour page for its groundbreaking feature representations. You can also explore our [Blazor DataGrid example](https://blazor.syncfusion.com/demos/datagrid/overview?theme=bootstrap4) to understand how to present and manipulate data. \ No newline at end of file +N> Refer to the [Blazor DataGrid](https://www.syncfusion.com/blazor-components/blazor-datagrid) feature tour for a broad overview. Explore the [Blazor DataGrid example](https://blazor.syncfusion.com/demos/datagrid/overview?theme=bootstrap5) to understand data presentation and manipulation. \ No newline at end of file diff --git a/blazor/datagrid/filter-bar.md b/blazor/datagrid/filter-bar.md index 5fd3f8337d..c2781524ab 100644 --- a/blazor/datagrid/filter-bar.md +++ b/blazor/datagrid/filter-bar.md @@ -9,12 +9,13 @@ documentation: ug # Filter bar in Blazor DataGrid -The filter bar feature provides a user-friendly way to filter data in the Syncfusion® Blazor DataGrid. It displays an input field for each column, allowing entry of filter criteria and instant viewing of filtered results. +The filter bar feature provides a user-friendly way to filter data in the Syncfusion® Blazor DataGrid. It displays an input field for each column, allowing developers to enter filter criteria and view the filtered results immediately. -Enable the filter bar by setting [AllowFiltering](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_AllowFiltering) to true, rendering a filter bar row below the header for data filtering. Filter records using different expressions depending on column type. +By setting the [AllowFiltering](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_AllowFiltering) property to **true**, a filter bar row appears below the column headers. This enables filtering of records using various expressions based on the column type. **Filter bar expressions** -Enter the following filter expressions (operators) manually in the filter bar. + +The following filter expressions (operators) can be manually entered in the filter bar based on the column type: Expression |Example |Description |Column Type -----|-----|-----|----- @@ -26,10 +27,10 @@ Expression |Example |Description |Column Type <=|<=value|LessThanOrEqual |Number * |*value |StartsWith |String % |%value |EndsWith |String -N/A |N/A | **Equal** operator always used for date filter. |Date -N/A |N/A | **Equal** operator always used for Boolean filter. |Boolean +N/A |N/A | Always uses **equal** |Date +N/A |N/A | *Always uses **equal** |Boolean -The following example demonstrates activation of default filtering in the Grid: +The following example demonstrates how to enable default filtering in the DataGrid:: {% tabs %} {% highlight razor tabtitle="Index.razor" %} @@ -50,7 +51,7 @@ The following example demonstrates activation of default filtering in the Grid: @code { - private List GridData; + public List GridData { get; set; } SfGrid Grid; @@ -116,15 +117,20 @@ public class OrderData ## Filter bar modes -The Syncfusion® Blazor DataGrid refers to two different ways the Grid’s filter bar operates: **OnEnter Mode** and **Immediate Mode**, offering distinct user experiences. +The Syncfusion® Blazor DataGrid supports two distinct operational modes for the filter bar when applying filtering criteria. These modes define how and when the filtering action is triggered:: + +* **OnEnter Mode:** Filtering is triggered only after pressing the **Enter** key. +* **Immediate Mode:** Filtering is applied automatically as values are **typed** into the filter bar. + +Each mode offers a different user experience depending on the desired interaction model. **OnEnter Mode:** -Set the filter bar [Mode](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridFilterSettings.html#Syncfusion_Blazor_Grids_GridFilterSettings_Mode) as [OnEnter](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.FilterBarMode.html#Syncfusion_Blazor_Grids_FilterBarMode_OnEnter) in [GridFilterSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_FilterSettings). This captures criteria but applies filtering only on Enter key press, allowing modifications without triggering actions. +To enable [OnEnter](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.FilterBarMode.html#Syncfusion_Blazor_Grids_FilterBarMode_OnEnter) mode, set the filter bar [Mode](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridFilterSettings.html#Syncfusion_Blazor_Grids_GridFilterSettings_Mode) property to **OnEnter** within the [GridFilterSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_FilterSettings). In this mode, the filter bar captures the entered criteria but does not initiate filtering until the **Enter** key is pressed. This allows multiple criteria to be modified before applying the filter. **Immediate Mode:** -Set the filter bar [Mode](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridFilterSettings.html#Syncfusion_Blazor_Grids_GridFilterSettings_Mode) as [Immediate](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.FilterBarMode.html#Syncfusion_Blazor_Grids_FilterBarMode_Immediate) in [GridFilterSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_FilterSettings). This applies filtering instantly as criteria are entered, providing real-time previews. +To enable [Immediate](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.FilterBarMode.html#Syncfusion_Blazor_Grids_FilterBarMode_Immediate) mode, set the filter bar [Mode](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridFilterSettings.html#Syncfusion_Blazor_Grids_GridFilterSettings_Mode) property to **Immediate** within the [GridFilterSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_FilterSettings). In this mode, filtering is applied automatically as values are entered or modified in the filter bar, providing real-time filtering results. {% tabs %} {% highlight razor tabtitle="Index.razor" %} @@ -233,9 +239,9 @@ public class OrderData ## Display filter text in pager -The Syncfusion® Blazor DataGrid provides an option to display filter text within the pager, indicating the current filtering status. Enabling this feature provides users with a clear understanding of applied filters and criteria used for filtering. +The Syncfusion® Blazor DataGrid provides an option to display filter text within the pager, indicating the current filtering status. This feature enhances visibility of the applied filters and the criteria used for filtering. -To enable display of filter text within the pager, set the [ShowFilterBarStatus](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridFilterSettings.html#Syncfusion_Blazor_Grids_GridFilterSettings_ShowFilterBarStatus) property within the [GridFilterSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_FilterSettings) configuration. +To enable this functionality, set the [ShowFilterBarStatus](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridFilterSettings.html#Syncfusion_Blazor_Grids_GridFilterSettings_ShowFilterBarStatus) property within the [GridFilterSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_FilterSettings) configuration. {% tabs %} {% highlight razor tabtitle="Index.razor" %} @@ -355,9 +361,9 @@ public class OrderData ## Prevent filtering for particular column -In the Syncfusion® Blazor DataGrid, prevent filtering for a specific column by utilizing the [AllowFiltering](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_AllowFiltering) property of the [GridColumn](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridColumn.html) object and setting it to **false**. This feature is useful when disabling filtering options for a particular column. +The Syncfusion® Blazor DataGrid allows disabling filtering for specific columns by setting the [AllowFiltering](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_AllowFiltering) property of the [GridColumn](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridColumn.html) object to **false**. This configuration is useful when filtering should be restricted for certain columns. -Here’s an example that demonstrates how to remove the filter bar for the **CustomerID** column in Grid: +The following example demonstrates how to remove the filter bar for the **CustomerID** column in the DataGrid: {% tabs %} {% highlight razor tabtitle="Index.razor" %} @@ -435,11 +441,11 @@ public class OrderData ## Hide filter bar for template column -By default, the filter bar is set to a disabled mode for template columns in the Syncfusion® Blazor DataGrid. However, customize the filter bar for a template column to provide a customized filtering experience. +By default, the filter bar is disabled for template columns in the Syncfusion® Blazor DataGrid. In scenarios requiring a customized filtering experience, the filter bar can be hidden for a template column. -To hide the filter bar for a template column, use the [FilterTemplate](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridColumn.html#Syncfusion_Blazor_Grids_GridColumn_FilterTemplate) property of the [GridColumn](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridColumn.html). This property allows definition of a custom template for the filter bar of a column. +To hide the filter bar for a template column, use the [FilterTemplate](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridColumn.html#Syncfusion_Blazor_Grids_GridColumn_FilterTemplate) property of the [GridColumn](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridColumn.html). This property allows defining a custom template for the filter bar of the column. -Here’s an example that demonstrates how to hide the filter bar for a template column in the Grid: +The following example demonstrates how to hide the filter bar for a template column in the DataGrid: {% tabs %} {% highlight razor tabtitle="Index.razor" %} @@ -521,9 +527,11 @@ public class OrderData ## Filter bar template with custom component -The [FilterTemplate](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridColumn.html#Syncfusion_Blazor_Grids_GridColumn_FilterTemplate) feature in the Syncfusion® Blazor DataGrid allows customization of components displayed in the filter bar. Normally, a text box is the default element rendered in the filter bar cell. This flexibility allows use of various components, such as [DatePicker](https://blazor.syncfusion.com/documentation/datepicker/getting-started), [NumericTextBox](https://blazor.syncfusion.com/documentation/numeric-textbox/getting-started), [ComboBox](https://blazor.syncfusion.com/documentation/combobox/getting-started-with-web-app), and [MultiSelect Dropdown](https://blazor.syncfusion.com/documentation/multiselect-dropdown/getting-started-webapp), within the filter bar based on specific requirements. +The [FilterTemplate](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridColumn.html#Syncfusion_Blazor_Grids_GridColumn_FilterTemplate) feature in the Syncfusion® Blazor DataGrid enables customization of the components rendered in the filter bar. By default, a text box is displayed in the filter bar cell. This feature allows integration of various components such as the [DatePicker](https://blazor.syncfusion.com/documentation/datepicker/getting-started), [NumericTextBox](https://blazor.syncfusion.com/documentation/numeric-textbox/getting-started), [ComboBox](https://blazor.syncfusion.com/documentation/combobox/getting-started-with-web-app), and [MultiSelect Dropdown](https://blazor.syncfusion.com/documentation/multiselect-dropdown/getting-started-webapp) to suit specific filtering requirements. + +To implement a custom filter bar component, define a template using the `FilterTemplate` property of the [GridColumn](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridColumn.html). -To utilize this feature, define a custom template for the filter bar by setting the `FilterTemplate` property of the [GridColumn](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridColumn.html) in the Blazor application: +The following example demonstrates how to use a custom component in the filter bar: {% tabs %} {% highlight razor tabtitle="Index.razor" %} @@ -724,4 +732,4 @@ public class OrderData {% previewsample "https://blazorplayground.syncfusion.com/embed/rNhTtWrFGgPwVFGP?appbar=false&editor=false&result=true&errorlist=false&theme=bootstrap5" %} -N> Refer to the [Blazor DataGrid](https://www.syncfusion.com/blazor-components/blazor-datagrid) feature tour page for groundbreaking representations. Explore the [Blazor DataGrid example](https://blazor.syncfusion.com/demos/datagrid/overview?theme=bootstrap4) to present and manipulate data. \ No newline at end of file +N> Refer to the [Blazor DataGrid](https://www.syncfusion.com/blazor-components/blazor-datagrid) feature tour for a broad overview. Explore the [Blazor DataGrid example](https://blazor.syncfusion.com/demos/datagrid/overview?theme=bootstrap5) to understand data presentation and manipulation. \ No newline at end of file diff --git a/blazor/datagrid/filter-menu.md b/blazor/datagrid/filter-menu.md index 4b89eca908..84ab626bf7 100644 --- a/blazor/datagrid/filter-menu.md +++ b/blazor/datagrid/filter-menu.md @@ -9,11 +9,11 @@ documentation: ug # Filter menu in Blazor DataGrid -The filter menu in the Syncfusion® Blazor DataGrid enables filtering data using column-specific operators, offering enhanced control over dataset views. +The Syncfusion® Blazor DataGrid supports a filter menu interface that enables column-specific filtering using various operators. This feature provides enhanced control over how data is displayed and filtered. -To enable the filter menu, set the [Type](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridFilterSettings.html#Syncfusion_Blazor_Grids_GridFilterSettings_Type) of [GridFilterSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_FilterSettings) as **Menu**. This renders filter icons in column headers when [AllowFiltering](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_AllowFiltering) is **true**, allowing interactive filtering with various operators. +To enable the filter menu, set the [Type](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridFilterSettings.html#Syncfusion_Blazor_Grids_GridFilterSettings_Type) of [GridFilterSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_FilterSettings) to **Menu**. When the [AllowFiltering](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_AllowFiltering) property is set to **true**, filter icons are rendered in the column headers, enabling interactive filtering with multiple operator options. -Here is an example that demonstrates the usage of the filter menu in the Grid: +The following example demonstrates the usage of the filter menu in the DataGrid: {% tabs %} {% highlight razor tabtitle="Index.razor" %} @@ -92,18 +92,20 @@ public class OrderData {% previewsample "https://blazorplayground.syncfusion.com/embed/hZVJXMVKpLxfzxZN?appbar=false&editor=false&result=true&errorlist=false&theme=bootstrap5" %} -> * [AllowFiltering](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_AllowFiltering) must be set as true to enable filter menu. -> * By setting [AllowFiltering](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_AllowFiltering) property of the [GridColumn](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridColumn.html) object as **false** will prevent filter menu rendering for a particular column. +> * [AllowFiltering](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_AllowFiltering) must be set to true to enable the filter menu. +> * Setting the [AllowFiltering](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_AllowFiltering) property of the [GridColumn](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridColumn.html) object to **false** prevents the filter menu from rendering for that specific column. ## Custom component in filter menu -Enhance filtering with custom components by utilizing the [FilterTemplate](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridColumn.html#Syncfusion_Blazor_Grids_GridColumn_FilterTemplate) property. This allows replacement of default inputs with alternatives like dropdowns or textboxes. +The Syncfusion® Blazor DataGrid supports customization of the filter menu by replacing default input editors with custom components. This customization is achieved using the [FilterTemplate](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridColumn.html#Syncfusion_Blazor_Grids_GridColumn_FilterTemplate) property of the [GridColumn](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridColumn.html). -By default, the filter menu provides an [Autocomplete](https://blazor.syncfusion.com/documentation/autocomplete/getting-started-with-web-app) for string type columns, a [NumericTextBox](https://blazor.syncfusion.com/documentation/numeric-textbox/getting-started) for number type columns, and a [DropDownList](https://blazor.syncfusion.com/documentation/dropdown-list/getting-started) for boolean type columns, facilitating value selection. +By default, the filter menu renders the following components based on column type: -Replace the standard search box in the filter menu with a `DropDownList` for the **OrderID** column. +- [AutoComplete](https://blazor.syncfusion.com/documentation/autocomplete/getting-started-with-web-app) for string columns +- [NumericTextBox](https://blazor.syncfusion.com/documentation/numeric-textbox/getting-started) for numeric columns +- [DropDownList](https://blazor.syncfusion.com/documentation/dropdown-list/getting-started) for boolean columns -Here is a sample code demonstrating how to render a `DropDownList` for the **OrderID** column: +The following example demonstrates how to replace the standard search box in the filter menu with a `DropDownList` for the **OrderID** column: {% tabs %} {% highlight razor tabtitle="Index.razor" %} @@ -191,17 +193,19 @@ public class OrderData **Default filter input for OrderID column** -![Default filter input OrderID column.](images/Blazor-default-filter-input-datagrid.gif) +![Default filter input for OrderID column](images/Blazor-default-filter-input-datagrid.gif) **Custom dropdown filter for OrderID column** -![Custom dropdown filter for OrderID column.](images/blazor-custom-dropdown-filter-datagrid.gif) +![Custom dropdown filter for OrderID column](images/blazor-custom-dropdown-filter-datagrid.gif) ## Show 24 hours time format in filter dialog -Display time in 24-hour format in date or datetime column filter dialogs. By default, the dialog shows time in 12-hour format (AM/PM). Customize using the [FilterTemplate](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridColumn.html#Syncfusion_Blazor_Grids_GridColumn_FilterTemplate) property of the [GridColumn](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridColumn.html). Set the `TimeFormat` of the `DateTimepicker` to **HH:mm**. +The Syncfusion® Blazor DataGrid supports displaying time in 24-hour format within the filter dialog for date or datetime columns. By default, the dialog displays time in 12-hour format (AM/PM). -Here is an example that demonstrates how to show 24 hours time format in filter dialog: +To display time in 24-hour format, use the [FilterTemplate](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridColumn.html#Syncfusion_Blazor_Grids_GridColumn_FilterTemplate) property of the [GridColumn](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridColumn.html) and set the `TimeFormat` of the [DateTimePicker](https://blazor.syncfusion.com/documentation/datetime-picker/getting-started-with-web-app) component to **HH:mm**. + +The following example demonstrates how to show 24-hour time format in the filter dialog: {% tabs %} {% highlight razor tabtitle="Index.razor" %} @@ -293,19 +297,15 @@ public class OrderData ## Customizing filter menu operators list -Customize the default filter operator list using the [FilterDialogOpening](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridEvents-1.html#Syncfusion_Blazor_Grids_GridEvents_1_FilterDialogOpening) event. Support customization for string, number, date, and boolean data types. - -Available customization options: - -* **StringOperator** - Defines customized string operator list. - -* **NumberOperator** - Defines customized number operator list. +The Syncfusion® Blazor DataGrid allows customization of the default filter operator list using the FilterDialogOpening event. This customization is supported for **string**, **number**, **date**, and **boolean** data types. +Available customization options include: -* **DateOperator** - Defines customized date operator list. +* **StringOperator** - Defines a custom list of string operators. +* **NumberOperator** - Defines a custom list of number operators. +* **DateOperator** - Defines a custom list of date operators. +* **BooleanOperator** - Defines a custom list of boolean operators. -* **BooleanOperator** - Defines customized boolean operator list. - -Here is an example of how to customize the filter operators list in the Grid: +The following example demonstrates how to customize the filter operators list in the DataGrid: {% tabs %} {% highlight razor tabtitle="Index.razor" %} @@ -313,7 +313,7 @@ Here is an example of how to customize the filter operators list in the Grid: @using Syncfusion.Blazor.Grids - + @@ -441,7 +441,9 @@ public class OrderData ## Customize filter input editor -The Syncfusion® Blazor DataGrid allows you to customize the built-in filter dialog editor components. You can achieve this customization by setting the `FilterEditorSettings` property on [GridColumn](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridColumn.html). In the following example, we have customized the following component configurations: +The Syncfusion® Blazor DataGrid allows customization of the built-in filter dialog editor components using the [FilterEditorSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridColumn.html#Syncfusion_Blazor_Grids_GridColumn_FilterEditorSettings) property on the [GridColumn](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridColumn.html). + +The following table outlines component configurations customized for specific columns: | Column | Filter Component | Customization | | -------------- | ------------------------------------------------------------------------------- | ----------------------------------------------------- | @@ -557,19 +559,18 @@ public class Orders ## Customize the default input component of filter menu dialog -Customize default input components in menu filter dialogs using the [FilterTemplate](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridColumn.html#Syncfusion_Blazor_Grids_GridColumn_FilterTemplate) property of the [GridColumn](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridColumn.html). +Customize the default input components in the filter menu dialog using the [FilterTemplate](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridColumn.html#Syncfusion_Blazor_Grids_GridColumn_FilterTemplate) property of the [GridColumn](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridColumn.html). -| Column Type | Default component |Customization | API Reference | +| Column Type | Default component |Customization Example | API Reference | | ----------- | ------------------------------------------------------------------------------------------------- | ---------------------------------------- | --------------------------------------------------------------------------------------------------------- | -| String | [AutoComplete](https://blazor.syncfusion.com/documentation/autocomplete/getting-started) | Eg: Autofill="false" | [AutoComplete API](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DropDowns.SfAutoComplete-2.html) | -| Number | [NumericTextBox](https://blazor.syncfusion.com/documentation/numeric-textbox/getting-started) | Eg: ShowSpinButton="false" | [NumericTextBox API](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Inputs.SfNumericTextBox-1.html) | -| Boolean | [DropDownList](https://blazor.syncfusion.com/documentation/dropdown-list/getting-started) | Eg: SortOrder="SortOrder.Ascending" | [DropDownList API](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DropDowns.SfDropDownList-2.html) | -| Date | [DatePicker](https://blazor.syncfusion.com/documentation/datepicker/getting-started) | Eg: WeekNumber="true" | [DatePicker API](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Calendars.SfDatePicker-1.html) | -| DateTime | [DateTimePicker](https://blazor.syncfusion.com/documentation/datetime-picker/getting-started) | Eg: ShowClearButton="true" | [DateTimePicker API](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Calendars.SfDateTimePicker-1.html) | +| String | [AutoComplete](https://blazor.syncfusion.com/documentation/autocomplete/getting-started) | Autofill="false" | [AutoComplete API](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DropDowns.SfAutoComplete-2.html) | +| Number | [NumericTextBox](https://blazor.syncfusion.com/documentation/numeric-textbox/getting-started) | ShowSpinButton="false" | [NumericTextBox API](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Inputs.SfNumericTextBox-1.html) | +| Boolean | [DropDownList](https://blazor.syncfusion.com/documentation/dropdown-list/getting-started) | SortOrder="SortOrder.Ascending" | [DropDownList API](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DropDowns.SfDropDownList-2.html) | +| Date | [DatePicker](https://blazor.syncfusion.com/documentation/datepicker/getting-started) | WeekNumber="true" | [DatePicker API](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Calendars.SfDatePicker-1.html) | +| DateTime | [DateTimePicker](https://blazor.syncfusion.com/documentation/datetime-picker/getting-started) | ShowClearButton="true" | [DateTimePicker API](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Calendars.SfDateTimePicker-1.html) | -> To know more about the feature, refer to the Getting Started documentation and API Reference -In the example provided below, the **OrderID** and **Freight** columns are numeric columns. When you open the filter dialog for these columns, you will notice that a `NumericTextBox` with a spin button is displayed to change or set the filter value. However, using the `FilterTemplate` property of the GridColumn. This property is used to add custom components to a particular column, you can hide the spin button specifically for the **OrderID** column: +In the following example, the **OrderID** and **Freight** columns are numeric. By default, the filter dialog displays a [NumericTextBox](https://blazor.syncfusion.com/documentation/numeric-textbox/getting-started) with a spin button. Using the `FilterTemplate` property of the `GridColumn`, the spin button can be hidden specifically for the **OrderID** column. {% tabs %} {% highlight razor tabtitle="Index.razor" %} @@ -653,9 +654,9 @@ public class OrderData ### Prevent autofill option in autocomplete of menu filter -By default, the [AutoComplete](https://blazor.syncfusion.com/documentation/autocomplete/getting-started) component in the filter menu dialog is set to automatically fill suggestions as you type. However, there might be scenarios where you want to prevent this autofill behavior to provide a more customized and controlled user experience. +By default, the [AutoComplete](https://blazor.syncfusion.com/documentation/autocomplete/getting-started) component in the filter menu dialog is configured to automatically fill suggestions while typing. In scenarios requiring a more controlled user experience, this autofill behavior can be disabled. -You can prevent autofill feature by setting the [Autofill](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DropDowns.SfComboBox-2.html#Syncfusion_Blazor_DropDowns_SfComboBox_2_Autofill) parameter to **false** using the `FilterTemplate` property of the GridColumn. This property is used to add custom components to a particular column. +To prevent autofill, set the [Autofill](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DropDowns.SfComboBox-2.html#Syncfusion_Blazor_DropDowns_SfComboBox_2_Autofill) parameter to **false** using the [FilterTemplate](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridColumn.html#Syncfusion_Blazor_Grids_GridColumn_FilterTemplate) property of the [GridColumn](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridColumn.html). This property enables the use of custom components for specific columns. {% tabs %} {% highlight razor tabtitle="Index.razor" %} @@ -741,7 +742,7 @@ You can prevent autofill feature by setting the [Autofill](https://help.syncfusi ### Hide the filter operator dropdownlist in the filter menu dialog -To hide the operator dropdown in the menu filter dialog of the Syncfusion® Blazor DataGrid, the following CSS can be used to override the styling of the **.e-flm_optrdiv** class. Using this customization logic, the interface becomes more focused, allowing a default filter behavior to be applied automatically. +To hide the operator dropdown in the menu filter dialog of the Syncfusion® Blazor DataGrid, apply the following CSS to override the styling of the **.e-flm_optrdiv** class. This customization simplifies the interface by applying a default filter behavior without displaying the operator selection. ```css .e-flm_optrdiv { @@ -835,9 +836,11 @@ public class OrderData ## Filter by multiple keywords using filter menu -The Syncfusion® Blazor DataGrid allows you to perform filtering actions based on multiple keywords, rather than a single keyword, using the filter menu dialog. To enable this feature, you can set the [Type](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridFilterSettings.html#Syncfusion_Blazor_Grids_GridFilterSettings_Type) of [GridFilterSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_FilterSettings) as **Menu** and render the `MultiSelect` as a custom component in the filter menu dialog. +The Syncfusion® Blazor DataGrid supports filtering based on multiple keywords using the filter menu dialog. This feature allows users to select multiple values for a column, enhancing filtering flexibility. -Here is an example that demonstrates how to perform filtering by multiple keywords using the filter menu in the Grid: +To enable this functionality, set the [Type](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridFilterSettings.html#Syncfusion_Blazor_Grids_GridFilterSettings_Type) property of the [GridFilterSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_FilterSettings) to **Menu**, and integrate the [MultiSelect](https://blazor.syncfusion.com/documentation/multiselect-dropdown/getting-started-webapp) component as a custom UI element within the filter menu dialog. + +The following example demonstrates how to configure multi-keyword filtering using the filter menu in the DataGrid: {% tabs %} {% highlight razor tabtitle="Index.razor" %} @@ -1055,9 +1058,9 @@ public class OrderData ## Hide default filter icons while perform filtering through method -When performing filtering programmatically using methods in the Syncfusion® Blazor DataGrid, the default filter icons in the column headers can be hidden to simplify the user interface. +When performing filtering programmatically using methods in the Syncfusion® Blazor DataGrid, the default filter icons in the column headers can be hidden to simplify the interface. -To customize the filter icon in the Grid, use the display property of the filter menu as mentioned below: +To hide the filter icon in the Grid, apply the CSS style to the filter menu element as shown below: ```cshtml ``` -The following example demonstrates how to remove the context menu option in the Excel filter dialog using the above CSS. - {% tabs %} {% highlight razor tabtitle="Index.razor" %} @@ -628,11 +627,9 @@ public class OrderData {% previewsample "https://blazorplayground.syncfusion.com/embed/BDVJZhtsFqnfgvJa?appbar=false&editor=false&result=true&errorlist=false&theme=bootstrap5" %} -**2.Customize the height and width of filter popup** +### Changing Filter Dialog Size -The height and width of each column’s filter dialog can be customized using CSS within the [FilterDialogOpening](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridEvents-1.html#Syncfusion_Blazor_Grids_GridEvents_1_FilterDialogOpening) event. This event is triggered before the filter dialog opens, allowing conditional styling based on column configuration. - -The following example demonstrates how to set custom height and width for the **CustomerID** and **OrderDate** columns using CSS styles. +The filter dialog height and width can be customized for each column. CSS combined with the [FilterDialogOpening](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridEvents-1.html#Syncfusion_Blazor_Grids_GridEvents_1_FilterDialogOpening) event enables application of custom sizes based on which column is being filtered. {% tabs %} {% highlight razor tabtitle="Index.razor" %} @@ -753,9 +750,9 @@ public class OrderData {% previewsample "https://blazorplayground.syncfusion.com/embed/BDBpZBDBCFDseVPP?appbar=false&editor=false&result=true&errorlist=false&theme=bootstrap5" %} -**3.Customize filter icon for filtered columns** +### Styling the filtered column icon -After applying a filter, the DataGrid displays a built-in filtered icon with default styles. This icon can be customized using the **.e-grid .e-filtered::before** CSS class. +When a filter is applied to a column, the DataGrid displays an icon in that column's header. The **.e-grid .e-filtered::before** CSS class enables modification of the icon appearance. {% tabs %} {% highlight razor tabtitle="Index.razor" %} @@ -838,16 +835,17 @@ public class OrderData {% endhighlight %} {% endtabs %} -## Add current selection to filter - -By default, the CheckBox and Excel filter types apply filtering only to the currently selected items. When filtering is performed multiple times on the same column, previously selected values are cleared. - -To retain previously filtered values, enable the Add current selection to filter option. This checkbox appears when data is searched using the search bar in the CheckBox or Excel filter dialog. +## Combining multiple filter selections -The following image illustrates this behavior: +By default, when a filter is applied multiple times to the same column, the new filter replaces the previous selection. Previously applied filters can be retained by using the **Add current selection to filter** option. This checkbox appears in the filter search bar when searching for values in the CheckBox or Excel filter dialog. ![Add current selection to filter in Blazor DataGrid.](images/blazor-datagrid-add-current-selection-to-filter.png) {% previewsample "https://blazorplayground.syncfusion.com/embed/VDBfNLDBsuTLPqvx?appbar=false&editor=false&result=true&errorlist=false&theme=bootstrap5" %} -N> Refer to the [Blazor DataGrid](https://www.syncfusion.com/blazor-components/blazor-datagrid) feature tour for a broad overview. Explore the [Blazor DataGrid example](https://blazor.syncfusion.com/demos/datagrid/overview?theme=bootstrap5) to understand data presentation and manipulation. \ No newline at end of file +## See Also + +Comprehensive information about the Syncfusion Blazor DataGrid and its features is available through the following resources: + +* **Feature Overview:** The [Blazor DataGrid](https://www.syncfusion.com/blazor-components/blazor-datagrid) feature tour provides a complete overview of available capabilities. +* **Interactive Examples:** The [Blazor DataGrid examples](https://blazor.syncfusion.com/demos/datagrid/overview?theme=bootstrap5) provide practical demonstrations of data presentation and manipulation. diff --git a/blazor/datagrid/filter-bar.md b/blazor/datagrid/filter-bar.md index ace961dbda..b0a3dd0a1c 100644 --- a/blazor/datagrid/filter-bar.md +++ b/blazor/datagrid/filter-bar.md @@ -7,30 +7,28 @@ control: DataGrid documentation: ug --- -# Filter bar in Blazor DataGrid +# Filter Bar in Blazor DataGrid -The filter bar feature provides a user-friendly way to filter data in the Syncfusion® Blazor DataGrid. It displays an input field for each column, allowing developers to enter filter criteria and view the filtered results immediately. +The filter bar feature provides an efficient and intuitive way to filter data within the Syncfusion® Blazor DataGrid component. This feature displays input fields below each column header, enabling straightforward data filtering based on column-specific criteria. The filter bar enhances data exploration by allowing users to narrow down large datasets to display only relevant records. -By setting the [AllowFiltering](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_AllowFiltering) property to **true**, a filter bar row appears below the column headers. This enables filtering of records using various expressions based on the column type. +To enable the filter bar, set the [AllowFiltering](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_AllowFiltering) property to **true** on the grid component. This action adds a filter row beneath the column headers, allowing filtering through various expression operators based on the respective column data type. -**Filter bar expressions** +**Supported filter expressions** -The following filter expressions (operators) can be manually entered in the filter bar based on the column type: +The following table outlines the filter expressions (operators) that can be manually entered in the filter bar, organized by column data type: -Expression |Example |Description |Column Type ------|-----|-----|----- -= |=value |StartsWith |Number -!= |!=value |NotEqual |Number -> |>value |GreaterThan |Number -< |= |>=value |GreaterThanOrEqual |Number -<=|<=value|LessThanOrEqual |Number -* |*value |StartsWith |String -% |%value |EndsWith |String -N/A |N/A | Always uses **equal** |Date -N/A |N/A | *Always uses **equal** |Boolean - -The following example demonstrates how to enable default filtering in the DataGrid:: +| Operator | Example | Description | Data Type | +|----------|---------|-------------|-----------| +| = | =value | Equal | Number | +| != | !=value | Not Equal | Number | +| > | >value | Greater Than | Number | +| < | = | >=value | Greater Than or Equal | Number | +| <= | <=value | Less Than or Equal | Number | +| * | *value | Starts With | Text | +| % | %value | Ends With | Text | +| N/A | N/A | Always uses equal | Date | +| N/A | N/A | Always uses equal | Boolean | {% tabs %} {% highlight razor tabtitle="Index.razor" %} @@ -117,20 +115,18 @@ public class OrderData ## Filter bar modes -The Syncfusion® Blazor DataGrid supports two distinct operational modes for the filter bar when applying filtering criteria. These modes define how and when the filtering action is triggered:: - -* **OnEnter Mode:** Filtering is triggered only after pressing the **Enter** key. -* **Immediate Mode:** Filtering is applied automatically as values are **typed** into the filter bar. +The Syncfusion® Blazor DataGrid provides two distinct operational modes for the filter bar. These modes determine how and when filtering is executed: -Each mode offers a different user experience depending on the desired interaction model. +* **OnEnter Mode**: Filters are applied only after pressing the **Enter** key, allowing multiple changes before execution +* **Immediate Mode**: Filters are applied automatically as values are entered, providing real-time results -**OnEnter Mode:** +**OnEnter Mode Implementation** -To enable [OnEnter](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.FilterBarMode.html#Syncfusion_Blazor_Grids_FilterBarMode_OnEnter) mode, set the filter bar [Mode](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridFilterSettings.html#Syncfusion_Blazor_Grids_GridFilterSettings_Mode) property to **OnEnter** within the [GridFilterSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_FilterSettings). In this mode, the filter bar captures the entered criteria but does not initiate filtering until the **Enter** key is pressed. This allows multiple criteria to be modified before applying the filter. +The [OnEnter](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.FilterBarMode.html#Syncfusion_Blazor_Grids_FilterBarMode_OnEnter) mode executes filtering when the **Enter** key is pressed. Set the [Mode](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridFilterSettings.html#Syncfusion_Blazor_Grids_GridFilterSettings_Mode) property to **OnEnter** within [GridFilterSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_FilterSettings) to enable this mode. This approach enables multiple filter criteria to be adjusted before triggering the filter operation. -**Immediate Mode:** +**Immediate Mode Implementation** -To enable [Immediate](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.FilterBarMode.html#Syncfusion_Blazor_Grids_FilterBarMode_Immediate) mode, set the filter bar [Mode](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridFilterSettings.html#Syncfusion_Blazor_Grids_GridFilterSettings_Mode) property to **Immediate** within the [GridFilterSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_FilterSettings). In this mode, filtering is applied automatically as values are entered or modified in the filter bar, providing real-time filtering results. +The [Immediate](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.FilterBarMode.html#Syncfusion_Blazor_Grids_FilterBarMode_Immediate) mode applies filters automatically as data is entered. Set the [Mode](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridFilterSettings.html#Syncfusion_Blazor_Grids_GridFilterSettings_Mode) property to **Immediate** within [GridFilterSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_FilterSettings) to enable this mode. This delivers live filtering results as values are modified in the filter bar. {% tabs %} {% highlight razor tabtitle="Index.razor" %} @@ -237,11 +233,11 @@ public class OrderData {% previewsample "https://blazorplayground.syncfusion.com/embed/BjBJjCrLfIsxkmhV?appbar=false&editor=false&result=true&errorlist=false&theme=bootstrap5" %} -## Display filter text in pager +### Display filter text in pager -The Syncfusion® Blazor DataGrid provides an option to display filter text within the pager, indicating the current filtering status. This feature enhances visibility of the applied filters and the criteria used for filtering. +The Syncfusion® Blazor DataGrid can display active filter information within the pager section. This visibility enhancement allows clear tracking of currently applied filters and their criteria. -To enable this functionality, set the [ShowFilterBarStatus](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridFilterSettings.html#Syncfusion_Blazor_Grids_GridFilterSettings_ShowFilterBarStatus) property within the [GridFilterSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_FilterSettings) configuration. +Enable this functionality by setting the [ShowFilterBarStatus](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridFilterSettings.html#Syncfusion_Blazor_Grids_GridFilterSettings_ShowFilterBarStatus) property to **true** within the [GridFilterSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_FilterSettings) configuration. {% tabs %} {% highlight razor tabtitle="Index.razor" %} @@ -359,11 +355,9 @@ public class OrderData {% previewsample "https://blazorplayground.syncfusion.com/embed/BZVfZhtdTBLebNJe?appbar=false&editor=false&result=true&errorlist=false&theme=bootstrap5" %} -## Prevent filtering for particular column +### Disable filter for specific columns -The Syncfusion® Blazor DataGrid allows disabling filtering for specific columns by setting the [AllowFiltering](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_AllowFiltering) property of the [GridColumn](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridColumn.html) object to **false**. This configuration is useful when filtering should be restricted for certain columns. - -The following example demonstrates how to remove the filter bar for the **CustomerID** column in the DataGrid: +The Syncfusion® Blazor DataGrid supports disabling the filter bar for particular columns. Configure the [AllowFiltering](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_AllowFiltering) property of the [GridColumn](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridColumn.html) object to **false** to restrict filtering for that specific column. {% tabs %} {% highlight razor tabtitle="Index.razor" %} @@ -439,13 +433,9 @@ public class OrderData {% previewsample "https://blazorplayground.syncfusion.com/embed/rtLpZirLweUEtUYL?appbar=false&editor=false&result=true&errorlist=false&theme=bootstrap5" %} -## Hide filter bar for template column - -By default, the filter bar is disabled for template columns in the Syncfusion® Blazor DataGrid. In scenarios requiring a customized filtering experience, the filter bar can be hidden for a template column. +### Hide filter bar for template column -To hide the filter bar for a template column, use the [FilterTemplate](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridColumn.html#Syncfusion_Blazor_Grids_GridColumn_FilterTemplate) property of the [GridColumn](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridColumn.html). This property allows defining a custom template for the filter bar of the column. - -The following example demonstrates how to hide the filter bar for a template column in the DataGrid: +Template columns in the Syncfusion® Blazor DataGrid do not display filter bars by default. To maintain or further customize the filter behavior for template columns, use the [FilterTemplate](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridColumn.html#Syncfusion_Blazor_Grids_GridColumn_FilterTemplate) property. This property defines a custom template for the filter bar area of the column. {% tabs %} {% highlight razor tabtitle="Index.razor" %} @@ -525,13 +515,18 @@ public class OrderData {% previewsample "https://blazorplayground.syncfusion.com/embed/rjrTNshUBMYiOnUm?appbar=false&editor=false&result=true&errorlist=false&theme=bootstrap5" %} -## Filter bar template with custom component +### Filter bar template with custom component + +The [FilterTemplate](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridColumn.html#Syncfusion_Blazor_Grids_GridColumn_FilterTemplate) property enables customization of components displayed in the filter bar. By default, the filter bar displays a standard text input field. However, specific filtering scenarios may benefit from alternative components. -The [FilterTemplate](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridColumn.html#Syncfusion_Blazor_Grids_GridColumn_FilterTemplate) feature in the Syncfusion® Blazor DataGrid enables customization of the components rendered in the filter bar. By default, a text box is displayed in the filter bar cell. This feature allows integration of various components such as the [DatePicker](https://blazor.syncfusion.com/documentation/datepicker/getting-started), [NumericTextBox](https://blazor.syncfusion.com/documentation/numeric-textbox/getting-started), [ComboBox](https://blazor.syncfusion.com/documentation/combobox/getting-started-with-web-app), and [MultiSelect Dropdown](https://blazor.syncfusion.com/documentation/multiselect-dropdown/getting-started-webapp) to suit specific filtering requirements. +The Syncfusion® Blazor DataGrid supports integration of the following specialized components within the filter bar: -To implement a custom filter bar component, define a template using the `FilterTemplate` property of the [GridColumn](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridColumn.html). +* [DatePicker](https://blazor.syncfusion.com/documentation/datepicker/getting-started) - For date-based filtering +* [NumericTextBox](https://blazor.syncfusion.com/documentation/numeric-textbox/getting-started) - For numeric value filtering +* [ComboBox](https://blazor.syncfusion.com/documentation/combobox/getting-started-with-web-app) - For predefined selection filtering +* [MultiSelect Dropdown](https://blazor.syncfusion.com/documentation/multiselect-dropdown/getting-started-webapp) - For multi-value filtering -The following example demonstrates how to use a custom component in the filter bar: +To implement a custom filter component, define a template using the `FilterTemplate` property of the [GridColumn](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridColumn.html). {% tabs %} {% highlight razor tabtitle="Index.razor" %} @@ -731,5 +726,3 @@ public class OrderData {% endtabs %} {% previewsample "https://blazorplayground.syncfusion.com/embed/rNhTtWrFGgPwVFGP?appbar=false&editor=false&result=true&errorlist=false&theme=bootstrap5" %} - -N> Refer to the [Blazor DataGrid](https://www.syncfusion.com/blazor-components/blazor-datagrid) feature tour for a broad overview. Explore the [Blazor DataGrid example](https://blazor.syncfusion.com/demos/datagrid/overview?theme=bootstrap5) to understand data presentation and manipulation. \ No newline at end of file diff --git a/blazor/datagrid/filter-menu.md b/blazor/datagrid/filter-menu.md index 24f6f694b0..312902aa99 100644 --- a/blazor/datagrid/filter-menu.md +++ b/blazor/datagrid/filter-menu.md @@ -9,11 +9,9 @@ documentation: ug # Filter menu in Blazor DataGrid -The Syncfusion® Blazor DataGrid supports a filter menu interface that enables column-specific filtering using various operators. This feature provides enhanced control over how data is displayed and filtered. +The Syncfusion® Blazor DataGrid filter menu provides an intuitive interface for filtering data on a per-column basis. It utilizes a pop-up menu that contains a range of filter operators, offering precise control over the displayed data. -To enable the filter menu, set the [Type](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridFilterSettings.html#Syncfusion_Blazor_Grids_GridFilterSettings_Type) of [GridFilterSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_FilterSettings) to **Menu**. When the [AllowFiltering](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_AllowFiltering) property is set to **true**, filter icons are rendered in the column headers, enabling interactive filtering with multiple operator options. - -The following example demonstrates the usage of the filter menu in the DataGrid: +To enable the filter menu, set the [AllowFiltering](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_AllowFiltering) property to **true** and the [Type](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridFilterSettings.html#Syncfusion_Blazor_Grids_GridFilterSettings_Type) property of the [GridFilterSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_FilterSettings) to **Menu**. When enabled, a filter icon appears in the column header, allowing for interactive filtering. {% tabs %} {% highlight razor tabtitle="Index.razor" %} @@ -92,20 +90,19 @@ public class OrderData {% previewsample "https://blazorplayground.syncfusion.com/embed/hZVJXMVKpLxfzxZN?appbar=false&editor=false&result=true&errorlist=false&theme=bootstrap5" %} -> * [AllowFiltering](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_AllowFiltering) must be set to true to enable the filter menu. > * Setting the [AllowFiltering](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_AllowFiltering) property of the [GridColumn](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridColumn.html) object to **false** prevents the filter menu from rendering for that specific column. ## Custom component in filter menu -The Syncfusion® Blazor DataGrid supports customization of the filter menu by replacing default input editors with custom components. This customization is achieved using the [FilterTemplate](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridColumn.html#Syncfusion_Blazor_Grids_GridColumn_FilterTemplate) property of the [GridColumn](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridColumn.html). +The filter menu can be customized by replacing its default input component with a custom one. This is achieved by defining a template within the [FilterTemplate](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridColumn.html#Syncfusion_Blazor_Grids_GridColumn_FilterTemplate) property of a [GridColumn](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridColumn.html). -By default, the filter menu renders the following components based on column type: +The default component rendered in the filter menu is determined by the column's data type: -- [AutoComplete](https://blazor.syncfusion.com/documentation/autocomplete/getting-started-with-web-app) for string columns -- [NumericTextBox](https://blazor.syncfusion.com/documentation/numeric-textbox/getting-started) for numeric columns -- [DropDownList](https://blazor.syncfusion.com/documentation/dropdown-list/getting-started) for boolean columns +* **String**: [AutoComplete](https://blazor.syncfusion.com/documentation/autocomplete/getting-started-with-web-app) +* **Numeric**: [NumericTextBox](https://blazor.syncfusion.com/documentation/numeric-textbox/getting-started) +* **Boolean**: [DropDownList](https://blazor.syncfusion.com/documentation/dropdown-list/getting-started) -The following example demonstrates how to replace the standard search box in the filter menu with a `DropDownList` for the **OrderID** column: +For example, the following code demonstrates how to replace the default `NumericTextBox` with a `DropDownList` for the numeric **OrderID** column. This customization allows filtering based on a selection from the dropdown list instead of manual input. {% tabs %} {% highlight razor tabtitle="Index.razor" %} @@ -201,11 +198,9 @@ public class OrderData ## Show 24 hours time format in filter dialog -The Syncfusion® Blazor DataGrid supports displaying time in 24-hour format within the filter dialog for date or datetime columns. By default, the dialog displays time in 12-hour format (AM/PM). - -To display time in 24-hour format, use the [FilterTemplate](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridColumn.html#Syncfusion_Blazor_Grids_GridColumn_FilterTemplate) property of the [GridColumn](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridColumn.html) and set the `TimeFormat` of the [DateTimePicker](https://blazor.syncfusion.com/documentation/datetime-picker/getting-started-with-web-app) component to **HH:mm**. +The Syncfusion® Blazor DataGrid supports displaying time in 24-hour format within the filter dialog for date or datetime columns. For `DateTime` columns, the filter dialog's time picker defaults to a **12-hour (AM/PM)** format. This can be customized to a 24-hour format. -The following example demonstrates how to show 24-hour time format in the filter dialog: +To implement this, define a [FilterTemplate](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridColumn.html#Syncfusion_Blazor_Grids_GridColumn_FilterTemplate) for the desired [GridColumn](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridColumn.html). Inside the template, use a [DateTimePicker](https://blazor.syncfusion.com/documentation/datetime-picker/getting-started-with-web-app) component and set its `TimeFormat` property to **HH:mm**. {% tabs %} {% highlight razor tabtitle="Index.razor" %} @@ -297,16 +292,19 @@ public class OrderData ## Customizing filter menu operators list -The Syncfusion® Blazor DataGrid allows customization of the default filter operator list using the FilterDialogOpening event. This customization is supported for **string**, **number**, **date**, and **boolean** data types. -Available customization options include: +The Syncfusion® Blazor DataGrid allows customization of the default filter operator list using the [FilterDialogOpening](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridEvents-1.html#Syncfusion_Blazor_Grids_GridEvents_1_FilterDialogOpening) event. This customization is supported for the following data types: +- String +- Number +- Date +- Boolean + +Provide a custom list by assigning one of the following collections to **args.FilterOperators** based on the column: * **StringOperator** - Defines a custom list of string operators. * **NumberOperator** - Defines a custom list of number operators. * **DateOperator** - Defines a custom list of date operators. * **BooleanOperator** - Defines a custom list of boolean operators. -The following example demonstrates how to customize the filter operators list in the DataGrid: - {% tabs %} {% highlight razor tabtitle="Index.razor" %} @@ -750,8 +748,6 @@ To hide the operator dropdown in the menu filter dialog of the Syncfusion® Blazor DataGrid supports fi To enable this functionality, set the [Type](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridFilterSettings.html#Syncfusion_Blazor_Grids_GridFilterSettings_Type) property of the [GridFilterSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_FilterSettings) to **Menu**, and integrate the [MultiSelect](https://blazor.syncfusion.com/documentation/multiselect-dropdown/getting-started-webapp) component as a custom UI element within the filter menu dialog. -The following example demonstrates how to configure multi-keyword filtering using the filter menu in the DataGrid: - {% tabs %} {% highlight razor tabtitle="Index.razor" %} @@ -1069,9 +1063,6 @@ To hide the filter icon in the Grid, apply the CSS style to the filter menu elem } ``` - -The following example demonstrates how to filter the **CustomerID** column programmatically and hide the default filter icons: - {% tabs %} {% highlight razor tabtitle="Index.razor" %} @@ -1140,8 +1131,6 @@ The Syncfusion® Blazor DataGrid provides th 3. [FilterDialogOpening](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridEvents-1.html#Syncfusion_Blazor_Grids_GridEvents_1_FilterDialogOpening): Occurs before the filter dialog opens, enabling pre-opening customization. 4. [FilterDialogOpened](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridEvents-1.html#Syncfusion_Blazor_Grids_GridEvents_1_FilterDialogOpened): Occurs after the filter dialog has opened, allowing post-opening adjustments. -The following example demonstrates how to use these events to handle filter menu actions in the Grid: - {% tabs %} {% highlight razor tabtitle="Index.razor" %} @@ -1303,9 +1292,9 @@ Different filter types such as Excel, Menu, and Checkbox can be defined in diffe ## Filtering using DateRangePicker -By default, for the date column in the filter menu, filtering action is performed based on a single date value selected from the `SfDatePicker`. The Syncfusion® Blazor DataGrid also can perform the filtering action between the range of date values by rendering the `SfDateRangePicker` in the filter menu. This can be achieved by the filter template feature of the Grid. +By default, for the date column in the filter menu, filtering action is performed based on a single date value selected from the `SfDatePicker`. The Syncfusion® Blazor DataGrid also can perform the filtering action between the range of date values by rendering the [SfDateRangePicker](https://blazor.syncfusion.com/documentation/daterangepicker/getting-started-with-web-app) in the filter menu. This can be achieved by the filter template feature of the Grid. -In the following sample, the `SfDateRangePicker` is rendered in the filter template. Using the `ValueChange` event of the `SfDateRangePicker`, get the start and end date values needed to perform the filtering action. In the [OnActionBegin](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridEvents-1.html#Syncfusion_Blazor_Grids_GridEvents_1_OnActionBegin) event of the Grid, the default filter action is prevented by setting the `args.Cancel` as true. Then, perform the filtering action by setting the custom predicate values. +In this configuration, the `SfDateRangePicker` is rendered in the filter template of the **OrderDate** column. The [ValueChange](https://blazor.syncfusion.com/documentation/daterangepicker/events#valuechange) event captures the selected start and end dates. The filtering logic is handled in the [Filtering](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridEvents-1.html#Syncfusion_Blazor_Grids_GridEvents_1_Filtering) event, where the default filter action is canceled and custom predicates are applied using the selected date range. {% tabs %} {% highlight razor tabtitle="Index.razor" %} @@ -1450,7 +1439,7 @@ public class OrderData When using the filter menu in the Syncfusion® Blazor DataGrid, the UI may display filter operators for all columns based on the data type of the first record it encounters. If the first record contains null or empty values, the filter menu may not function as expected. To resolve this issue, follow these steps: -**Explicitly define data types:** Specify the data type for each column using the Type property in the column definition. This ensures consistent operator rendering regardless of the initial data. For example: +**Explicitly define data types:** Specify the data type for each column using the Type property in the column definition. This ensures consistent operator rendering regardless of the initial data. ```cshtml From 1003f5614140aa521bb2ee445723400102c0d488 Mon Sep 17 00:00:00 2001 From: SadhanaBaskaran Date: Thu, 13 Nov 2025 19:30:23 +0530 Subject: [PATCH 037/266] 991627: Updated the UG content and samples for Filtering in Blazor DataGrid --- blazor/datagrid/filtering.md | 38 ++++++++++-------------------------- 1 file changed, 10 insertions(+), 28 deletions(-) diff --git a/blazor/datagrid/filtering.md b/blazor/datagrid/filtering.md index e772fec04a..3db84bc6f5 100644 --- a/blazor/datagrid/filtering.md +++ b/blazor/datagrid/filtering.md @@ -13,8 +13,6 @@ Filtering is a key feature in the Syncfusion®® Blazor DataGrid, define the filter criteria using the Predicate object within the [Columns](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridFilterSettings.html#Syncfusion_Blazor_Grids_GridFilterSettings_Columns) property of [GridFilterSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_FilterSettings). The Predicate object represents the filtering condition and includes properties such as **field**, **operator**, and **value**. - -The following example demonstrates how to configure the initial filter using the Predicate object: +To apply an initial filter in the Syncfusion® Blazor DataGrid, define the filter criteria using the **Predicate** object within the [Columns](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridFilterSettings.html#Syncfusion_Blazor_Grids_GridFilterSettings_Columns) property of [GridFilterSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_FilterSettings). The **Predicate** object represents the filtering condition and includes properties such as **Field**, **Operator**, and **Value**. {% tabs %} {% highlight razor tabtitle="Index.razor" %} @@ -185,8 +181,6 @@ In the Syncfusion® Blazor DataGrid, an init To apply an initial filter with multiple values for the same column, define the filter [Predicate](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridFilterColumn.html#Syncfusion_Blazor_Grids_GridFilterColumn_Predicate) object within the [Columns](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridFilterSettings.html#Syncfusion_Blazor_Grids_GridFilterSettings_Columns) property of [GridFilterSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_FilterSettings). -The following example demonstrates how to configure an initial filter with multiple values for the **CustomerID** column using the `Columns` property of `GridFilterSettings` and Predicate: - {% tabs %} {% highlight razor tabtitle="Index.razor" %} @@ -310,8 +304,6 @@ In the Syncfusion® Blazor DataGrid, an init To apply an initial filter with multiple values for different columns, define the filter [Predicate](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridFilterColumn.html#Syncfusion_Blazor_Grids_GridFilterColumn_Predicate) object within the [Columns](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridFilterSettings.html#Syncfusion_Blazor_Grids_GridFilterSettings_Columns) property of [GridFilterSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_FilterSettings). -The following example demonstrates how to configure an initial filter with multiple values for the **Order ID** and **Customer ID** columns using the `Columns` property of `GridFilterSettings` and Predicate: - {% tabs %} {% highlight razor tabtitle="Index.razor" %} @@ -497,7 +489,7 @@ ab* | Matches values that contain “a”, followed by any characters, then “b ### Like filtering -The Like filter processes single search patterns using the % symbol to retrieve values that match the defined criteria. The following Syncfusion® Blazor DataGrid features support Like filtering on string-type columns: +The **Like** filter processes single search patterns using the % symbol to retrieve values that match the defined criteria. The following Syncfusion® Blazor DataGrid features support Like filtering on string-type columns: * Filter Menu * Filter Bar using the [Operator](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.FilterSettings.html#Syncfusion_Blazor_Grids_FilterSettings_Operator) property within the [GridFilterSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_FilterSettings) configuration @@ -517,8 +509,6 @@ The Like filter processes single search patterns using the % symbol to re The Syncfusion® Blazor DataGrid provides the flexibility to enable or disable case sensitivity during filtering. This feature allows control over whether filtering operations should consider character casing. Case sensitivity can be configured using the [EnableCaseSensitivity](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridFilterSettings.html#Syncfusion_Blazor_Grids_GridFilterSettings_EnableCaseSensitivity) property of [GridFilterSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_FilterSettings)configuration. -The following example demonstrates how to enable or disable case sensitivity during filtering: - {% tabs %} {% highlight razor tabtitle="Index.razor" %} @@ -779,8 +769,6 @@ public class OrderData The Syncfusion® Blazor DataGrid provides flexibility to modify the default filter operator for individual columns. By default, the filter operator is set to **StartsWith** for string-type columns, and **Equal** for numerical and boolean-type columns. In scenarios where a different operator better suits the nature of the data, the default can be customized using the [Operator](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.FilterSettings.html#Syncfusion_Blazor_Grids_FilterSettings_Operator) property within the [GridFilterSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_FilterSettings) configuration. -The following example demonstrates how to change the default filter operator for a column: - {% tabs %} {% highlight razor tabtitle="Index.razor" %} @@ -938,14 +926,12 @@ public class OrderData {% previewsample "https://blazorplayground.syncfusion.com/embed/rtLTXCAsUitWDKfU?appbar=false&editor=false&result=true&errorlist=false&theme=bootstrap5" %} -## Filter Blazor DataGrid programmatically with single and multiple values using method +## Filter via programmatically Programmatic filtering in the Syncfusion® Blazor DataGrid enables applying filters to specific columns without relying on UI interactions. This approach supports both single and multiple filter values. Filtering can be performed using the [FilterByColumnAsync](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_FilterByColumnAsync_System_String_System_String_System_Object_System_String_System_Nullable_System_Boolean__System_Nullable_System_Boolean__System_Object_System_Object_System_String_) method of the Grid. -The following example demonstrates how to programmatically filter the Grid using single and multiple values for the **OrderID** and **CustomerID** columns. This is accomplished by invoking the `FilterByColumnAsync` method within an external button click handler: - {% tabs %} {% highlight razor tabtitle="Index.razor" %} @@ -1042,11 +1028,11 @@ public class OrderData Retrieving filtered records in the Syncfusion® Blazor DataGrid is essential when working with data that matches the currently applied filters. This can be accomplished using available methods and event properties in the Grid. -**1. Using the GetFilteredRecordsAsync() method** +**Fetch filtered Records with GetFilteredRecordsAsync** -The [GetFilteredRecordsAsync](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_GetFilteredRecordsAsync_System_Boolean_) method returns an array of records that match the currently applied filters. +**Local Data** -The following example demonstrates how to retrieve filtered data using the `GetFilteredRecordsAsync` method: +The [GetFilteredRecordsAsync](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_GetFilteredRecordsAsync_System_Boolean_) method returns a collection of records that match the currently applied filters. {% tabs %} {% highlight razor tabtitle="Index.razor" %} @@ -1198,7 +1184,7 @@ public class OrderData {% previewsample "https://blazorplayground.syncfusion.com/embed/hjhpZCiFKFFRoZzt?appbar=false&editor=false&result=true&errorlist=false&theme=bootstrap5" %} -**2. Using the GetFilteredRecordsAsync() method with remote data** +**Remote Data** When using a remote data source, the [GetFilteredRecordsAsync](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_GetFilteredRecordsAsync_System_Boolean_) method returns the filtered records as objects. These objects must be deserialized to access the filtered data. @@ -1304,7 +1290,7 @@ When using a remote data source, the [GetFilteredRecordsAsync](https://help.sync {% previewsample "https://blazorplayground.syncfusion.com/embed/rXLTXiUChxbmPDxX?appbar=false&editor=false&result=true&errorlist=false&theme=bootstrap5" %} -**3. Using properties in the FilteredEventArgs object** +**Accessing filter details via FilteredEventArgs Properties** Filtered record details can also be accessed through the [Filtered](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridEvents-1.html#Syncfusion_Blazor_Grids_GridEvents_1_Filtered) event handler using the following properties: @@ -1319,12 +1305,10 @@ public async Task FilteredHandler(FilteredEventArgs args) } ``` -## Clear filtering using methods +## Clear filter via programmatically The Syncfusion® Blazor DataGrid provides the [ClearFilteringAsync](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_ClearFilteringAsync) method to remove applied filters and reset the Grid to its original state. -The following example demonstrates how to clear filtering in the Grid using the `ClearFilteringAsync` method: - {% tabs %} {% highlight razor tabtitle="Index.razor" %} @@ -1414,8 +1398,6 @@ Filtering events provide customization options for the Syncfusion® Blazor DataGrid using the Filter Template feature. -In the following example, the [SfDropDownList](https://blazor.syncfusion.com/documentation/dropdown-list/getting-started-with-web-app) component is rendered within the [FilterTemplate](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridColumn.html#Syncfusion_Blazor_Grids_GridColumn_FilterTemplate) of the Type column. The enumerated list is bound to the column, and filtering is applied dynamically using the [ValueChange](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DropDowns.DropDownListEvents-2.html#Syncfusion_Blazor_DropDowns_DropDownListEvents_2_ValueChange) event of the `SfDropDownList`. Within this event, the [FilterByColumnAsync](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_FilterByColumnAsync_System_String_System_String_System_Object_System_String_System_Nullable_System_Boolean__System_Nullable_System_Boolean__System_Object_System_Object_System_String_) method is used to apply filtering to the Type column. +In the following example, the [SfDropDownList](https://blazor.syncfusion.com/documentation/dropdown-list/getting-started-with-web-app) component is rendered within the [FilterTemplate](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridColumn.html#Syncfusion_Blazor_Grids_GridColumn_FilterTemplate) of the **Type** column. The enumerated list is bound to the column, and filtering is applied dynamically using the [ValueChange](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DropDowns.DropDownListEvents-2.html#Syncfusion_Blazor_DropDowns_DropDownListEvents_2_ValueChange) event of the `SfDropDownList`. Within this event, the [FilterByColumnAsync](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_FilterByColumnAsync_System_String_System_String_System_Object_System_String_System_Nullable_System_Boolean__System_Nullable_System_Boolean__System_Object_System_Object_System_String_) method is used to apply filtering to the **Type** column. {% tabs %} {% highlight razor tabtitle="Index.razor" %} From e14c9fc388558be41fb862ba384c57640890ced5 Mon Sep 17 00:00:00 2001 From: VinothkumarYuvaraj Date: Fri, 14 Nov 2025 12:36:48 +0530 Subject: [PATCH 038/266] 990489: Add UG Documentation for the HttpClientInstance Support for Syncfusion Blazor Rich Text Editor - Blazor --- blazor-toc.html | 1 + .../rich-text-editor/http-client-instance.md | 63 +++++++++++++++++++ 2 files changed, 64 insertions(+) create mode 100644 blazor/rich-text-editor/http-client-instance.md diff --git a/blazor-toc.html b/blazor-toc.html index 9d01dcca15..ce2fea913b 100644 --- a/blazor-toc.html +++ b/blazor-toc.html @@ -4137,6 +4137,7 @@
  • Accessibility
  • WebAssembly Performance
  • Import and Export
  • +
  • http client
  • Editor Modes
  • Keyboard shortcuts
  • Miscellaneous
  • diff --git a/blazor/rich-text-editor/http-client-instance.md b/blazor/rich-text-editor/http-client-instance.md new file mode 100644 index 0000000000..1ac9bce035 --- /dev/null +++ b/blazor/rich-text-editor/http-client-instance.md @@ -0,0 +1,63 @@ +--- +layout: post +title: HttpClientInstance in Blazor RichTextEditor Component | Syncfusion +description: Checkout and learn here all about HttpClientInstance in Syncfusion Blazor RichTextEditor component and much more. +platform: Blazor +control: RichTextEditor +documentation: ug +--- + +# HttpClientInstance in Blazor RichTextEditor Component + +The Rich Text Editor component in Blazor enables you to utilize the `HttpClientInstance` property to append the custom HttpClient instance to all file upload requests. This approach offers flexibility in managing authentication and custom request configurations for Word Import, Word Export, "PDF Export and image/audio/video insertions. + +The following example illustrates how to configure the Rich Text Editor component with HttpClient in a Blazor application. + +```razor +@using Syncfusion.Blazor.RichTextEditor +@inject HttpClient httpClient + + + + + + + + + + +@code { + protected override async Task OnInitializedAsync() + { + // Adding authorization header to HTTP client + httpClient.DefaultRequestHeaders.Add("Authorization_1", "syncfusion"); + await base.OnInitializedAsync(); + } +} +``` + +## Program.cs + +```csharp +using Syncfusion.Blazor; + +var builder = WebApplication.CreateBuilder(args); + +// Add services to the container. +builder.Services.AddRazorComponents() + .AddInteractiveServerComponents(); +builder.Services.AddSyncfusionBlazor(); +builder.Services.AddScoped(sp => +{ + var httpClient = new HttpClient + { + BaseAddress = new Uri("https://your_api.com/") + }; + + // Add custom header + httpClient.DefaultRequestHeaders.Add("Custom-Header", "YourCustomValue"); + return httpClient; +}); +var app = builder.Build(); + +``` From 24670d869aa37e5f9581e7580fbdf59e1143e79f Mon Sep 17 00:00:00 2001 From: VinothkumarYuvaraj Date: Fri, 14 Nov 2025 15:57:27 +0530 Subject: [PATCH 039/266] 990489: Add UG Documentation for the HttpClientInstance Support for Syncfusion Blazor Rich Text Editor - Blazor --- blazor-toc.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/blazor-toc.html b/blazor-toc.html index ce2fea913b..add4ca8172 100644 --- a/blazor-toc.html +++ b/blazor-toc.html @@ -4137,7 +4137,7 @@
  • Accessibility
  • WebAssembly Performance
  • Import and Export
  • -
  • http client
  • +
  • Http Client
  • Editor Modes
  • Keyboard shortcuts
  • Miscellaneous
  • From a9226612079fe374eb057ac088957f67f7ffd0fe Mon Sep 17 00:00:00 2001 From: VinothkumarYuvaraj Date: Mon, 17 Nov 2025 11:13:28 +0530 Subject: [PATCH 040/266] 990489: Add UG Documentation for the HttpClientInstance Support for Syncfusion Blazor Rich Text Editor - Blazor --- blazor/rich-text-editor/http-client-instance.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/blazor/rich-text-editor/http-client-instance.md b/blazor/rich-text-editor/http-client-instance.md index 1ac9bce035..01ba2c33dc 100644 --- a/blazor/rich-text-editor/http-client-instance.md +++ b/blazor/rich-text-editor/http-client-instance.md @@ -9,7 +9,7 @@ documentation: ug # HttpClientInstance in Blazor RichTextEditor Component -The Rich Text Editor component in Blazor enables you to utilize the `HttpClientInstance` property to append the custom HttpClient instance to all file upload requests. This approach offers flexibility in managing authentication and custom request configurations for Word Import, Word Export, "PDF Export and image/audio/video insertions. +The Rich Text Editor component in Blazor enables you to utilize the `HttpClientInstance` property to append the custom HttpClient instance to all file upload requests. This approach offers flexibility in managing authentication and custom request configurations for Word Import, Word Export, PDF Export and image/audio/video insertions. The following example illustrates how to configure the Rich Text Editor component with HttpClient in a Blazor application. From f2e10809aca0b4a0342ec4a4b7394fe24eaef456 Mon Sep 17 00:00:00 2001 From: Ashwini-SF5049 Date: Mon, 17 Nov 2025 15:15:34 +0530 Subject: [PATCH 041/266] 993136: Add events UG Documentation for Chip components --- blazor-toc.html | 3 + blazor/chip/events.md | 193 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 196 insertions(+) create mode 100644 blazor/chip/events.md diff --git a/blazor-toc.html b/blazor-toc.html index 9d01dcca15..19874ac1ee 100644 --- a/blazor-toc.html +++ b/blazor-toc.html @@ -1610,6 +1610,9 @@
  • Types
  • +
  • + Events +
  • Customization
  • diff --git a/blazor/chip/events.md b/blazor/chip/events.md new file mode 100644 index 0000000000..c3bf5bd459 --- /dev/null +++ b/blazor/chip/events.md @@ -0,0 +1,193 @@ +--- +layout: post +title: Events in Blazor Chip Component | Syncfusion +description: Checkout and learn here all about Events in Syncfusion Blazor Chip component and much more details. +platform: Blazor +control: Chip +documentation: ug +--- + +# Events in Blazor Chip Component + +This section explains the list of events of the Chip component which will be triggered for appropriate Chip actions. + +## Created + +`Created` event triggers when the Chip component rendering is completed. + + +```cshtml +@using Syncfusion.Blazor.Buttons + + + + + + + + + + +@code { + private void OnCreated(object args) + { + // Write your code here + } +} +``` +## Deleted + +`Deleted`event triggers when a chip item is deleted. + +```cshtml + +@using Syncfusion.Blazor.Buttons + + + + + + + + + + + +@code { + private void OnDeleted(ChipDeletedEventArgs args) + { + // Write your code here + } +} +``` +## Destroyed + +`Destroyed` event triggers when the Chip component is disposed. + +```cshtml + + +using Syncfusion.Blazor.Buttons + + + + + + + + + + +@code { + private void OnDestroyed(object args) + { + // Write your code here + } +} +``` +## OnBeforeClick + +`OnBeforeClick` event triggers before a chip is clicked. + +```cshtml + + +@using Syncfusion.Blazor.Buttons + + + + ChipItem Text="Small"> + + + + + + + +@code { + private void OnBeforeChipClick(ChipEventArgs args) + { + // Write your code here + } +} +``` + +## OnClick + +`OnClick` event triggers when a chip is clicked. + +```cshtml + +@using Syncfusion.Blazor.Buttons + + + + + + + + + + + +@code { + private void OnChipClick(ChipEventArgs args) + { + // Write your code here + } +} +``` +## OnDelete + +`OnDelete` event triggers before removing the chip. + +```cshtml + +@using Syncfusion.Blazor.Buttons + + + + + + + + + + + +@code { + private void OnChipDelete(ChipEventArgs args) + { + // Write your code here + } +} + +``` +## SelectionChanged + +`SelectionChanged` event triggers when the selected chips are changed. + +```cshtml + +@using Syncfusion.Blazor.Buttons + + + + + + + + + + + +@ { + private void OnSelectionChanged(SelectionChangedEventArgs args) + { + // Write your code here + } +} + +``` + + From ac903ac23c5534368ccee468773fac5eb9fa8403 Mon Sep 17 00:00:00 2001 From: Ashwini-SF5049 Date: Mon, 17 Nov 2025 15:32:48 +0530 Subject: [PATCH 042/266] 993136: Updated the length of the description in events --- blazor/chip/events.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/blazor/chip/events.md b/blazor/chip/events.md index c3bf5bd459..2e319c910e 100644 --- a/blazor/chip/events.md +++ b/blazor/chip/events.md @@ -1,7 +1,7 @@ --- layout: post title: Events in Blazor Chip Component | Syncfusion -description: Checkout and learn here all about Events in Syncfusion Blazor Chip component and much more details. +description: Checkout and learn here all about Events in Syncfusion Blazor Chip component. platform: Blazor control: Chip documentation: ug From 872eebe7e1944fe19075818cf914b9b046210011 Mon Sep 17 00:00:00 2001 From: Ashwini-SF5049 Date: Mon, 17 Nov 2025 15:41:06 +0530 Subject: [PATCH 043/266] 993136: Updated the length of the description in events --- blazor/chip/events.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/blazor/chip/events.md b/blazor/chip/events.md index 2e319c910e..b4d44973d3 100644 --- a/blazor/chip/events.md +++ b/blazor/chip/events.md @@ -1,7 +1,7 @@ --- layout: post title: Events in Blazor Chip Component | Syncfusion -description: Checkout and learn here all about Events in Syncfusion Blazor Chip component. +description: Learn here all about Events in Syncfusion Blazor Chip component. platform: Blazor control: Chip documentation: ug From 7429c05760c8ada431c8fb302dcd5171c44fafca Mon Sep 17 00:00:00 2001 From: Ashwini-SF5049 Date: Mon, 17 Nov 2025 15:49:41 +0530 Subject: [PATCH 044/266] 993136: Updated the length of the description in events --- blazor/chip/events.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/blazor/chip/events.md b/blazor/chip/events.md index b4d44973d3..e10c3bc601 100644 --- a/blazor/chip/events.md +++ b/blazor/chip/events.md @@ -1,7 +1,7 @@ --- layout: post title: Events in Blazor Chip Component | Syncfusion -description: Learn here all about Events in Syncfusion Blazor Chip component. +description: Explore events in Syncfusion Blazor Chip component including Created, Deleted, Destroyed, OnBeforeClick, OnClick, OnDelete, and SelectionChanged events. platform: Blazor control: Chip documentation: ug From 5d0d4cbb610de5a170b0181d79f4d197bdcbd9c6 Mon Sep 17 00:00:00 2001 From: Ashwini-SF5049 Date: Mon, 17 Nov 2025 19:07:04 +0530 Subject: [PATCH 045/266] 993136: Add events UG Documentation for Chip components --- blazor/chip/events.md | 31 ++++++++++--------------------- 1 file changed, 10 insertions(+), 21 deletions(-) diff --git a/blazor/chip/events.md b/blazor/chip/events.md index e10c3bc601..55930893ec 100644 --- a/blazor/chip/events.md +++ b/blazor/chip/events.md @@ -13,8 +13,7 @@ This section explains the list of events of the Chip component which will be tri ## Created -`Created` event triggers when the Chip component rendering is completed. - +The `Created` event triggers when the Chip component rendering is completed. ```cshtml @using Syncfusion.Blazor.Buttons @@ -37,10 +36,9 @@ This section explains the list of events of the Chip component which will be tri ``` ## Deleted -`Deleted`event triggers when a chip item is deleted. +The `Deleted` event triggers when a chip item is deleted. ```cshtml - @using Syncfusion.Blazor.Buttons @@ -62,12 +60,10 @@ This section explains the list of events of the Chip component which will be tri ``` ## Destroyed -`Destroyed` event triggers when the Chip component is disposed. +The `Destroyed` event triggers when the Chip component is disposed. ```cshtml - - -using Syncfusion.Blazor.Buttons +@using Syncfusion.Blazor.Buttons @@ -87,16 +83,14 @@ using Syncfusion.Blazor.Buttons ``` ## OnBeforeClick -`OnBeforeClick` event triggers before a chip is clicked. +The `OnBeforeClick` event triggers before a chip is clicked. ```cshtml - - @using Syncfusion.Blazor.Buttons - ChipItem Text="Small"> + @@ -114,10 +108,9 @@ using Syncfusion.Blazor.Buttons ## OnClick -`OnClick` event triggers when a chip is clicked. +The `OnClick` event triggers when a chip is clicked. ```cshtml - @using Syncfusion.Blazor.Buttons @@ -139,10 +132,9 @@ using Syncfusion.Blazor.Buttons ``` ## OnDelete -`OnDelete` event triggers before removing the chip. +The `OnDelete` event triggers before removing the chip. ```cshtml - @using Syncfusion.Blazor.Buttons @@ -161,14 +153,12 @@ using Syncfusion.Blazor.Buttons // Write your code here } } - ``` ## SelectionChanged -`SelectionChanged` event triggers when the selected chips are changed. +The `SelectionChanged` event triggers when the selected chips are changed. ```cshtml - @using Syncfusion.Blazor.Buttons @@ -181,13 +171,12 @@ using Syncfusion.Blazor.Buttons -@ { +@code { private void OnSelectionChanged(SelectionChangedEventArgs args) { // Write your code here } } - ``` From 42c619be52b2fbbcdb353ed4382dbb866cbf0198 Mon Sep 17 00:00:00 2001 From: SadhanaBaskaran Date: Tue, 18 Nov 2025 10:43:44 +0530 Subject: [PATCH 046/266] 993664: Updated the UG content and samples for Blazor Pager Component --- blazor/pager/accessibility.md | 67 +++++++++++++++++++++-------------- 1 file changed, 41 insertions(+), 26 deletions(-) diff --git a/blazor/pager/accessibility.md b/blazor/pager/accessibility.md index 2b5c79f572..1643f5e410 100644 --- a/blazor/pager/accessibility.md +++ b/blazor/pager/accessibility.md @@ -1,7 +1,7 @@ --- layout: post -title: Accessibility in Blazor Pager Component | Syncfusion -description: Checkout here and learn about accessibility in Syncfusion Blazor Pager component and much more details. +title: Accessibility Support in the Blazor Pager Component | Syncfusion +description: Learn about accessibility features and compliance in the Syncfusion Blazor Pager component, including WAI-ARIA roles and keyboard navigation. platform: Blazor control: Pager documentation: ug @@ -9,9 +9,16 @@ documentation: ug # Accessibility in Blazor Pager Component -The Blazor Pager component followed the accessibility guidelines and standards, including [ADA](https://www.ada.gov/), [Section 508](https://www.section508.gov/), [WCAG 2.2](https://www.w3.org/TR/WCAG22/) standards, and [WCAG roles](https://www.w3.org/TR/wai-aria/#roles) that are commonly used to evaluate accessibility. +The Syncfusion® Blazor Pager component is designed to meet widely recognized accessibility standards, ensuring compatibility with assistive technologies and delivering an inclusive experience. It adheres to the following guidelines: -The accessibility compliance for the Blazor Pager component is outlined below. +- [ADA](https://www.ada.gov/) – Americans with Disabilities Act compliance for accessible digital content. +- [Section 508](https://www.section508.gov/) – U.S. federal accessibility requirements for software applications. +- [WCAG 2.2](https://www.w3.org/TR/WCAG22/) – Web Content Accessibility Guidelines for perceivable, operable, and understandable content. +- [WAI-ARIA Roles](https://www.w3.org/TR/wai-aria/#roles) – Accessible Rich Internet Applications specifications for improved interaction with assistive technologies. + +## Accessibility Compliance + +The table below lists the accessibility features supported by the Syncfusion® Blazor Pager component: | Accessibility Criteria | Compatibility | | -- | -- | @@ -31,42 +38,50 @@ The accessibility compliance for the Blazor Pager component is outlined below. } -
    Yes - All features of the component meet the requirement.
    +**Legend:** + +
    Yes - Fully meets the requirement.
    -
    Intermediate - Some features of the component do not meet the requirement.
    +
    Intermediate - Partially meets the requirement.
    -
    No - The component does not meet the requirement.
    +
    No - Does not meet the requirement.
    ## WAI-ARIA -The Blazor Pager component followed the [WAI-ARIA](https://www.w3.org/WAI/ARIA/apg/patterns/) patterns to meet the accessibility. The following ARIA attributes are used in the Blazor Pager component: +The Syncfusion® Blazor Pager component applies Accessible Rich Internet Applications ([WAI-ARIA](https://www.w3.org/WAI/ARIA/apg/patterns/)) roles and attributes to improve interoperability with assistive technologies. + +| **Element** | **Purpose** | **Applied Role / Attribute** | +|----------------------|--------------------------------------------------|-------------------------------------| +| Pager root container | Identifies the region as page navigation | `role="navigation"` | +| Pager wrapper | Groups the collection of page selectors | `role="pager"` | +| Page selector | Represents an interactive control for page selection | `role="button"` | +| Navigation region | Provides an accessible name for the navigation area | `aria-label=""` | -* pager (role) -* button (role) -* navigation(role) -* aria-label (Attribute) ## Keyboard navigation -The Blazor Pager component followed the [keyboard interaction](https://www.w3.org/WAI/ARIA/apg/patterns/alert/#keyboardinteraction) guideline, making it easy for people who use assistive technologies (AT) and those who completely rely on keyboard navigation. The following keyboard shortcuts are supported by the Blazor Pager component. +The Syncfusion® Blazor Pager component supports keyboard interactions to ensure accessibility for individuals relying on assistive technologies or keyboard navigation. The available shortcuts are: + +| **Windows** | **Mac** | **Action** | +|---------------------------------|----------------------------------|-------------------------------------------| +| Page Down / | Page Down / | Navigate to the next page | +| Page Up / | Page Up / | Navigate to the previous page | +| Enter / Space | Enter / Space | Select the currently focused page | +| Tab | Tab | Move focus to the next pager item | +| Shift + Tab | + Tab | Move focus to the previous pager item | +| Home | Home | Navigate to the first page | +| End | End | Navigate to the last page | +| Alt + Page Up | + Page Up | Navigate to the previous pager group | +| Alt + Page Down| + Page Down | Navigate to the next pager group | -|Windows | Mac |Description| -|-----|-----| --- | -|Page down / | Page down / |Navigates to the next page.| -|Page up / | Page up / | Navigates to the previous page.| -|Enter / Space | Enter / Space | Select the currently focused page.| -|Tab | Tab | Focus on the next pager item.| -|Shift + Tab | + Tab | Focus on the previous pager item.| -|Home | Home | Navigates to the first page.| -|End | End | Navigates to the last page.| -|Alt + Page up | + Page up | Navigates to the previous pager.| -|Alt + Page down | + Page down | Navigates to the next pager.| ## Ensuring accessibility -The Blazor Pager component's accessibility levels are ensured through an [axe-core](https://www.nuget.org/packages/Deque.AxeCore.Playwright) with playwright tests. +The Syncfusion® Blazor Pager component’s accessibility compliance is validated using [axe-core](https://www.nuget.org/packages/Deque.AxeCore.Playwright) integrated with Playwright tests. This automated testing ensures adherence to accessibility standards and identifies potential issues. + +An interactive sample is available to evaluate the component’s accessibility using standard tools: -The accessibility compliance of the Blazor Pager component is shown in the following sample. Open the [sample](https://blazor.syncfusion.com/accessibility/pager) in a new window to evaluate the accessibility of the Blazor Pager component with accessibility tools. +- [Accessibility Evaluation Sample](https://blazor.syncfusion.com/accessibility/pager) ## See also From 8039d50c9b6f06889c78c0420e6beb68070ef6e2 Mon Sep 17 00:00:00 2001 From: SadhanaBaskaran Date: Tue, 18 Nov 2025 11:00:20 +0530 Subject: [PATCH 047/266] 993664: Updated the Behavior settings UG content and samples in Blazor Pager Component --- blazor/pager/behaviour-settings.md | 24 ++++++++++++++++-------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/blazor/pager/behaviour-settings.md b/blazor/pager/behaviour-settings.md index b8ba8bbb1e..eee54d514c 100644 --- a/blazor/pager/behaviour-settings.md +++ b/blazor/pager/behaviour-settings.md @@ -1,7 +1,7 @@ --- layout: post -title: Behaviour Settings in Blazor Pager Component | Syncfusion -description: Checkout here and learn about all the basic functionalities of rendering the Syncfusion Blazor Pager component and much more. +title: Behavior Settings in Blazor Pager Component | Syncfusion +description: Learn how to configure core behavior settings—page size, numeric item count, total item count, and more—in the Syncfusion Blazor Pager component. platform: Blazor control: Pager documentation: ug @@ -9,11 +9,19 @@ documentation: ug # Behaviour Settings in Pager Component -This section briefly explains how the Pager APIS are helped to render the elements (numeric items and navigation buttons) of the Pager component. The total pages of the Pager component is calculated based on the defined [PageSize](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Navigations.SfPager.html#Syncfusion_Blazor_Navigations_SfPager_PageSize) and [TotalItemsCount](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Navigations.SfPager.html#Syncfusion_Blazor_Navigations_SfPager_TotalItemsCount) property. +The Syncfusion® Blazor Pager component includes properties that control its rendering behavior, such as numeric items and navigation buttons. The total number of pages is determined by the values of the [PageSize](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Navigations.SfPager.html#Syncfusion_Blazor_Navigations_SfPager_PageSize) and [TotalItemsCount](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Navigations.SfPager.html#Syncfusion_Blazor_Navigations_SfPager_TotalItemsCount) properties. + +**Core properties of the pager component** + +* [PageSize](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Navigations.SfPager.html#Syncfusion_Blazor_Navigations_SfPager_PageSize) – Specifies the number of items displayed per page. +* [NumericItemsCount](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Navigations.SfPager.html#Syncfusion_Blazor_Navigations_SfPager_NumericItemsCount) – Defines the number of numeric items shown for navigation. +* [TotalItemsCount](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Navigations.SfPager.html#Syncfusion_Blazor_Navigations_SfPager_TotalItemsCount) – Indicates the total number of items in the data collection. +* [CurrentPage](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Navigations.SfPager.html#Syncfusion_Blazor_Navigations_SfPager_CurrentPage) – Sets the page to display initially. +* [ShowPagerMessage](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Navigations.SfPager.html#Syncfusion_Blazor_Navigations_SfPager_ShowPagerMessage) – Controls the visibility of the pager information message. ## Page size -The Pager component provides an option to define the number of items to be displayed per page. This can be achieved by using the [PageSize](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Navigations.SfPager.html#Syncfusion_Blazor_Navigations_SfPager_PageSize) property. The default value of the `PageSize` property is "12." +The Syncfusion® Blazor Pager component provides the [PageSize](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Navigations.SfPager.html#Syncfusion_Blazor_Navigations_SfPager_PageSize) property to define the number of items displayed per page. The default value is **12**. ```csharp @using Syncfusion.Blazor.Navigations @@ -25,7 +33,7 @@ The Pager component provides an option to define the number of items to be displ ## Numeric items count -The Pager component provides an option to define the number of numeric items to be displayed in the Pager for navigation. This can be achieved by using the [NumericItemsCount](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Navigations.SfPager.html#Syncfusion_Blazor_Navigations_SfPager_NumericItemsCount) property. The default value of the `NumericItemsCount` property is "10." +The Syncfusion® Blazor Pager component provides the [NumericItemsCount](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Navigations.SfPager.html#Syncfusion_Blazor_Navigations_SfPager_NumericItemsCount) property to define how many numeric navigation items are displayed in the pager. The default value is **10**. ```csharp @using Syncfusion.Blazor.Navigations @@ -37,7 +45,7 @@ The Pager component provides an option to define the number of numeric items to ## Total items count -The Pager component provides an option to define the total number of items available in the assigned data collection, which is used to render the elements(numeric items, navigation buttons) of Pager component. This can be achieved by using the [TotalItemsCount](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Navigations.SfPager.html#Syncfusion_Blazor_Navigations_SfPager_TotalItemsCount) property of the Pager. +The Syncfusion® Blazor Pager component provides the [TotalItemsCount](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Navigations.SfPager.html#Syncfusion_Blazor_Navigations_SfPager_TotalItemsCount) property to specify the total number of items in the data collection. This value is used to calculate the total number of pages and render numeric items and navigation buttons. ```csharp @using Syncfusion.Blazor.Navigations @@ -49,7 +57,7 @@ The Pager component provides an option to define the total number of items avail ## Current page -Blazor Pager component support to define which page to be displayed currently in the Pager using the [CurrentPage](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Navigations.SfPager.html#Syncfusion_Blazor_Navigations_SfPager_CurrentPage) property. The default value of the `CurrentPage` property is "1". +The Syncfusion® Blazor Pager component provides the [CurrentPage](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Navigations.SfPager.html#Syncfusion_Blazor_Navigations_SfPager_CurrentPage) property to specify which page is displayed initially when the pager is rendered. The default value is **1**. ```csharp @using Syncfusion.Blazor.Navigations @@ -61,7 +69,7 @@ Blazor Pager component support to define which page to be displayed currently in ## Show pager message -The Pager component provides an option to show or hide the Pager information in the Pager container. This can be achieved by using the [ShowPagerMessage](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Navigations.SfPager.html#Syncfusion_Blazor_Navigations_SfPager_ShowPagerMessage) property. The default value of the `ShowPagerMessage` is "true". If you set the `ShowPagerMessage` to false, then the Pager information will be hidden. +The Syncfusion® Blazor Pager component provides the [ShowPagerMessage](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Navigations.SfPager.html#Syncfusion_Blazor_Navigations_SfPager_ShowPagerMessage) property to control the visibility of the pager information message. The default value is **true**. Setting this property to **false** hides the message from the pager container. ```csharp @using Syncfusion.Blazor.Navigations From ee375c01830fdba35e308aac3efdae4840b2db43 Mon Sep 17 00:00:00 2001 From: SadhanaBaskaran Date: Tue, 18 Nov 2025 11:02:48 +0530 Subject: [PATCH 048/266] 993664: Updated the customization UG content and samples in Blazor Pager Component --- blazor/pager/customization.md | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/blazor/pager/customization.md b/blazor/pager/customization.md index 8eac4d12c7..8b3904df83 100644 --- a/blazor/pager/customization.md +++ b/blazor/pager/customization.md @@ -1,7 +1,7 @@ --- layout: post title: Customization in Blazor Pager Component | Syncfusion -description: Checkout here and learn about how to customize the elements of Syncfusion Blazor Pager component and much more. +description: Learn how to customize the Syncfusion Blazor Pager component, including custom text and styling options. platform: Blazor control: Pager documentation: ug @@ -9,26 +9,29 @@ documentation: ug # Customization in Pager Component +The Syncfusion® Blazor Pager component provides options to customize its appearance and behavior. Customization can include modifying numeric item text and applying custom styles through CSS classes. + ## Custom text for numeric items -The Pager component provides an option to define custom text and it is added as a prefix for numeric items. This can be achieved by using the [NumericItemPrefix](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Navigations.SfPager.html#Syncfusion_Blazor_Navigations_SfPager_NumericItemPrefix) property. +The Syncfusion® Blazor Pager component allows adding a custom prefix to numeric items using the [NumericItemPrefix](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Navigations.SfPager.html#Syncfusion_Blazor_Navigations_SfPager_NumericItemPrefix) property. This property accepts a string value that appears before each numeric item in the pager. ```csharp @using Syncfusion.Blazor.Navigations - + ``` ![Blazor Pager with Custom Text](./images/blazor-pager-custom-text.png) -## Custom CSS - -To modify the Pager's appearance, you need to override the default CSS of the Pager. This can be achieved by using the [CssClass](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Navigations.SfPager.html#Syncfusion_Blazor_Navigations_SfPager_CssClass) property. +## Apply custom CSS -In the following sample, the value for the `CssClass` property is set as custom CSS, and this root class is used to customize the Pager appearance. +The Syncfusion® Blazor Pager component supports customizing its appearance by applying custom CSS classes. This customization is enabled through the [CssClass](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Navigations.SfPager.html#Syncfusion_Blazor_Navigations_SfPager_CssClass) property. Assign a class name to this property and define the required styles in the CSS file. ```csharp From 0e07e954154101aafe1e6b3dabbb3d35e55cf9fb Mon Sep 17 00:00:00 2001 From: SadhanaBaskaran Date: Tue, 18 Nov 2025 11:20:17 +0530 Subject: [PATCH 049/266] 993664: Updated the Data Binding UG content and samples in Blazor Pager Component --- blazor/pager/data-binding.md | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/blazor/pager/data-binding.md b/blazor/pager/data-binding.md index c5d19cb4a7..7a68fc62f1 100644 --- a/blazor/pager/data-binding.md +++ b/blazor/pager/data-binding.md @@ -1,7 +1,7 @@ --- layout: post title: Data Binding in Blazor Pager Component | Syncfusion -description: Checkout and learn here all about working Syncfusion Blazor Pager component with both local or remote data collection and how it splits into sectioned pages. +description: Learn how the Syncfusion Blazor Pager component segments local or remote data collections into paged views. platform: Blazor control: Pager documentation: ug @@ -9,11 +9,16 @@ documentation: ug # Data Binding in Blazor Pager Component -## Local Data +The Syncfusion® Blazor Pager component divides **local** or **remote** data collections into paged views. It provides navigation controls to manage large datasets efficiently. -The Blazor Pager component has an option to split the collection of data sets (local data) into sectioned pages. +**When to Use:** -In the following sample, initially list view items are displayed per page based on the Pager's PageSize property. While navigating the numeric items in the Pager, the `ItemClick` event will be triggered. In the `ItemClick` event of the Pager, we have calculated the number of items displayed per page in the ListView component. Here, items in the ListView component are loaded from local data collection. +- Use **Local Data** for **small**, **static** collections that can be loaded in memory. +- Use **Remote Data** for **large** or **dynamic** datasets that require server-side operations. + +## Local Data Binding + +The Syncfusion® Blazor Pager component can segment an in-memory data collection into multiple pages. The [PageSize](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Navigations.SfPager.html#Syncfusion_Blazor_Navigations_SfPager_PageSize) property defines the number of items displayed per page. The [ItemClick](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Navigations.SfPager.html#Syncfusion_Blazor_Navigations_SfPager_ItemClick) event updates the displayed subset when navigating between pages. ```csharp @using Syncfusion.Blazor.Data @@ -92,11 +97,9 @@ In the following sample, initially list view items are displayed per page based ``` -## Remote Data - -The Blazor Pager component has an option to split the collection of data sets (remote data) into sectioned pages. +## Remote Data Binding -In the following sample, initially list view items are displayed per page based on the Pager's PageSize property. While navigating the numeric items in the Pager, the `ItemClick` event will be triggered. In the `ItemClick` event of the Pager, we have calculated the number of items displayed per page in the ListView component. Here, items in the ListView component are loaded from the remote data services. +The Syncfusion® Blazor Pager component supports paging for data retrieved from remote services. The [SfDataManager](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Data.SfDataManager.html) component manages remote operations such as **querying**, **filtering**, and **paging**. The [PageSize](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Navigations.SfPager.html#Syncfusion_Blazor_Navigations_SfPager_PageSize) property specifies the number of items displayed per page. The [ItemClick](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Navigations.SfPager.html#Syncfusion_Blazor_Navigations_SfPager_ItemClick) event updates query parameters to fetch the correct subset of data. ```csharp @using Syncfusion.Blazor.Lists From aa54e61ce0f6baa56a99db7dfa265e3da54c26d7 Mon Sep 17 00:00:00 2001 From: SadhanaBaskaran Date: Tue, 18 Nov 2025 12:00:14 +0530 Subject: [PATCH 050/266] 993664: Updated the UG content and samples in Blazor Pager Component --- blazor-toc.html | 2 +- ...viour-settings.md => behavior-settings.md} | 4 +- blazor/pager/navigation.md | 204 ++++++++++++++++-- 3 files changed, 195 insertions(+), 15 deletions(-) rename blazor/pager/{behaviour-settings.md => behavior-settings.md} (95%) diff --git a/blazor-toc.html b/blazor-toc.html index 349588459f..3cc48bce1e 100644 --- a/blazor-toc.html +++ b/blazor-toc.html @@ -3745,7 +3745,7 @@ Data Binding
  • - Behaviour Settings + Behavior Settings
  • Pager with Dropdown diff --git a/blazor/pager/behaviour-settings.md b/blazor/pager/behavior-settings.md similarity index 95% rename from blazor/pager/behaviour-settings.md rename to blazor/pager/behavior-settings.md index eee54d514c..ec2fb97bff 100644 --- a/blazor/pager/behaviour-settings.md +++ b/blazor/pager/behavior-settings.md @@ -1,13 +1,13 @@ --- layout: post title: Behavior Settings in Blazor Pager Component | Syncfusion -description: Learn how to configure core behavior settings—page size, numeric item count, total item count, and more—in the Syncfusion Blazor Pager component. +description: Learn how to configure core behavior settings page size, numeric item count, total item count, and more in the Syncfusion Blazor Pager component. platform: Blazor control: Pager documentation: ug --- -# Behaviour Settings in Pager Component +# Behavior Settings in Pager Component The Syncfusion® Blazor Pager component includes properties that control its rendering behavior, such as numeric items and navigation buttons. The total number of pages is determined by the values of the [PageSize](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Navigations.SfPager.html#Syncfusion_Blazor_Navigations_SfPager_PageSize) and [TotalItemsCount](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Navigations.SfPager.html#Syncfusion_Blazor_Navigations_SfPager_TotalItemsCount) properties. diff --git a/blazor/pager/navigation.md b/blazor/pager/navigation.md index ad3e0d418d..0be2f4ee9b 100644 --- a/blazor/pager/navigation.md +++ b/blazor/pager/navigation.md @@ -9,15 +9,195 @@ documentation: ug # Navigation in Pager Component -The following methods are available in the Pager component for performing Pager actions externally. - -| Method | Description | -|----------------------| -----------------------------------------| -| GoToPageAsync | This method navigates the target page by the given number in the argument.| -| GoToLastPageAsync | This method navigates to the last page of the pager component. | -| GoToFirstPageAsync | This method navigates to the first page of the pager component. | -| GoToNextPageAsync | This method navigates to the next page of the pager component. | -| GoToPreviousPageAsync | This method navigates to the previous page of the pager component. | -| UpdatePageSizeAsync | This method updates the page size of the Pager. | -| UpdateNumericItemsCountAsync | This method updates the numeric item count of the Pager. | -| RefreshAsync | This method applies all the property changes and renders the component again. | \ No newline at end of file +The Syncfusion® Blazor Pager component provides built-in methods for programmatically controlling navigation and updating pager settings. These methods allow external actions such as navigating to specific pages, moving to the first or last page, updating page size, and refreshing the component. Each method can be invoked asynchronously to ensure smooth interaction within Blazor applications. + +## Navigate to a Specific Page + +The [GoToPageAsync](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Navigations.SfPager.html#Syncfusion_Blazor_Navigations_SfPager_GoToPageAsync_System_Int32_) method navigates to the specified page number. + +| Parameter | Type | Description | +|------------|------|---------------------------------| +| pageNo | int | Indicates the page number to navigate.| + + +```cshtml +@using Syncfusion.Blazor.Navigations +@using Syncfusion.Blazor.Buttons + + +Go to Page 5 + +@code +{ + private SfPager? pager; + + private async Task NavigateToPage() + { + await pager?.GoToPageAsync(5); + } +} +``` + +## Navigate to the Last Page + +The [GoToLastPageAsync](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Navigations.SfPager.html#Syncfusion_Blazor_Navigations_SfPager_GoToLastPageAsync) method navigates to the last page of the Pager component. + +```cshtml +@using Syncfusion.Blazor.Navigations +@using Syncfusion.Blazor.Buttons + + +Go to Last Page + +@code +{ + + private SfPager? pager; + + private async Task NavigateToLastPage() + { + await pager?.GoToLastPageAsync(); + } +} +``` + +## Navigate to the First Page + +The [GoToFirstPageAsync](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Navigations.SfPager.html#Syncfusion_Blazor_Navigations_SfPager_GoToFirstPageAsync) method navigates to the first page of the Pager component. + +```cshtml +@using Syncfusion.Blazor.Navigations +@using Syncfusion.Blazor.Buttons + + +Go to First Page + +@code +{ + + private SfPager? pager; + + private async Task NavigateToFirstPage() + { + await pager?.GoToFirstPageAsync(); + } +} +``` + +## Navigate to the Next Page + +The [GoToNextPageAsync](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Navigations.SfPager.html#Syncfusion_Blazor_Navigations_SfPager_GoToNextPageAsync) method navigates to the next page of the Pager component. + +```cshtml +@using Syncfusion.Blazor.Navigations +@using Syncfusion.Blazor.Buttons + + +Go to Next Page + +@code +{ + private SfPager? pager; + + private async Task NavigateToNextPage() + { + await pager?.GoToNextPageAsync(); + } +} +``` + +## Navigate to the Previous Page + +The [GoToPreviousPageAsync](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Navigations.SfPager.html#Syncfusion_Blazor_Navigations_SfPager_GoToPreviousPageAsync) method navigates to the previous page of the Pager component. + +```cshtml +@using Syncfusion.Blazor.Navigations +@using Syncfusion.Blazor.Buttons + + +Go to Previous Page + +@code +{ + private SfPager? pager; + + private async Task NavigateToPreviousPage() + { + await pager?.GoToPreviousPageAsync(); + } +} +``` + +## Update Page Size + +The [UpdatePageSizeAsync](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Navigations.SfPager.html#Syncfusion_Blazor_Navigations_SfPager_UpdatePageSizeAsync_System_Int32_) method updates the page size of the Pager component. + +| Parameter | Type | Description | +|-----------|------|------------------------------| +| pageSize | int | The number of items to be shown on a page. | + +```cshtml +@using Syncfusion.Blazor.Navigations +@using Syncfusion.Blazor.Buttons + + +Set Page Size to 20 + +@code +{ + private SfPager? pager; + + private async Task UpdatePageSize() + { + await pager?.UpdatePageSizeAsync(20); + } +} +``` + +## Update Numeric Items Count + +The [UpdateNumericItemsCountAsync](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Navigations.SfPager.html#Syncfusion_Blazor_Navigations_SfPager_UpdateNumericItemsCountAsync_System_Int32_) method updates the numeric item count displayed in the Pager. + +| Parameter | Type | Description | +|-------------------|------|--------------------------------------------| +| numericItemsCount | int | The number of numeric items to display. | + +```cshtml +@using Syncfusion.Blazor.Navigations +@using Syncfusion.Blazor.Buttons + + +Set Numeric Items to 5 + +@code +{ + private SfPager? pager; + + private async Task UpdateNumericItemsCount() + { + await pager?.UpdateNumericItemsCountAsync(5); + } +} +``` + +## Refresh Pager + +The [RefreshAsync](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Navigations.SfPager.html#Syncfusion_Blazor_Navigations_SfPager_RefreshAsync) method applies all property changes and re-renders the Pager component. + +```cshtml +@using Syncfusion.Blazor.Navigations +@using Syncfusion.Blazor.Buttons + + +Refresh Pager + +@code +{ + private SfPager? pager; + + private async Task RefreshPager() + { + await pager?.RefreshAsync(); + } +} +``` \ No newline at end of file From f5571b0c2aaaea456745c12c9a312db90ab919d8 Mon Sep 17 00:00:00 2001 From: SadhanaBaskaran Date: Tue, 18 Nov 2025 12:02:44 +0530 Subject: [PATCH 051/266] 993664: Updated the UG content and samples for Blazor Pager Component --- blazor/pager/behaviour-settings.md | 82 ++++++++++++++++++++++++++++++ 1 file changed, 82 insertions(+) create mode 100644 blazor/pager/behaviour-settings.md diff --git a/blazor/pager/behaviour-settings.md b/blazor/pager/behaviour-settings.md new file mode 100644 index 0000000000..ec2fb97bff --- /dev/null +++ b/blazor/pager/behaviour-settings.md @@ -0,0 +1,82 @@ +--- +layout: post +title: Behavior Settings in Blazor Pager Component | Syncfusion +description: Learn how to configure core behavior settings page size, numeric item count, total item count, and more in the Syncfusion Blazor Pager component. +platform: Blazor +control: Pager +documentation: ug +--- + +# Behavior Settings in Pager Component + +The Syncfusion® Blazor Pager component includes properties that control its rendering behavior, such as numeric items and navigation buttons. The total number of pages is determined by the values of the [PageSize](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Navigations.SfPager.html#Syncfusion_Blazor_Navigations_SfPager_PageSize) and [TotalItemsCount](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Navigations.SfPager.html#Syncfusion_Blazor_Navigations_SfPager_TotalItemsCount) properties. + +**Core properties of the pager component** + +* [PageSize](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Navigations.SfPager.html#Syncfusion_Blazor_Navigations_SfPager_PageSize) – Specifies the number of items displayed per page. +* [NumericItemsCount](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Navigations.SfPager.html#Syncfusion_Blazor_Navigations_SfPager_NumericItemsCount) – Defines the number of numeric items shown for navigation. +* [TotalItemsCount](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Navigations.SfPager.html#Syncfusion_Blazor_Navigations_SfPager_TotalItemsCount) – Indicates the total number of items in the data collection. +* [CurrentPage](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Navigations.SfPager.html#Syncfusion_Blazor_Navigations_SfPager_CurrentPage) – Sets the page to display initially. +* [ShowPagerMessage](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Navigations.SfPager.html#Syncfusion_Blazor_Navigations_SfPager_ShowPagerMessage) – Controls the visibility of the pager information message. + +## Page size + +The Syncfusion® Blazor Pager component provides the [PageSize](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Navigations.SfPager.html#Syncfusion_Blazor_Navigations_SfPager_PageSize) property to define the number of items displayed per page. The default value is **12**. + +```csharp +@using Syncfusion.Blazor.Navigations + + + + +``` + +## Numeric items count + +The Syncfusion® Blazor Pager component provides the [NumericItemsCount](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Navigations.SfPager.html#Syncfusion_Blazor_Navigations_SfPager_NumericItemsCount) property to define how many numeric navigation items are displayed in the pager. The default value is **10**. + +```csharp +@using Syncfusion.Blazor.Navigations + + + + +``` + +## Total items count + +The Syncfusion® Blazor Pager component provides the [TotalItemsCount](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Navigations.SfPager.html#Syncfusion_Blazor_Navigations_SfPager_TotalItemsCount) property to specify the total number of items in the data collection. This value is used to calculate the total number of pages and render numeric items and navigation buttons. + +```csharp +@using Syncfusion.Blazor.Navigations + + + + +``` + +## Current page + +The Syncfusion® Blazor Pager component provides the [CurrentPage](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Navigations.SfPager.html#Syncfusion_Blazor_Navigations_SfPager_CurrentPage) property to specify which page is displayed initially when the pager is rendered. The default value is **1**. + +```csharp +@using Syncfusion.Blazor.Navigations + + + + +``` + +## Show pager message + +The Syncfusion® Blazor Pager component provides the [ShowPagerMessage](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Navigations.SfPager.html#Syncfusion_Blazor_Navigations_SfPager_ShowPagerMessage) property to control the visibility of the pager information message. The default value is **true**. Setting this property to **false** hides the message from the pager container. + +```csharp +@using Syncfusion.Blazor.Navigations + + + + +``` + +![Show Blazor Pager Message](./images/blazor-pager-message.png) From 8d8cdbbbe85a09ad0c4edd9d5d54ae4f89336974 Mon Sep 17 00:00:00 2001 From: SadhanaBaskaran Date: Tue, 18 Nov 2025 12:04:59 +0530 Subject: [PATCH 052/266] 993664: Updated the UG content and samples for Blazor Pager Component --- blazor/pager/behaviour-settings.md | 82 ------------------------------ 1 file changed, 82 deletions(-) delete mode 100644 blazor/pager/behaviour-settings.md diff --git a/blazor/pager/behaviour-settings.md b/blazor/pager/behaviour-settings.md deleted file mode 100644 index ec2fb97bff..0000000000 --- a/blazor/pager/behaviour-settings.md +++ /dev/null @@ -1,82 +0,0 @@ ---- -layout: post -title: Behavior Settings in Blazor Pager Component | Syncfusion -description: Learn how to configure core behavior settings page size, numeric item count, total item count, and more in the Syncfusion Blazor Pager component. -platform: Blazor -control: Pager -documentation: ug ---- - -# Behavior Settings in Pager Component - -The Syncfusion® Blazor Pager component includes properties that control its rendering behavior, such as numeric items and navigation buttons. The total number of pages is determined by the values of the [PageSize](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Navigations.SfPager.html#Syncfusion_Blazor_Navigations_SfPager_PageSize) and [TotalItemsCount](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Navigations.SfPager.html#Syncfusion_Blazor_Navigations_SfPager_TotalItemsCount) properties. - -**Core properties of the pager component** - -* [PageSize](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Navigations.SfPager.html#Syncfusion_Blazor_Navigations_SfPager_PageSize) – Specifies the number of items displayed per page. -* [NumericItemsCount](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Navigations.SfPager.html#Syncfusion_Blazor_Navigations_SfPager_NumericItemsCount) – Defines the number of numeric items shown for navigation. -* [TotalItemsCount](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Navigations.SfPager.html#Syncfusion_Blazor_Navigations_SfPager_TotalItemsCount) – Indicates the total number of items in the data collection. -* [CurrentPage](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Navigations.SfPager.html#Syncfusion_Blazor_Navigations_SfPager_CurrentPage) – Sets the page to display initially. -* [ShowPagerMessage](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Navigations.SfPager.html#Syncfusion_Blazor_Navigations_SfPager_ShowPagerMessage) – Controls the visibility of the pager information message. - -## Page size - -The Syncfusion® Blazor Pager component provides the [PageSize](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Navigations.SfPager.html#Syncfusion_Blazor_Navigations_SfPager_PageSize) property to define the number of items displayed per page. The default value is **12**. - -```csharp -@using Syncfusion.Blazor.Navigations - - - - -``` - -## Numeric items count - -The Syncfusion® Blazor Pager component provides the [NumericItemsCount](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Navigations.SfPager.html#Syncfusion_Blazor_Navigations_SfPager_NumericItemsCount) property to define how many numeric navigation items are displayed in the pager. The default value is **10**. - -```csharp -@using Syncfusion.Blazor.Navigations - - - - -``` - -## Total items count - -The Syncfusion® Blazor Pager component provides the [TotalItemsCount](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Navigations.SfPager.html#Syncfusion_Blazor_Navigations_SfPager_TotalItemsCount) property to specify the total number of items in the data collection. This value is used to calculate the total number of pages and render numeric items and navigation buttons. - -```csharp -@using Syncfusion.Blazor.Navigations - - - - -``` - -## Current page - -The Syncfusion® Blazor Pager component provides the [CurrentPage](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Navigations.SfPager.html#Syncfusion_Blazor_Navigations_SfPager_CurrentPage) property to specify which page is displayed initially when the pager is rendered. The default value is **1**. - -```csharp -@using Syncfusion.Blazor.Navigations - - - - -``` - -## Show pager message - -The Syncfusion® Blazor Pager component provides the [ShowPagerMessage](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Navigations.SfPager.html#Syncfusion_Blazor_Navigations_SfPager_ShowPagerMessage) property to control the visibility of the pager information message. The default value is **true**. Setting this property to **false** hides the message from the pager container. - -```csharp -@using Syncfusion.Blazor.Navigations - - - - -``` - -![Show Blazor Pager Message](./images/blazor-pager-message.png) From 0dfedbfeff644215fc17d86f16798bc8ea8bcf0b Mon Sep 17 00:00:00 2001 From: SadhanaBaskaran Date: Tue, 18 Nov 2025 12:10:33 +0530 Subject: [PATCH 053/266] 993664: Updated the Pager Drop-down UG content and samples in Blazor Pager Component --- blazor/pager/pager-with-drop-down.md | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/blazor/pager/pager-with-drop-down.md b/blazor/pager/pager-with-drop-down.md index 4eabe2dc92..e3e82e5fa3 100644 --- a/blazor/pager/pager-with-drop-down.md +++ b/blazor/pager/pager-with-drop-down.md @@ -1,7 +1,7 @@ --- layout: post -title: Pager with Dropdown in Blazor Pager Component | Syncfusion -description: Checkout and learn here all about how to render the Syncfusion Blazor Pager component with dropdown and much more. +title: Configure a Page-Size Dropdown in the Blazor Pager Component | Syncfusion +description: Learn how to enable page-size selection with a dropdown in the Syncfusion Blazor Pager component. platform: Blazor control: Pager documentation: ug @@ -10,11 +10,15 @@ documentation: ug # Pager Component with Dropdown +The Syncfusion® Blazor Pager component provides navigation for paginated data and supports dynamic page size selection through a dropdown list. This feature allows adjusting the number of items displayed per page without reloading the entire view, improving flexibility and enhancing the experience in applications with large datasets. + ## Page size list -The Pager component provides an option to change the number of items dynamically using a dropdown list. This can be achieved by using the [PageSizes](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Navigations.SfPager.html#Syncfusion_Blazor_Navigations_SfPager_PageSizes) property of the Pager.  +The Syncfusion® Blazor Pager component supports dynamic page size selection through a dropdown list. This is configured using the [PageSizes](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Navigations.SfPager.html#Syncfusion_Blazor_Navigations_SfPager_PageSizes) property. When a value is selected from the dropdown, it updates the [PageSize](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Navigations.SfPager.html#Syncfusion_Blazor_Navigations_SfPager_PageSize) property, and the Pager refreshes to display the specified number of items per page. + +The [ShowAllInPageSizes](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Navigations.SfPager.html#Syncfusion_Blazor_Navigations_SfPager_ShowAllInPageSizes) property adds an **All** option to the dropdown list. When `ShowAllInPageSizes` is set to **true**, selecting this option displays all items in a single page, bypassing pagination. -In the following sample, the selected value in a dropdown will be set to the [PageSize](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Navigations.SfPager.html#Syncfusion_Blazor_Navigations_SfPager_PageSize) property, and the Pager will refresh based on this new page size. +Values for the `PageSizes` property must be provided as a collection of integers representing the available page size options. ```csharp @using Syncfusion.Blazor.Navigations From 8a9f4b3f47baa7713b8c78f87d13a908608aaabb Mon Sep 17 00:00:00 2001 From: SadhanaBaskaran Date: Tue, 18 Nov 2025 12:12:07 +0530 Subject: [PATCH 054/266] 993664: Updated the Responsive-Layout UG content and samples in Blazor Pager Component --- blazor/pager/responsive-layout.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/blazor/pager/responsive-layout.md b/blazor/pager/responsive-layout.md index a3fdee1e23..b79df5e02e 100644 --- a/blazor/pager/responsive-layout.md +++ b/blazor/pager/responsive-layout.md @@ -9,8 +9,10 @@ documentation: ug # Responsive Layout in Pager Component +The Syncfusion® Blazor Pager component includes built-in responsive capabilities that automatically adapt its inner elements to the available viewport size. This behavior maintains optimal readability and usability on **mobile devices**, **tablets**, and **desktop monitors** without additional configuration. + ## Responsive -The Pager component has responsive support such that component also fit with mobile resolutions. While resizing the browser window, the inner elements in the Pager component will adjust automatically to equalize the size. +When the browser window is resized or when the page loads on a device with a different resolution, the component recalculates and adjusts element sizes to maintain a balanced layout. ![Blazor Pager with Responsive](./images/blazor-pager-responsive-layout.png) \ No newline at end of file From a9b3733a48a20f7fa6208b42d8284600dd77974a Mon Sep 17 00:00:00 2001 From: SadhanaBaskaran Date: Tue, 18 Nov 2025 12:32:13 +0530 Subject: [PATCH 055/266] 993664: Updated the UG content and samples for Blazor Pager Component --- blazor/pager/pager-with-drop-down.md | 4 +- blazor/pager/template.md | 208 ++++++++++++--------------- 2 files changed, 90 insertions(+), 122 deletions(-) diff --git a/blazor/pager/pager-with-drop-down.md b/blazor/pager/pager-with-drop-down.md index e3e82e5fa3..8186ae2c7b 100644 --- a/blazor/pager/pager-with-drop-down.md +++ b/blazor/pager/pager-with-drop-down.md @@ -1,7 +1,7 @@ --- layout: post -title: Configure a Page-Size Dropdown in the Blazor Pager Component | Syncfusion -description: Learn how to enable page-size selection with a dropdown in the Syncfusion Blazor Pager component. +title: Configure Page-Size Dropdown in Blazor Pager Component | Syncfusion +description: Learn how to configure a page-size dropdown in the Syncfusion Blazor Pager component for flexible pagination and improved navigation. platform: Blazor control: Pager documentation: ug diff --git a/blazor/pager/template.md b/blazor/pager/template.md index ec60572c7e..abc76d6d14 100644 --- a/blazor/pager/template.md +++ b/blazor/pager/template.md @@ -1,7 +1,7 @@ --- layout: post title: Pager with Template in Blazor Pager Component | Syncfusion -description: Checkout and learn here all about how to render a custom element in the Syncfusion Blazor Pager component and much more. +description: Learn how to render custom elements using the Template property in the Syncfusion Blazor Pager component. platform: Blazor control: Pager documentation: ug @@ -9,9 +9,9 @@ documentation: ug # Pager Component with Template -The Pager component provides an option to render a custom element or content in the Pager. This can be achieved by using the [Template](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Navigations.SfPager.html#Syncfusion_Blazor_Navigations_SfPager_Template) property of the Pager.  +The Syncfusion® Blazor Pager component divides large data collections into manageable pages and provides built-in navigation controls. The [Template](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Navigations.SfPager.html#Syncfusion_Blazor_Navigations_SfPager_Template) property extends this functionality by allowing any Blazor content such as **buttons**, **hyperlinks**, or **drop-down lists** to be rendered inside the pager area, enabling fully customized paging experiences that align with application requirements and design guidelines. -In this following sample, we have rendered two anchor tags for navigating next and previous pages. And the pager info detail is displayed in between those two anchor tags. The anchor tags will be disabled based on the current page number using Pager APIs. +This configuration renders two **anchor** elements for navigating to **previous** and **next** pages, with page information displayed between them. Navigation elements are dynamically enabled or disabled based on the current page using Pager APIs. ```cshtml @using Syncfusion.Blazor.Data @@ -20,129 +20,124 @@ In this following sample, we have rendered two anchor tags for navigating next a @using Syncfusion.Blazor.DropDowns @using Syncfusion.Blazor.Buttons -
    - +
    + - - - - - + + + + + - + +
    -@code -{ - public List Orders { get; set; } - public SfGrid Grid { get; set; } - public SfPager Pager { get; set; } - private bool BackButtonDisabled { get; set; } = true; - private bool ForwardButtonDisabled { get; set; } - private Query QueryData = new Syncfusion.Blazor.Data.Query().Skip(0).Take(10); - public int ddlIndex { get; set; } = 0; + - private async Task ValueChangeHandler(ChangeEventArgs args) +@code { + private SfGrid? grid; + private SfPager? pager; + private bool backButtonDisabled = true; + private bool forwardButtonDisabled; + private Query queryData = new Query().Skip(0).Take(10); + private int ddlIndex = 0; + + public List Orders { get; set; } = new(); + private List dropdownDataSource = new() { - var currentPage = args.Value -1; - int skipValue = (currentPage * Pager.PageSize); - int takeValue = Pager.PageSize; - QueryData = new Query().Skip(skipValue).Take(takeValue); - ddlIndex = currentPage; - int totalPages = (int)(Math.Ceiling((double)(Pager.TotalItemsCount / Pager.PageSize))); - if (args.Value == totalPages) - { - ForwardButtonDisabled = true; - BackButtonDisabled = false; - } - else if (args.Value == 1) - { - ForwardButtonDisabled = false; - BackButtonDisabled = true; - } - else - { - ForwardButtonDisabled = false; - BackButtonDisabled = false; - } - await Task.Yield(); - await Grid.Refresh(); - await Pager.GoToPageAsync(args.Value); - } + new TemplateDropdown() { Paging = 1 }, + new TemplateDropdown() { Paging = 2 }, + new TemplateDropdown() { Paging = 3 }, + new TemplateDropdown() { Paging = 4 }, + new TemplateDropdown() { Paging = 5 }, + new TemplateDropdown() { Paging = 6 }, + new TemplateDropdown() { Paging = 7 }, + new TemplateDropdown() { Paging = 8 } + }; - public string EnablePreviousButton() + protected override void OnInitialized() { - string classNames = BackButtonDisabled ? "e-disabled disable-pointer" : "enable-pointer"; - return classNames; + Orders = Enumerable.Range(1, 80).Select(x => new Order() + { + OrderID = 1000 + x, + CustomerID = new[] { "ALFKI", "ANANTR", "ANTON", "BLONP", "BOLID" }[new Random().Next(5)], + Freight = 2.1 * x, + OrderDate = DateTime.Now.AddDays(-x), + ShippedDate = DateTime.Now.AddDays(x) + }).ToList(); } - public string EnableNextButton() + private async Task ValueChangeHandler(ChangeEventArgs args) { - string classNames = ForwardButtonDisabled ? "e-disabled e-disable disable-pointer" : "enable-pointer"; - return classNames; + var currentPage = args.Value - 1; + int skipValue = currentPage * (pager?.PageSize ?? 10); + int takeValue = pager?.PageSize ?? 10; + queryData = new Query().Skip(skipValue).Take(takeValue); + ddlIndex = currentPage; + + int totalPages = (int)Math.Ceiling((double)(pager?.TotalItemsCount ?? 80) / (pager?.PageSize ?? 10)); + forwardButtonDisabled = args.Value == totalPages; + backButtonDisabled = args.Value == 1; + + await grid?.Refresh(); + await pager?.GoToPageAsync(args.Value); } - public async Task NavigatePreviousPage() + private string EnablePreviousButton() => backButtonDisabled ? "e-disabled disable-pointer" : "enable-pointer"; + private string EnableNextButton() => forwardButtonDisabled ? "e-disabled disable-pointer" : "enable-pointer"; + + private async Task NavigatePreviousPage() { - ForwardButtonDisabled = ForwardButtonDisabled ? false : ForwardButtonDisabled; - BackButtonDisabled = Pager.CurrentPage == 2 ? true : false; - int skipValue = (Pager.CurrentPage * Pager.PageSize) - (Pager.PageSize * 2); - int takeValue = Pager.PageSize; - QueryData = new Query().Skip(skipValue).Take(takeValue); + backButtonDisabled = pager?.CurrentPage == 2; + forwardButtonDisabled = false; + int skipValue = ((pager?.CurrentPage ?? 2) * (pager?.PageSize ?? 10)) - ((pager?.PageSize ?? 10) * 2); + queryData = new Query().Skip(skipValue).Take(pager?.PageSize ?? 10); ddlIndex--; - await Grid.Refresh(); - await Pager.GoToPreviousPageAsync(); + await grid?.Refresh(); + await pager?.GoToPreviousPageAsync(); } - public async Task NavigateNextPage() + private async Task NavigateNextPage() { - BackButtonDisabled = BackButtonDisabled ? false : BackButtonDisabled; - int totalPages = (int)(Math.Ceiling((double)(Pager.TotalItemsCount / Pager.PageSize))); - ForwardButtonDisabled = Pager.CurrentPage == totalPages - 1 ? true : false; - int skipValue = (Pager.CurrentPage * Pager.PageSize); - int takeValue = Pager.PageSize; - QueryData = new Query().Skip(skipValue).Take(takeValue); + backButtonDisabled = false; + int totalPages = (int)Math.Ceiling((double)(pager?.TotalItemsCount ?? 80) / (pager?.PageSize ?? 10)); + forwardButtonDisabled = pager?.CurrentPage == totalPages - 1; + int skipValue = (pager?.CurrentPage ?? 1) * (pager?.PageSize ?? 10); + queryData = new Query().Skip(skipValue).Take(pager?.PageSize ?? 10); ddlIndex++; - await Grid.Refresh(); - await Pager.GoToNextPageAsync(); - } - - protected override void OnInitialized() - { - Orders = Enumerable.Range(1, 80).Select(x => new Order() - { - OrderID = 1000 + x, - CustomerID = (new string[] { "ALFKI", "ANANTR", "ANTON", "BLONP", "BOLID" })[new Random().Next(5)], - Freight = 2.1 * x, - OrderDate = DateTime.Now.AddDays(-x), - ShippedDate = DateTime.Now.AddDays(x), - }).ToList(); - + await grid?.Refresh(); + await pager?.GoToNextPageAsync(); } - public class Order + public class Order { public int? OrderID { get; set; } public string CustomerID { get; set; } @@ -150,39 +145,12 @@ In this following sample, we have rendered two anchor tags for navigating next a public double? Freight { get; set; } public DateTime? ShippedDate { get; set; } } + public class TemplateDropdown { public int Paging { get; set; } } - List DropdownDataSource = new List - { - new TemplateDropdown() { Paging = 1}, - new TemplateDropdown() { Paging = 2}, - new TemplateDropdown() { Paging = 3}, - new TemplateDropdown() { Paging = 4}, - new TemplateDropdown() { Paging = 5}, - new TemplateDropdown() { Paging = 6}, - new TemplateDropdown() { Paging = 7}, - new TemplateDropdown() { Paging = 8} - }; } - - ``` ![Blazor Pager with Template](./images/blazor-pager-with-template.gif) \ No newline at end of file From d64bca03ebd1062c510a8bcd10f398739aee0d33 Mon Sep 17 00:00:00 2001 From: SadhanaBaskaran Date: Tue, 18 Nov 2025 13:02:39 +0530 Subject: [PATCH 056/266] 993664: Updated the UG content and samples for Blazor Pager Component --- blazor/pager/globalization.md | 26 +++++++++++++++++++++----- 1 file changed, 21 insertions(+), 5 deletions(-) diff --git a/blazor/pager/globalization.md b/blazor/pager/globalization.md index 03da1be2d9..b66cd1df74 100644 --- a/blazor/pager/globalization.md +++ b/blazor/pager/globalization.md @@ -1,7 +1,7 @@ --- layout: post title: Globalization in Blazor Pager Component | Syncfusion -description: Checkout and learn here all about globalization and RTL in Syncfusion Blazor Pager component and much more details. +description: Learn how to configure localization and right-to-left (RTL) rendering in the Syncfusion Blazor Pager component. platform: Blazor control: Pager documentation: ug @@ -9,16 +9,32 @@ documentation: ug # Globalization in Blazor Pager Component +This article explains how to **localize** the Syncfusion® Blazor Pager component and how to enable **right-to-left (RTL)** rendering. + ## Localization -Blazor Pager component can be localized. Refer to [Blazor Localization](https://blazor.syncfusion.com/documentation/common/localization) topic to localize Syncfusion® Blazor components. +The Syncfusion® Blazor Pager component supports localization, allowing text and UI elements to adapt to various languages and cultural formats. + +> Refer to the [Blazor Localization](https://blazor.syncfusion.com/documentation/common/localization) guide for detailed configuration steps. ## Right to left (RTL) -RTL provides an option to switch the text direction and layout of the Pager component from right to left. It improves the user experiences and accessibility for users who use right-to-left languages (Arabic, Farsi, Urdu, etc.). In the following sample, [EnableRtl](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Navigations.SfPager.html#Syncfusion_Blazor_Navigations_SfPager_EnableRtl) property is used to enable RTL in the Pager. +The Syncfusion® Blazor Pager component supports right-to-left (RTL) rendering for languages such as **Arabic**, **Farsi**, and **Urdu**. **RTL** can be enabled by configuring the **Syncfusion Blazor service** during application startup. + +**Register the `EnableRtl` option in Program.cs**: + +{% tabs %} +{% highlight C# tabtitle="~/_Program.cs" %} + +builder.Services.AddSyncfusionBlazor(options => { options.EnableRtl = true; }); + +{% endhighlight %} +{% endtabs %} ```cshtml @using Syncfusion.Blazor.Navigations - -``` \ No newline at end of file + +``` + +> For more details, refer to the [Right-to-Left](https://blazor.syncfusion.com/documentation/common/right-to-left) guide for detailed configuration steps. \ No newline at end of file From 85f23e009ea178134b16e277377906a3564d28fd Mon Sep 17 00:00:00 2001 From: Backiaraj Date: Tue, 18 Nov 2025 16:10:38 +0530 Subject: [PATCH 057/266] Updated code snippet syntax --- .../ai-samples/kanban/smart-task-suggestion.md | 8 ++++---- .../ai-samples/rich-text-editor/writting-assistance.md | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/blazor/smart-ai-solutions/ai-samples/kanban/smart-task-suggestion.md b/blazor/smart-ai-solutions/ai-samples/kanban/smart-task-suggestion.md index a4ad47896a..3ed120de4d 100644 --- a/blazor/smart-ai-solutions/ai-samples/kanban/smart-task-suggestion.md +++ b/blazor/smart-ai-solutions/ai-samples/kanban/smart-task-suggestion.md @@ -241,7 +241,7 @@ The Kanban AI interface starts with a simple form where users provide **Project - **Generate Button:** A progress-enabled button that calls `GenerateTasks()` to start AI-based task creation. {% tabs %} -{% highlight %} +{% highlight razor %}
    @@ -320,7 +320,7 @@ The Kanban board uses `SfKanban` to organize tasks into columns like **To Do**, - **Dynamic Binding:** The [DataSource](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Kanban.SfKanban-1.html#Syncfusion_Blazor_Kanban_SfKanban_1_DataSource) property binds to `smartSuggestion`, ensuring that newly generated tasks appear instantly. {% tabs %} -{% highlight %} +{% highlight razor %} @@ -365,7 +365,7 @@ When users switch to **Backlog View**, tasks are displayed in a grid using `SfGr - **Data Binding:** The [DataSource](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_DataSource) property binds to `smartSuggestion`, just like Kanban. {% tabs %} -{% highlight %} +{% highlight razor %} @@ -408,7 +408,7 @@ When users switch to **Backlog View**, tasks are displayed in a grid using `SfGr **View Toggle:** Users can switch between **Kanban** and **Grid** using the button below: {% tabs %} -{% highlight %} +{% highlight razor %} diff --git a/blazor/smart-ai-solutions/ai-samples/rich-text-editor/writting-assistance.md b/blazor/smart-ai-solutions/ai-samples/rich-text-editor/writting-assistance.md index f6c75df29c..281ffd2108 100644 --- a/blazor/smart-ai-solutions/ai-samples/rich-text-editor/writting-assistance.md +++ b/blazor/smart-ai-solutions/ai-samples/rich-text-editor/writting-assistance.md @@ -307,7 +307,7 @@ The dialog is divided into two main rows: - **Replace:** Inserts the AI-generated content back into the original editor with undo support. {% tabs %} -{% highlight %} +{% highlight razor %} @@ -571,7 +571,7 @@ Once the AI-generated content is ready, it needs to be inserted exactly where th Additionally, users can copy the AI-generated content to the clipboard for use elsewhere. This is handled via a `JavaScript interop` function that copies plain text extracted from the AI result. {% tabs %} -{% highlight %} +{% highlight razor %} Copy From 7e8ce2d5a63c13c83cf77311eb0ef1482f4d74ae Mon Sep 17 00:00:00 2001 From: SadhanaBaskaran Date: Tue, 18 Nov 2025 16:16:06 +0530 Subject: [PATCH 058/266] 993664: Updated the UG content and samples for Blazor Pager Component --- blazor/pager/data-binding.md | 2 +- blazor/pager/getting-started-webapp.md | 241 ++++++++++++------------- 2 files changed, 117 insertions(+), 126 deletions(-) diff --git a/blazor/pager/data-binding.md b/blazor/pager/data-binding.md index 7a68fc62f1..ec628dd1ea 100644 --- a/blazor/pager/data-binding.md +++ b/blazor/pager/data-binding.md @@ -87,7 +87,7 @@ The Syncfusion® Blazor Pager component can @code { - SfGrid Grid; - SfDialog dialog; - public DataTable table = new DataTable(); - [Inject] private IWebHostEnvironment HostEnvironment { get; set; } + private SfGrid? grid; + private SfDialog? dialog; + private string[]? columns; + private List customerList = new(); + private string dialogContent = string.Empty; + private DataTable table = new(); + + [Inject] private IWebHostEnvironment? HostEnvironment { get; set; } - private async void OnChange(UploadChangeEventArgs args) + private async Task OnChange(UploadChangeEventArgs args) { if (args.Files[0].FileInfo.Type == "xlsx") { foreach (var file in args.Files) { var path = GetPath(file.FileInfo.Name); - ExcelEngine excelEngine = new ExcelEngine(); - IApplication application = excelEngine.Excel; - application.DefaultVersion = ExcelVersion.Excel2016; - // Create new file stream at the generated path. - FileStream openFileStream = new FileStream(path, FileMode.OpenOrCreate, FileAccess.Write); + using var openFileStream = new FileStream(path, FileMode.OpenOrCreate, FileAccess.Write); await file.File.OpenReadStream(long.MaxValue).CopyToAsync(openFileStream); - openFileStream.Close(); - // Open file stream from saved path. - FileStream fileStream = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.ReadWrite); - IWorkbook workbook = application.Workbooks.Open(fileStream); - IWorksheet worksheet = workbook.Worksheets[0]; + using var fileStream = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.ReadWrite); + using var excelEngine = new ExcelEngine(); + var application = excelEngine.Excel; + application.DefaultVersion = ExcelVersion.Excel2016; + + var workbook = application.Workbooks.Open(fileStream); + var worksheet = workbook.Worksheets[0]; table = worksheet.ExportDataTable(worksheet.UsedRange, ExcelExportDataTableOptions.ColumnNames); - GenerateListFromTable(table); - } + await GenerateListFromTable(table); + } } else { - dialog.Content = "Please upload only .xlsx format"; - dialog.ShowAsync(true); + dialogContent = "Please upload only .xlsx format"; + await dialog!.ShowAsync(); } } private async Task OnRemove(RemovingEventArgs args) { - CustomerList = new List(); // Clear data. - Columns = null; + customerList.Clear(); + columns = null; + await Task.CompletedTask; } private string GetPath(string filename) { - return Path.Combine(HostEnvironment.WebRootPath, filename); + return Path.Combine(HostEnvironment!.WebRootPath, filename); } - string[] Columns; - public List CustomerList = new List(); - - public void GenerateListFromTable(DataTable input) + private async Task GenerateListFromTable(DataTable input) { - // Check if at least one cell has meaningful data. bool hasData = input.Rows.Cast() .Any(row => row.ItemArray.Any(cell => cell != null && !string.IsNullOrWhiteSpace(cell.ToString()))); if (!hasData) { - dialog.Content = "The uploaded Excel file contains only blank rows or invalid data."; - dialog.ShowAsync(); - return; // Exit if the data is invalid. + dialogContent = "The uploaded Excel file contains only blank rows or invalid data."; + await dialog!.ShowAsync(); + return; } var list = new List(); - Columns = input.Columns.Cast() - .Select(x => x.ColumnName) - .ToArray(); + columns = input.Columns.Cast().Select(x => x.ColumnName).ToArray(); + foreach (DataRow row in input.Rows) { - System.Dynamic.ExpandoObject e = new System.Dynamic.ExpandoObject(); + var expando = new ExpandoObject() as IDictionary; foreach (DataColumn col in input.Columns) - e.TryAdd(col.ColumnName, row.ItemArray[col.Ordinal]); - list.Add(e); + { + expando![col.ColumnName] = row[col]; + } + list.Add((ExpandoObject)expando!); } - CustomerList = list; + + customerList = list; StateHasChanged(); + await Task.CompletedTask; } } {% endhighlight %} {% endtabs %} -[!Binding data from Excel document](./images/excel-import-data.gif) - -> You can find the complete sample on [GitHub](https://github.com/SyncfusionExamples/databinding-in-blazor-datagrid/tree/master/Binding_data_from_excel/Excel_Export). +> Find the complete sample on [GitHub](https://github.com/SyncfusionExamples/databinding-in-blazor-datagrid/tree/master/Binding_data_from_excel/Excel_Export). ## Observable collection -An Observable collection is a special type of collection in .NET that automatically notifies any subscribers (such as the UI or other components) when changes are made to the collection. This is particularly useful in data-binding scenarios, where you want the UI to reflect changes in the underlying data model without having to manually update the view. +An **Observable collection** is a specialized collection type in .NET that automatically notifies subscribers—such as UI components—when items are added, removed, or updated. This behavior is especially useful in data-binding scenarios where the interface needs to reflect changes in the underlying data without requiring manual refreshes. + +**Key Benefits** -To achieve this, you can use the [ObservableCollection](https://learn.microsoft.com/en-us/dotnet/api/system.collections.objectmodel.observablecollection-1?view=netframework-4.8), a dynamic data collection that: +- **Automatic UI Updates:** Changes to the collection (e.g., adding or removing items) are instantly reflected in the DataGrid. +- **Simplified Data Management:** Reduces the need for manual calls to StateHasChanged() or other update mechanisms. +- **Ideal for Dynamic Data:** Suitable for applications where data changes frequently, such as dashboards, real-time feeds, or user-driven interactions. + +To achieve this, use the [ObservableCollection](https://learn.microsoft.com/en-us/dotnet/api/system.collections.objectmodel.observablecollection-1?view=netframework-4.8), a dynamic data collection that: * Provides notifications when items are added, removed, or moved. @@ -1577,57 +1587,66 @@ To achieve this, you can use the [ObservableCollection](https://learn.microsoft. * Implements the [INotifyPropertyChanged](https://learn.microsoft.com/en-us/dotnet/api/system.componentmodel.inotifypropertychanged?view=netframework-4.8) interface to notify when a property value changes on the client side. -The following sample demonstrates how the Order class implements the **INotifyPropertyChanged** interface and raises the event when the `CustomerID`property value is changed. - {% tabs %} {% highlight razor tabtitle="Index.razor" %} @using Syncfusion.Blazor.Grids @using Syncfusion.Blazor.Buttons @using System.Collections.ObjectModel -@using Observable_Collection.Components.Data; +@using BlazorApp3.Data -
    - - - +
    + + +
    - + - - - - - + + + + + - @code { - - public ObservableCollection GridData { get; set; } - public int Count = 32341; + private ObservableCollection? gridData; + private int count = 32341; protected override void OnInitialized() { - GridData = OrdersDetailsObserveData.GetRecords(); + gridData = OrdersDetailsObserveData.GetRecords(); } - public void AddRecords() + private void AddRecords() { - GridData.Add(new OrdersDetailsObserveData(Count++, "ALFKI", 4343, 2.3 * 43, false, new DateTime(1991, 05, 15), "Berlin", "Simons bistro", "Denmark", new DateTime(1996, 7, 16), "Kirchgasse 6")); + gridData!.Add(new OrdersDetailsObserveData( + count++, "ALFKI", 4343, 2.3 * 43, false, + new DateTime(1991, 5, 15), "Berlin", "Simons bistro", + "Denmark", new DateTime(1996, 7, 16), "Kirchgasse 6")); } - public void DelRecords() + private void DelRecords() { - GridData.Remove(GridData.First()); + if (gridData!.Any()) + { + gridData!.Remove(gridData.First()); + } } - public void UpdateRecords() + private void UpdateRecords() { - var a = GridData.First(); - a.CustomerID = "Update"; + var record = gridData!.FirstOrDefault(); + if (record != null) + { + record.CustomerID = "Updated"; + } } } @@ -1641,86 +1660,99 @@ using System.ComponentModel; namespace Observable_Collection.Components.Data { public class OrdersDetailsObserveData : INotifyPropertyChanged +{ + + public OrdersDetailsObserveData( + int orderID, string customerID, int employeeID, double freight, bool verified, + DateTime orderDate, string shipCity, string shipName, string shipCountry, + DateTime shippedDate, string shipAddress) { - public OrdersDetailsObserveData() - { - } - public OrdersDetailsObserveData(int OrderID, string CustomerId, int EmployeeId, double Freight, bool Verified, DateTime OrderDate, string ShipCity, string ShipName, string ShipCountry, DateTime ShippedDate, string ShipAddress) - { - this.OrderID = OrderID; - this.CustomerID = CustomerId; - this.EmployeeID = EmployeeId; - this.Freight = Freight; - this.ShipCity = ShipCity; - this.Verified = Verified; - this.OrderDate = OrderDate; - this.ShipName = ShipName; - this.ShipCountry = ShipCountry; - this.ShippedDate = ShippedDate; - this.ShipAddress = ShipAddress; - } - public static ObservableCollection GetRecords() - { - ObservableCollection order = new ObservableCollection(); - int code = 10000; - for (int i = 1; i < 2; i++) - { - order.Add(new OrdersDetailsObserveData(code + 1, "ALFKI", i + 0, 2.3 * i, false, new DateTime(1991, 05, 15), "Berlin", "Simons bistro", "Denmark", new DateTime(1996, 7, 16), "Kirchgasse 6")); - order.Add(new OrdersDetailsObserveData(code + 2, "ANATR", i + 2, 3.3 * i, true, new DateTime(1990, 04, 04), "Madrid", "Queen Cozinha", "Brazil", new DateTime(1996, 9, 11), "Avda. Azteca 123")); - order.Add(new OrdersDetailsObserveData(code + 3, "ANTON", i + 1, 4.3 * i, true, new DateTime(1957, 11, 30), "Cholchester", "Frankenversand", "Germany", new DateTime(1996, 10, 7), "Carrera 52 con Ave. Bol�var #65-98 Llano Largo")); - order.Add(new OrdersDetailsObserveData(code + 4, "BLONP", i + 3, 5.3 * i, false, new DateTime(1930, 10, 22), "Marseille", "Ernst Handel", "Austria", new DateTime(1996, 12, 30), "Magazinweg 7")); - order.Add(new OrdersDetailsObserveData(code + 5, "BOLID", i + 4, 6.3 * i, true, new DateTime(1953, 02, 18), "Tsawassen", "Hanari Carnes", "Switzerland", new DateTime(1997, 12, 3), "1029 - 12th Ave. S.")); - code += 5; - } - return order; - } + OrderID = orderID; + CustomerID = customerID; + EmployeeID = employeeID; + Freight = freight; + Verified = verified; + OrderDate = orderDate; + ShipCity = shipCity; + ShipName = shipName; + ShipCountry = shipCountry; + ShippedDate = shippedDate; + ShipAddress = shipAddress; + } - public int OrderID { get; set; } - public string CustomerID + public static ObservableCollection GetRecords() + { + var orders = new ObservableCollection(); + int code = 10000; + + for (int i = 1; i < 2; i++) { - get { return customerID; } - set - { - customerID = value; - NotifyPropertyChanged("CustomerID"); - } - } - public string customerID { get; set; } - public int? EmployeeID { get; set; } - public double? Freight { get; set; } - public string ShipCity { get; set; } - public bool Verified { get; set; } - public DateTime? OrderDate { get; set; } + orders.Add(new OrdersDetailsObserveData(code + 1, "ALFKI", i + 0, 2.3 * i, false, + new DateTime(1991, 5, 15), "Berlin", "Simons bistro", "Denmark", + new DateTime(1996, 7, 16), "Kirchgasse 6")); - public event PropertyChangedEventHandler PropertyChanged; + orders.Add(new OrdersDetailsObserveData(code + 2, "ANATR", i + 2, 3.3 * i, true, + new DateTime(1990, 4, 4), "Madrid", "Queen Cozinha", "Brazil", + new DateTime(1996, 9, 11), "Avda. Azteca 123")); - public string ShipName { get; set; } + orders.Add(new OrdersDetailsObserveData(code + 3, "ANTON", i + 1, 4.3 * i, true, + new DateTime(1957, 11, 30), "Cholchester", "Frankenversand", "Germany", + new DateTime(1996, 10, 7), "Carrera 52 con Ave. Bolívar #65-98 Llano Largo")); + + orders.Add(new OrdersDetailsObserveData(code + 4, "BLONP", i + 3, 5.3 * i, false, + new DateTime(1930, 10, 22), "Marseille", "Ernst Handel", "Austria", + new DateTime(1996, 12, 30), "Magazinweg 7")); + + orders.Add(new OrdersDetailsObserveData(code + 5, "BOLID", i + 4, 6.3 * i, true, + new DateTime(1953, 2, 18), "Tsawassen", "Hanari Carnes", "Switzerland", + new DateTime(1997, 12, 3), "1029 - 12th Ave. S.")); + + code += 5; + } - public string ShipCountry { get; set; } + return orders; + } - public DateTime ShippedDate { get; set; } - public string ShipAddress { get; set; } + public int OrderID { get; set; } - private void NotifyPropertyChanged(String propertyName) + private string customerID; + public string CustomerID + { + get => customerID; + set { - if (PropertyChanged != null) - { - PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); - } + customerID = value; + NotifyPropertyChanged(nameof(CustomerID)); } } + int? EmployeeID { get; set; } + public double? Freight { get; set; } + public string ShipCity { get; set; } + public bool Verified { get; set; } + public DateTime? OrderDate { get; set; } + public string ShipName { get; set; } + public string ShipCountry { get; set; } + public DateTime ShippedDate { get; set; } + public string ShipAddress { get; set; } + + public event PropertyChangedEventHandler PropertyChanged; + + private void NotifyPropertyChanged(string propertyName) + { + PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); + } +} } {% endhighlight %} {% endtabs %} -The following screenshot represents the Grid with **Observable Collection**. +![Blazor DataGrid with ObservableCollection](../images/blazor-datagrid-observable.gif) -![Blazor DataGrid with ObservableCollection](./images/blazor-datagrid-observable.gif) +N> * The Grid automatically reflects changes when records are added, removed, or updated. +* When updating the collection using external triggers (e.g., timers, events), call **StateHasChanged()** to refresh the UI. -> You can find the complete sample on [GitHub](https://github.com/SyncfusionExamples/databinding-in-blazor-datagrid/tree/master/observable_collection/Observable_Collection). - -N> While using an Observable collection, the added, removed, and changed records are reflected in the UI. But while updating the Observable collection using external actions like timers, events, and other notifications, you need to call the StateHasChanged method to reflect the changes in the UI. +> Find the complete sample on [GitHub](https://github.com/SyncfusionExamples/databinding-in-blazor-datagrid/tree/master/observable_collection/Observable_Collection). ### Add a range of items into ObservableCollection in Blazor DataGrid @@ -1737,19 +1769,19 @@ The Syncfusion® Blazor DataGrid supports bi * Ensuring smoother and more efficient data rendering in scenarios with high-frequency data changes. -By default, the `Add` method is used to insert a single item into the **ObservableCollection**. When multiple items are added one by one using a `foreach` loop, the Grid refreshes after each addition. This can lead to performance issues and UI flickering, especially when adding a large number of items. +By default, the **Add** method is used to insert a single item into the **ObservableCollection**. When multiple items are added one by one using a **foreach** loop, the Grid refreshes after each addition. This can lead to performance issues and UI flickering, especially when adding a large number of items. -To optimize performance when adding multiple items at once, you can extend the `ObservableCollection` class by implementing an `AddRange` method. By using this method, you can add a range of items and ensure that the `OnCollectionChanged` event is triggered only once, updating the Grid a single time for the entire batch operation. +To optimize performance when adding multiple items at once, extend the **ObservableCollection** class by implementing an **AddRange** method. By using this method, add a range of items and ensure that the **OnCollectionChanged** event is triggered only once, updating the Grid a single time for the entire batch operation. To implement this functionality, follow these steps: 1. **Create a Custom Collection Class** - Define a new class **SmartObservableCollection** that inherits from `ObservableCollection`. This allows you to customize the behavior of the collection. + Define a new class **SmartObservableCollection** that inherits from **ObservableCollection**. This allows customization of the behavior of the collection. 2. **Add a flag to control notifications** - Introduce a private boolean **flag _preventNotification** to temporarily disable collection change notifications while adding multiple items. + Introduce a private boolean **_preventNotification** to temporarily disable collection change notifications while adding multiple items. 3. **Override the OnCollectionChanged method** @@ -1764,8 +1796,6 @@ To implement this functionality, follow these steps: * Resetting **_preventNotification** to **false**. * Raising a single **NotifyCollectionChangedAction.Reset** notification to inform the Grid that the entire collection has changed. -The following example demonstrates how to use this approach in a Grid: - {% tabs %} {% highlight razor tabtitle="Index.razor" %} @@ -1773,41 +1803,50 @@ The following example demonstrates how to use this approach in a Grid: @using Syncfusion.Blazor.Buttons @using System.Collections.ObjectModel @using System.Collections.Specialized -@using ObservableCollection.Components.Data; +@using ObservableCollection.Components.Data
    - Add Range of Items + Add Range of Items
    - + + - - - - + + + + + @code { - SfGrid Grid; - public SmartObservableCollection GridData = new SmartObservableCollection(); - public void AddRangeItems() + private SfGrid? grid; + private SmartObservableCollection gridData = new(); + + private void AddRangeItems() { - GridData.AddRange(OrdersDetailsObserveData.GetAllRecords()); + gridData.AddRange(OrdersDetailsObserveData.GetAllRecords()); } public class SmartObservableCollection : ObservableCollection { - private bool _preventNotification = false; + private bool preventNotification; + protected override void OnCollectionChanged(NotifyCollectionChangedEventArgs e) { - if (!_preventNotification) + if (!preventNotification) + { base.OnCollectionChanged(e); + } } + public void AddRange(IEnumerable list) { - _preventNotification = true; - foreach (T item in list) + preventNotification = true; + foreach (var item in list) + { Add(item); - _preventNotification = false; + } + preventNotification = false; OnCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Reset)); } } @@ -1822,16 +1861,19 @@ namespace ObservableCollection.Components.Data public class OrdersDetailsObserveData { public int? OrderID { get; set; } - public string CustomerID { get; set; } + public string CustomerID { get; set; } = string.Empty; public DateTime? OrderDate { get; set; } public double? Freight { get; set; } public static IEnumerable GetAllRecords() { + var random = new Random(); + var customers = new[] { "ALFKI", "ANANTR", "ANTON", "BLONP", "BOLID" }; + return Enumerable.Range(1, 10).Select(x => new OrdersDetailsObserveData { OrderID = 1000 + x, - CustomerID = (new[] { "ALFKI", "ANANTR", "ANTON", "BLONP", "BOLID" })[new Random().Next(5)], + CustomerID = customers[random.Next(customers.Length)], Freight = Math.Round(2.1 * x, 2), OrderDate = DateTime.Now.AddDays(-x) }).ToList(); @@ -1842,12 +1884,9 @@ namespace ObservableCollection.Components.Data {% endhighlight %} {% endtabs %} -The following screenshot represents the Grid with **Observable Collection**. - -![Blazor DataGrid with ObservableCollection](./images/Observable-collection-range.gif) - -> You can find the complete sample on [GitHub](https://github.com/SyncfusionExamples/databinding-in-blazor-datagrid/tree/master/add_range_items_observableCollection/ObservableCollection). +> Find the complete sample on [GitHub](https://github.com/SyncfusionExamples/databinding-in-blazor-datagrid/tree/master/add_range_items_observableCollection/ObservableCollection). ## See also -* [How to clear all Data from Grid](https://www.syncfusion.com/forums/150965/how-to-clear-all-data-from-grid) +* [How to import data from Excel sheet and bind to Blazor Grid](https://support.syncfusion.com/kb/article/11560/how-to-import-data-from-excel-sheet-and-bind-to-blazor-grid) +* [How to clear all Data from Grid](https://www.syncfusion.com/forums/150965/how-to-clear-all-data-from-grid) \ No newline at end of file From 13cf0f6784e81d863bc20b7257fba1e6b0bb5f0e Mon Sep 17 00:00:00 2001 From: Kokila Poovendran Date: Wed, 26 Nov 2025 16:17:52 +0530 Subject: [PATCH 112/266] 945108: Staging Failure Resolved --- .../tools/code-snippet/nesting-table.razor | 63 +++++++++++++++++++ 1 file changed, 63 insertions(+) create mode 100644 blazor/rich-text-editor/tools/code-snippet/nesting-table.razor diff --git a/blazor/rich-text-editor/tools/code-snippet/nesting-table.razor b/blazor/rich-text-editor/tools/code-snippet/nesting-table.razor new file mode 100644 index 0000000000..70ca9cde38 --- /dev/null +++ b/blazor/rich-text-editor/tools/code-snippet/nesting-table.razor @@ -0,0 +1,63 @@ +@using Syncfusion.Blazor.RichTextEditor + + + + + + + + + + + + + + + + +
    DepartmentDetails
    Sales + + + + + + + + + + + + + +
    EmployeeTarget
    John Doe$50,000
    Jane Smith$60,000
    +
    MarketingCampaign planning in progress
    +
    + +@code{ + private List Tools = new List() + { + new ToolbarItemModel() { Command = ToolbarCommand.Bold }, + new ToolbarItemModel() { Command = ToolbarCommand.Italic }, + new ToolbarItemModel() { Command = ToolbarCommand.Underline }, + new ToolbarItemModel() { Command = ToolbarCommand.StrikeThrough }, + new ToolbarItemModel() { Command = ToolbarCommand.Separator }, + new ToolbarItemModel() { Command = ToolbarCommand.FontColor }, + new ToolbarItemModel() { Command = ToolbarCommand.BackgroundColor }, + new ToolbarItemModel() { Command = ToolbarCommand.Separator }, + new ToolbarItemModel() { Command = ToolbarCommand.Formats }, + new ToolbarItemModel() { Command = ToolbarCommand.Alignments }, + new ToolbarItemModel() { Command = ToolbarCommand.Separator }, + new ToolbarItemModel() { Command = ToolbarCommand.OrderedList }, + new ToolbarItemModel() { Command = ToolbarCommand.UnorderedList }, + new ToolbarItemModel() { Command = ToolbarCommand.Separator }, + new ToolbarItemModel() { Command = ToolbarCommand.Outdent }, + new ToolbarItemModel() { Command = ToolbarCommand.Indent }, + new ToolbarItemModel() { Command = ToolbarCommand.Separator }, + new ToolbarItemModel() { Command = ToolbarCommand.CreateLink }, + new ToolbarItemModel() { Command = ToolbarCommand.Image }, + new ToolbarItemModel() { Command = ToolbarCommand.CreateTable }, + new ToolbarItemModel() { Command = ToolbarCommand.Separator }, + new ToolbarItemModel() { Command = ToolbarCommand.Undo }, + new ToolbarItemModel() { Command = ToolbarCommand.Redo } + }; +} \ No newline at end of file From 2d5d2acac9f696ec960b82ef7ff72900d22e6289 Mon Sep 17 00:00:00 2001 From: sanjaykumar-suresh Date: Wed, 26 Nov 2025 16:57:18 +0530 Subject: [PATCH 113/266] 995143: Changing Playgroundlinks for Custom Toolbar Sample --- blazor/datagrid/custom-toolbar.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/blazor/datagrid/custom-toolbar.md b/blazor/datagrid/custom-toolbar.md index 6c76758b65..ab4eb7d58f 100644 --- a/blazor/datagrid/custom-toolbar.md +++ b/blazor/datagrid/custom-toolbar.md @@ -113,7 +113,7 @@ The following example demonstrates, how to render the custom Toolbar using `Temp {% endhighlight %} {% endtabs %} -{% previewsample "https://blazorplayground.syncfusion.com/embed/VXBUsZBuSRVoiYtS?appbar=false&editor=false&result=true&errorlist=false&theme=bootstrap5" %} +{% previewsample "https://blazorplayground.syncfusion.com/embed/hjhyWChngaryhJXi?appbar=true&editor=true&result=true&errorlist=true&theme=bootstrap5" %} ## Render image with text in custom Toolbar @@ -351,7 +351,7 @@ In the **OnChange** method, the text of the selected item is checked to determin {% endhighlight %} {% endtabs %} -{% previewsample "https://blazorplayground.syncfusion.com/embed/LDVgWDUiLWIJdsVg?appbar=false&editor=false&result=true&errorlist=false&theme=bootstrap5" %} +{% previewsample "https://blazorplayground.syncfusion.com/embed/hDreCMLRKkzmjRdG?appbar=true&editor=true&result=true&errorlist=true&theme=bootstrap5" %} ## Render SfAutoComplete in custom toolbar @@ -470,7 +470,7 @@ The following example demonstrates how to render the `SfAutoComplete` inside the {% endhighlight %} {% endtabs %} -{% previewsample "https://blazorplayground.syncfusion.com/embed/BthoNTLFzGxGrdMg?appbar=false&editor=false&result=true&errorlist=false&theme=bootstrap5" %} +{% previewsample "https://blazorplayground.syncfusion.com/embed/VDBysCBdJXXyIRKP?appbar=true&editor=true&result=true&errorlist=true&theme=bootstrap5" %} ## Render a component or element using the Toolbar Template @@ -576,4 +576,4 @@ The following example demonstrates how to render a **SfButton** in the Toolbar u {% endhighlight %} {% endtabs %} -{% previewsample "https://blazorplayground.syncfusion.com/embed/BjLUCtDUyMhZgqEX?appbar=false&editor=false&result=true&errorlist=false&theme=bootstrap5" %} \ No newline at end of file +{% previewsample "https://blazorplayground.syncfusion.com/embed/LjrSMMhxJXWJIerL?appbar=true&editor=true&result=true&errorlist=true&theme=bootstrap5" %} \ No newline at end of file From a7f131ecf4a61e5fc4ab4ec493bdebaf891557b5 Mon Sep 17 00:00:00 2001 From: Backiaraj Date: Wed, 26 Nov 2025 17:00:21 +0530 Subject: [PATCH 114/266] Updated Blazor components Getting Started UG documentation for Blazor Web App --- .../data-form/getting-started-with-web-app.md | 119 +++++++++++------- .../datagrid/getting-started-with-web-app.md | 32 ++--- .../getting-started-with-web-app.md | 119 +++++++++++------- .../getting-started-with-web-app.md | 119 +++++++++++------- .../getting-started-with-web-app.md | 119 +++++++++++------- .../diagram/getting-started-with-web-app.md | 30 ++--- blazor/dialog/getting-started-with-web-app.md | 119 +++++++++++------- .../getting-started-with-web-app.md | 119 +++++++++++------- .../getting-started-with-web-app.md | 30 ++--- .../getting-started-webapp.md | 118 ++++++++++------- 10 files changed, 556 insertions(+), 368 deletions(-) diff --git a/blazor/data-form/getting-started-with-web-app.md b/blazor/data-form/getting-started-with-web-app.md index c03b87de5b..898d077d5e 100644 --- a/blazor/data-form/getting-started-with-web-app.md +++ b/blazor/data-form/getting-started-with-web-app.md @@ -9,7 +9,7 @@ documentation: ug # Getting Started with Blazor DataForm Component in Web App -This section briefly explains about how to include [Blazor DataForm](https://www.syncfusion.com/blazor-components/blazor-data-form) component in your Blazor Web App using [Visual Studio](https://visualstudio.microsoft.com/vs/) and Visual Studio Code. +This section briefly explains about how to include [Blazor DataForm](https://www.syncfusion.com/blazor-components/blazor-data-form) component in your Blazor Web App using [Visual Studio](https://visualstudio.microsoft.com/vs/), [Visual Studio Code](https://code.visualstudio.com/), and the [.NET CLI](https://learn.microsoft.com/en-us/dotnet/core/tools/). {% tabcontents %} @@ -21,15 +21,15 @@ This section briefly explains about how to include [Blazor DataForm](https://www ## 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). +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-10.0&pivots=vs) or the [Syncfusion® Blazor Extension](https://blazor.syncfusion.com/documentation/visual-studio-integration/template-studio). -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. +Configure the appropriate [Interactive render mode](https://learn.microsoft.com/en-us/aspnet/core/blazor/components/render-modes?view=aspnetcore-10.0#render-modes) and [Interactivity location](https://learn.microsoft.com/en-us/aspnet/core/blazor/tooling?view=aspnetcore-10.0&pivots=vs) while creating a Blazor Web App. ## Install Syncfusion® Blazor DataForm and Themes NuGet in the Blazor Web App -To add **Blazor DataForm** 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.DataForm](https://www.nuget.org/packages/Syncfusion.Blazor.DataForm/) and [Syncfusion.Blazor.Themes](https://www.nuget.org/packages/Syncfusion.Blazor.Themes/). +To add the **Blazor DataForm** component in the app, open the NuGet package manager in Visual Studio (*Tools → NuGet Package Manager → Manage NuGet Packages for Solution*), then search and install [Syncfusion.Blazor.DataForm](https://www.nuget.org/packages/Syncfusion.Blazor.DataForm/) and [Syncfusion.Blazor.Themes](https://www.nuget.org/packages/Syncfusion.Blazor.Themes/). -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 using the `WebAssembly or Auto` render modes in the Blazor Web App, install Syncfusion® Blazor component NuGet packages in the client project. Alternatively, you can utilize the following package manager command to achieve the same. @@ -42,7 +42,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 in [nuget.org](https://www.nuget.org/packages?q=syncfusion.blazor). Refer to the [NuGet packages](https://blazor.syncfusion.com/documentation/nuget-packages) topic for the available NuGet packages list with component details. {% endtabcontent %} @@ -54,9 +54,9 @@ N> Syncfusion® Blazor components are availa ## 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). +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-10.0&pivots=vsc) or the [Syncfusion® Blazor Extension](https://blazor.syncfusion.com/documentation/visual-studio-code-integration/create-project). -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=vsc) while creating a Blazor Web Application. +Configure the appropriate interactive render mode and interactivity location when setting up a Blazor Web App. For detailed information, 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. @@ -70,11 +70,9 @@ cd BlazorWebApp.Client {% endhighlight %} {% endtabs %} -N> For more information on creating a **Blazor Web App** with various interactive modes and locations, refer to this [link](https://blazor.syncfusion.com/documentation/getting-started/blazor-web-app?tabcontent=visual-studio-code#render-interactive-modes). - ## Install Syncfusion® Blazor DataForm 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 using the `WebAssembly` or `Auto` render modes in the Blazor Web App, install Syncfusion® Blazor component 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. @@ -92,20 +90,69 @@ dotnet restore {% 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 in [nuget.org](https://www.nuget.org/packages?q=syncfusion.blazor). Refer to the [NuGet packages](https://blazor.syncfusion.com/documentation/nuget-packages) topic for the available NuGet packages list with component details. {% endtabcontent %} -{% endtabcontents %} +{% tabcontent .NET CLI %} -## Register Syncfusion® Blazor Service +## Prerequisites + +Latest version of the [.NET 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). + +{% tabs %} +{% highlight c# tabtitle=".NET CLI" %} + +dotnet --version + +{% endhighlight %} +{% endtabs %} + +## 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). + +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). + +For example, in a Blazor Web App with the `Auto` interactive render mode, use the following commands. + +{% tabs %} +{% highlight c# tabtitle="Blazor Web App" %} + +dotnet new blazor -o BlazorWebApp -int Auto +cd BlazorWebApp +cd BlazorWebApp.Client + +{% endhighlight %} +{% endtabs %} + +This command creates a new Blazor Web App and places it in a new directory called `BlazorWebApp` inside your current location. See the [Create a Blazor App](https://dotnet.microsoft.com/en-us/learn/aspnet/blazor-tutorial/create) and [dotnet new CLI command](https://learn.microsoft.com/en-us/aspnet/core/blazor/tooling?pivots=cli&view=aspnetcore-10.0) topics for more details. + +## Install Syncfusion® Blazor DataForm and Themes NuGet in the App + +Here's an example of how to add the **Blazor DataForm** component to the application by using the following commands in a command prompt (Windows), terminal (Linux and macOS), or PowerShell to install the [Syncfusion.Blazor.DataForm](https://www.nuget.org/packages/Syncfusion.Blazor.DataForm/) and [Syncfusion.Blazor.Themes](https://www.nuget.org/packages/Syncfusion.Blazor.Themes/) NuGet packages. See [Install and manage packages using the dotnet CLI](https://learn.microsoft.com/en-us/nuget/consume-packages/install-use-packages-dotnet-cli) for more details. + +If using the `WebAssembly` or `Auto` render modes in the Blazor Web App, install Syncfusion® Blazor component NuGet packages in the client project. + +{% tabs %} +{% highlight c# tabtitle=".NET CLI" %} + +dotnet add package Syncfusion.Blazor.DataForm --version {{ site.releaseversion }} +dotnet add package Syncfusion.Blazor.Themes --version {{ 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 the [NuGet packages](https://blazor.syncfusion.com/documentation/nuget-packages) topic for the available NuGet package list with component details. + +{% endtabcontent %} + +{% endtabcontents %} -| Interactive Render Mode | Description | -| -- | -- | -| WebAssembly or Auto | Open **~/_Imports.razor** file from the client project.| -| Server | Open **~/_import.razor** file, which is located in the `Components` folder.| +## Add Import Namespaces -Import the `Syncfusion.Blazor` and `Syncfusion.Blazor.DataForm` namespace. +Open the **~/_Imports.razor** file in the client project and import the `Syncfusion.Blazor` and `Syncfusion.Blazor.DataForm` namespaces. {% tabs %} {% highlight C# tabtitle="~/_Imports.razor" %} @@ -116,9 +163,11 @@ Import the `Syncfusion.Blazor` and `Syncfusion.Blazor.DataForm` namespace. {% endhighlight %} {% endtabs %} -Now, register the Syncfusion® Blazor Service in the **~/Program.cs** file of your Blazor Web App. +## Register Syncfusion® Blazor Service + +Register the Syncfusion® Blazor Service in the **~/Program.cs** file of your Blazor Web App. -If the **Interactive Render Mode** is set to `WebAssembly` or `Auto`, you need to register the Syncfusion® Blazor service in both **~/Program.cs** files of your Blazor Web App. +If the **Interactive Render Mode** is set to `WebAssembly` or `Auto`, register the Syncfusion® Blazor service in the **~/Program.cs** files of the main `server` project and associated `.Client` project. {% tabs %} {% highlight c# tabtitle="Server(~/_Program.cs)" hl_lines="3 11" %} @@ -152,27 +201,6 @@ await builder.Build().RunAsync(); {% endhighlight %} {% endtabs %} -If the **Interactive Render Mode** is set to `Server`, your project will contain a single **~/Program.cs** file. So, you should register the Syncfusion® Blazor Service only in that **~/Program.cs** file. - -{% tabs %} -{% highlight c# tabtitle="~/_Program.cs" hl_lines="2 9" %} - -... -using Syncfusion.Blazor; - -var builder = WebApplication.CreateBuilder(args); - -// Add services to the container. -builder.Services.AddRazorComponents() - .AddInteractiveServerComponents(); -builder.Services.AddSyncfusionBlazor(); - -var app = builder.Build(); -.... - -{% 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 reference in the `` section and the script reference at the end of the `` in the **~/Components/App.razor** file as shown below: @@ -193,16 +221,15 @@ N> Check out the [Blazor Themes](https://blazor.syncfusion.com/documentation/app ## Add Blazor DataForm component -Add the Syncfusion® Blazor DataForm component in `.razor` file inside the `Pages` folder. If an interactivity location as Per `page/component` in the web app, define a render mode at top of the component, as follows: +Add the Syncfusion® Blazor DataForm 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 top of the component, as follows: | Interactivity location | RenderMode | Code | | --- | --- | --- | | Per page/component | Auto | @rendermode InteractiveAuto | | | WebAssembly | @rendermode InteractiveWebAssembly | -| | Server | @rendermode InteractiveServer | | | None | --- | -N> If an **Interactivity Location** is set to `Global` and the **Render Mode** is set to `Auto` or `WebAssembly` or `Server`, the render mode is configured in the `App.razor` file by default. +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. {% tabs %} {% highlight razor %} @@ -260,6 +287,8 @@ N> If an **Interactivity Location** is set to `Global` and the **Render Mode** i {% endhighlight %} {% endtabs %} +* Press Ctrl+F5 (Windows) or +F5 (macOS) to launch the application. This will render the Syncfusion® Blazor DataForm component in the default web browser. + {% previewsample "https://blazorplayground.syncfusion.com/embed/hNhfXCLaBIvJBwaZ?appbar=false&editor=false&result=true&errorlist=false&theme=bootstrap5" backgroundimage "[Blazor DataForm Component](images/blazor-dataform.png)" %} N> [View Sample in GitHub](https://github.com/SyncfusionExamples/Blazor-Getting-Started-Examples/tree/main/DataForm). \ No newline at end of file diff --git a/blazor/datagrid/getting-started-with-web-app.md b/blazor/datagrid/getting-started-with-web-app.md index 4c7c0773da..de3e2d2e16 100644 --- a/blazor/datagrid/getting-started-with-web-app.md +++ b/blazor/datagrid/getting-started-with-web-app.md @@ -9,7 +9,7 @@ documentation: ug # Getting Started with Blazor DataGrid in Web App -This section briefly explains about how to include [Syncfusion® Blazor DataGrid](https://www.syncfusion.com/blazor-components/blazor-datagrid) in your Blazor Web App using [Visual Studio](https://visualstudio.microsoft.com/vs/), Visual Studio Code and .NET CLI. +This section briefly explains about how to include [Syncfusion® Blazor DataGrid](https://www.syncfusion.com/blazor-components/blazor-datagrid) in your Blazor Web App using [Visual Studio](https://visualstudio.microsoft.com/vs/), [Visual Studio Code](https://code.visualstudio.com/), and the [.NET CLI](https://learn.microsoft.com/en-us/dotnet/core/tools/). > **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) @@ -23,17 +23,17 @@ This section briefly explains about how to include [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. +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-10.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 Web App Getting Started](https://blazor.syncfusion.com/documentation/getting-started/blazor-web-app) documentation. -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=vs) while creating a Blazor Web Application. +Configure the appropriate [Interactive render mode](https://learn.microsoft.com/en-us/aspnet/core/blazor/components/render-modes?view=aspnetcore-10.0#render-modes) and [Interactivity location](https://learn.microsoft.com/en-us/aspnet/core/blazor/tooling?view=aspnetcore-10.0&pivots=vs) while creating a Blazor Web App. ![Create Blazor Web App](images/blazor-create-web-app.png) ## Install Blazor DataGrid and Themes NuGet in the Blazor Web App -To add **Syncfusion® Blazor DataGrid** 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.Grid](https://www.nuget.org/packages/Syncfusion.Blazor.Grid/) and [Syncfusion.Blazor.Themes](https://www.nuget.org/packages/Syncfusion.Blazor.Themes/). +To add the **Syncfusion® Blazor DataGrid** in the app, open the NuGet package manager in Visual Studio (*Tools → NuGet Package Manager → Manage NuGet Packages for Solution*), then search and install [Syncfusion.Blazor.Grid](https://www.nuget.org/packages/Syncfusion.Blazor.Grid/) and [Syncfusion.Blazor.Themes](https://www.nuget.org/packages/Syncfusion.Blazor.Themes/). -If you utilize `WebAssembly or Auto` render modes in the Blazor Web App need to be install Syncfusion® Blazor NuGet packages within the client project. +If using the `WebAssembly or Auto` render modes in the Blazor Web App, install Syncfusion® Blazor component NuGet packages in the client project. Alternatively, you can utilize the following package manager command to achieve the same. @@ -46,7 +46,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 in [nuget.org](https://www.nuget.org/packages?q=syncfusion.blazor). Refer to the [NuGet packages](https://blazor.syncfusion.com/documentation/nuget-packages) topic for the available NuGet packages list with component details. {% endtabcontent %} @@ -58,9 +58,9 @@ N> Syncfusion® Blazor components are availa ## 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. +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-10.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. -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). +Configure the appropriate interactive render mode and interactivity location when setting up a Blazor Web App. For detailed information, 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. @@ -76,7 +76,7 @@ cd BlazorWebApp.Client ## Install Blazor DataGrid 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 using the `WebAssembly` or `Auto` render modes in the Blazor Web App, install Syncfusion® Blazor component 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. @@ -94,7 +94,7 @@ dotnet restore {% 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 in [nuget.org](https://www.nuget.org/packages?q=syncfusion.blazor). Refer to the [NuGet packages](https://blazor.syncfusion.com/documentation/nuget-packages) topic for the available NuGet packages list with component details. {% endtabcontent %} @@ -130,13 +130,13 @@ cd BlazorApp.Client {% endhighlight %} {% endtabs %} -This command creates new Blazor Web 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/aspnet/core/blazor/tooling?pivots=linux-macos&view=aspnetcore-8.0) topics for more details. +This command creates a new Blazor Web App and places it in a new directory called `BlazorApp` inside your current location. See the [Create a Blazor App](https://dotnet.microsoft.com/en-us/learn/aspnet/blazor-tutorial/create) and [dotnet new CLI command](https://learn.microsoft.com/en-us/aspnet/core/blazor/tooling?pivots=cli&view=aspnetcore-10.0) topics for more details. ## Install Syncfusion® Blazor Grid and Themes NuGet in the App Here's an example of how to add **Blazor DataGrid** component in the application using the following command in the command prompt (Windows) or terminal (Linux and macOS) to install a [Syncfusion.Blazor.Grid](https://www.nuget.org/packages/Syncfusion.Blazor.Grid/) 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. -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 using the `WebAssembly or Auto` render modes in the Blazor Web App, install Syncfusion® Blazor component NuGet packages in the client project. {% tabs %} {% highlight c# tabtitle=".NET CLI" %} @@ -148,7 +148,7 @@ 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 in [nuget.org](https://www.nuget.org/packages?q=syncfusion.blazor). Refer to the [NuGet packages](https://blazor.syncfusion.com/documentation/nuget-packages) topic for the available NuGet packages list with component details. {% endtabcontent %} @@ -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.Grids` namespace. +Open the **~/_Imports.razor** file in the client project and import the `Syncfusion.Blazor` and `Syncfusion.Blazor.Grids` namespaces. {% tabs %} {% highlight C# tabtitle="~/_Imports.razor" %} @@ -171,7 +171,7 @@ Open the **~/_Imports.razor** file from the client project and import the `Syncf 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. +If the **Interactive Render Mode** is set to `WebAssembly` or `Auto`, register the Syncfusion® Blazor service in the **~/Program.cs** files of the main `server` project and associated `.Client` project. {% tabs %} {% highlight c# tabtitle="Server(~/_Program.cs)" hl_lines="3 11" %} @@ -277,7 +277,7 @@ N> If an **Interactivity Location** is set to `Global` and the **Render Mode** i {% previewsample "https://blazorplayground.syncfusion.com/embed/BNVztWraLacsGbYO?appbar=false&editor=false&result=true&errorlist=false&theme=bootstrap5" backgroundimage "[Blazor DataGrid](images/blazor-datagrid-component.png)" %} -* Press Ctrl+F5 (Windows) or +F5 (macOS) to launch the application. This will render the Grid in your default web browser. +* Press Ctrl+F5 (Windows) or +F5 (macOS) to launch the application. This will render the Syncfusion® Blazor Grid component in the default web browser. ## Defining row data diff --git a/blazor/datepicker/getting-started-with-web-app.md b/blazor/datepicker/getting-started-with-web-app.md index baaaddd40e..000dca4d97 100644 --- a/blazor/datepicker/getting-started-with-web-app.md +++ b/blazor/datepicker/getting-started-with-web-app.md @@ -9,7 +9,7 @@ documentation: ug # Getting Started with Blazor DatePicker Component in Web App -This section explains how to include the [Blazor DatePicker](https://www.syncfusion.com/blazor-components/blazor-datepicker) component in a Blazor Web App using [Visual Studio](https://visualstudio.microsoft.com/vs/) and Visual Studio Code. +This section explains how to include the [Blazor DatePicker](https://www.syncfusion.com/blazor-components/blazor-datepicker) component in a Blazor Web App using [Visual Studio](https://visualstudio.microsoft.com/vs/), [Visual Studio Code](https://code.visualstudio.com/), and the [.NET CLI](https://learn.microsoft.com/en-us/dotnet/core/tools/). {% tabcontents %} @@ -21,15 +21,15 @@ This section explains how to include the [Blazor DatePicker](https://www.syncfus ## Create a new Blazor Web App in Visual Studio -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&pivots=vs) or the [Syncfusion® Blazor Extension](https://blazor.syncfusion.com/documentation/visual-studio-integration/template-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-10.0&pivots=vs) or the [Syncfusion® Blazor Extension](https://blazor.syncfusion.com/documentation/visual-studio-integration/template-studio). -Configure the appropriate [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=vs) when creating the application. +Configure the appropriate [Interactive render mode](https://learn.microsoft.com/en-us/aspnet/core/blazor/components/render-modes?view=aspnetcore-10.0#render-modes) and [Interactivity location](https://learn.microsoft.com/en-us/aspnet/core/blazor/tooling?view=aspnetcore-10.0&pivots=vs) while creating a Blazor Web App. ## Install Syncfusion® Blazor Calendars and Themes NuGet in the Blazor Web App -To add the **Blazor DatePicker** component, open the NuGet Package Manager in Visual Studio (Tools → NuGet Package Manager → Manage NuGet Packages for Solution), then search for and install [Syncfusion.Blazor.Calendars](https://www.nuget.org/packages/Syncfusion.Blazor.Calendars/) and [Syncfusion.Blazor.Themes](https://www.nuget.org/packages/Syncfusion.Blazor.Themes/). +To add the **Blazor DatePicker** component in the app, open the NuGet Package Manager in Visual Studio (Tools → NuGet Package Manager → Manage NuGet Packages for Solution), then search for and install [Syncfusion.Blazor.Calendars](https://www.nuget.org/packages/Syncfusion.Blazor.Calendars/) and [Syncfusion.Blazor.Themes](https://www.nuget.org/packages/Syncfusion.Blazor.Themes/). -If using `WebAssembly` or `Auto` render modes, install the Syncfusion® Blazor packages in the client project of the Blazor Web App. +If using the `WebAssembly or Auto` render modes in the Blazor Web App, install Syncfusion® Blazor component NuGet packages in the client project. Alternatively, use the following Package Manager commands: @@ -42,7 +42,7 @@ Install-Package Syncfusion.Blazor.Themes -Version {{ site.releaseversion }} {% endhighlight %} {% endtabs %} -N> Syncfusion® Blazor components are available on NuGet. For the full package list and component details, see [NuGet packages](https://blazor.syncfusion.com/documentation/nuget-packages). +N> Syncfusion® Blazor components are available in [nuget.org](https://www.nuget.org/packages?q=syncfusion.blazor). Refer to the [NuGet packages](https://blazor.syncfusion.com/documentation/nuget-packages) topic for the available NuGet packages list with component details. {% endtabcontent %} @@ -54,9 +54,9 @@ N> Syncfusion® Blazor components are availa ## Create a new Blazor Web App in Visual Studio Code -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). +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-10.0&pivots=vsc) or the [Syncfusion® Blazor Extension](https://blazor.syncfusion.com/documentation/visual-studio-code-integration/create-project). -Configure the appropriate [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=vsc) when creating the application. +Configure the appropriate interactive render mode and interactivity location when setting up a Blazor Web App. For detailed information, refer to the [interactive render mode documentation](https://blazor.syncfusion.com/documentation/common/interactive-render-mode). For example, for a Blazor Web App with the `Auto` interactive render mode, use the following commands: @@ -70,11 +70,9 @@ cd BlazorWebApp.Client {% endhighlight %} {% endtabs %} -N> For details on creating a **Blazor Web App** with various interactive modes and locations, refer to the [render interactive modes](https://blazor.syncfusion.com/documentation/getting-started/blazor-web-app?tabcontent=visual-studio-code#render-interactive-modes) topic. - ## Install Syncfusion® Blazor Calendars and Themes NuGet in the App -If using `WebAssembly` or `Auto` render modes, install the Syncfusion® Blazor component NuGet packages in the client project. +If using the `WebAssembly` or `Auto` render modes in the Blazor Web App, install Syncfusion® Blazor component NuGet packages in the client project. * Press Ctrl+` to open the integrated terminal in Visual Studio Code. * Ensure the command is run in the project directory that contains the `.csproj` file. @@ -92,20 +90,69 @@ dotnet restore {% endtabs %} -N> Syncfusion® Blazor components are available on NuGet. For the full package list and component details, see [NuGet packages](https://blazor.syncfusion.com/documentation/nuget-packages). +N> Syncfusion® Blazor components are available in [nuget.org](https://www.nuget.org/packages?q=syncfusion.blazor). Refer to the [NuGet packages](https://blazor.syncfusion.com/documentation/nuget-packages) topic for the available NuGet packages list with component details. {% endtabcontent %} -{% endtabcontents %} +{% tabcontent .NET CLI %} -## Register Syncfusion® Blazor Service +## Prerequisites + +Latest version of the [.NET 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). + +{% tabs %} +{% highlight c# tabtitle=".NET CLI" %} + +dotnet --version + +{% endhighlight %} +{% endtabs %} + +## 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). + +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). + +For example, in a Blazor Web App with the `Auto` interactive render mode, use the following commands. + +{% tabs %} +{% highlight c# tabtitle="Blazor Web App" %} + +dotnet new blazor -o BlazorWebApp -int Auto +cd BlazorWebApp +cd BlazorWebApp.Client + +{% endhighlight %} +{% endtabs %} + +This command creates a new Blazor Web App and places it in a new directory called `BlazorWebApp` inside your current location. See the [Create a Blazor App](https://dotnet.microsoft.com/en-us/learn/aspnet/blazor-tutorial/create) and [dotnet new CLI command](https://learn.microsoft.com/en-us/aspnet/core/blazor/tooling?pivots=cli&view=aspnetcore-10.0) topics for more details. + +## Install Syncfusion® Blazor Calendars and Themes NuGet in the App -| Interactive Render Mode | Description | -| -- | -- | -| WebAssembly or Auto | Open **~/_Imports.razor** from the client project. | -| Server | Open **~/_Imports.razor** in the `Components` folder. | +Here's an example of how to add the **Blazor DatePicker** component to the application by using the following commands in a command prompt (Windows), terminal (Linux and macOS), or PowerShell to install the [Syncfusion.Blazor.Calendars](https://www.nuget.org/packages/Syncfusion.Blazor.Calendars/) and [Syncfusion.Blazor.Themes](https://www.nuget.org/packages/Syncfusion.Blazor.Themes/) NuGet packages. See [Install and manage packages using the dotnet CLI](https://learn.microsoft.com/en-us/nuget/consume-packages/install-use-packages-dotnet-cli) for more details. -Import the `Syncfusion.Blazor` and `Syncfusion.Blazor.Calendars` namespaces. +If using the `WebAssembly` or `Auto` render modes in the Blazor Web App, install Syncfusion® Blazor component NuGet packages in the client project. + +{% tabs %} +{% highlight c# tabtitle=".NET CLI" %} + +dotnet add package Syncfusion.Blazor.Calendars --version {{ site.releaseversion }} +dotnet add package Syncfusion.Blazor.Themes --version {{ 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 the [NuGet packages](https://blazor.syncfusion.com/documentation/nuget-packages) topic for the available NuGet package list with component details. + +{% endtabcontent %} + +{% endtabcontents %} + +## Add Import Namespaces + +Open the **~/_Imports.razor** file in the client project and import the `Syncfusion.Blazor` and `Syncfusion.Blazor.Calendars` namespaces. {% tabs %} {% highlight C# tabtitle="~/_Imports.razor" %} @@ -116,9 +163,11 @@ Import the `Syncfusion.Blazor` and `Syncfusion.Blazor.Calendars` namespaces. {% endhighlight %} {% endtabs %} -Now, register the Syncfusion® Blazor service in the **~/Program.cs** file of the Blazor Web App. +## Register Syncfusion® Blazor Service + +Register the Syncfusion® Blazor service in the **~/Program.cs** file of the Blazor Web App. -If the **Interactive Render Mode** is set to `WebAssembly` or `Auto`, register the Syncfusion® Blazor service in both **~/Program.cs** files (server and client) of the Blazor Web App. +If the **Interactive Render Mode** is set to `WebAssembly` or `Auto`, register the Syncfusion® Blazor service in the **~/Program.cs** files of the main `server` project and associated `.Client` project. {% tabs %} {% highlight c# tabtitle="Server(~/_Program.cs)" hl_lines="3 11" %} @@ -152,29 +201,6 @@ await builder.Build().RunAsync(); {% endhighlight %} {% endtabs %} -If the **Interactive Render Mode** is set to `Server`, the project contains a single **~/Program.cs** file. In this case, register the Syncfusion® Blazor service only in that file. - -{% tabs %} -{% highlight c# tabtitle="~/_Program.cs" hl_lines="2 9" %} - -... -using Syncfusion.Blazor; - -var builder = WebApplication.CreateBuilder(args); - -// Add services to the container. -builder.Services.AddRazorComponents() - .AddInteractiveServerComponents(); -builder.Services.AddSyncfusionBlazor(); - -var app = builder.Build(); -.... - -{% endhighlight %} -{% endtabs %} - -N> A valid Syncfusion license is required. For details on generating and registering a license, refer to the [License key registration](https://blazor.syncfusion.com/documentation/common/essential-studio/licensing/overview) documentation. - ## 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: @@ -195,16 +221,15 @@ N> See [Blazor Themes](https://blazor.syncfusion.com/documentation/appearance/th ## Add Syncfusion® Blazor DatePicker component -Add the Syncfusion® Blazor DatePicker component in a `.razor` file inside the `Pages` folder. If the interactivity location is set to `Per page/component`, define a render mode at the top of the component as follows: +Add the Syncfusion® Blazor DatePicker 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 top of the component, as follows: | Interactivity location | RenderMode | Code | | --- | --- | --- | | Per page/component | Auto | @rendermode InteractiveAuto | | | WebAssembly | @rendermode InteractiveWebAssembly | -| | Server | @rendermode InteractiveServer | | | None | --- | -N> If the **Interactivity Location** is set to `Global` and the **Render Mode** is `Auto`, `WebAssembly`, or `Server`, the render mode is configured in the `App.razor` file by default. +N> If the **Interactivity Location** is set to `Global` and the **Render Mode** is `Auto` or `WebAssembly`, the render mode is configured in the `App.razor` file by default. {% tabs %} {% highlight razor %} diff --git a/blazor/daterangepicker/getting-started-with-web-app.md b/blazor/daterangepicker/getting-started-with-web-app.md index 0c6449b4f4..6b5b32afc4 100644 --- a/blazor/daterangepicker/getting-started-with-web-app.md +++ b/blazor/daterangepicker/getting-started-with-web-app.md @@ -9,7 +9,7 @@ documentation: ug # Getting Started with Blazor DateRangePicker Component in Web App -This section briefly explains about how to include [Blazor DateRangePicker](https://www.syncfusion.com/blazor-components/blazor-daterangepicker) component in your Blazor Web App using [Visual Studio](https://visualstudio.microsoft.com/vs/) and Visual Studio Code. +This section briefly explains about how to include [Blazor DateRangePicker](https://www.syncfusion.com/blazor-components/blazor-daterangepicker) component in your Blazor Web App using [Visual Studio](https://visualstudio.microsoft.com/vs/), [Visual Studio Code](https://code.visualstudio.com/), and the [.NET CLI](https://learn.microsoft.com/en-us/dotnet/core/tools/). {% tabcontents %} @@ -21,15 +21,15 @@ This section briefly explains about how to include [Blazor DateRangePicker](http ## 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&pivots=vs) or the [Syncfusion® Blazor Extension](https://blazor.syncfusion.com/documentation/visual-studio-integration/template-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-10.0&pivots=vs) or the [Syncfusion® Blazor Extension](https://blazor.syncfusion.com/documentation/visual-studio-integration/template-studio). -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=vs) while creating a Blazor Web Application. +Configure the appropriate [Interactive render mode](https://learn.microsoft.com/en-us/aspnet/core/blazor/components/render-modes?view=aspnetcore-10.0#render-modes) and [Interactivity location](https://learn.microsoft.com/en-us/aspnet/core/blazor/tooling?view=aspnetcore-10.0&pivots=vs) while creating a Blazor Web App. ## Install Syncfusion® Blazor Calendars and Themes NuGet in the Blazor Web App -To add **Blazor DateRangePicker** 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.Calendars](https://www.nuget.org/packages/Syncfusion.Blazor.Calendars/) and [Syncfusion.Blazor.Themes](https://www.nuget.org/packages/Syncfusion.Blazor.Themes/). +To add the **Blazor DateRangePicker** component in the app, open the NuGet package manager in Visual Studio (*Tools → NuGet Package Manager → Manage NuGet Packages for Solution*), then search and install [Syncfusion.Blazor.Calendars](https://www.nuget.org/packages/Syncfusion.Blazor.Calendars/) and [Syncfusion.Blazor.Themes](https://www.nuget.org/packages/Syncfusion.Blazor.Themes/). -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 using the `WebAssembly or Auto` render modes in the Blazor Web App, install Syncfusion® Blazor component NuGet packages in the client project. Alternatively, you can utilize the following package manager command to achieve the same. @@ -42,7 +42,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 in [nuget.org](https://www.nuget.org/packages?q=syncfusion.blazor). Refer to the [NuGet packages](https://blazor.syncfusion.com/documentation/nuget-packages) topic for the available NuGet packages list with component details. {% endtabcontent %} @@ -54,9 +54,9 @@ N> Syncfusion® Blazor components are availa ## 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). +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-10.0&pivots=vsc) or the [Syncfusion® Blazor Extension](https://blazor.syncfusion.com/documentation/visual-studio-code-integration/create-project). -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=vsc) while creating a Blazor Web Application. +Configure the appropriate interactive render mode and interactivity location when setting up a Blazor Web App. For detailed information, 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. @@ -70,11 +70,9 @@ cd BlazorWebApp.Client {% endhighlight %} {% endtabs %} -N> For more information on creating a **Blazor Web App** with various interactive modes and locations, refer to this [link](https://blazor.syncfusion.com/documentation/getting-started/blazor-web-app?tabcontent=visual-studio-code#render-interactive-modes). - ## Install Syncfusion® Blazor Calendars 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 using the `WebAssembly` or `Auto` render modes in the Blazor Web App, install Syncfusion® Blazor component 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. @@ -92,20 +90,69 @@ dotnet restore {% 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 in [nuget.org](https://www.nuget.org/packages?q=syncfusion.blazor). Refer to the [NuGet packages](https://blazor.syncfusion.com/documentation/nuget-packages) topic for the available NuGet packages list with component details. {% endtabcontent %} -{% endtabcontents %} +{% tabcontent .NET CLI %} -## Register Syncfusion® Blazor Service +## Prerequisites + +Latest version of the [.NET 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). + +{% tabs %} +{% highlight c# tabtitle=".NET CLI" %} + +dotnet --version + +{% endhighlight %} +{% endtabs %} + +## 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). + +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). + +For example, in a Blazor Web App with the `Auto` interactive render mode, use the following commands. -| Interactive Render Mode | Description | -| -- | -- | -| WebAssembly or Auto | Open **~/_Imports.razor** file from the client project.| -| Server | Open **~/_import.razor** file, which is located in the `Components` folder.| +{% tabs %} +{% highlight c# tabtitle="Blazor Web App" %} + +dotnet new blazor -o BlazorWebApp -int Auto +cd BlazorWebApp +cd BlazorWebApp.Client + +{% endhighlight %} +{% endtabs %} + +This command creates a new Blazor Web App and places it in a new directory called `BlazorWebApp` inside your current location. See the [Create a Blazor App](https://dotnet.microsoft.com/en-us/learn/aspnet/blazor-tutorial/create) and [dotnet new CLI command](https://learn.microsoft.com/en-us/aspnet/core/blazor/tooling?pivots=cli&view=aspnetcore-10.0) topics for more details. + +## Install Syncfusion® Blazor Calendars and Themes NuGet in the App -Import the `Syncfusion.Blazor` and `Syncfusion.Blazor.Calendars` namespace. +Here's an example of how to add the **Blazor DateRangePicker** component to the application by using the following commands in a command prompt (Windows), terminal (Linux and macOS), or PowerShell to install the [Syncfusion.Blazor.Calendars](https://www.nuget.org/packages/Syncfusion.Blazor.Calendars/) and [Syncfusion.Blazor.Themes](https://www.nuget.org/packages/Syncfusion.Blazor.Themes/) NuGet packages. See [Install and manage packages using the dotnet CLI](https://learn.microsoft.com/en-us/nuget/consume-packages/install-use-packages-dotnet-cli) for more details. + +If using the `WebAssembly` or `Auto` render modes in the Blazor Web App, install Syncfusion® Blazor component NuGet packages in the client project. + +{% tabs %} +{% highlight c# tabtitle=".NET CLI" %} + +dotnet add package Syncfusion.Blazor.Calendars --version {{ site.releaseversion }} +dotnet add package Syncfusion.Blazor.Themes --version {{ 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 the [NuGet packages](https://blazor.syncfusion.com/documentation/nuget-packages) topic for the available NuGet package list with component details. + +{% endtabcontent %} + +{% endtabcontents %} + +## Add Import Namespaces + +Open the **~/_Imports.razor** file in the client project and import the `Syncfusion.Blazor` and `Syncfusion.Blazor.Calendars` namespaces. {% tabs %} {% highlight C# tabtitle="~/_Imports.razor" %} @@ -116,9 +163,11 @@ Import the `Syncfusion.Blazor` and `Syncfusion.Blazor.Calendars` namespace. {% endhighlight %} {% endtabs %} -Now, register the Syncfusion® Blazor Service in the **~/Program.cs** file of your Blazor Web App. +## Register Syncfusion® Blazor Service + +Register the Syncfusion® Blazor Service in the **~/Program.cs** file of your Blazor Web App. -If the **Interactive Render Mode** is set to `WebAssembly` or `Auto`, you need to register the Syncfusion® Blazor service in both **~/Program.cs** files of your Blazor Web App. +If the **Interactive Render Mode** is set to `WebAssembly` or `Auto`, register the Syncfusion® Blazor service in the **~/Program.cs** files of the main `server` project and associated `.Client` project. {% tabs %} {% highlight c# tabtitle="Server(~/_Program.cs)" hl_lines="3 11" %} @@ -152,27 +201,6 @@ await builder.Build().RunAsync(); {% endhighlight %} {% endtabs %} -If the **Interactive Render Mode** is set to `Server`, your project will contain a single **~/Program.cs** file. So, you should register the Syncfusion® Blazor Service only in that **~/Program.cs** file. - -{% tabs %} -{% highlight c# tabtitle="~/_Program.cs" hl_lines="2 9" %} - -... -using Syncfusion.Blazor; - -var builder = WebApplication.CreateBuilder(args); - -// Add services to the container. -builder.Services.AddRazorComponents() - .AddInteractiveServerComponents(); -builder.Services.AddSyncfusionBlazor(); - -var app = builder.Build(); -.... - -{% 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 reference in the `` section and the script reference at the end of the `` in the **~/Components/App.razor** file as shown below: @@ -193,16 +221,15 @@ N> Check out the [Blazor Themes](https://blazor.syncfusion.com/documentation/app ## Add Syncfusion® Blazor DateRangePicker component -Add the Syncfusion® Blazor DateRangePicker component in `.razor` file inside the `Pages` folder. If an interactivity location as `Per page/component` in the web app, define a render mode at top of the component, as follows: +Add the Syncfusion® Blazor DateRangePicker 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 top of the component, as follows: | Interactivity location | RenderMode | Code | | --- | --- | --- | | Per page/component | Auto | @rendermode InteractiveAuto | | | WebAssembly | @rendermode InteractiveWebAssembly | -| | Server | @rendermode InteractiveServer | | | None | --- | -N> If an **Interactivity Location** is set to `Global` and the **Render Mode** is set to `Auto` or `WebAssembly` or `Server`, the render mode is configured in the `App.razor` file by default. +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. {% tabs %} {% highlight razor %} @@ -221,7 +248,7 @@ N> If an **Interactivity Location** is set to `Global` and the **Render Mode** i {% endhighlight %} {% endtabs %} -* Press Ctrl+F5 (Windows) or +F5 (macOS) to launch the application. This will render the Syncfusion® Blazor DateRangePicker component in your default web browser. +* Press Ctrl+F5 (Windows) or +F5 (macOS) to launch the application. This will render the Syncfusion® Blazor DateRangePicker component in the default web browser. {% previewsample "https://blazorplayground.syncfusion.com/embed/rDhTZCBOqWgwMmva?appbar=false&editor=false&result=true&errorlist=false&theme=bootstrap5" backgroundimage "[Blazor DateRangePicker Component](./images/blazor-daterangepicker-component.png)" %} diff --git a/blazor/datetime-picker/getting-started-with-web-app.md b/blazor/datetime-picker/getting-started-with-web-app.md index f492904f7b..94a8027455 100644 --- a/blazor/datetime-picker/getting-started-with-web-app.md +++ b/blazor/datetime-picker/getting-started-with-web-app.md @@ -9,7 +9,7 @@ documentation: ug # Getting Started with Blazor DateTimePicker Component in Web App -This section briefly explains about how to include [Blazor DateTimePicker](https://www.syncfusion.com/blazor-components/blazor-datetime-picker) component in your Blazor Web App using [Visual Studio](https://visualstudio.microsoft.com/vs/) and Visual Studio Code. +This section briefly explains about how to include [Blazor DateTimePicker](https://www.syncfusion.com/blazor-components/blazor-datetime-picker) component in your Blazor Web App using [Visual Studio](https://visualstudio.microsoft.com/vs/), [Visual Studio Code](https://code.visualstudio.com/), and the [.NET CLI](https://learn.microsoft.com/en-us/dotnet/core/tools/). {% tabcontents %} @@ -21,15 +21,15 @@ This section briefly explains about how to include [Blazor DateTimePicker](https ## 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&pivots=vs) or the [Syncfusion® Blazor Extension](https://blazor.syncfusion.com/documentation/visual-studio-integration/template-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-10.0&pivots=vs) or the [Syncfusion® Blazor Extension](https://blazor.syncfusion.com/documentation/visual-studio-integration/template-studio). -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=vs) while creating a Blazor Web Application. +Configure the appropriate [Interactive render mode](https://learn.microsoft.com/en-us/aspnet/core/blazor/components/render-modes?view=aspnetcore-10.0#render-modes) and [Interactivity location](https://learn.microsoft.com/en-us/aspnet/core/blazor/tooling?view=aspnetcore-10.0&pivots=vs) while creating a Blazor Web App. ## Install Syncfusion® Blazor Calendars and Themes NuGet in the Blazor Web App -To add **Blazor DateTimePicker** 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.Calendars](https://www.nuget.org/packages/Syncfusion.Blazor.Calendars/) and [Syncfusion.Blazor.Themes](https://www.nuget.org/packages/Syncfusion.Blazor.Themes/). +To add the **Blazor DateTimePicker** component in the app, open the NuGet package manager in Visual Studio (*Tools → NuGet Package Manager → Manage NuGet Packages for Solution*), then search and install [Syncfusion.Blazor.Calendars](https://www.nuget.org/packages/Syncfusion.Blazor.Calendars/) and [Syncfusion.Blazor.Themes](https://www.nuget.org/packages/Syncfusion.Blazor.Themes/). -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 using the `WebAssembly or Auto` render modes in the Blazor Web App, install Syncfusion® Blazor component NuGet packages in the client project. Alternatively, you can utilize the following package manager command to achieve the same. @@ -42,7 +42,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 in [nuget.org](https://www.nuget.org/packages?q=syncfusion.blazor). Refer to the [NuGet packages](https://blazor.syncfusion.com/documentation/nuget-packages) topic for the available NuGet packages list with component details. {% endtabcontent %} @@ -54,9 +54,9 @@ N> Syncfusion® Blazor components are availa ## 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). +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-10.0&pivots=vsc) or the [Syncfusion® Blazor Extension](https://blazor.syncfusion.com/documentation/visual-studio-code-integration/create-project). -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=vsc) while creating a Blazor Web Application. +Configure the appropriate interactive render mode and interactivity location when setting up a Blazor Web App. For detailed information, 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. @@ -70,11 +70,9 @@ cd BlazorWebApp.Client {% endhighlight %} {% endtabs %} -N> For more information on creating a **Blazor Web App** with various interactive modes and locations, refer to this [link](https://blazor.syncfusion.com/documentation/getting-started/blazor-web-app?tabcontent=visual-studio-code#render-interactive-modes). - ## Install Syncfusion® Blazor Calendars 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 using the `WebAssembly` or `Auto` render modes in the Blazor Web App, install Syncfusion® Blazor component 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. @@ -92,20 +90,69 @@ dotnet restore {% 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 in [nuget.org](https://www.nuget.org/packages?q=syncfusion.blazor). Refer to the [NuGet packages](https://blazor.syncfusion.com/documentation/nuget-packages) topic for the available NuGet packages list with component details. {% endtabcontent %} -{% endtabcontents %} +{% tabcontent .NET CLI %} -## Register Syncfusion® Blazor Service +## Prerequisites + +Latest version of the [.NET 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). + +{% tabs %} +{% highlight c# tabtitle=".NET CLI" %} + +dotnet --version + +{% endhighlight %} +{% endtabs %} + +## 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). + +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). + +For example, in a Blazor Web App with the `Auto` interactive render mode, use the following commands. -| Interactive Render Mode | Description | -| -- | -- | -| WebAssembly or Auto | Open **~/_Imports.razor** file from the client project.| -| Server | Open **~/_import.razor** file, which is located in the `Components` folder.| +{% tabs %} +{% highlight c# tabtitle="Blazor Web App" %} + +dotnet new blazor -o BlazorWebApp -int Auto +cd BlazorWebApp +cd BlazorWebApp.Client + +{% endhighlight %} +{% endtabs %} + +This command creates a new Blazor Web App and places it in a new directory called `BlazorWebApp` inside your current location. See the [Create a Blazor App](https://dotnet.microsoft.com/en-us/learn/aspnet/blazor-tutorial/create) and [dotnet new CLI command](https://learn.microsoft.com/en-us/aspnet/core/blazor/tooling?pivots=cli&view=aspnetcore-10.0) topics for more details. + +## Install Syncfusion® Blazor Calendars and Themes NuGet in the App -Import the `Syncfusion.Blazor` and `Syncfusion.Blazor.Calendars` namespace. +Here's an example of how to add the **Blazor DateTimePicker** component to the application by using the following commands in a command prompt (Windows), terminal (Linux and macOS), or PowerShell to install the [Syncfusion.Blazor.Calendars](https://www.nuget.org/packages/Syncfusion.Blazor.Calendars/) and [Syncfusion.Blazor.Themes](https://www.nuget.org/packages/Syncfusion.Blazor.Themes/) NuGet packages. See [Install and manage packages using the dotnet CLI](https://learn.microsoft.com/en-us/nuget/consume-packages/install-use-packages-dotnet-cli) for more details. + +If using the `WebAssembly` or `Auto` render modes in the Blazor Web App, install Syncfusion® Blazor component NuGet packages in the client project. + +{% tabs %} +{% highlight c# tabtitle=".NET CLI" %} + +dotnet add package Syncfusion.Blazor.Calendars --version {{ site.releaseversion }} +dotnet add package Syncfusion.Blazor.Themes --version {{ 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 the [NuGet packages](https://blazor.syncfusion.com/documentation/nuget-packages) topic for the available NuGet package list with component details. + +{% endtabcontent %} + +{% endtabcontents %} + +## Add Import Namespaces + +Open the **~/_Imports.razor** file in the client project and import the `Syncfusion.Blazor` and `Syncfusion.Blazor.Calendars` namespaces. {% tabs %} {% highlight C# tabtitle="~/_Imports.razor" %} @@ -116,9 +163,11 @@ Import the `Syncfusion.Blazor` and `Syncfusion.Blazor.Calendars` namespace. {% endhighlight %} {% endtabs %} -Now, register the Syncfusion® Blazor Service in the **~/Program.cs** file of your Blazor Web App. +## Register Syncfusion® Blazor Service + +Register the Syncfusion® Blazor Service in the **~/Program.cs** file of your Blazor Web App. -If the **Interactive Render Mode** is set to `WebAssembly` or `Auto`, you need to register the Syncfusion® Blazor service in both **~/Program.cs** files of your Blazor Web App. +If the **Interactive Render Mode** is set to `WebAssembly` or `Auto`, register the Syncfusion® Blazor service in the **~/Program.cs** files of the main `server` project and associated `.Client` project. {% tabs %} {% highlight c# tabtitle="Server(~/_Program.cs)" hl_lines="3 11" %} @@ -152,27 +201,6 @@ await builder.Build().RunAsync(); {% endhighlight %} {% endtabs %} -If the **Interactive Render Mode** is set to `Server`, your project will contain a single **~/Program.cs** file. So, you should register the Syncfusion® Blazor Service only in that **~/Program.cs** file. - -{% tabs %} -{% highlight c# tabtitle="~/_Program.cs" hl_lines="2 9" %} - -... -using Syncfusion.Blazor; - -var builder = WebApplication.CreateBuilder(args); - -// Add services to the container. -builder.Services.AddRazorComponents() - .AddInteractiveServerComponents(); -builder.Services.AddSyncfusionBlazor(); - -var app = builder.Build(); -.... - -{% 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 reference in the `` section and the script reference at the end of the `` in the **~/Components/App.razor** file as shown below: @@ -193,16 +221,15 @@ N> Check out the [Blazor Themes](https://blazor.syncfusion.com/documentation/app ## Add Syncfusion® Blazor DateTimePicker component -Add the Syncfusion® Blazor DateTimePicker component in `.razor` file inside the `Pages` folder. If an interactivity location as `Per page/component` in the web app, define a render mode at top of the component, as follows: +Add the Syncfusion® Blazor DateTimePicker 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 top of the component, as follows: | Interactivity location | RenderMode | Code | | --- | --- | --- | | Per page/component | Auto | @rendermode InteractiveAuto | | | WebAssembly | @rendermode InteractiveWebAssembly | -| | Server | @rendermode InteractiveServer | | | None | --- | -N> If an **Interactivity Location** is set to `Global` and the **Render Mode** is set to `Auto` or `WebAssembly` or `Server`, the render mode is configured in the `App.razor` file by default. +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. {% tabs %} {% highlight razor %} @@ -221,7 +248,7 @@ N> If an **Interactivity Location** is set to `Global` and the **Render Mode** i {% endhighlight %} {% endtabs %} -* Press Ctrl+F5 (Windows) or +F5 (macOS) to launch the application. This will render the Syncfusion® Blazor DateTimePicker component in your default web browser. +* Press Ctrl+F5 (Windows) or +F5 (macOS) to launch the application. This will render the Syncfusion® Blazor DateTimePicker component in the default web browser. {% previewsample "https://blazorplayground.syncfusion.com/embed/BZLzDsBOKWcNOSex?appbar=false&editor=false&result=true&errorlist=false&theme=bootstrap5" backgroundimage "[Blazor DateTimePicker Component](./images/blazor-datetimepicker-component.png)" %} diff --git a/blazor/diagram/getting-started-with-web-app.md b/blazor/diagram/getting-started-with-web-app.md index 5b6b1f4d09..bf1ae5e49b 100644 --- a/blazor/diagram/getting-started-with-web-app.md +++ b/blazor/diagram/getting-started-with-web-app.md @@ -9,7 +9,7 @@ documentation: ug # Getting Started with Blazor Diagram Component in Web App -This section briefly explains how to include the [Blazor Diagram](https://www.syncfusion.com/blazor-components/blazor-diagram) component in your Blazor Web App using [Visual Studio](https://visualstudio.microsoft.com/vs/), Visual Studio Code, and the .NET CLI. +This section briefly explains how to include the [Blazor Diagram](https://www.syncfusion.com/blazor-components/blazor-diagram) component in your Blazor Web App using [Visual Studio](https://visualstudio.microsoft.com/vs/), [Visual Studio Code](https://code.visualstudio.com/), and the [.NET CLI](https://learn.microsoft.com/en-us/dotnet/core/tools/). > **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) @@ -23,17 +23,17 @@ This section briefly explains how to include the [Blazor Diagram](https://www.sy ## Step 1: How to Create a New Blazor Web App -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&pivots=vs) or the [Syncfusion® Blazor Extension](https://blazor.syncfusion.com/documentation/visual-studio-integration/template-studio). For detailed instructions, refer to the [this Blazor Web App Getting Started](https://blazor.syncfusion.com/documentation/getting-started/blazor-web-app) documentation. +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-10.0&pivots=vs) or the [Syncfusion® Blazor Extension](https://blazor.syncfusion.com/documentation/visual-studio-integration/template-studio). -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=vs) while creating a Blazor Web Application. +Configure the appropriate [Interactive render mode](https://learn.microsoft.com/en-us/aspnet/core/blazor/components/render-modes?view=aspnetcore-10.0#render-modes) and [Interactivity location](https://learn.microsoft.com/en-us/aspnet/core/blazor/tooling?view=aspnetcore-10.0&pivots=vs) while creating a Blazor Web App. ![Create Blazor Web App](images/blazor-create-web-app.png) ## Step 2: How to Install Syncfusion® Blazor Diagram and Themes NuGet Packages in the Blazor Web App -To add the **Blazor Diagram** 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.Diagram](https://www.nuget.org/packages/Syncfusion.Blazor.Diagram/) and [Syncfusion.Blazor.Themes](https://www.nuget.org/packages/Syncfusion.Blazor.Themes/). +To add the **Blazor Diagram** component in the app, open the NuGet package manager in Visual Studio (*Tools → NuGet Package Manager → Manage NuGet Packages for Solution*), then search and install [Syncfusion.Blazor.Diagram](https://www.nuget.org/packages/Syncfusion.Blazor.Diagram/) and [Syncfusion.Blazor.Themes](https://www.nuget.org/packages/Syncfusion.Blazor.Themes/). -If using the `WebAssembly or Auto` render modes in the Blazor Web App need to be install Syncfusion® Blazor components NuGet packages within the client project. +If using the `WebAssembly or Auto` render modes in the Blazor Web App, install Syncfusion® Blazor component NuGet packages in the client project. Alternatively, use the following package manager command to achieve the same. @@ -46,7 +46,7 @@ Install-Package Syncfusion.Blazor.Themes -Version {{ site.releaseversion }} {% endhighlight %} {% endtabs %} -N> Syncfusion® Blazor components are available on [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). Refer to the [NuGet packages](https://blazor.syncfusion.com/documentation/nuget-packages) topic for the available NuGet packages list with component details. ## Step 3: Add Import Namespaces @@ -65,7 +65,7 @@ Open the **~/_Imports.razor** file in the client project and import the `Syncfus Register the Syncfusion® Blazor service in the **~/Program.cs** file of your Blazor Web App. -If the Blazor Web App uses `WebAssembly` or `Auto` interactive render modes, register the Syncfusion® Blazor service in the **~/Program.cs** files of the main `server` project and associated `.Client` project. +If the **Interactive Render Mode** is set to `WebAssembly` or `Auto`, register the Syncfusion® Blazor service in the **~/Program.cs** files of the main `server` project and associated `.Client` project. {% tabs %} {% highlight c# tabtitle="Server(~/_Program.cs)" hl_lines="3 11" %} @@ -158,9 +158,9 @@ N> If the **Interactivity Location** is set to `Global` and the **Render Mode** ## Step 1: How to Create a New Blazor Web App in Visual Studio Code -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 the [this Blazor Web App Getting Started](https://blazor.syncfusion.com/documentation/getting-started/blazor-web-app?tabcontent=visual-studio-code) documentation. +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-10.0&pivots=vsc) or the [Syncfusion® Blazor Extension](https://blazor.syncfusion.com/documentation/visual-studio-code-integration/create-project). -Configure the appropriate interactive render mode and interactivity location when setting up the Blazor Web Application. For more information, refer to the [interactive render mode documentation](https://blazor.syncfusion.com/documentation/common/interactive-render-mode). +Configure the appropriate interactive render mode and interactivity location when setting up a Blazor Web App. For detailed information, refer to the [interactive render mode documentation](https://blazor.syncfusion.com/documentation/common/interactive-render-mode). For example, for a Blazor Web App with the `Auto` interactive render mode, use the following commands. @@ -176,7 +176,7 @@ cd BlazorWebApp.Client ## Step 2: How to Install Syncfusion® Blazor Diagram and Themes NuGet Packages in the App -If using the `WebAssembly` or `Auto` render modes in the Blazor Web App need to be install Syncfusion® Blazor components NuGet packages within the client project. +If using the `WebAssembly` or `Auto` render modes in the Blazor Web App, install Syncfusion® Blazor component NuGet packages in the client project. * Press Ctrl+` to open the integrated terminal in Visual Studio Code. * Ensure the current directory is the project root directory where your `.csproj` file is located. @@ -213,7 +213,7 @@ Open the **~/_Imports.razor** file in the client project and import the `Syncfus Register the Syncfusion® Blazor service in the **~/Program.cs** file of your Blazor Web App. -If the Blazor Web App uses `WebAssembly` or `Auto` interactive render modes, register the Syncfusion® Blazor service in the **~/Program.cs** files of the main `server` project and associated `.Client` project. +If the **Interactive Render Mode** is set to `WebAssembly` or `Auto`, register the Syncfusion® Blazor service in the **~/Program.cs** files of the main `server` project and associated `.Client` project. {% tabs %} {% highlight c# tabtitle="Server(~/_Program.cs)" hl_lines="3 11" %} @@ -330,13 +330,13 @@ cd BlazorApp.Client {% endhighlight %} {% endtabs %} -This command creates a new Blazor Web app project and places it in a new directory called `BlazorApp` inside the 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/aspnet/core/blazor/tooling?pivots=linux-macos&view=aspnetcore-8.0) topics for more details. +This command creates a new Blazor Web App and places it in a new directory called `BlazorApp` inside your current location. See the [Create a Blazor App](https://dotnet.microsoft.com/en-us/learn/aspnet/blazor-tutorial/create) and [dotnet new CLI command](https://learn.microsoft.com/en-us/aspnet/core/blazor/tooling?pivots=cli&view=aspnetcore-10.0) topics for more details. ## Step 2: Install Syncfusion® Blazor Diagram and Themes NuGet in the App Here's an example of how to add **Blazor Diagram** component in the application using the following command in the command prompt (Windows) or terminal (Linux and macOS) to install a [Syncfusion.Blazor.Diagram](https://www.nuget.org/packages/Syncfusion.Blazor.Diagram/) 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. -If using the `WebAssembly or Auto` render modes in the Blazor Web App need to be install Syncfusion® Blazor components NuGet packages within the client project. +If using the `WebAssembly or Auto` render modes in the Blazor Web App, install Syncfusion® Blazor component NuGet packages in the client project. {% tabs %} {% highlight c# tabtitle=".NET CLI" %} @@ -348,7 +348,7 @@ dotnet restore {% endhighlight %} {% endtabs %} -N> Syncfusion® Blazor components are available on [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). Refer to the [NuGet packages](https://blazor.syncfusion.com/documentation/nuget-packages) topic for the available NuGet packages list with component details. ## Step 3: Add Import Namespaces @@ -367,7 +367,7 @@ Open the **~/_Imports.razor** file from the client project and import the `Syncf Register the Syncfusion® Blazor service in the **~/Program.cs** file of your Blazor Web App. -If the Blazor Web App uses `WebAssembly` or `Auto` interactive render modes, register the Syncfusion® Blazor service in the **~/Program.cs** files of the main `server` project and associated `.Client` project. +If the **Interactive Render Mode** is set to `WebAssembly` or `Auto`, register the Syncfusion® Blazor service in the **~/Program.cs** files of the main `server` project and associated `.Client` project. {% tabs %} {% highlight c# tabtitle="Server(~/_Program.cs)" hl_lines="3 11" %} diff --git a/blazor/dialog/getting-started-with-web-app.md b/blazor/dialog/getting-started-with-web-app.md index 28e78564c2..35a6487fcc 100644 --- a/blazor/dialog/getting-started-with-web-app.md +++ b/blazor/dialog/getting-started-with-web-app.md @@ -9,7 +9,7 @@ documentation: ug # Getting Started with Blazor Dialog Component in Web App -This section briefly explains about how to include [Blazor Dialog](https://www.syncfusion.com/blazor-components/blazor-modal-dialog) component in your Blazor Web App using [Visual Studio](https://visualstudio.microsoft.com/vs/) and Visual Studio Code. +This section briefly explains about how to include [Blazor Dialog](https://www.syncfusion.com/blazor-components/blazor-modal-dialog) component in your Blazor Web App using [Visual Studio](https://visualstudio.microsoft.com/vs/), [Visual Studio Code](https://code.visualstudio.com/), and the [.NET CLI](https://learn.microsoft.com/en-us/dotnet/core/tools/). {% tabcontents %} @@ -21,15 +21,15 @@ This section briefly explains about how to include [Blazor Dialog](https://www.s ## 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&pivots=vs) or the [Syncfusion® Blazor Extension](https://blazor.syncfusion.com/documentation/visual-studio-integration/template-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-10.0&pivots=vs) or the [Syncfusion® Blazor Extension](https://blazor.syncfusion.com/documentation/visual-studio-integration/template-studio). -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=vs) while creating a Blazor Web Application. +Configure the appropriate [Interactive render mode](https://learn.microsoft.com/en-us/aspnet/core/blazor/components/render-modes?view=aspnetcore-10.0#render-modes) and [Interactivity location](https://learn.microsoft.com/en-us/aspnet/core/blazor/tooling?view=aspnetcore-10.0&pivots=vs) while creating a Blazor Web App. ## Install Syncfusion® Blazor Popups and Themes NuGet in the Blazor Web App -To add **Blazor Dialog** 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.Popups](https://www.nuget.org/packages/Syncfusion.Blazor.Popups/) and [Syncfusion.Blazor.Themes](https://www.nuget.org/packages/Syncfusion.Blazor.Themes/). +To add the **Blazor Dialog** component in the app, open the NuGet package manager in Visual Studio (*Tools → NuGet Package Manager → Manage NuGet Packages for Solution*), then search and install [Syncfusion.Blazor.Popups](https://www.nuget.org/packages/Syncfusion.Blazor.Popups/) and [Syncfusion.Blazor.Themes](https://www.nuget.org/packages/Syncfusion.Blazor.Themes/). -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 using the `WebAssembly or Auto` render modes in the Blazor Web App, install Syncfusion® Blazor component NuGet packages in the client project. Alternatively, you can utilize the following package manager command to achieve the same. @@ -42,7 +42,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 in [nuget.org](https://www.nuget.org/packages?q=syncfusion.blazor). Refer to the [NuGet packages](https://blazor.syncfusion.com/documentation/nuget-packages) topic for the available NuGet packages list with component details. {% endtabcontent %} @@ -54,9 +54,9 @@ N> Syncfusion® Blazor components are availa ## 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). +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-10.0&pivots=vsc) or the [Syncfusion® Blazor Extension](https://blazor.syncfusion.com/documentation/visual-studio-code-integration/create-project). -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=vsc) while creating a Blazor Web Application. +Configure the appropriate interactive render mode and interactivity location when setting up a Blazor Web App. For detailed information, 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. @@ -70,11 +70,9 @@ cd BlazorWebApp.Client {% endhighlight %} {% endtabs %} -N> For more information on creating a **Blazor Web App** with various interactive modes and locations, refer to this [link](https://blazor.syncfusion.com/documentation/getting-started/blazor-web-app?tabcontent=visual-studio-code#render-interactive-modes). - ## Install Syncfusion® Blazor Popups 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 using the `WebAssembly` or `Auto` render modes in the Blazor Web App, install Syncfusion® Blazor component 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. @@ -92,20 +90,69 @@ dotnet restore {% 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 in [nuget.org](https://www.nuget.org/packages?q=syncfusion.blazor). Refer to the [NuGet packages](https://blazor.syncfusion.com/documentation/nuget-packages) topic for the available NuGet packages list with component details. {% endtabcontent %} -{% endtabcontents %} +{% tabcontent .NET CLI %} -## Register Syncfusion® Blazor Service +## Prerequisites + +Latest version of the [.NET 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). + +{% tabs %} +{% highlight c# tabtitle=".NET CLI" %} + +dotnet --version + +{% endhighlight %} +{% endtabs %} + +## 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). + +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). + +For example, in a Blazor Web App with the `Auto` interactive render mode, use the following commands. -| Interactive Render Mode | Description | -| -- | -- | -| WebAssembly or Auto | Open **~/_Imports.razor** file from the client project.| -| Server | Open **~/_import.razor** file, which is located in the `Components` folder.| +{% tabs %} +{% highlight c# tabtitle="Blazor Web App" %} + +dotnet new blazor -o BlazorWebApp -int Auto +cd BlazorWebApp +cd BlazorWebApp.Client + +{% endhighlight %} +{% endtabs %} + +This command creates a new Blazor Web App and places it in a new directory called `BlazorWebApp` inside your current location. See the [Create a Blazor App](https://dotnet.microsoft.com/en-us/learn/aspnet/blazor-tutorial/create) and [dotnet new CLI command](https://learn.microsoft.com/en-us/aspnet/core/blazor/tooling?pivots=cli&view=aspnetcore-10.0) topics for more details. + +## Install Syncfusion® Blazor Popups and Themes NuGet in the App -Import the `Syncfusion.Blazor` and `Syncfusion.Blazor.Popups` namespace. +Here's an example of how to add the **Blazor Dialog** component to the application by using the following commands in a command prompt (Windows), terminal (Linux and macOS), or PowerShell to install the [Syncfusion.Blazor.Popups](https://www.nuget.org/packages/Syncfusion.Blazor.Popups/) and [Syncfusion.Blazor.Themes](https://www.nuget.org/packages/Syncfusion.Blazor.Themes/) NuGet packages. See [Install and manage packages using the dotnet CLI](https://learn.microsoft.com/en-us/nuget/consume-packages/install-use-packages-dotnet-cli) for more details. + +If using the `WebAssembly` or `Auto` render modes in the Blazor Web App, install Syncfusion® Blazor component NuGet packages in the client project. + +{% tabs %} +{% highlight c# tabtitle=".NET CLI" %} + +dotnet add package Syncfusion.Blazor.Popups --version {{ site.releaseversion }} +dotnet add package Syncfusion.Blazor.Themes --version {{ 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 the [NuGet packages](https://blazor.syncfusion.com/documentation/nuget-packages) topic for the available NuGet package list with component details. + +{% endtabcontent %} + +{% endtabcontents %} + +## Add Import Namespaces + +Open the **~/_Imports.razor** file in the client project and import the `Syncfusion.Blazor` and `Syncfusion.Blazor.Popups` namespaces. {% tabs %} {% highlight C# tabtitle="~/_Imports.razor" %} @@ -116,9 +163,11 @@ Import the `Syncfusion.Blazor` and `Syncfusion.Blazor.Popups` namespace. {% endhighlight %} {% endtabs %} -Now, register the Syncfusion® Blazor Service in the **~/Program.cs** file of your Blazor Web App. +## Register Syncfusion® Blazor Service + +Register the Syncfusion® Blazor Service in the **~/Program.cs** file of your Blazor Web App. -If the **Interactive Render Mode** is set to `WebAssembly` or `Auto`, you need to register the Syncfusion® Blazor service in both **~/Program.cs** files of your Blazor Web App. +If the **Interactive Render Mode** is set to `WebAssembly` or `Auto`, register the Syncfusion® Blazor service in the **~/Program.cs** files of the main `server` project and associated `.Client` project. {% tabs %} {% highlight c# tabtitle="Server(~/_Program.cs)" hl_lines="3 11" %} @@ -152,27 +201,6 @@ await builder.Build().RunAsync(); {% endhighlight %} {% endtabs %} -If the **Interactive Render Mode** is set to `Server`, your project will contain a single **~/Program.cs** file. So, you should register the Syncfusion® Blazor Service only in that **~/Program.cs** file. - -{% tabs %} -{% highlight c# tabtitle="~/_Program.cs" hl_lines="2 9" %} - -... -using Syncfusion.Blazor; - -var builder = WebApplication.CreateBuilder(args); - -// Add services to the container. -builder.Services.AddRazorComponents() - .AddInteractiveServerComponents(); -builder.Services.AddSyncfusionBlazor(); - -var app = builder.Build(); -.... - -{% 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 reference in the `` section and the script reference at the end of the `` in the **~/Components/App.razor** file as shown below: @@ -193,16 +221,15 @@ N> Check out the [Blazor Themes](https://blazor.syncfusion.com/documentation/app ## Add Syncfusion® Blazor Dialog component -Add the Syncfusion® Blazor Dialog component in `.razor` file inside the `Pages` folder. If an interactivity location as `Per page/component` in the web app, define a render mode at top of the component, as follows: +Add the Syncfusion® Blazor Dialog 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 top of the component, as follows: | Interactivity location | RenderMode | Code | | --- | --- | --- | | Per page/component | Auto | @rendermode InteractiveAuto | | | WebAssembly | @rendermode InteractiveWebAssembly | -| | Server | @rendermode InteractiveServer | | | None | --- | -N> If an **Interactivity Location** is set to `Global` and the **Render Mode** is set to `Auto` or `WebAssembly` or `Server`, the render mode is configured in the `App.razor` file by default. +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. {% tabs %} {% highlight razor %} @@ -225,7 +252,7 @@ N> If an **Interactivity Location** is set to `Global` and the **Render Mode** i {% endhighlight %} {% endtabs %} -* Press Ctrl+F5 (Windows) or +F5 (macOS) to launch the application. This will render the Syncfusion® Blazor Dialog component in your default web browser. +* Press Ctrl+F5 (Windows) or +F5 (macOS) to launch the application. This will render the Syncfusion® Blazor Dialog component in the default web browser. {% previewsample "https://blazorplayground.syncfusion.com/embed/BDhTjVLBVzsCojDt?appbar=false&editor=false&result=true&errorlist=false&theme=bootstrap5" backgroundimage "[Blazor Dialog](./images/blazor-dialog.png)" %} diff --git a/blazor/drop-down-menu/getting-started-with-web-app.md b/blazor/drop-down-menu/getting-started-with-web-app.md index 9880938a5a..e5abaf6992 100644 --- a/blazor/drop-down-menu/getting-started-with-web-app.md +++ b/blazor/drop-down-menu/getting-started-with-web-app.md @@ -9,7 +9,7 @@ documentation: ug # Getting Started with Blazor Dropdown Menu Component in Web App -This section briefly explains about how to include [Blazor DropDown Menu](https://www.syncfusion.com/blazor-components/blazor-dropdown-menu) component in your Blazor Web App using [Visual Studio](https://visualstudio.microsoft.com/vs/) and Visual Studio Code. +This section briefly explains about how to include [Blazor DropDown Menu](https://www.syncfusion.com/blazor-components/blazor-dropdown-menu) component in your Blazor Web App using [Visual Studio](https://visualstudio.microsoft.com/vs/), [Visual Studio Code](https://code.visualstudio.com/), and the [.NET CLI](https://learn.microsoft.com/en-us/dotnet/core/tools/). {% tabcontents %} @@ -21,15 +21,15 @@ This section briefly explains about how to include [Blazor DropDown Menu](https: ## 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&pivots=vs) or the [Syncfusion® Blazor Extension](https://blazor.syncfusion.com/documentation/visual-studio-integration/template-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-10.0&pivots=vs) or the [Syncfusion® Blazor Extension](https://blazor.syncfusion.com/documentation/visual-studio-integration/template-studio). -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=vs) while creating a Blazor Web Application. +Configure the appropriate [Interactive render mode](https://learn.microsoft.com/en-us/aspnet/core/blazor/components/render-modes?view=aspnetcore-10.0#render-modes) and [Interactivity location](https://learn.microsoft.com/en-us/aspnet/core/blazor/tooling?view=aspnetcore-10.0&pivots=vs) while creating a Blazor Web App. ## Install Syncfusion® Blazor SplitButtons and Themes NuGet in the Blazor Web App -To add **Blazor DropDown Menu** 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.SplitButtons](https://www.nuget.org/packages/Syncfusion.Blazor.SplitButtons/) and [Syncfusion.Blazor.Themes](https://www.nuget.org/packages/Syncfusion.Blazor.Themes/). +To add the **Blazor DropDown Menu** component in the app, open the NuGet package manager in Visual Studio (*Tools → NuGet Package Manager → Manage NuGet Packages for Solution*), then search and install [Syncfusion.Blazor.SplitButtons](https://www.nuget.org/packages/Syncfusion.Blazor.SplitButtons/) and [Syncfusion.Blazor.Themes](https://www.nuget.org/packages/Syncfusion.Blazor.Themes/). -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 using the `WebAssembly or Auto` render modes in the Blazor Web App, install Syncfusion® Blazor component NuGet packages in the client project. Alternatively, you can utilize the following package manager command to achieve the same. @@ -42,7 +42,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 in [nuget.org](https://www.nuget.org/packages?q=syncfusion.blazor). Refer to the [NuGet packages](https://blazor.syncfusion.com/documentation/nuget-packages) topic for the available NuGet packages list with component details. {% endtabcontent %} @@ -54,9 +54,9 @@ N> Syncfusion® Blazor components are availa ## 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). +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-10.0&pivots=vsc) or the [Syncfusion® Blazor Extension](https://blazor.syncfusion.com/documentation/visual-studio-code-integration/create-project). -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=vsc) while creating a Blazor Web Application. +Configure the appropriate interactive render mode and interactivity location when setting up a Blazor Web App. For detailed information, 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. @@ -70,11 +70,9 @@ cd BlazorWebApp.Client {% endhighlight %} {% endtabs %} -N> For more information on creating a **Blazor Web App** with various interactive modes and locations, refer to this [link](https://blazor.syncfusion.com/documentation/getting-started/blazor-web-app?tabcontent=visual-studio-code#render-interactive-modes). - ## Install Syncfusion® Blazor SplitButtons 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 using the `WebAssembly` or `Auto` render modes in the Blazor Web App, install Syncfusion® Blazor component 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. @@ -92,20 +90,69 @@ dotnet restore {% 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 in [nuget.org](https://www.nuget.org/packages?q=syncfusion.blazor). Refer to the [NuGet packages](https://blazor.syncfusion.com/documentation/nuget-packages) topic for the available NuGet packages list with component details. {% endtabcontent %} -{% endtabcontents %} +{% tabcontent .NET CLI %} -## Register Syncfusion® Blazor Service +## Prerequisites + +Latest version of the [.NET 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). + +{% tabs %} +{% highlight c# tabtitle=".NET CLI" %} + +dotnet --version + +{% endhighlight %} +{% endtabs %} + +## 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). + +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). + +For example, in a Blazor Web App with the `Auto` interactive render mode, use the following commands. -| Interactive Render Mode | Description | -| -- | -- | -| WebAssembly or Auto | Open **~/_Imports.razor** file from the client project.| -| Server | Open **~/_import.razor** file, which is located in the `Components` folder.| +{% tabs %} +{% highlight c# tabtitle="Blazor Web App" %} + +dotnet new blazor -o BlazorWebApp -int Auto +cd BlazorWebApp +cd BlazorWebApp.Client + +{% endhighlight %} +{% endtabs %} + +This command creates a new Blazor Web App and places it in a new directory called `BlazorWebApp` inside your current location. See the [Create a Blazor App](https://dotnet.microsoft.com/en-us/learn/aspnet/blazor-tutorial/create) and [dotnet new CLI command](https://learn.microsoft.com/en-us/aspnet/core/blazor/tooling?pivots=cli&view=aspnetcore-10.0) topics for more details. + +## Install Syncfusion® Blazor SplitButtons and Themes NuGet in the App -Import the `Syncfusion.Blazor` and `Syncfusion.Blazor.SplitButtons` namespace. +Here's an example of how to add the **Blazor DropDown Menu** component to the application by using the following commands in a command prompt (Windows), terminal (Linux and macOS), or PowerShell to install the [Syncfusion.Blazor.SplitButtons](https://www.nuget.org/packages/Syncfusion.Blazor.SplitButtons/) and [Syncfusion.Blazor.Themes](https://www.nuget.org/packages/Syncfusion.Blazor.Themes/) NuGet packages. See [Install and manage packages using the dotnet CLI](https://learn.microsoft.com/en-us/nuget/consume-packages/install-use-packages-dotnet-cli) for more details. + +If using the `WebAssembly` or `Auto` render modes in the Blazor Web App, install Syncfusion® Blazor component NuGet packages in the client project. + +{% tabs %} +{% highlight c# tabtitle=".NET CLI" %} + +dotnet add package Syncfusion.Blazor.SplitButtons --version {{ site.releaseversion }} +dotnet add package Syncfusion.Blazor.Themes --version {{ 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 the [NuGet packages](https://blazor.syncfusion.com/documentation/nuget-packages) topic for the available NuGet package list with component details. + +{% endtabcontent %} + +{% endtabcontents %} + +## Add Import Namespaces + +Open the **~/_Imports.razor** file in the client project and import the `Syncfusion.Blazor` and `Syncfusion.Blazor.SplitButtons` namespaces. {% tabs %} {% highlight C# tabtitle="~/_Imports.razor" %} @@ -116,9 +163,11 @@ Import the `Syncfusion.Blazor` and `Syncfusion.Blazor.SplitButtons` namespace. {% endhighlight %} {% endtabs %} -Now, register the Syncfusion® Blazor Service in the **~/Program.cs** file of your Blazor Web App. +## Register Syncfusion® Blazor Service + +Register the Syncfusion® Blazor Service in the **~/Program.cs** file of your Blazor Web App. -If the **Interactive Render Mode** is set to `WebAssembly` or `Auto`, you need to register the Syncfusion® Blazor service in both **~/Program.cs** files of your Blazor Web App. +If the **Interactive Render Mode** is set to `WebAssembly` or `Auto`, register the Syncfusion® Blazor service in the **~/Program.cs** files of the main `server` project and associated `.Client` project. {% tabs %} {% highlight c# tabtitle="Server(~/_Program.cs)" hl_lines="3 11" %} @@ -152,27 +201,6 @@ await builder.Build().RunAsync(); {% endhighlight %} {% endtabs %} -If the **Interactive Render Mode** is set to `Server`, your project will contain a single **~/Program.cs** file. So, you should register the Syncfusion® Blazor Service only in that **~/Program.cs** file. - -{% tabs %} -{% highlight c# tabtitle="~/_Program.cs" hl_lines="2 9" %} - -... -using Syncfusion.Blazor; - -var builder = WebApplication.CreateBuilder(args); - -// Add services to the container. -builder.Services.AddRazorComponents() - .AddInteractiveServerComponents(); -builder.Services.AddSyncfusionBlazor(); - -var app = builder.Build(); -.... - -{% 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 reference in the `` section and the script reference at the end of the `` in the **~/Components/App.razor** file as shown below: @@ -193,16 +221,15 @@ N> Check out the [Blazor Themes](https://blazor.syncfusion.com/documentation/app ## Add Syncfusion® Blazor Dropdown Menu component -Add the Syncfusion® Blazor DropDown Menu component in `.razor` file inside the `Pages` folder. If an interactivity location as `Per page/component` in the web app, define a render mode at top of the component, as follows: +Add the Syncfusion® Blazor DropDown Menu 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 top of the component, as follows: | Interactivity location | RenderMode | Code | | --- | --- | --- | | Per page/component | Auto | @rendermode InteractiveAuto | | | WebAssembly | @rendermode InteractiveWebAssembly | -| | Server | @rendermode InteractiveServer | | | None | --- | -N> If an **Interactivity Location** is set to `Global` and the **Render Mode** is set to `Auto` or `WebAssembly` or `Server`, the render mode is configured in the `App.razor` file by default. +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. {% tabs %} {% highlight razor %} @@ -227,7 +254,7 @@ N> If an **Interactivity Location** is set to `Global` and the **Render Mode** i {% endhighlight %} {% endtabs %} -* Press Ctrl+F5 (Windows) or +F5 (macOS) to launch the application. This will render the Syncfusion® Blazor Dropdown Menu component in your default web browser. +* Press Ctrl+F5 (Windows) or +F5 (macOS) to launch the application. This will render the Syncfusion® Blazor Dropdown Menu component in the default web browser. {% previewsample "https://blazorplayground.syncfusion.com/embed/LjLTjshOAyMLHrtb?appbar=false&editor=false&result=true&errorlist=false&theme=bootstrap5" backgroundimage "[Blazor DropDownMenu Component](./images/blazor-dropdownmenu-component.png)" %} diff --git a/blazor/dropdown-list/getting-started-with-web-app.md b/blazor/dropdown-list/getting-started-with-web-app.md index d49045c12d..11d925e52a 100644 --- a/blazor/dropdown-list/getting-started-with-web-app.md +++ b/blazor/dropdown-list/getting-started-with-web-app.md @@ -9,7 +9,7 @@ documentation: ug # Getting Started with Blazor DropDown List Component in Web App -This section briefly explains about how to include [Blazor DropDown List](https://www.syncfusion.com/blazor-components/blazor-dropdown-list) component in your Blazor Web App using [Visual Studio](https://visualstudio.microsoft.com/vs/), Visual Studio Code and .NET CLI. +This section briefly explains about how to include [Blazor DropDown List](https://www.syncfusion.com/blazor-components/blazor-dropdown-list) component in your Blazor Web App using [Visual Studio](https://visualstudio.microsoft.com/vs/), [Visual Studio Code](https://code.visualstudio.com/), and the [.NET CLI](https://learn.microsoft.com/en-us/dotnet/core/tools/). {% tabcontents %} @@ -21,17 +21,17 @@ This section briefly explains about how to include [Blazor DropDown List](https: ## 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&pivots=vs) 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. +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-10.0&pivots=vs) or the [Syncfusion® Blazor Extension](https://blazor.syncfusion.com/documentation/visual-studio-integration/template-studio). -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=vs) while creating a Blazor Web Application. +Configure the appropriate [Interactive render mode](https://learn.microsoft.com/en-us/aspnet/core/blazor/components/render-modes?view=aspnetcore-10.0#render-modes) and [Interactivity location](https://learn.microsoft.com/en-us/aspnet/core/blazor/tooling?view=aspnetcore-10.0&pivots=vs) while creating a Blazor Web App. ![Create Blazor Web App](images/blazor-create-web-app.png) ## Install Syncfusion® Blazor DropDowns and Themes NuGet in the Blazor Web App -To add **Blazor DropDown List** 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.DropDowns](https://www.nuget.org/packages/Syncfusion.Blazor.DropDowns/) and [Syncfusion.Blazor.Themes](https://www.nuget.org/packages/Syncfusion.Blazor.Themes/). +To add the **Blazor DropDown List** component in the app, open the NuGet package manager in Visual Studio (*Tools → NuGet Package Manager → Manage NuGet Packages for Solution*), then search and install [Syncfusion.Blazor.DropDowns](https://www.nuget.org/packages/Syncfusion.Blazor.DropDowns/) and [Syncfusion.Blazor.Themes](https://www.nuget.org/packages/Syncfusion.Blazor.Themes/). -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 using the `WebAssembly or Auto` render modes in the Blazor Web App, install Syncfusion® Blazor component NuGet packages in the client project. Alternatively, you can utilize the following package manager command to achieve the same. @@ -44,7 +44,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 in [nuget.org](https://www.nuget.org/packages?q=syncfusion.blazor). Refer to the [NuGet packages](https://blazor.syncfusion.com/documentation/nuget-packages) topic for the available NuGet packages list with component details. {% endtabcontent %} @@ -56,9 +56,9 @@ N> Syncfusion® Blazor components are availa ## 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. +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-10.0&pivots=vsc) or the [Syncfusion® Blazor Extension](https://blazor.syncfusion.com/documentation/visual-studio-code-integration/create-project). -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). +Configure the appropriate interactive render mode and interactivity location when setting up a Blazor Web App. For detailed information, 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. @@ -74,7 +74,7 @@ cd BlazorWebApp.Client ## Install Syncfusion® Blazor DropDowns 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 using the `WebAssembly` or `Auto` render modes in the Blazor Web App, install Syncfusion® Blazor component 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. @@ -92,7 +92,7 @@ dotnet restore {% 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 in [nuget.org](https://www.nuget.org/packages?q=syncfusion.blazor). Refer to the [NuGet packages](https://blazor.syncfusion.com/documentation/nuget-packages) topic for the available NuGet packages list with component details. {% endtabcontent %} @@ -128,13 +128,13 @@ cd BlazorApp.Client {% endhighlight %} {% endtabs %} -This command creates new Blazor Web 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/aspnet/core/blazor/tooling?pivots=linux-macos&view=aspnetcore-8.0) topics for more details. +This command creates a new Blazor Web App and places it in a new directory called `BlazorWebApp` inside your current location. See the [Create a Blazor App](https://dotnet.microsoft.com/en-us/learn/aspnet/blazor-tutorial/create) and [dotnet new CLI command](https://learn.microsoft.com/en-us/aspnet/core/blazor/tooling?pivots=cli&view=aspnetcore-10.0) topics for more details. ## Install Syncfusion® Blazor DropDowns and Themes NuGet in the App Here's an example of how to add **Blazor DropDown List** component in the application using the following command in the command prompt (Windows) or terminal (Linux and macOS) to install a [Syncfusion.Blazor.DropDowns](https://www.nuget.org/packages/Syncfusion.Blazor.DropDowns/) 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. -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 using the `WebAssembly or Auto` render modes in the Blazor Web App, install Syncfusion® Blazor component NuGet packages in the client project. {% tabs %} {% highlight c# tabtitle=".NET CLI" %} @@ -146,7 +146,7 @@ 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 in [nuget.org](https://www.nuget.org/packages?q=syncfusion.blazor). Refer to the [NuGet packages](https://blazor.syncfusion.com/documentation/nuget-packages) topic for the available NuGet packages list with component details. {% endtabcontent %} @@ -169,7 +169,7 @@ Open the **~/_Imports.razor** file from the client project and import the `Syncf 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. +If the **Interactive Render Mode** is set to `WebAssembly` or `Auto`, register the Syncfusion® Blazor service in the **~/Program.cs** files of the main `server` project and associated `.Client` project. {% tabs %} {% highlight c# tabtitle="Server(~/_Program.cs)" hl_lines="3 11" %} @@ -253,7 +253,7 @@ N> If an **Interactivity Location** is set to `Global` and the **Render Mode** i {% endhighlight %} {% endtabs %} -* Press Ctrl+F5 (Windows) or +F5 (macOS) to launch the application. This will render the Syncfusion® Blazor DropDown List component in your default web browser. +* Press Ctrl+F5 (Windows) or +F5 (macOS) to launch the application. This will render the Syncfusion® Blazor DropDown List component in the default web browser. {% previewsample "https://blazorplayground.syncfusion.com/embed/LNLTDChuUITQFPJn?appbar=false&editor=false&result=true&errorlist=false&theme=bootstrap5" backgroundimage "[Blazor DropDownList Component](./images/blazor-dropdownlist-component.png)" %} diff --git a/blazor/predefined-dialogs/getting-started-webapp.md b/blazor/predefined-dialogs/getting-started-webapp.md index f92710af87..9dbb891573 100644 --- a/blazor/predefined-dialogs/getting-started-webapp.md +++ b/blazor/predefined-dialogs/getting-started-webapp.md @@ -9,7 +9,7 @@ documentation: ug # Getting Started with Blazor Predefined Dialogs in Blazor Web App -This section briefly explains about how to include `Blazor Predefined Dialogs` component in your Blazor Web App using [Visual Studio](https://visualstudio.microsoft.com/vs/) and Visual Studio Code. +This section briefly explains about how to include `Blazor Predefined Dialogs` component in your Blazor Web App using [Visual Studio](https://visualstudio.microsoft.com/vs/), [Visual Studio Code](https://code.visualstudio.com/), and the [.NET CLI](https://learn.microsoft.com/en-us/dotnet/core/tools/). {% tabcontents %} @@ -21,15 +21,15 @@ This section briefly explains about how to include `Blazor Predefined Dialogs` c ## 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&pivots=vs) or the [Syncfusion® Blazor Extension](https://blazor.syncfusion.com/documentation/visual-studio-integration/template-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-10.0&pivots=vs) or the [Syncfusion® Blazor Extension](https://blazor.syncfusion.com/documentation/visual-studio-integration/template-studio). -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=vs) while creating a Blazor Web Application. +Configure the appropriate [Interactive render mode](https://learn.microsoft.com/en-us/aspnet/core/blazor/components/render-modes?view=aspnetcore-10.0#render-modes) and [Interactivity location](https://learn.microsoft.com/en-us/aspnet/core/blazor/tooling?view=aspnetcore-10.0&pivots=vs) while creating a Blazor Web App. ## Install Syncfusion® Blazor Popups and Themes NuGet in the App -To add **Blazor predefined dialog** 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.Popups](https://www.nuget.org/packages/Syncfusion.Blazor.Popups) and [Syncfusion.Blazor.Themes](https://www.nuget.org/packages/Syncfusion.Blazor.Themes/). +To add the **Blazor predefined dialog** component in the app, open the NuGet package manager in Visual Studio (*Tools → NuGet Package Manager → Manage NuGet Packages for Solution*), then search and install [Syncfusion.Blazor.Popups](https://www.nuget.org/packages/Syncfusion.Blazor.Popups) and [Syncfusion.Blazor.Themes](https://www.nuget.org/packages/Syncfusion.Blazor.Themes/). -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 using the `WebAssembly or Auto` render modes in the Blazor Web App, install Syncfusion® Blazor component NuGet packages in the client project. Alternatively, you can utilize the following package manager command to achieve the same. @@ -42,7 +42,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 in [nuget.org](https://www.nuget.org/packages?q=syncfusion.blazor). Refer to the [NuGet packages](https://blazor.syncfusion.com/documentation/nuget-packages) topic for the available NuGet packages list with component details. {% endtabcontent %} @@ -54,9 +54,9 @@ N> Syncfusion® Blazor components are availa ## 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). +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-10.0&pivots=vsc) or the [Syncfusion® Blazor Extension](https://blazor.syncfusion.com/documentation/visual-studio-code-integration/create-project). -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=vsc) while creating a Blazor Web Application. +Configure the appropriate interactive render mode and interactivity location when setting up a Blazor Web App. For detailed information, 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. @@ -70,11 +70,9 @@ cd BlazorWebApp.Client {% endhighlight %} {% endtabs %} -N> For more information on creating a **Blazor Web App** with various interactive modes and locations, refer to this [link](https://blazor.syncfusion.com/documentation/getting-started/blazor-web-app?tabcontent=visual-studio-code#render-interactive-modes). - ## Install Syncfusion® Blazor Popups 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 using the `WebAssembly` or `Auto` render modes in the Blazor Web App, install Syncfusion® Blazor component 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. @@ -92,20 +90,69 @@ dotnet restore {% 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 in [nuget.org](https://www.nuget.org/packages?q=syncfusion.blazor). Refer to the [NuGet packages](https://blazor.syncfusion.com/documentation/nuget-packages) topic for the available NuGet packages list with component details. {% endtabcontent %} -{% endtabcontents %} +{% tabcontent .NET CLI %} -## Register Syncfusion® Blazor Service +## Prerequisites + +Latest version of the [.NET 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). + +{% tabs %} +{% highlight c# tabtitle=".NET CLI" %} + +dotnet --version + +{% endhighlight %} +{% endtabs %} + +## 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). + +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). + +For example, in a Blazor Web App with the `Auto` interactive render mode, use the following commands. + +{% tabs %} +{% highlight c# tabtitle="Blazor Web App" %} + +dotnet new blazor -o BlazorWebApp -int Auto +cd BlazorWebApp +cd BlazorWebApp.Client + +{% endhighlight %} +{% endtabs %} + +This command creates a new Blazor Web App and places it in a new directory called `BlazorWebApp` inside your current location. See the [Create a Blazor App](https://dotnet.microsoft.com/en-us/learn/aspnet/blazor-tutorial/create) and [dotnet new CLI command](https://learn.microsoft.com/en-us/aspnet/core/blazor/tooling?pivots=cli&view=aspnetcore-10.0) topics for more details. + +## Install Syncfusion® Blazor Popups and Themes NuGet in the App + +Here's an example of how to add the **Blazor Predefined Dialog** component to the application by using the following commands in a command prompt (Windows), terminal (Linux and macOS), or PowerShell to install the [Syncfusion.Blazor.Popups](https://www.nuget.org/packages/Syncfusion.Blazor.Popups/) and [Syncfusion.Blazor.Themes](https://www.nuget.org/packages/Syncfusion.Blazor.Themes/) NuGet packages. See [Install and manage packages using the dotnet CLI](https://learn.microsoft.com/en-us/nuget/consume-packages/install-use-packages-dotnet-cli) for more details. + +If using the `WebAssembly` or `Auto` render modes in the Blazor Web App, install Syncfusion® Blazor component NuGet packages in the client project. + +{% tabs %} +{% highlight c# tabtitle=".NET CLI" %} + +dotnet add package Syncfusion.Blazor.Popups --version {{ site.releaseversion }} +dotnet add package Syncfusion.Blazor.Themes --version {{ 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 the [NuGet packages](https://blazor.syncfusion.com/documentation/nuget-packages) topic for the available NuGet package list with component details. + +{% endtabcontent %} + +{% endtabcontents %} -| Interactive Render Mode | Description | -| -- | -- | -| WebAssembly or Auto | Open **~/_Imports.razor** file from the client project.| -| Server | Open **~/_import.razor** file, which is located in the `Components` folder.| +## Add Import Namespaces -Import the `Syncfusion.Blazor` and `Syncfusion.Blazor.Popups` namespace. +Open the **~/_Imports.razor** file in the client project and import the `Syncfusion.Blazor` and `Syncfusion.Blazor.Popups` namespaces. {% tabs %} {% highlight C# tabtitle="~/_Imports.razor" %} @@ -116,9 +163,11 @@ Import the `Syncfusion.Blazor` and `Syncfusion.Blazor.Popups` namespace. {% endhighlight %} {% endtabs %} -Now, register the Syncfusion® Blazor Service in the **~/Program.cs** file of your Blazor Web App. +## Register Syncfusion® Blazor Service + +Register the Syncfusion® Blazor Service in the **~/Program.cs** file of your Blazor Web App. -If the **Interactive Render Mode** is set to `WebAssembly` or `Auto`, you need to register the Syncfusion® Blazor service in both **~/Program.cs** files of your Blazor Web App. +If the **Interactive Render Mode** is set to `WebAssembly` or `Auto`, register the Syncfusion® Blazor service in the **~/Program.cs** files of the main `server` project and associated `.Client` project. {% tabs %} {% highlight c# tabtitle="Server(~/_Program.cs)" hl_lines="3 11" %} @@ -154,28 +203,6 @@ await builder.Build().RunAsync(); {% endhighlight %} {% endtabs %} -If the **Interactive Render Mode** is set to `Server`, your project will contain a single **~/Program.cs** file. So, you should register the Syncfusion® Blazor Service only in that **~/Program.cs** file. - -{% tabs %} -{% highlight c# tabtitle="~/_Program.cs" hl_lines="2 9" %} - -... -using Syncfusion.Blazor; - -var builder = WebApplication.CreateBuilder(args); - -// Add services to the container. -builder.Services.AddRazorComponents() - .AddInteractiveServerComponents(); -builder.Services.AddScoped(); -builder.Services.AddSyncfusionBlazor(); - -var app = builder.Build(); -.... - -{% 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 reference in the `` section and the script reference at the end of the `` in the **~/Components/App.razor** file as shown below: @@ -214,16 +241,15 @@ Once you added `SfDialogService` and `SfDialogProvider`, you can open predefined ### Show alert dialog -An alert dialog box used to display an errors, warnings, and information alerts that needs user awareness. This can be achieved by using the [DialogService.AlertAsync](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Popups.SfDialogService.html#Syncfusion_Blazor_Popups_SfDialogService_AlertAsync_System_String_System_String_Syncfusion_Blazor_Popups_DialogOptions_) method. The alert dialog is displayed along with the `OK` button. When user clicks on `OK` button, alert dialog will get closed. 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: +An alert dialog box used to display an errors, warnings, and information alerts that needs user awareness. This can be achieved by using the [DialogService.AlertAsync](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Popups.SfDialogService.html#Syncfusion_Blazor_Popups_SfDialogService_AlertAsync_System_String_System_String_Syncfusion_Blazor_Popups_DialogOptions_) method. The alert dialog is displayed along with the `OK` button. When user clicks on `OK` button, alert dialog will get closed. 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: | Interactivity location | RenderMode | Code | | --- | --- | --- | | Per page/component | Auto | @rendermode InteractiveAuto | | | WebAssembly | @rendermode InteractiveWebAssembly | -| | Server | @rendermode InteractiveServer | | | None | --- | -N> If an **Interactivity Location** is set to `Global` and the **Render Mode** is set to `Auto` or `WebAssembly` or `Server`, the render mode is configured in the `App.razor` file by default. +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. {% tabs %} {% highlight razor %} From 64e177730939a020391cda9ea47c5a6e609dcdf6 Mon Sep 17 00:00:00 2001 From: Backiaraj Date: Wed, 26 Nov 2025 18:36:42 +0530 Subject: [PATCH 115/266] Added project creation image link --- blazor/3D-chart/getting-started-with-web-app.md | 2 ++ blazor/accordion/getting-started-with-web-app.md | 2 ++ blazor/accumulation-chart/getting-started-with-web-app.md | 2 ++ blazor/ai-assistview/getting-started-webapp.md | 2 ++ blazor/appbar/getting-started-with-web-app.md | 2 ++ blazor/autocomplete/getting-started-with-web-app.md | 2 ++ blazor/avatar/getting-started-with-web-app.md | 2 ++ blazor/badge/getting-started-with-web-app.md | 2 ++ blazor/barcode/getting-started-with-web-app.md | 2 ++ blazor/breadcrumb/getting-started-with-web-app.md | 2 ++ blazor/bullet-chart/getting-started-with-web-app.md | 2 ++ blazor/button-group/getting-started-with-web-app.md | 2 ++ blazor/button/getting-started-with-web-app.md | 2 ++ blazor/calendar/getting-started-with-web-app.md | 2 ++ blazor/card/getting-started-with-web-app.md | 2 ++ blazor/carousel/getting-started-with-web-app.md | 2 ++ blazor/chat-ui/getting-started-webapp.md | 2 ++ blazor/check-box/getting-started-with-web-app.md | 2 ++ blazor/chip/getting-started-with-web-app.md | 2 ++ blazor/circular-gauge/getting-started-with-web-app.md | 2 ++ blazor/color-picker/getting-started-with-web-app.md | 2 ++ blazor/combobox/getting-started-with-web-app.md | 2 ++ blazor/context-menu/getting-started-with-web-app.md | 2 ++ blazor/dashboard-layout/getting-started-with-web-app.md | 2 ++ blazor/data-form/getting-started-with-web-app.md | 2 ++ blazor/data/getting-started-with-web-app.md | 2 ++ blazor/datepicker/getting-started-with-web-app.md | 2 ++ blazor/daterangepicker/getting-started-with-web-app.md | 2 ++ blazor/datetime-picker/getting-started-with-web-app.md | 2 ++ blazor/dialog/getting-started-with-web-app.md | 2 ++ blazor/drop-down-menu/getting-started-with-web-app.md | 2 ++ blazor/predefined-dialogs/getting-started-webapp.md | 2 ++ 32 files changed, 64 insertions(+) diff --git a/blazor/3D-chart/getting-started-with-web-app.md b/blazor/3D-chart/getting-started-with-web-app.md index aeddc137d8..82e7f52760 100644 --- a/blazor/3D-chart/getting-started-with-web-app.md +++ b/blazor/3D-chart/getting-started-with-web-app.md @@ -30,6 +30,8 @@ You can create a **Blazor Web App** using Visual Studio 2022 via [Microsoft Temp Configure the appropriate [Interactive render mode](https://learn.microsoft.com/en-us/aspnet/core/blazor/components/render-modes?view=aspnetcore-10.0#render-modes) and [Interactivity location](https://learn.microsoft.com/en-us/aspnet/core/blazor/tooling?view=aspnetcore-10.0&pivots=vs) while creating a Blazor Web App. +![Create Blazor Web App](images/blazor-create-web-app.png) + ## Install Syncfusion® Blazor 3D Chart NuGet in the Blazor Web App To add the **Blazor 3D Chart** component in the app, open NuGet package manager in Visual Studio (*Tools → NuGet Package Manager → Manage NuGet Packages for Solution*), then search and install [Syncfusion.Blazor.Chart3D](https://www.nuget.org/packages/Syncfusion.Blazor.Chart3D). diff --git a/blazor/accordion/getting-started-with-web-app.md b/blazor/accordion/getting-started-with-web-app.md index 0f932e583b..9a0c5b81f1 100644 --- a/blazor/accordion/getting-started-with-web-app.md +++ b/blazor/accordion/getting-started-with-web-app.md @@ -25,6 +25,8 @@ You can create a **Blazor Web App** using Visual Studio 2022 via [Microsoft Temp Configure the appropriate [Interactive render mode](https://learn.microsoft.com/en-us/aspnet/core/blazor/components/render-modes?view=aspnetcore-10.0#render-modes) and [Interactivity location](https://learn.microsoft.com/en-us/aspnet/core/blazor/tooling?view=aspnetcore-10.0&pivots=vs) while creating a Blazor Web App. +![Create Blazor Web App](images/blazor-create-web-app.png) + ## Install Syncfusion® Blazor Navigations and Themes NuGet in the App To add the **Blazor Accordion** component in the app, open the NuGet package manager in Visual Studio (*Tools → NuGet Package Manager → Manage NuGet Packages for Solution*), then search and install [Syncfusion.Blazor.Navigations](https://www.nuget.org/packages/Syncfusion.Blazor.Navigations/) and [Syncfusion.Blazor.Themes](https://www.nuget.org/packages/Syncfusion.Blazor.Themes/). diff --git a/blazor/accumulation-chart/getting-started-with-web-app.md b/blazor/accumulation-chart/getting-started-with-web-app.md index 1c4de686a5..e5ddb0212e 100644 --- a/blazor/accumulation-chart/getting-started-with-web-app.md +++ b/blazor/accumulation-chart/getting-started-with-web-app.md @@ -25,6 +25,8 @@ You can create a **Blazor Web App** using Visual Studio 2022 via [Microsoft Temp Configure the appropriate [Interactive render mode](https://learn.microsoft.com/en-us/aspnet/core/blazor/components/render-modes?view=aspnetcore-10.0#render-modes) and [Interactivity location](https://learn.microsoft.com/en-us/aspnet/core/blazor/tooling?view=aspnetcore-10.0&pivots=vs) while creating a Blazor Web App. +![Create Blazor Web App](images/blazor-create-web-app.png) + ## Install Syncfusion® Blazor Charts and Themes NuGet in the App To add the **Blazor Accumulation Chart** component in the app, open the NuGet package manager in Visual Studio (*Tools → NuGet Package Manager → Manage NuGet Packages for Solution*), then search and install [Syncfusion.Blazor.Charts](https://www.nuget.org/packages/Syncfusion.Blazor.Charts/) and [Syncfusion.Blazor.Themes](https://www.nuget.org/packages/Syncfusion.Blazor.Themes/). diff --git a/blazor/ai-assistview/getting-started-webapp.md b/blazor/ai-assistview/getting-started-webapp.md index 13107514e1..57287e1d83 100644 --- a/blazor/ai-assistview/getting-started-webapp.md +++ b/blazor/ai-assistview/getting-started-webapp.md @@ -25,6 +25,8 @@ You can create a **Blazor Web App** using Visual Studio 2022 via [Microsoft Temp 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=vs) while creating a Blazor Web Application. +![Create Blazor Web App](images/blazor-create-web-app.png) + ## Install Syncfusion® Blazor InteractiveChat and Themes NuGet in the App To add **Blazor AI AssistView** 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.InteractiveChat` and [Syncfusion.Blazor.Themes](https://www.nuget.org/packages/Syncfusion.Blazor.Themes/). diff --git a/blazor/appbar/getting-started-with-web-app.md b/blazor/appbar/getting-started-with-web-app.md index a9e6313412..2390147e33 100644 --- a/blazor/appbar/getting-started-with-web-app.md +++ b/blazor/appbar/getting-started-with-web-app.md @@ -25,6 +25,8 @@ You can create a **Blazor Web App** using Visual Studio 2022 via [Microsoft Temp Configure the appropriate [Interactive render mode](https://learn.microsoft.com/en-us/aspnet/core/blazor/components/render-modes?view=aspnetcore-10.0#render-modes) and [Interactivity location](https://learn.microsoft.com/en-us/aspnet/core/blazor/tooling?view=aspnetcore-10.0&pivots=vs) while creating a Blazor Web App. +![Create Blazor Web App](images/blazor-create-web-app.png) + ## Install Syncfusion® Blazor Navigations and Themes NuGet in the App To add the **Blazor AppBar** component in the app, open the NuGet package manager in Visual Studio (*Tools → NuGet Package Manager → Manage NuGet Packages for Solution*), then search and install [Syncfusion.Blazor.Navigations](https://www.nuget.org/packages/Syncfusion.Blazor.Navigations/) and [Syncfusion.Blazor.Themes](https://www.nuget.org/packages/Syncfusion.Blazor.Themes/). diff --git a/blazor/autocomplete/getting-started-with-web-app.md b/blazor/autocomplete/getting-started-with-web-app.md index f4c0537cb1..a9cf2ceb90 100644 --- a/blazor/autocomplete/getting-started-with-web-app.md +++ b/blazor/autocomplete/getting-started-with-web-app.md @@ -25,6 +25,8 @@ You can create a **Blazor Web App** using Visual Studio 2022 via [Microsoft Temp Configure the appropriate [Interactive render mode](https://learn.microsoft.com/en-us/aspnet/core/blazor/components/render-modes?view=aspnetcore-10.0#render-modes) and [Interactivity location](https://learn.microsoft.com/en-us/aspnet/core/blazor/tooling?view=aspnetcore-10.0&pivots=vs) while creating a Blazor Web App. +![Create Blazor Web App](images/blazor-create-web-app.png) + ## Install Syncfusion® Blazor DropDowns and Themes NuGet in the App To add the **Blazor AutoComplete** component in the app, open the NuGet package manager in Visual Studio (*Tools → NuGet Package Manager → Manage NuGet Packages for Solution*), then search and install [Syncfusion.Blazor.DropDowns](https://www.nuget.org/packages/Syncfusion.Blazor.DropDowns/) and [Syncfusion.Blazor.Themes](https://www.nuget.org/packages/Syncfusion.Blazor.Themes/). diff --git a/blazor/avatar/getting-started-with-web-app.md b/blazor/avatar/getting-started-with-web-app.md index b06b2fe19f..6c729647d7 100644 --- a/blazor/avatar/getting-started-with-web-app.md +++ b/blazor/avatar/getting-started-with-web-app.md @@ -25,6 +25,8 @@ You can create a **Blazor Web App** using Visual Studio 2022 via [Microsoft Temp Configure the appropriate [Interactive render mode](https://learn.microsoft.com/en-us/aspnet/core/blazor/components/render-modes?view=aspnetcore-10.0#render-modes) and [Interactivity location](https://learn.microsoft.com/en-us/aspnet/core/blazor/tooling?view=aspnetcore-10.0&pivots=vs) while creating a Blazor Web App. +![Create Blazor Web App](images/blazor-create-web-app.png) + ## Install Syncfusion® Blazor Themes NuGet in the App To add the **Blazor Avatar** component in the app, open the NuGet package manager in Visual Studio (*Tools → NuGet Package Manager → Manage NuGet Packages for Solution*), then search and install [Syncfusion.Blazor.Themes](https://www.nuget.org/packages/Syncfusion.Blazor.Themes/). diff --git a/blazor/badge/getting-started-with-web-app.md b/blazor/badge/getting-started-with-web-app.md index 1ed10f9008..f18e9de8fc 100644 --- a/blazor/badge/getting-started-with-web-app.md +++ b/blazor/badge/getting-started-with-web-app.md @@ -25,6 +25,8 @@ You can create a **Blazor Web App** using Visual Studio 2022 via [Microsoft Temp Configure the appropriate [Interactive render mode](https://learn.microsoft.com/en-us/aspnet/core/blazor/components/render-modes?view=aspnetcore-10.0#render-modes) and [Interactivity location](https://learn.microsoft.com/en-us/aspnet/core/blazor/tooling?view=aspnetcore-10.0&pivots=vs) while creating a Blazor Web App. +![Create Blazor Web App](images/blazor-create-web-app.png) + ## Install Syncfusion® Blazor Themes NuGet in the App To add the **Blazor Badge** component in the app, open the NuGet package manager in Visual Studio (*Tools → NuGet Package Manager → Manage NuGet Packages for Solution*), then search and install [Syncfusion.Blazor.Themes](https://www.nuget.org/packages/Syncfusion.Blazor.Themes/). diff --git a/blazor/barcode/getting-started-with-web-app.md b/blazor/barcode/getting-started-with-web-app.md index 4a7e44d19e..d249f8071c 100644 --- a/blazor/barcode/getting-started-with-web-app.md +++ b/blazor/barcode/getting-started-with-web-app.md @@ -25,6 +25,8 @@ You can create a **Blazor Web App** using Visual Studio 2022 via [Microsoft Temp Configure the appropriate [Interactive render mode](https://learn.microsoft.com/en-us/aspnet/core/blazor/components/render-modes?view=aspnetcore-10.0#render-modes) and [Interactivity location](https://learn.microsoft.com/en-us/aspnet/core/blazor/tooling?view=aspnetcore-10.0&pivots=vs) while creating a Blazor Web App. +![Create Blazor Web App](images/blazor-create-web-app.png) + ## Install Syncfusion® Blazor BarcodeGenerator and Themes NuGet in the App To add the **Blazor Barcode** component in the app, open the NuGet package manager in Visual Studio (*Tools → NuGet Package Manager → Manage NuGet Packages for Solution*), then search and install [Syncfusion.Blazor.BarcodeGenerator](https://www.nuget.org/packages/Syncfusion.Blazor.BarcodeGenerator/) and [Syncfusion.Blazor.Themes](https://www.nuget.org/packages/Syncfusion.Blazor.Themes/). diff --git a/blazor/breadcrumb/getting-started-with-web-app.md b/blazor/breadcrumb/getting-started-with-web-app.md index 364a39f936..197482770f 100644 --- a/blazor/breadcrumb/getting-started-with-web-app.md +++ b/blazor/breadcrumb/getting-started-with-web-app.md @@ -25,6 +25,8 @@ You can create a **Blazor Web App** using Visual Studio 2022 via [Microsoft Temp Configure the appropriate [Interactive render mode](https://learn.microsoft.com/en-us/aspnet/core/blazor/components/render-modes?view=aspnetcore-10.0#render-modes) and [Interactivity location](https://learn.microsoft.com/en-us/aspnet/core/blazor/tooling?view=aspnetcore-10.0&pivots=vs) while creating a Blazor Web App. +![Create Blazor Web App](images/blazor-create-web-app.png) + ## Install Syncfusion® Blazor Navigations and Themes NuGet in the App To add the **Blazor Breadcrumb** component in the app, open the NuGet package manager in Visual Studio (*Tools → NuGet Package Manager → Manage NuGet Packages for Solution*), then search and install [Syncfusion.Blazor.Navigations](https://www.nuget.org/packages/Syncfusion.Blazor.Navigations/) and [Syncfusion.Blazor.Themes](https://www.nuget.org/packages/Syncfusion.Blazor.Themes/). diff --git a/blazor/bullet-chart/getting-started-with-web-app.md b/blazor/bullet-chart/getting-started-with-web-app.md index 6ac477ab60..422c4955d3 100644 --- a/blazor/bullet-chart/getting-started-with-web-app.md +++ b/blazor/bullet-chart/getting-started-with-web-app.md @@ -25,6 +25,8 @@ You can create a **Blazor Web App** using Visual Studio 2022 via [Microsoft Temp Configure the appropriate [Interactive render mode](https://learn.microsoft.com/en-us/aspnet/core/blazor/components/render-modes?view=aspnetcore-10.0#render-modes) and [Interactivity location](https://learn.microsoft.com/en-us/aspnet/core/blazor/tooling?view=aspnetcore-10.0&pivots=vs) while creating a Blazor Web App. +![Create Blazor Web App](images/blazor-create-web-app.png) + ## Install Syncfusion® Blazor Bullet Chart NuGet in the App To add the **Blazor Bullet Chart** component in the app, open the NuGet package manager in Visual Studio (*Tools → NuGet Package Manager → Manage NuGet Packages for Solution*), then search and install [Syncfusion.Blazor.BulletChart](https://www.nuget.org/packages/Syncfusion.Blazor.BulletChart). diff --git a/blazor/button-group/getting-started-with-web-app.md b/blazor/button-group/getting-started-with-web-app.md index e3fb9e611b..665dcc439f 100644 --- a/blazor/button-group/getting-started-with-web-app.md +++ b/blazor/button-group/getting-started-with-web-app.md @@ -25,6 +25,8 @@ You can create a **Blazor Web App** using Visual Studio 2022 via [Microsoft Temp Configure the appropriate [Interactive render mode](https://learn.microsoft.com/en-us/aspnet/core/blazor/components/render-modes?view=aspnetcore-10.0#render-modes) and [Interactivity location](https://learn.microsoft.com/en-us/aspnet/core/blazor/tooling?view=aspnetcore-10.0&pivots=vs) while creating a Blazor Web App. +![Create Blazor Web App](images/blazor-create-web-app.png) + ## Install Syncfusion® Blazor SplitButtons and Themes NuGet in the App To add the **Blazor ButtonGroup** component in the app, open the NuGet package manager in Visual Studio (*Tools → NuGet Package Manager → Manage NuGet Packages for Solution*), then search and install [Syncfusion.Blazor.SplitButtons](https://www.nuget.org/packages/Syncfusion.Blazor.SplitButtons) and [Syncfusion.Blazor.Themes](https://www.nuget.org/packages/Syncfusion.Blazor.Themes/). diff --git a/blazor/button/getting-started-with-web-app.md b/blazor/button/getting-started-with-web-app.md index 3e7dd7afd9..ab969480be 100644 --- a/blazor/button/getting-started-with-web-app.md +++ b/blazor/button/getting-started-with-web-app.md @@ -25,6 +25,8 @@ You can create a **Blazor Web App** using Visual Studio 2022 via [Microsoft Temp Configure the appropriate [Interactive render mode](https://learn.microsoft.com/en-us/aspnet/core/blazor/components/render-modes?view=aspnetcore-10.0#render-modes) and [Interactivity location](https://learn.microsoft.com/en-us/aspnet/core/blazor/tooling?view=aspnetcore-10.0&pivots=vs) while creating a Blazor Web App. +![Create Blazor Web App](images/blazor-create-web-app.png) + ## Install Syncfusion® Blazor Buttons and Themes NuGet in the App To add the **Blazor Button** component in the app, open the NuGet package manager in Visual Studio (*Tools → NuGet Package Manager → Manage NuGet Packages for Solution*), then search and install [Syncfusion.Blazor.Buttons](https://www.nuget.org/packages/Syncfusion.Blazor.Buttons) and [Syncfusion.Blazor.Themes](https://www.nuget.org/packages/Syncfusion.Blazor.Themes/). diff --git a/blazor/calendar/getting-started-with-web-app.md b/blazor/calendar/getting-started-with-web-app.md index 75877e1c82..35156216b9 100644 --- a/blazor/calendar/getting-started-with-web-app.md +++ b/blazor/calendar/getting-started-with-web-app.md @@ -25,6 +25,8 @@ You can create a **Blazor Web App** using Visual Studio 2022 via [Microsoft Temp Configure the appropriate [Interactive render mode](https://learn.microsoft.com/en-us/aspnet/core/blazor/components/render-modes?view=aspnetcore-10.0#render-modes) and [Interactivity location](https://learn.microsoft.com/en-us/aspnet/core/blazor/tooling?view=aspnetcore-10.0&pivots=vs) while creating a Blazor Web App. +![Create Blazor Web App](images/blazor-create-web-app.png) + ## Install Syncfusion® Blazor Calendars and Themes NuGet in the Blazor Web App To add the **Blazor Calendar** component in the app, open the NuGet package manager in Visual Studio (*Tools → NuGet Package Manager → Manage NuGet Packages for Solution*), then search and install [Syncfusion.Blazor.Calendars](https://www.nuget.org/packages/Syncfusion.Blazor.Calendars/) and [Syncfusion.Blazor.Themes](https://www.nuget.org/packages/Syncfusion.Blazor.Themes/). diff --git a/blazor/card/getting-started-with-web-app.md b/blazor/card/getting-started-with-web-app.md index 8be0bdff56..3f1af2d7e5 100644 --- a/blazor/card/getting-started-with-web-app.md +++ b/blazor/card/getting-started-with-web-app.md @@ -25,6 +25,8 @@ You can create a **Blazor Web App** using Visual Studio 2022 via [Microsoft Temp Configure the appropriate [Interactive render mode](https://learn.microsoft.com/en-us/aspnet/core/blazor/components/render-modes?view=aspnetcore-10.0#render-modes) and [Interactivity location](https://learn.microsoft.com/en-us/aspnet/core/blazor/tooling?view=aspnetcore-10.0&pivots=vs) while creating a Blazor Web App. +![Create Blazor Web App](images/blazor-create-web-app.png) + ## Install Syncfusion® Blazor Cards and Themes NuGet in the Blazor Web App To add the **Blazor Card** component in the app, open the NuGet package manager in Visual Studio (*Tools → NuGet Package Manager → Manage NuGet Packages for Solution*), then search and install [Syncfusion.Blazor.Cards](https://www.nuget.org/packages/Syncfusion.Blazor.Cards/) and [Syncfusion.Blazor.Themes](https://www.nuget.org/packages/Syncfusion.Blazor.Themes/). diff --git a/blazor/carousel/getting-started-with-web-app.md b/blazor/carousel/getting-started-with-web-app.md index 367192138a..8a4b836fce 100644 --- a/blazor/carousel/getting-started-with-web-app.md +++ b/blazor/carousel/getting-started-with-web-app.md @@ -25,6 +25,8 @@ You can create a **Blazor Web App** using Visual Studio 2022 via [Microsoft Temp Configure the appropriate [Interactive render mode](https://learn.microsoft.com/en-us/aspnet/core/blazor/components/render-modes?view=aspnetcore-10.0#render-modes) and [Interactivity location](https://learn.microsoft.com/en-us/aspnet/core/blazor/tooling?view=aspnetcore-10.0&pivots=vs) while creating a Blazor Web App. +![Create Blazor Web App](images/blazor-create-web-app.png) + ## Install Syncfusion® Blazor Navigations and Themes NuGet in the Blazor Web App To add the **Blazor Carousel** component in the app, open the NuGet package manager in Visual Studio (*Tools → NuGet Package Manager → Manage NuGet Packages for Solution*), then search and install [Syncfusion.Blazor.Navigations](https://www.nuget.org/packages/Syncfusion.Blazor.Navigations/) and [Syncfusion.Blazor.Themes](https://www.nuget.org/packages/Syncfusion.Blazor.Themes/). diff --git a/blazor/chat-ui/getting-started-webapp.md b/blazor/chat-ui/getting-started-webapp.md index cc516ad3ab..3232999c79 100644 --- a/blazor/chat-ui/getting-started-webapp.md +++ b/blazor/chat-ui/getting-started-webapp.md @@ -30,6 +30,8 @@ You can create a **Blazor Web App** using Visual Studio 2022 via [Microsoft Temp Configure the appropriate [Interactive render mode](https://learn.microsoft.com/en-us/aspnet/core/blazor/components/render-modes?view=aspnetcore-10.0#render-modes) and [Interactivity location](https://learn.microsoft.com/en-us/aspnet/core/blazor/tooling?view=aspnetcore-10.0&pivots=vs) while creating a Blazor Web App. +![Create Blazor Web App](images/blazor-create-web-app.png) + ## Install Syncfusion® Blazor InteractiveChat and Themes NuGet in the App To add the **Blazor Chat UI** component to your app, open the NuGet package manager in Visual Studio (*Tools → NuGet Package Manager → Manage NuGet Packages for Solution*), then search for and install [Syncfusion.Blazor.InteractiveChat](https://www.nuget.org/packages/Syncfusion.Blazor.InteractiveChat) and [Syncfusion.Blazor.Themes](https://www.nuget.org/packages/Syncfusion.Blazor.Themes/). diff --git a/blazor/check-box/getting-started-with-web-app.md b/blazor/check-box/getting-started-with-web-app.md index e7547dc005..c33cdcf01f 100644 --- a/blazor/check-box/getting-started-with-web-app.md +++ b/blazor/check-box/getting-started-with-web-app.md @@ -25,6 +25,8 @@ You can create a **Blazor Web App** using Visual Studio 2022 via [Microsoft Temp Configure the appropriate [Interactive render mode](https://learn.microsoft.com/en-us/aspnet/core/blazor/components/render-modes?view=aspnetcore-10.0#render-modes) and [Interactivity location](https://learn.microsoft.com/en-us/aspnet/core/blazor/tooling?view=aspnetcore-10.0&pivots=vs) while creating a Blazor Web App. +![Create Blazor Web App](images/blazor-create-web-app.png) + ## Install Syncfusion® Blazor Buttons and Themes NuGet in the Blazor Web App To add the **Blazor CheckBox** component, open the NuGet Package Manager in Visual Studio (Tools → NuGet Package Manager → Manage NuGet Packages for Solution), then search for and install [Syncfusion.Blazor.Buttons](https://www.nuget.org/packages/Syncfusion.Blazor.Buttons/) and [Syncfusion.Blazor.Themes](https://www.nuget.org/packages/Syncfusion.Blazor.Themes/). diff --git a/blazor/chip/getting-started-with-web-app.md b/blazor/chip/getting-started-with-web-app.md index d51f27b5fe..b81cf8644c 100644 --- a/blazor/chip/getting-started-with-web-app.md +++ b/blazor/chip/getting-started-with-web-app.md @@ -25,6 +25,8 @@ You can create a **Blazor Web App** using Visual Studio 2022 via [Microsoft Temp Configure the appropriate [Interactive render mode](https://learn.microsoft.com/en-us/aspnet/core/blazor/components/render-modes?view=aspnetcore-10.0#render-modes) and [Interactivity location](https://learn.microsoft.com/en-us/aspnet/core/blazor/tooling?view=aspnetcore-10.0&pivots=vs) while creating a Blazor Web App. +![Create Blazor Web App](images/blazor-create-web-app.png) + ## Install Syncfusion® Blazor Buttons and Themes NuGet in the Blazor Web App To add the **Blazor Chip** component in the app, open the NuGet package manager in Visual Studio (*Tools → NuGet Package Manager → Manage NuGet Packages for Solution*), then search and install [Syncfusion.Blazor.Buttons](https://www.nuget.org/packages/Syncfusion.Blazor.Buttons/) and [Syncfusion.Blazor.Themes](https://www.nuget.org/packages/Syncfusion.Blazor.Themes/). diff --git a/blazor/circular-gauge/getting-started-with-web-app.md b/blazor/circular-gauge/getting-started-with-web-app.md index ce16e7ce2e..3202295f87 100644 --- a/blazor/circular-gauge/getting-started-with-web-app.md +++ b/blazor/circular-gauge/getting-started-with-web-app.md @@ -25,6 +25,8 @@ You can create a **Blazor Web App** using Visual Studio 2022 via [Microsoft Temp Configure the appropriate [Interactive render mode](https://learn.microsoft.com/en-us/aspnet/core/blazor/components/render-modes?view=aspnetcore-10.0#render-modes) and [Interactivity location](https://learn.microsoft.com/en-us/aspnet/core/blazor/tooling?view=aspnetcore-10.0&pivots=vs) while creating a Blazor Web App. +![Create Blazor Web App](images/blazor-create-web-app.png) + ## Install Syncfusion® Blazor CircularGauge and Themes NuGet in the Blazor Web App To add the **Blazor CircularGauge** component in the app, open the NuGet package manager in Visual Studio (*Tools → NuGet Package Manager → Manage NuGet Packages for Solution*), then search and install [Syncfusion.Blazor.CircularGauge](https://www.nuget.org/packages/Syncfusion.Blazor.CircularGauge/) and [Syncfusion.Blazor.Themes](https://www.nuget.org/packages/Syncfusion.Blazor.Themes/). diff --git a/blazor/color-picker/getting-started-with-web-app.md b/blazor/color-picker/getting-started-with-web-app.md index 7ab3d99ea0..71d321c71f 100644 --- a/blazor/color-picker/getting-started-with-web-app.md +++ b/blazor/color-picker/getting-started-with-web-app.md @@ -25,6 +25,8 @@ You can create a **Blazor Web App** using Visual Studio 2022 via [Microsoft Temp Configure the appropriate [Interactive render mode](https://learn.microsoft.com/en-us/aspnet/core/blazor/components/render-modes?view=aspnetcore-10.0#render-modes) and [Interactivity location](https://learn.microsoft.com/en-us/aspnet/core/blazor/tooling?view=aspnetcore-10.0&pivots=vs) while creating a Blazor Web App. +![Create Blazor Web App](images/blazor-create-web-app.png) + ## Install Syncfusion® Blazor Inputs and Themes NuGet in the Blazor Web App To add the **Blazor ColorPicker** component in the app, open the NuGet package manager in Visual Studio (*Tools → NuGet Package Manager → Manage NuGet Packages for Solution*), then search and install [Syncfusion.Blazor.Inputs](https://www.nuget.org/packages/Syncfusion.Blazor.Inputs/) and [Syncfusion.Blazor.Themes](https://www.nuget.org/packages/Syncfusion.Blazor.Themes/). diff --git a/blazor/combobox/getting-started-with-web-app.md b/blazor/combobox/getting-started-with-web-app.md index 4de20cb474..5798a4864c 100644 --- a/blazor/combobox/getting-started-with-web-app.md +++ b/blazor/combobox/getting-started-with-web-app.md @@ -25,6 +25,8 @@ You can create a **Blazor Web App** using Visual Studio 2022 via [Microsoft Temp Configure the appropriate [Interactive render mode](https://learn.microsoft.com/en-us/aspnet/core/blazor/components/render-modes?view=aspnetcore-10.0#render-modes) and [Interactivity location](https://learn.microsoft.com/en-us/aspnet/core/blazor/tooling?view=aspnetcore-10.0&pivots=vs) while creating a Blazor Web App. +![Create Blazor Web App](images/blazor-create-web-app.png) + ## Install Syncfusion® Blazor DropDowns and Themes NuGet in the Blazor Web App To add the **Blazor ComboBox** component in the app, open the NuGet package manager in Visual Studio (*Tools → NuGet Package Manager → Manage NuGet Packages for Solution*), then search and install [Syncfusion.Blazor.DropDowns](https://www.nuget.org/packages/Syncfusion.Blazor.DropDowns/) and [Syncfusion.Blazor.Themes](https://www.nuget.org/packages/Syncfusion.Blazor.Themes/). diff --git a/blazor/context-menu/getting-started-with-web-app.md b/blazor/context-menu/getting-started-with-web-app.md index 4c2ba355ba..1d8a1a7e20 100644 --- a/blazor/context-menu/getting-started-with-web-app.md +++ b/blazor/context-menu/getting-started-with-web-app.md @@ -25,6 +25,8 @@ You can create a **Blazor Web App** using Visual Studio 2022 via [Microsoft Temp Configure the appropriate [Interactive render mode](https://learn.microsoft.com/en-us/aspnet/core/blazor/components/render-modes?view=aspnetcore-10.0#render-modes) and [Interactivity location](https://learn.microsoft.com/en-us/aspnet/core/blazor/tooling?view=aspnetcore-10.0&pivots=vs) while creating a Blazor Web App. +![Create Blazor Web App](images/blazor-create-web-app.png) + ## Install Syncfusion® Blazor Navigations and Themes NuGet in the Blazor Web App To add the **Blazor ContextMenu** component in the app, open the NuGet package manager in Visual Studio (*Tools → NuGet Package Manager → Manage NuGet Packages for Solution*), then search and install [Syncfusion.Blazor.Navigations](https://www.nuget.org/packages/Syncfusion.Blazor.Navigations/) and [Syncfusion.Blazor.Themes](https://www.nuget.org/packages/Syncfusion.Blazor.Themes/). diff --git a/blazor/dashboard-layout/getting-started-with-web-app.md b/blazor/dashboard-layout/getting-started-with-web-app.md index f9235abb09..24989f8638 100644 --- a/blazor/dashboard-layout/getting-started-with-web-app.md +++ b/blazor/dashboard-layout/getting-started-with-web-app.md @@ -25,6 +25,8 @@ You can create a **Blazor Web App** using Visual Studio 2022 via [Microsoft Temp Configure the appropriate [Interactive render mode](https://learn.microsoft.com/en-us/aspnet/core/blazor/components/render-modes?view=aspnetcore-10.0#render-modes) and [Interactivity location](https://learn.microsoft.com/en-us/aspnet/core/blazor/tooling?view=aspnetcore-10.0&pivots=vs) while creating a Blazor Web App. +![Create Blazor Web App](images/blazor-create-web-app.png) + ## Install Syncfusion® Blazor Layouts and Themes NuGet in the Blazor Web App To add the **Blazor Dashboard Layout** component in the app, open the NuGet package manager in Visual Studio (*Tools → NuGet Package Manager → Manage NuGet Packages for Solution*), then search and install [Syncfusion.Blazor.Layouts](https://www.nuget.org/packages/Syncfusion.Blazor.Layouts/) and [Syncfusion.Blazor.Themes](https://www.nuget.org/packages/Syncfusion.Blazor.Themes/). diff --git a/blazor/data-form/getting-started-with-web-app.md b/blazor/data-form/getting-started-with-web-app.md index 898d077d5e..6e8a9adf16 100644 --- a/blazor/data-form/getting-started-with-web-app.md +++ b/blazor/data-form/getting-started-with-web-app.md @@ -25,6 +25,8 @@ You can create a **Blazor Web App** using Visual Studio 2022 via [Microsoft Temp Configure the appropriate [Interactive render mode](https://learn.microsoft.com/en-us/aspnet/core/blazor/components/render-modes?view=aspnetcore-10.0#render-modes) and [Interactivity location](https://learn.microsoft.com/en-us/aspnet/core/blazor/tooling?view=aspnetcore-10.0&pivots=vs) while creating a Blazor Web App. +![Create Blazor Web App](images/blazor-create-web-app.png) + ## Install Syncfusion® Blazor DataForm and Themes NuGet in the Blazor Web App To add the **Blazor DataForm** component in the app, open the NuGet package manager in Visual Studio (*Tools → NuGet Package Manager → Manage NuGet Packages for Solution*), then search and install [Syncfusion.Blazor.DataForm](https://www.nuget.org/packages/Syncfusion.Blazor.DataForm/) and [Syncfusion.Blazor.Themes](https://www.nuget.org/packages/Syncfusion.Blazor.Themes/). diff --git a/blazor/data/getting-started-with-web-app.md b/blazor/data/getting-started-with-web-app.md index f3820c68f2..c98c2e5cf0 100644 --- a/blazor/data/getting-started-with-web-app.md +++ b/blazor/data/getting-started-with-web-app.md @@ -25,6 +25,8 @@ You can create a **Blazor Web App** using Visual Studio 2022 via [Microsoft Temp Configure the appropriate [Interactive render mode](https://learn.microsoft.com/en-us/aspnet/core/blazor/components/render-modes?view=aspnetcore-10.0#render-modes) and [Interactivity location](https://learn.microsoft.com/en-us/aspnet/core/blazor/tooling?view=aspnetcore-10.0&pivots=vs) while creating a Blazor Web App. +![Create Blazor Web App](images/blazor-create-web-app.png) + ## Install Syncfusion® Blazor Data and Themes NuGet in the Blazor Web App To add the **Blazor DataManager** component in the app, open the NuGet package manager in Visual Studio (*Tools → NuGet Package Manager → Manage NuGet Packages for Solution*), then search and install [Syncfusion.Blazor.Data](https://www.nuget.org/packages/Syncfusion.Blazor.Data/) and [Syncfusion.Blazor.Themes](https://www.nuget.org/packages/Syncfusion.Blazor.Themes/). diff --git a/blazor/datepicker/getting-started-with-web-app.md b/blazor/datepicker/getting-started-with-web-app.md index 000dca4d97..640cdf1c09 100644 --- a/blazor/datepicker/getting-started-with-web-app.md +++ b/blazor/datepicker/getting-started-with-web-app.md @@ -25,6 +25,8 @@ You can create a **Blazor Web App** using Visual Studio 2022 via [Microsoft Temp Configure the appropriate [Interactive render mode](https://learn.microsoft.com/en-us/aspnet/core/blazor/components/render-modes?view=aspnetcore-10.0#render-modes) and [Interactivity location](https://learn.microsoft.com/en-us/aspnet/core/blazor/tooling?view=aspnetcore-10.0&pivots=vs) while creating a Blazor Web App. +![Create Blazor Web App](images/blazor-create-web-app.png) + ## Install Syncfusion® Blazor Calendars and Themes NuGet in the Blazor Web App To add the **Blazor DatePicker** component in the app, open the NuGet Package Manager in Visual Studio (Tools → NuGet Package Manager → Manage NuGet Packages for Solution), then search for and install [Syncfusion.Blazor.Calendars](https://www.nuget.org/packages/Syncfusion.Blazor.Calendars/) and [Syncfusion.Blazor.Themes](https://www.nuget.org/packages/Syncfusion.Blazor.Themes/). diff --git a/blazor/daterangepicker/getting-started-with-web-app.md b/blazor/daterangepicker/getting-started-with-web-app.md index 6b5b32afc4..a9528564e3 100644 --- a/blazor/daterangepicker/getting-started-with-web-app.md +++ b/blazor/daterangepicker/getting-started-with-web-app.md @@ -25,6 +25,8 @@ You can create a **Blazor Web App** using Visual Studio 2022 via [Microsoft Temp Configure the appropriate [Interactive render mode](https://learn.microsoft.com/en-us/aspnet/core/blazor/components/render-modes?view=aspnetcore-10.0#render-modes) and [Interactivity location](https://learn.microsoft.com/en-us/aspnet/core/blazor/tooling?view=aspnetcore-10.0&pivots=vs) while creating a Blazor Web App. +![Create Blazor Web App](images/blazor-create-web-app.png) + ## Install Syncfusion® Blazor Calendars and Themes NuGet in the Blazor Web App To add the **Blazor DateRangePicker** component in the app, open the NuGet package manager in Visual Studio (*Tools → NuGet Package Manager → Manage NuGet Packages for Solution*), then search and install [Syncfusion.Blazor.Calendars](https://www.nuget.org/packages/Syncfusion.Blazor.Calendars/) and [Syncfusion.Blazor.Themes](https://www.nuget.org/packages/Syncfusion.Blazor.Themes/). diff --git a/blazor/datetime-picker/getting-started-with-web-app.md b/blazor/datetime-picker/getting-started-with-web-app.md index 94a8027455..8c8ada7e67 100644 --- a/blazor/datetime-picker/getting-started-with-web-app.md +++ b/blazor/datetime-picker/getting-started-with-web-app.md @@ -25,6 +25,8 @@ You can create a **Blazor Web App** using Visual Studio 2022 via [Microsoft Temp Configure the appropriate [Interactive render mode](https://learn.microsoft.com/en-us/aspnet/core/blazor/components/render-modes?view=aspnetcore-10.0#render-modes) and [Interactivity location](https://learn.microsoft.com/en-us/aspnet/core/blazor/tooling?view=aspnetcore-10.0&pivots=vs) while creating a Blazor Web App. +![Create Blazor Web App](images/blazor-create-web-app.png) + ## Install Syncfusion® Blazor Calendars and Themes NuGet in the Blazor Web App To add the **Blazor DateTimePicker** component in the app, open the NuGet package manager in Visual Studio (*Tools → NuGet Package Manager → Manage NuGet Packages for Solution*), then search and install [Syncfusion.Blazor.Calendars](https://www.nuget.org/packages/Syncfusion.Blazor.Calendars/) and [Syncfusion.Blazor.Themes](https://www.nuget.org/packages/Syncfusion.Blazor.Themes/). diff --git a/blazor/dialog/getting-started-with-web-app.md b/blazor/dialog/getting-started-with-web-app.md index 35a6487fcc..8dace588f2 100644 --- a/blazor/dialog/getting-started-with-web-app.md +++ b/blazor/dialog/getting-started-with-web-app.md @@ -25,6 +25,8 @@ You can create a **Blazor Web App** using Visual Studio 2022 via [Microsoft Temp Configure the appropriate [Interactive render mode](https://learn.microsoft.com/en-us/aspnet/core/blazor/components/render-modes?view=aspnetcore-10.0#render-modes) and [Interactivity location](https://learn.microsoft.com/en-us/aspnet/core/blazor/tooling?view=aspnetcore-10.0&pivots=vs) while creating a Blazor Web App. +![Create Blazor Web App](images/blazor-create-web-app.png) + ## Install Syncfusion® Blazor Popups and Themes NuGet in the Blazor Web App To add the **Blazor Dialog** component in the app, open the NuGet package manager in Visual Studio (*Tools → NuGet Package Manager → Manage NuGet Packages for Solution*), then search and install [Syncfusion.Blazor.Popups](https://www.nuget.org/packages/Syncfusion.Blazor.Popups/) and [Syncfusion.Blazor.Themes](https://www.nuget.org/packages/Syncfusion.Blazor.Themes/). diff --git a/blazor/drop-down-menu/getting-started-with-web-app.md b/blazor/drop-down-menu/getting-started-with-web-app.md index e5abaf6992..f48e1b16ab 100644 --- a/blazor/drop-down-menu/getting-started-with-web-app.md +++ b/blazor/drop-down-menu/getting-started-with-web-app.md @@ -25,6 +25,8 @@ You can create a **Blazor Web App** using Visual Studio 2022 via [Microsoft Temp Configure the appropriate [Interactive render mode](https://learn.microsoft.com/en-us/aspnet/core/blazor/components/render-modes?view=aspnetcore-10.0#render-modes) and [Interactivity location](https://learn.microsoft.com/en-us/aspnet/core/blazor/tooling?view=aspnetcore-10.0&pivots=vs) while creating a Blazor Web App. +![Create Blazor Web App](images/blazor-create-web-app.png) + ## Install Syncfusion® Blazor SplitButtons and Themes NuGet in the Blazor Web App To add the **Blazor DropDown Menu** component in the app, open the NuGet package manager in Visual Studio (*Tools → NuGet Package Manager → Manage NuGet Packages for Solution*), then search and install [Syncfusion.Blazor.SplitButtons](https://www.nuget.org/packages/Syncfusion.Blazor.SplitButtons/) and [Syncfusion.Blazor.Themes](https://www.nuget.org/packages/Syncfusion.Blazor.Themes/). diff --git a/blazor/predefined-dialogs/getting-started-webapp.md b/blazor/predefined-dialogs/getting-started-webapp.md index 9dbb891573..97d031d9c2 100644 --- a/blazor/predefined-dialogs/getting-started-webapp.md +++ b/blazor/predefined-dialogs/getting-started-webapp.md @@ -25,6 +25,8 @@ You can create a **Blazor Web App** using Visual Studio 2022 via [Microsoft Temp Configure the appropriate [Interactive render mode](https://learn.microsoft.com/en-us/aspnet/core/blazor/components/render-modes?view=aspnetcore-10.0#render-modes) and [Interactivity location](https://learn.microsoft.com/en-us/aspnet/core/blazor/tooling?view=aspnetcore-10.0&pivots=vs) while creating a Blazor Web App. +![Create Blazor Web App](images/blazor-create-web-app.png) + ## Install Syncfusion® Blazor Popups and Themes NuGet in the App To add the **Blazor predefined dialog** component in the app, open the NuGet package manager in Visual Studio (*Tools → NuGet Package Manager → Manage NuGet Packages for Solution*), then search and install [Syncfusion.Blazor.Popups](https://www.nuget.org/packages/Syncfusion.Blazor.Popups) and [Syncfusion.Blazor.Themes](https://www.nuget.org/packages/Syncfusion.Blazor.Themes/). From d7c9e9a3d578d09ff64310c48e623fcd1c41b378 Mon Sep 17 00:00:00 2001 From: SadhanaBaskaran Date: Sat, 8 Nov 2025 10:20:54 +0530 Subject: [PATCH 116/266] 991769: Updated the UG content and samples for Editing in Blazor DataGrid --- blazor/datagrid/column-validation.md | 65 ++++++++++------- blazor/datagrid/command-column-editing.md | 38 +++++----- blazor/datagrid/persisting-data-in-server.md | 47 ++++++++----- blazor/datagrid/template-editing.md | 73 ++++++++++---------- 4 files changed, 125 insertions(+), 98 deletions(-) diff --git a/blazor/datagrid/column-validation.md b/blazor/datagrid/column-validation.md index 1967d3dc8f..0972c883ee 100644 --- a/blazor/datagrid/column-validation.md +++ b/blazor/datagrid/column-validation.md @@ -1,7 +1,7 @@ --- layout: post title: Column Validation in Blazor DataGrid | Syncfusion -description: Checkout and learn here all about Column Validation in Syncfusion Blazor DataGrid and much more details. +description: Learn about Column Validation in Syncfusion Blazor DataGrid, including setup, validation types, and customization options. platform: Blazor control: DataGrid documentation: ug @@ -9,15 +9,15 @@ documentation: ug # Validation in Blazor DataGrid -Validation is a crucial aspect of data integrity in any application. The Syncfusion® Blazor DataGrid provides built-in support for easy and effective data validation. This feature ensures that the data entered or modified adheres to predefined rules, preventing errors and guaranteeing the accuracy of the displayed information. +Validation is a critical aspect of maintaining data integrity in applications. The Syncfusion® Blazor DataGrid provides built-in support for efficient and reliable data validation. This feature ensures that entered or modified data adheres to predefined rules, helping prevent errors and maintain the accuracy of displayed information. ## Column validation -Column validation allows you to validate edited or newly added row data before saving it. This feature is particularly useful when you need to enforce specific rules or constraints on individual columns to ensure data integrity. By applying validation rules to columns, you can display error messages for invalid fields and prevent the saving of erroneous data. This feature leverages the **Form Validator** library to perform validation. You can define validation rules using the [GridColumn.ValidationRules](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridColumn.html#Syncfusion_Blazor_Grids_GridColumn_ValidationRules) property to specify the criteria for validating column values. +Column validation ensures that edited or newly added row data meets specific criteria before being saved. This feature is useful for enforcing rules or constraints on individual columns to maintain data integrity. Validation rules can be defined using the [GridColumn.ValidationRules](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridColumn.html#Syncfusion_Blazor_Grids_GridColumn_ValidationRules) property, which specifies the conditions for validating column values. The validation mechanism utilizes the **Form Validator** library. -> Validation in Grid works based on the Microsoft Blazor EditForm behavior. Once a validation message is shown, it will be validated again only during form submission or when you focus out from that particular field. Refer to the [Microsoft Validation](https://learn.microsoft.com/en-us/aspnet/core/blazor/forms/validation?view=aspnetcore-5.0#data-annotations-validator-component-and-custom-validation) documentation for further reference. +> Validation in the DataGrid is based on the Microsoft Blazor EditForm behavior. Once a validation message is displayed, the field is revalidated only during form submission or when focus is moved away from the field. Refer to the [Microsoft Validation](https://learn.microsoft.com/en-us/aspnet/core/blazor/forms/validation?view=aspnetcore-5.0#data-annotations-validator-component-and-custom-validation) documentation for additional details. -The following code example demonstrates how to define a validation rule for a Grid column: +The following example demonstrates how to define a validation rule for a Grid column: {% tabs %} {% highlight razor tabtitle="Index.razor" %} @@ -88,21 +88,21 @@ public class OrderDetails ## Data annotation -Data annotation validation attributes are used to validate fields in the DataGrid. The following validation attributes are supported in the Grid: +Data annotation validation attributes are used to validate fields in the Syncfusion® Blazor DataGrid. These attributes define validation rules that are applied during CRUD operations to ensure data integrity. | Attribute Name | Functionality | |---------------|--------------| -| 1. RequiredAttribute
    2. StringLengthAttribute
    3. RangeAttribute
    4. RegularExpressionAttribute
    5. MinLengthAttribute
    6. MaxLengthAttribute
    7. EmailAddressAttribute
    8. CompareAttribute
    9. DataTypeAttribute
    10. DataType.Custom
    11. DataType.Date
    12. DataType.DateTime
    13. DataType.EmailAddress
    14. DataType.ImageUrl
    15. DataType.Url | These data annotation validation attributes are used as `validation rules` in DataGrid CRUD operations. | +| 1. RequiredAttribute
    2. StringLengthAttribute
    3. RangeAttribute
    4. RegularExpressionAttribute
    5. MinLengthAttribute
    6. MaxLengthAttribute
    7. EmailAddressAttribute
    8. CompareAttribute
    9. DataTypeAttribute
    10. DataType.Custom
    11. DataType.Date
    12. DataType.DateTime
    13. DataType.EmailAddress
    14. DataType.ImageUrl
    15. DataType.Url | These data annotation attributes are used as `validation rules` in DataGrid CRUD operations. | For more information on data annotation, refer to this [documentation](https://blazor.syncfusion.com/documentation/datagrid/data-annotation) section. ## Custom validation -Custom validation allows users to define their own validation logic based on specific requirements. +Custom validation enables the definition of validation logic tailored to specific application requirements. -To implement custom validation, create a class that inherits from the `ValidationAttribute` class and override the `IsValid` method. All custom validation logic should be placed inside the `IsValid` method. +To implement custom validation, create a class that inherits from the `ValidationAttribute` class and override the `IsValid` method. All custom validation logic should be placed within the `IsValid` method. -The following sample code demonstrates how to implement custom validation for the **EmployeeID** and **Freight** fields. +The following example demonstrates how to implement custom validation for the **EmployeeID** and **Freight** fields: {% tabs %} {% highlight razor tabtitle="Index.razor" %} @@ -223,9 +223,9 @@ public class CustomValidationFreight : ValidationAttribute ### Validate complex column using data annotation attribute -You can validate complex data binding columns by using the [ValidateComplexType](https://learn.microsoft.com/en-us/aspnet/core/blazor/forms/validation?view=aspnetcore-5.0#data-annotations-validator-component-and-custom-validation) attribute from data annotations. +Complex data binding columns can be validated using the [ValidateComplexType](https://learn.microsoft.com/en-us/aspnet/core/blazor/forms/validation?view=aspnetcore-5.0#data-annotations-validator-component-and-custom-validation) attribute from data annotations. -In the following sample, the `ValidateComplexType` attribute is applied to the `EmployeeName` class to enable validation of its properties. A custom validation message is displayed in the "First Name" column by using the `RequiredAttribute` with a custom error message. +In the following example, the `ValidateComplexType` attribute is applied to the **EmployeeName** class to enable validation of its properties. A custom validation message is displayed in the **First Name** column using the `RequiredAttribute` with a custom error message. {% tabs %} {% highlight razor tabtitle="Index.razor" %} @@ -296,22 +296,27 @@ public class EmployeeInfo {% endhighlight %} {% endtabs %} -> Ensure to include the package **Microsoft.AspNetCore.Components.DataAnnotations.Validation** for complex type validation using the following reference: -`` +> Ensure the package **Microsoft.AspNetCore.Components.DataAnnotations.Validation** is included to enable complex type validation. Use the following reference: + +```csharp + + +``` ![Validate Complex Column Using Data Annotation Attribute in Blazor DataGrid.](images/blazor-datagrid-validate-complex-column-using-data-annotation-attribute.gif) ## Custom validator component -In addition to using the default and custom validation options, there may be scenarios where you want to implement your own validator component to validate the Grid edit form. This can be accomplished by using the **Validator** property of the **GridEditSettings** component, which accepts a validation component and injects it inside the **EditForm** of the Grid. Within the **Validator**, you can access the data using the implicit parameter `context`, which is of type [ValidatorTemplateContext](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.ValidatorTemplateContext.html). +In scenarios where built-in or attribute-based validation is insufficient, a custom validator component can be implemented to validate the Grid edit form. This is achieved using the [Validator](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridEditSettings.html#Syncfusion_Blazor_Grids_GridEditSettings_Validator) property of the [GridEditSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridEditSettings.html) component, which accepts a validation component and injects it into the EditForm of the DataGrid. -For guidance on creating a form validator component, refer to the [official documentation](https://learn.microsoft.com/en-us/aspnet/core/blazor/forms-and-input-components?view=aspnetcore-5.0#validator-components). +Within the custom validator component, data can be accessed using the implicit context parameter, which is of type [ValidatorTemplateContext](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.ValidatorTemplateContext.html). -In the following code example: +For guidance on creating a form validator component, refer to the [official documentation](https://learn.microsoft.com/en-us/aspnet/core/blazor/forms-and-input-components?view=aspnetcore-5.0#validator-components). +In the following example: -* A form validator component named `MyCustomValidator` is created, which accepts a [ValidatorTemplateContext](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.ValidatorTemplateContext.html) value as a parameter. -* The `MyCustomValidator` component is used inside the **Validator** property. -* This validator component checks whether the Freight value is between 0 and 100. +* A form validator component named **MyCustomValidator** is created, accepting a `ValidatorTemplateContext` value as a parameter. +* The **MyCustomValidator** component is assigned to the `Validator` property. +* The component validates whether the **Freight** value is between **0** and **100**. * Validation error messages are displayed using the **ValidationMessage** component. ```csharp @@ -400,9 +405,9 @@ public class MyCustomValidator : ComponentBase ## Display validation message using in-built tooltip -In the above code example, the **ValidationMessage** component is used. However, this approach may not be suitable when using Inline editing or Batch editing modes. In such cases, you can use the built-in validation tooltip to display error messages by calling the `ValidatorTemplateContext.ShowValidationMessage(fieldName, isValid, message)` method. +When using **Inline** or **Batch** editing modes in the Syncfusion® Blazor DataGrid, the **ValidationMessage** component may not be suitable for displaying error messages. In such cases, the built-in validation tooltip can be used to show validation messages by invoking the [ValidatorTemplateContext.ShowValidationMessage(fieldName, isValid, message)](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.ValidatorTemplateContext.html#Syncfusion_Blazor_Grids_ValidatorTemplateContext_ShowValidationMessage) method. -The `HandleValidation` method of the `MyCustomValidator` component can be updated as shown below. +The `HandleValidation` method of the **MyCustomValidator** component can be updated as shown below: ```c# protected void HandleValidation(FieldIdentifier identifier) @@ -433,7 +438,12 @@ protected void HandleValidation(FieldIdentifier identifier) ## Disable in-built validator component -The **Validator** property can also be used to disable the built-in validator component used by the Syncfusion® Blazor DataGrid. By default, the Grid uses two validator components: **DataAnnotationsValidator** and an internal validator that handles the [ValidationRules](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridColumn.html#Syncfusion_Blazor_Grids_GridColumn_ValidationRules) property for edit form validation. If you want to use only the **DataAnnotationsValidator** component, you can achieve this by using the following code. +The [Validator](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridEditSettings.html#Syncfusion_Blazor_Grids_GridEditSettings_Validator) property of the [GridEditSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridEditSettings.html) component can be used to disable the built-in validator component in the Syncfusion® Blazor DataGrid. By default, the Grid uses two validator components: + +* DataAnnotationsValidator +* An internal validator that processes the `ValidationRules` property + +To use only the **DataAnnotationsValidator** component and disable the internal validator, configure the Validator property as shown below: ```c# @@ -463,9 +473,10 @@ The **Validator** property can also be used to disable the built-in validator co ## Display validation message in dialog template -Use form validation to display a validation message for a field that is not defined as a column in the Syncfusion® Blazor DataGrid. +Use form validation to show a validation message for a field that is not defined as a column in the Syncfusion® Blazor DataGrid. +The [Validator](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridEditSettings.html#Syncfusion_Blazor_Grids_GridEditSettings_Validator) property can be used to display a validation message for a field within the dialog template, even if the field is not included in the Grid columns. -You can use the **Validator** property to show a validation message for a field in the dialog template, even if that field is not present in the Grid columns. In the following example, the validation message for **ShipAddress** is displayed in the dialog template, even though the **ShipAddress** field is not defined as a Grid column. +In the following example, the validation message for **ShipAddress** is shown in the dialog template, although the **ShipAddress** field is not defined as a Grid column. > Validation messages for fields not defined in the Grid columns will appear as a validation summary at the top of the dialog edit form. @@ -643,4 +654,6 @@ public class OrderDetails {% previewsample "https://blazorplayground.syncfusion.com/embed/hZBoZChqfqyraNHa?appbar=false&editor=false&result=true&errorlist=false&theme=bootstrap5" %} -> You can find the fully working sample [here](https://github.com/SyncfusionExamples/blazor-datagrid-display-validation-message-in-dialog-template). \ No newline at end of file +> A fully working sample is available [here](https://github.com/SyncfusionExamples/blazor-datagrid-display-validation-message-in-dialog-template). + +N> Refer to the [Blazor DataGrid](https://www.syncfusion.com/blazor-components/blazor-datagrid) feature tour for a broad overview. Explore the [Blazor DataGrid example](https://blazor.syncfusion.com/demos/datagrid/overview?theme=bootstrap5) to understand data presentation and manipulation. \ No newline at end of file diff --git a/blazor/datagrid/command-column-editing.md b/blazor/datagrid/command-column-editing.md index 95c07e3b38..5005fd1684 100644 --- a/blazor/datagrid/command-column-editing.md +++ b/blazor/datagrid/command-column-editing.md @@ -1,7 +1,7 @@ --- layout: post title: Command Column Editing in Blazor DataGrid | Syncfusion -description: Checkout and learn here all about Command Column Editing in Syncfusion Blazor DataGrid and much more details. +description: Learn how to configure Command Column Editing in Syncfusion Blazor DataGrid with setup, usage, and customization tips. platform: Blazor control: DataGrid documentation: ug @@ -9,12 +9,14 @@ documentation: ug # Command column editing in Blazor DataGrid -The command column editing feature allows you to add CRUD (Create, Read, Update and Delete) action buttons in a column for performing operations on individual rows. This feature is commonly used when you want to enable inline editing, deletion, or saving of row changes directly within the Grid. +The command column editing feature enables CRUD (Create, Read, Update, and Delete) action buttons in a column to perform operations on individual rows. This approach is useful for inline editing, deletion, or saving changes directly within the Grid. -To enable command column editing, use the [GridColumn.Commands](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridColumn.html#Syncfusion_Blazor_Grids_GridColumn_Commands) property. By defining this property, you can specify the command buttons to display in the command column, such as Edit, Delete, Save, and Cancel. +To enable command column editing, use the [GridColumn.Commands](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridColumn.html#Syncfusion_Blazor_Grids_GridColumn_Commands) property. This property allows you to define which command buttons—such as Edit, Delete, Save, and Cancel—should appear in the command column. The available built-in command buttons are: +The available built-in command buttons: + | Command Button | Action | |---------------|-----------------------------| | Edit | Edit the current row. | @@ -22,7 +24,7 @@ The available built-in command buttons are: | Save | Update the edited row. | | Cancel | Cancel the edit operation. | -Here's an example that demonstrates how to add CRUD action buttons in a column using the `GridCommandColumns` property: +The following example demonstrates how to add CRUD action buttons in a column using the [GridCommandColumns](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridCommandColumns.html) property: {% tabs %} {% highlight razor tabtitle="Index.razor" %} @@ -99,11 +101,11 @@ public class OrderDetails ## Custom command column -The custom command column feature in the Syncfusion® Blazor DataGrid allows you to add custom command buttons in a column to perform specific actions on individual rows. This feature is particularly useful when you need to provide customized functionality for editing, deleting, or performing any other operation on a row. +The custom command column feature in the Syncfusion® Blazor DataGrid enables the addition of custom command buttons in a column to perform specific actions on individual rows. This feature is useful for implementing customized functionality such as editing, deleting, or executing other operations on a row. -To add custom command buttons in a column, you can utilize the [GridColumn.Commands](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridColumn.html#Syncfusion_Blazor_Grids_GridColumn_Commands) property. Furthermore, you can define the actions associated with these custom buttons using the [CommandClicked](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridEvents-1.html#Syncfusion_Blazor_Grids_GridEvents_1_CommandClicked) event. +To add custom command buttons, configure the [GridColumn.Commands](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridColumn.html#Syncfusion_Blazor_Grids_GridColumn_Commands) property. Define the actions for these buttons using the [CommandClicked](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridEvents-1.html#Syncfusion_Blazor_Grids_GridEvents_1_CommandClicked) event. -Here's an example that demonstrates how to add custom command buttons using the `GridCommandColumns` property and customize the button click behavior to display Grid details in a dialog using the `CommandClicked` event: +The following example demonstrates how to add custom command buttons using the [GridCommandColumns](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridCommandColumns.html) property and configure the `CommandClicked` event to display Grid details in a dialog: {% tabs %} {% highlight razor tabtitle="Index.razor" %} @@ -204,18 +206,18 @@ public class OrderDetails {% previewsample "https://blazorplayground.syncfusion.com/embed/htVoDiBhCEmvtthU?appbar=false&editor=false&result=true&errorlist=false&theme=bootstrap5" %} -> The Syncfusion® Blazor DataGrid does not support adding a new record using the command column. This is because the command column and its buttons are rendered only after a record is created. As a result, the Grid supports only edit, delete, cancel, and update options in the command column. +> The Syncfusion® Blazor DataGrid does not support **adding new records** using the command column. This limitation exists because the command column and its buttons are rendered only after a record is created. Therefore, the command column supports only **edit**, **delete**, **cancel**, and **update** operations. -## Hide the command column button in a specific record +## Hide command column button in specific records -In the Syncfusion® Blazor DataGrid, command columns are used to perform CRUD operations on records, such as editing or deleting. Sometimes, you may want to hide the command buttons for specific records based on certain conditions. This can be done by using the [`RowDataBound`](https://blazor.syncfusion.com/documentation/datagrid/events#rowdatabound) event, which is triggered every time a row is created or updated in the Grid. +In the Syncfusion® Blazor DataGrid, command columns are used to perform CRUD operations on records, such as editing or deleting. In certain scenarios, command buttons must be hidden for specific records based on defined conditions. This behavior can be achieved using the [RowDataBound](https://blazor.syncfusion.com/documentation/datagrid/events#rowdatabound) event, which is triggered whenever a row is created or updated in the Grid. -This is demonstrated in the following steps where the `RowDataBound` event is triggered when a record is created. Based on the record details, you can add a specific class name to that row and hide the command buttons using CSS styles. +The following steps demonstrate how to conditionally hide command buttons: -* Use the `RowDataBound` event of the Grid to access each row's data at the time of rendering. -* Inside the event, check the value of the **Verified** column for the current record. -* Based on the value of the **Verified** column, if Verified is **false**, only the **Edit** button will be shown; otherwise **Delete** button will be shown. -* In order to hide buttons (**display: none** style to the buttons), CSS class is applied to the row inside the `RowDataBound` event based on the record condition using `addClass` method, and corresponding CSS rules are defined to hide the respective command buttons. +* Use the `RowDataBound` event of the Grid to access each row's data during rendering. +* Check the value of the **Verified** column for the current record. +* If the **Verified** value is **false**, display only the **Edit** button; otherwise, display the **Delete** button. +* To hide buttons, apply a CSS class to the row using the `addClass` method inside the `RowDataBound` event based on the record condition. Define corresponding CSS rules to apply the style to the respective command buttons. {% tabs %} {% highlight razor tabtitle="Index.razor" %} @@ -240,11 +242,11 @@ This is demonstrated in the following steps where the `RowDataBound` event is tr ``` -> Here, **!important** attribute is used to apply custom styles since the column chooser dialog position will be calculated dynamically based on content. -This can be demonstrated in the following sample: +> The **!important** directive is used to ensure the custom styles override the dynamically calculated dimensions of the dialog. {% tabs %} {% highlight razor tabtitle="Index.razor" %} @@ -336,11 +340,9 @@ public class OrderData ## Change default search operator of the column chooser -The column chooser dialog in the Syncfusion® Blazor DataGrid provides a search box that allows you to search for column names. By default, the search functionality uses the **StartsWith** operator to match columns and display the results in the column chooser dialog. However, there might be cases where you need to change the default search operator to achieve more precise data matching. +The Syncfusion® Blazor DataGrid provides a search box in the column chooser dialog to filter column names. By default, the search uses the **StartsWith** operator. -To change the default search operator of the column chooser in Grid, you need to use the [Operator](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Operator.html) property of the [GridColumnChooserSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridColumnChooserSettings.html) class. - -Here’s an example of how to change the default search operator of the column chooser to **Contains** in the Grid: +To modify this behavior, use the [Operator](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Operator.html) property of the [GridColumnChooserSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridColumnChooserSettings.html). {% tabs %} {% highlight razor tabtitle="Index.razor" %} @@ -412,11 +414,13 @@ public class OrderData ## Column chooser template -Using the column chooser template, you can customize the column chooser dialog using [Template](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridColumnChooserSettings.html#Syncfusion_Blazor_Grids_GridColumnChooserSettings_Template) and [FooterTemplate](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridColumnChooserSettings.html#Syncfusion_Blazor_Grids_GridColumnChooserSettings_FooterTemplate) of the [GridColumnChooserSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridColumnChooserSettings.html). You can access the parameters passed to the templates using implicit parameter named context. +The Syncfusion® Blazor DataGrid allows customizing the column chooser dialog using the [Template](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridColumnChooserSettings.html#Syncfusion_Blazor_Grids_GridColumnChooserSettings_Template) and [FooterTemplate](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridColumnChooserSettings.html#Syncfusion_Blazor_Grids_GridColumnChooserSettings_FooterTemplate) properties of the [GridColumnChooserSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridColumnChooserSettings.html). These templates enable injecting custom content into the body and footer of the column chooser. + +The parameters passed to the templates can be accessed using the implicit **context** parameter. ### Customize the content of column chooser -The [Template](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridColumnChooserSettings.html#Syncfusion_Blazor_Grids_GridColumnChooserSettings_Template) tag in the [GridColumnChooserSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridColumnChooserSettings.html) is used to customize the content in the column chooser dialog. You can type cast the context as [ColumnChooserTemplateContext](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.ColumnChooserTemplateContext.html) to get columns inside content template. +The [Template](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridColumnChooserSettings.html#Syncfusion_Blazor_Grids_GridColumnChooserSettings_Template) property of the [GridColumnChooserSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridColumnChooserSettings.html) is used to customize the content of the column chooser dialog. The **context** parameter can be typecast to [ColumnChooserTemplateContext](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.ColumnChooserTemplateContext.html) to access the list of columns within the template. {% tabs %} {% highlight razor tabtitle="Index.razor" %} @@ -612,19 +616,18 @@ namespace Model {% endhighlight %} {% endtabs %} -> * You can build reusable custom component based on your customization need as like above code example. -> * In the above example, [ListView](https://blazor.syncfusion.com/documentation/listview/getting-started) is used as custom component in the content template to show/hide columns. +{% previewsample "https://blazorplayground.syncfusion.com/embed/BNLJiLVTWKyyPjml?appbar=false&editor=false&result=true&errorlist=false&theme=bootstrap5" %} -{% previewsample "https://blazorplayground.syncfusion.com/embed/BNLJiLVTWKyyPjml?appbar=false&editor=false&result=true&errorlist=false&theme=bootstrap5" backgroundimage "[Column chooser content template in Blazor DataGrid.](images/blazor-datagrid-column-chooser-content-template.png)" %} +![Column chooser content template in Blazor DataGrid.](images/blazor-datagrid-column-chooser-content-template.png) ### Customize the footer of column chooser -The [FooterTemplate](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridColumnChooserSettings.html#Syncfusion_Blazor_Grids_GridColumnChooserSettings_FooterTemplate) tag in the [GridColumnChooserSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridColumnChooserSettings.html) is used to customize the footer in the column chooser dialog. You can type cast the context as [ColumnChooserFooterTemplateContext](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.ColumnChooserFooterTemplateContext.html) to get columns inside FooterTemplate. +The [FooterTemplate](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridColumnChooserSettings.html#Syncfusion_Blazor_Grids_GridColumnChooserSettings_FooterTemplate) property of the [GridColumnChooserSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridColumnChooserSettings.html) allows customizing the footer area of the column chooser dialog. The **context** parameter can be typecast to [ColumnChooserFooterTemplateContext](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.ColumnChooserFooterTemplateContext.html) to access the list of columns and perform actions such as applying or cancelling changes. {% tabs %} {% highlight razor tabtitle="Index.razor" %} @using Syncfusion.Blazor.Grids -@using Syncfusion.Blazor.Buttons +@using Syncfusion.Blazor.Grids @@ -709,19 +712,14 @@ The [FooterTemplate](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gri ## Group column chooser items in Blazor DataGrid -The Syncfusion® Blazor DataGrid supports grouping items in the column chooser dialog to improve usability and organization.It allows you to organize column chooser items into logical groups. This can be achieved using the [GridColumnChooserItemGroup](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridColumnChooserItemGroup.html). - -To implement this: - -* **Enable column chooser** – Set [ShowColumnChooser](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_ShowColumnChooser) property as **true** in the Grid and add **ColumnChooser** to the [Toolbar](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_Toolbar). - -* **Use template in [GridColumnChooserSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridColumnChooserSettings.html)** – Customize the layout of chooser items using the [Template](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridColumnChooserSettings.html#Syncfusion_Blazor_Grids_GridColumnChooserSettings_Template) property. - -* **Group items** – Use [GridColumnChooserItemGroup](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridColumnChooserItemGroup.html) to define logical groups with a [Title](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridColumnChooserItemGroup.html#Syncfusion_Blazor_Grids_GridColumnChooserItemGroup_Title), and render corresponding columns under each group. +The Syncfusion® Blazor DataGrid supports grouping items in the column chooser dialog using the [GridColumnChooserItemGroup](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridColumnChooserItemGroup.html) component. This improves usability by organizing columns into logical sections. -* **Filter group columns** – Write helper methods to fetch grouped columns dynamically using field names. +To configure this: -The following example demonstrates how to group column chooser items using these steps: +1. Set the [ShowColumnChooser](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_ShowColumnChooser) property to **true** and include **"ColumnChooser"** in the [Toolbar](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_Toolbar) collection. +2. Use the [Template](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridColumnChooserSettings.html#Syncfusion_Blazor_Grids_GridColumnChooserSettings_Template) property of [GridColumnChooserSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridColumnChooserSettings.html) to define the layout of chooser items. +3. Define logical groups using the `GridColumnChooserItemGroup` component and assign a Title for each group. +4. Use helper methods to filter and render columns dynamically within each group. {% tabs %} {% highlight razor tabtitle="Index.razor" %} diff --git a/blazor/datagrid/column-menu.md b/blazor/datagrid/column-menu.md index f32d0768db..c929179017 100644 --- a/blazor/datagrid/column-menu.md +++ b/blazor/datagrid/column-menu.md @@ -1,7 +1,7 @@ --- layout: post title: Column Menu in Blazor DataGrid Component | Syncfusion -description: Checkout and learn here all about column menu in the Syncfusion Blazor DataGrid component and much more details. +description: Learn how to use and customize the column menu in Syncfusion Blazor DataGrid, including events, actions, and advanced options for better control. platform: Blazor control: DataGrid documentation: ug @@ -9,20 +9,22 @@ documentation: ug # Column Menu in Blazor DataGrid -The column menu in the Syncfusion® Blazor DataGrid provides options to enable features such as sorting, grouping, filtering, column chooser, and autofit. When users click on the column header’s menu icon, a menu will be displayed with these integrated features. To enable the column menu, you need to set the [ShowColumnMenu](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridColumn.html#Syncfusion_Blazor_Grids_GridColumn_ShowColumnMenu) property to true in the Grid configuration. +The Syncfusion® Blazor DataGrid supports a column menu that provides quick access to features such as sorting, grouping, filtering, column chooser, and autofit. Clicking the column header’s menu icon displays a contextual menu with these options. -The default menu items are displayed in the following table: +To enable the column menu, set the [ShowColumnMenu](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_ShowColumnMenu) property to **true** in the [Grid](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html) configuration. + +The default column menu items are listed in the table: | Item | Description | |-----|-----| | **SortAscending** | Sort the current column in ascending order. | | **SortDescending** | Sort the current column in descending order. | -| **Group** | Group the current column. | -| **Ungroup** | Ungroup the current column. | -| **AutoFit** | Auto fit the current column. | -| **AutoFitAll** | Auto fit all columns. | -| **ColumnChooser** | Choose the column visibility. | -| **Filter** | Show the filter option as given in filterSettings [Type](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridFilterSettings.html#Syncfusion_Blazor_Grids_GridFilterSettings_Type) property | +| **Group** | Groups the current column. | +| **Ungroup** | Ungroups the current column. | +| **AutoFit** | Adjusts the width of the current column to fit its content. | +| **AutoFitAll** | Adjusts the width of all columns to fit their content. | +| **ColumnChooser** | Opens the column chooser to manage column visibility. | +| **Filter** | Displays the filter option as defined in the [FilterSettings.Type](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridFilterSettings.html#Syncfusion_Blazor_Grids_GridFilterSettings_Type) property. | {% tabs %} {% highlight razor tabtitle="Index.razor" %} @@ -89,16 +91,16 @@ public class OrderData {% previewsample "https://blazorplayground.syncfusion.com/embed/hXLzMLWLKTPWHQcg?appbar=false&editor=false&result=true&errorlist=false&theme=bootstrap5" %} -> * You can disable column menu for a particular column by defining the column's [ShowColumnMenu](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridColumn.html#Syncfusion_Blazor_Grids_GridColumn_ShowColumnMenu) property as false. -> * You can customize the default menu items by defining the [ColumnMenuItems](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_ColumnMenuItems) with the required items. +> * To disable the column menu for a specific column, set the [ShowColumnMenu](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridColumn.html#Syncfusion_Blazor_Grids_GridColumn_ShowColumnMenu) property of the [GridColumn](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridColumn.html) to **false**. +> * To customize the menu items, define the [ColumnMenuItems](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_ColumnMenuItems) property with the required options. -## Prevent column menu for particular column +## Disable column menu for specific column -The Syncfusion® Blazor DataGrid provides the ability to prevent the appearance of the column menu for specific columns. This feature is useful when you want to restrict certain columns from being customizable through the column menu. +The Syncfusion® Blazor DataGrid provides the ability to prevent the column menu from appearing for specific columns. This is useful when certain columns should not be customizable through the column menu. -To prevent the column menu for a particular column, you can set the [ShowColumnMenu](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridColumn.html#Syncfusion_Blazor_Grids_GridColumn_ShowColumnMenu) property to **false** for that specific column configuration. This will disable the column menu options specifically for the designated column, while other columns will have the column menu enabled. +To disable the column menu for a specific column, set the [ShowColumnMenu](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridColumn.html#Syncfusion_Blazor_Grids_GridColumn_ShowColumnMenu) property of the [GridColumn](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridColumn.html) to **false**. -The following example demonstrates how to prevent the column menu for a specific column. In this example, the column menu is disabled for the **OrderID** column by setting the `ShowColumnMenu` property to **false**: +The column menu is disabled for the **OrderID** column: {% tabs %} {% highlight razor tabtitle="Index.razor" %} @@ -167,9 +169,11 @@ public class OrderData ## Add custom column menu item -The custom column menu item feature allows you to add additional menu items to the column menu in the Syncfusion® Blazor DataGrid. These custom menu items can be defined using the [ColumnMenuItems](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_ColumnMenuItems) property, which accepts a collection of [ColumnMenuItemModel](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.ColumnMenuItemModel.html) class.You can define the actions for these custom items in the [ColumnMenuItemClicked](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridEvents-1.html#Syncfusion_Blazor_Grids_GridEvents_1_ColumnMenuItemClicked) event. +The Syncfusion® Blazor DataGrid supports adding custom items to the column menu using the [ColumnMenuItems](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_ColumnMenuItems) property. This property accepts a collection of [ColumnMenuItemModel](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.ColumnMenuItemModel.html) objects. + +Custom actions for these items can be defined in the [ColumnMenuItemClicked](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridEvents-1.html#Syncfusion_Blazor_Grids_GridEvents_1_ColumnMenuItemClicked) event. -Consider the following example, which demonstrates how to add a custom column menu item to clear the sorting and grouping of the Grid using the [ClearSortingAsync](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_ClearSortingAsync_System_Collections_Generic_List_System_String__) and [ClearGroupingAsync](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_ClearGroupingAsync) method in the `ColumnMenuItemClicked` event: +In this configuration, two custom column menu items are added to clear sorting and grouping using the [ClearSortingAsync](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_ClearSortingAsync_System_Collections_Generic_List_System_String__) and [ClearGroupingAsync](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_ClearGroupingAsync) methods: {% tabs %} {% highlight razor tabtitle="Index.razor" %} @@ -260,17 +264,19 @@ public class OrderData {% previewsample "https://blazorplayground.syncfusion.com/embed/htVJMrMgCLBDWpXz?appbar=false&editor=false&result=true&errorlist=false&theme=bootstrap5" %} -## Customize menu items for particular columns +## Customize menu items for specific columns + +The Syncfusion® Blazor DataGrid allows customizing the visibility of column menu items for specific columns. This is useful when certain actions, such as filtering or grouping, should not be available for specific columns. -Sometimes, you have a scenario that to hide an item from column menu for particular columns. In that case, you need to define the [MenuItem.Hidden](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Navigations.MenuItem.html#Syncfusion_Blazor_Navigations_MenuItem_Hidden) property as **true** in the [OnColumnMenuOpen](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridEvents-1.html#Syncfusion_Blazor_Grids_GridEvents_1_OnColumnMenuOpen) event. +To hide a menu item for a specific column, set the [MenuItem.Hidden](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Navigations.MenuItem.html#Syncfusion_Blazor_Navigations_MenuItem_Hidden) property to **true** in the [OnColumnMenuOpen](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridEvents-1.html#Syncfusion_Blazor_Grids_GridEvents_1_OnColumnMenuOpen) event. -The following sample, **Filter** item was hidden in column menu when opens for the **OrderID** column: +The **Filter** item is hidden when the column menu is opened for the **OrderID** column. {% tabs %} {% highlight razor tabtitle="Index.razor" %} @using Syncfusion.Blazor.Grids - + @@ -353,11 +359,9 @@ public class OrderData ## Render nested column menu -The nested column menu feature provides an extended menu option in the Syncfusion® Blazor DataGrid column headers, allows you to access additional actions and options related to the columns. +The Syncfusion® Blazor DataGrid supports rendering a nested column menu that provides extended options within the column header menu. This feature allows organizing related actions under submenus for better usability. -To enable the nested column menu feature, you need to define the [ColumnMenuItems](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_ColumnMenuItems) property in your component. The `ColumnMenuItems` property is an array that contains the items for the column menu. Each item can be a string representing a built-in menu item or an object defining a custom menu item. - -Here is an example of how to configure the `ColumnMenuItems` property to include a nested menu: +To enable a nested column menu, define the [ColumnMenuItems](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_ColumnMenuItems) property. This property accepts a collection of [ColumnMenuItemModel](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.ColumnMenuItemModel.html) objects, where each item can include a submenu by specifying its [Items](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.ColumnMenuItemModel.html#Syncfusion_Blazor_Grids_ColumnMenuItemModel_Items) property. {% tabs %} {% highlight razor tabtitle="Index.razor" %} @@ -365,7 +369,7 @@ Here is an example of how to configure the `ColumnMenuItems` property to include @using Syncfusion.Blazor.Navigations - + @@ -453,22 +457,23 @@ public class OrderData ## Customize the icon of column menu -To customize the column menu icon, you need to override the default Grid class `.e-icons.e-columnmenu` with a custom CSS property called **content**. By specifying a Unicode character or an icon font’s CSS class, you can change the icon displayed in the column menu. +The Syncfusion® Blazor DataGrid allows customizing the column menu icon by overriding the default CSS class **.e-icons.e-columnmenu**. This is achieved by applying a custom CSS rule with the **content** property to display a different icon or Unicode character. + +**Steps to customize the icon:** -1. Add the necessary CSS code to override the default Grid class: +1. Override the default CSS class: ```css .e-grid .e-columnheader .e-icons.e-columnmenu::before { content: "\e99a"; } ``` -2. Import the required icon stylesheets. You can use either the material or bootstrap5 style, depending on your preference. Add the following code to import the stylesheets: +2. Import the icon stylesheet based on the selected theme preference: ```css ``` -Here is an example that demonstrates how to customize the column menu icon in the Grid: {% tabs %} {% highlight razor tabtitle="Index.razor" %} @@ -539,11 +544,44 @@ public class OrderData ## Column menu events -The column menu in Syncfusion® Blazor DataGrid provides a set of events that allow customization of behavior and performing actions when the column menu is opened or clicked. The below events are helpful for adding additional functionality or implementing specific actions based on user interactions with the column menu. +The Syncfusion® Blazor DataGrid provides events that are triggered during column menu interactions. These events allow execution of custom logic before the menu opens and after an item is clicked, enabling customization and UI updates. + +1. [OnColumnMenuOpen](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridEvents-1.html#Syncfusion_Blazor_Grids_GridEvents_1_OnColumnMenuOpen): Triggered before the column menu opens. +2. [ColumnMenuItemClicked](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridEvents-1.html#Syncfusion_Blazor_Grids_GridEvents_1_ColumnMenuItemClicked): Triggered when a column menu item is clicked. + +### OnColumnMenuOpen + +The `OnColumnMenuOpen` event is triggered before the column menu opens. This event can be used to inspect or modify the menu or cancel its opening based on custom logic. + +**Event Arguments** + +The event uses the [ColumnMenuOpenEventArgs](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.ColumnMenuOpenEventArgs.html) class, which includes: + +| Property | Type | Description | +|-------------------|-------------------------------------|-------------------------------------------------------------------------------------------------| +| Cancel | bool | Indicates whether to prevent the column menu from opening. Set to **true** to cancel opening. | +| Column | GridColumn | Represents the grid column where the column menu is currently open. | +| ColumnMenuIndex | int | Indicates the level of the menu item within the menu hierarchy. Starts from 0 for top-level. | +| Items | List<MenuItem> | The list of menu items displayed in the column menu. | +| Left | double | The left position of the column menu relative to the document or container. | +| ParentItem` | MenuItem | The parent menu item of the currently clicked sub-menu item. Null if no parent exists. | +| Top | double | The top position of the column menu relative to the document or container. | -1. The [OnColumnMenuOpen](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridEvents-1.html#Syncfusion_Blazor_Grids_GridEvents_1_OnColumnMenuOpen) event triggers before the column menu opens. +### ColumnMenuItemClicked + +The `ColumnMenuItemClicked` event is triggered when a column menu item is clicked. This event can be used to perform actions based on the selected menu item. + +**Event Arguments** + +The event uses the [ColumnMenuClickEventArgs](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.ColumnMenuClickEventArgs.html) class, which includes: + +| Property | Type | Description | +|----------|------|-------------| +| Column | GridColumn | The grid column associated with the column menu popup. | +| Element | ElementReference | The DOM element that triggered the event. | +| Event | System.EventArgs | Provides event details for the column menu interaction. | +| Item | Navigations.MenuItemModel | The menu item that was clicked in the column menu. | -2. The [ColumnMenuItemClicked](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridEvents-1.html#Syncfusion_Blazor_Grids_GridEvents_1_ColumnMenuItemClicked) event triggers when the user clicks the column menu of the Grid. {% tabs %} {% highlight razor tabtitle="Index.razor" %} @@ -623,182 +661,3 @@ public class OrderData {% endtabs %} {% previewsample "https://blazorplayground.syncfusion.com/embed/rthfMhiKzNimycPe?appbar=false&editor=false&result=true&errorlist=false&theme=bootstrap5" %} - - \ No newline at end of file From 00edbc8c89b41a97e1a892228576838dcd23492c Mon Sep 17 00:00:00 2001 From: SadhanaBaskaran Date: Tue, 2 Dec 2025 10:23:12 +0530 Subject: [PATCH 149/266] 993738: Updated the UG content and samples for Connecting to DataBase Section in Blazor DataGrid --- .../connecting-to-database/postgresql-server.md | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/blazor/datagrid/connecting-to-database/postgresql-server.md b/blazor/datagrid/connecting-to-database/postgresql-server.md index fcd108aff6..9f9bea6950 100644 --- a/blazor/datagrid/connecting-to-database/postgresql-server.md +++ b/blazor/datagrid/connecting-to-database/postgresql-server.md @@ -15,11 +15,13 @@ The Syncfusion® Blazor DataGrid component s - Implementing a [CustomAdaptor](https://blazor.syncfusion.com/documentation/datagrid/custom-binding) for custom logic. - Configuring remote data binding through adaptors such as [UrlAdaptor](https://blazor.syncfusion.com/documentation/data/adaptors#url-adaptor). -* **Remote Data Binding using UrlAdaptor** +This section explains how to connect and retrieve data from a PostgreSQL Server database using [Npgsql EntityFrameworkCore PostgreSQL](https://www.nuget.org/packages/Npgsql.EntityFrameworkCore.PostgreSQL) and bind the data to a Blazor DataGrid component through the following methods: + + **Using UrlAdaptor** The [UrlAdaptor](https://blazor.syncfusion.com/documentation/data/adaptors#url-adaptor) enables communication between the DataGrid and a remote API service connected to **PostgreSQL** Server. This approach is suitable when the API implements custom logic for data operations and returns results in the **result** and **count** format. -* **Custom Data Binding using CustomAdaptor** +**Using CustomAdaptor** The [CustomAdaptor](https://blazor.syncfusion.com/documentation/datagrid/connecting-to-adaptors/custom-adaptor) provides full control over data operations and CRUD functionality. It allows implementing custom logic for **searching**, **filtering**, **sorting**, **paging**, and **grouping** directly in the server-side code. @@ -181,7 +183,7 @@ Access the theme stylesheet and script from NuGet using [Static Web Assets](http 5. **Configure DataGrid with UrlAdaptor** -The [SfDataManager](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Data.SfDataManager.html) component supports multiple adaptors for remote data binding. For API services, set the [Adaptor](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Adaptors.html) property to [Adaptors.UrlAdaptor](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Adaptors.html#Syncfusion_Blazor_Adaptors_UrlAdaptor) and specify the service endpoint in the [Url](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataManager.html#Syncfusion_Blazor_DataManager_Url) property. +The [DataManager](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Data.SfDataManager.html) component supports multiple adaptors for remote data binding. For API services, set the [Adaptor](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Adaptors.html) property to [Adaptors.UrlAdaptor](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Adaptors.html#Syncfusion_Blazor_Adaptors_UrlAdaptor) and specify the service endpoint in the [Url](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataManager.html#Syncfusion_Blazor_DataManager_Url) property. {% tabs %} {% highlight razor tabtitle="Index.razor"%} @@ -470,7 +472,7 @@ public void Insert([FromBody] CRUDModel Value) **Update Operation:** -To edit a row, first select desired row and click the **Edit** toolbar button. The edit form will be displayed and proceed to modify any column value as per your requirement. Clicking the **Update** toolbar button will update the edit record in the Orders table by involving the following **Post** method of an API. +To edit a row, select the required row and click the **Edit** toolbar button. The edit form will appear, allowing modification of any column value as needed. Clicking the **Update** toolbar button applies the changes to the record in the Orders table by invoking the corresponding **POST** method of the API. {% tabs %} {% highlight c# tabtitle="OrdersController.cs" %} @@ -985,7 +987,7 @@ public class CustomAdaptor : DataAdaptor When employing `CustomAdaptor`, the grouping operation must be managed within the [Read](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataAdaptor.html#Syncfusion_Blazor_DataAdaptor_Read_Syncfusion_Blazor_DataManagerRequest_System_String_) or [ReadAsync](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataAdaptor.html#Syncfusion_Blazor_DataAdaptor_ReadAsync_Syncfusion_Blazor_DataManagerRequest_System_String_) method of the `CustomAdaptor`. -In the code example below, grouping a custom data source can be achieved by utilizing the [Group](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Data.DataUtil.html#Syncfusion_Blazor_Data_DataUtil_Group__1_System_Collections_IEnumerable_System_String_System_Collections_Generic_List_Syncfusion_Blazor_Data_Aggregate__System_Int32_System_Collections_Generic_IDictionary_System_String_System_String__System_Boolean_System_Boolean_) method from the [DataUtil](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Data.DataUtil.html) class. Alternatively, you can use your own method for grouping operation and bind the resulting data to the Blazor DataGrid component. +In the code example below, grouping a custom data source can be achieved by utilizing the [Group](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Data.DataUtil.html#Syncfusion_Blazor_Data_DataUtil_Group__1_System_Collections_IEnumerable_System_String_System_Collections_Generic_List_Syncfusion_Blazor_Data_Aggregate__System_Int32_System_Collections_Generic_IDictionary_System_String_System_String__System_Boolean_System_Boolean_) method from the [DataUtil](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Data.DataUtil.html) class. An alternative approach is to implement a custom method for the grouping operation and bind the resulting data to the Blazor DataGrid component. {% highlight razor %} public class CustomAdaptor : DataAdaptor From a49942959939d32436505501f1766bb655cf8cf4 Mon Sep 17 00:00:00 2001 From: SadhanaBaskaran Date: Tue, 2 Dec 2025 10:36:07 +0530 Subject: [PATCH 150/266] 984957: Updated the UG content and samples for Row in Blazor DataGrid --- blazor/datagrid/detail-template.md | 24 +++++------------------- blazor/datagrid/row-drag-and-drop.md | 12 ++++-------- blazor/datagrid/row-template.md | 6 ------ blazor/datagrid/row.md | 24 ++++-------------------- 4 files changed, 13 insertions(+), 53 deletions(-) diff --git a/blazor/datagrid/detail-template.md b/blazor/datagrid/detail-template.md index 30f05f2934..b494822110 100644 --- a/blazor/datagrid/detail-template.md +++ b/blazor/datagrid/detail-template.md @@ -21,11 +21,9 @@ For an overview of the `detail template` in the grid, watch the following video. To integrate the detail template in the grid: 1. Add the element within the component to define the detail row content. -2. Use any HTML structure or Blazor components inside the DetailTemplate to render custom content for each expanded row. +2. Use any HTML structure or Blazor components inside the **DetailTemplate** to render custom content for each expanded row. 3. Optionally, bind data to the template to display information corresponding to the expanded row. -The following example demonstrates using `DetailTemplate` to display additional details for each row: - {% tabs %} {% highlight razor tabtitle="Index.razor" %} @page "/" @@ -182,8 +180,6 @@ Use the [ExpandCollapseDetailRowAsync](https://help.syncfusion.com/cr/blazor/Syn > Alternatively, call `ExpandCollapseDetailRowAsync` with the row data object in the `DataBound` event. -The following example expands the record with `EmployeeID` equal to 1 by invoking `ExpandCollapseDetailRowAsync` in the `DataBound` event: - {% tabs %} {% highlight razor tabtitle="Index.razor" %} @@ -309,7 +305,7 @@ The Syncfusion® Blazor DataGrid can render To render a custom component or build a hierarchical grid inside the detail row, define the template in the [DetailTemplate](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridTemplates.html#Syncfusion_Blazor_Grids_GridTemplates_DetailTemplate) within the `GridTemplates` section. The hierarchical DataGrid displays data in expandable or collapsible levels using the expand or collapse button, or custom content such as HTML elements. -The following example uses the detail template to display parent–child data in a hierarchical structure with multiple levels (Employee → Orders → Customers): +The following example uses the detail template to display parent–child data in a hierarchical structure with multiple levels (**Employee → Orders → Customers**): {% tabs %} {% highlight razor tabtitle="Index.razor" %} @@ -480,8 +476,6 @@ A template column in a detail grid within the Syncfusion Employees = new List(); To expand or collapse a specific detail row programmatically, use [ExpandCollapseDetailRowAsync](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_ExpandCollapseDetailRowAsync__0_) and pass the corresponding row data object. -The following example expands or collapses a specific employee’s detail row when the button is clicked. - In the example, the `Expand` method validates the row index and then invokes `ExpandCollapseDetailRowAsync` with the selected row’s data: {% tabs %} @@ -1438,8 +1430,6 @@ Use the [RowDataBound](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.G ``` -The following example hides the expand/collapse icon for the row with `EmployeeID` equal to `1` when no child records exist: - {% tabs %} {% highlight razor tabtitle="Index.razor" %} @@ -1577,8 +1567,6 @@ public class OrderData Aggregates display summary values in the footer, group footer, or group caption of the detail grid. Use this feature to calculate and show summary information. -The following example renders aggregates in a detail grid to display the sum and maximum values of the `Freight` column: - {% tabs %} {% highlight razor tabtitle="Index.razor" %} @@ -2082,7 +2070,7 @@ To customize the appearance of the group expand/collapse icons in the detail Gri } ``` -In this example, the `.e-icon-gdownarrow` and `.e-icon-grightarrow` classes target the expand and collapse icons, respectively. Modify the `content` property to change the icon displayed. You can use the available [Syncfusion® icons](https://blazor.syncfusion.com/documentation/appearance/icons) based on your theme. +In this example, the `.e-icon-gdownarrow` and `.e-icon-grightarrow` classes target the expand and collapse icons, respectively. Modify the `content` property to change the icon displayed. [Syncfusion® icons](https://blazor.syncfusion.com/documentation/appearance/icons) sets can be used based on the selected theme. ![Detail Grid group expand or collapse icons in Blazor](images/hierarchy-grid/grid-child-group-expand-or-collapse-icons.png) @@ -2282,13 +2270,11 @@ In this example, the `.e-cellselectionbackground` class targets the background c Detail template is not supported with the following features: -* Frozen rows and columns * Immutable mode * Infinite scrolling * Virtual scrolling * Print * Row template -* Row spanning -* Column spanning * Lazy load grouping -* State persistence \ No newline at end of file +* State persistence +* Row and Column Spanning \ No newline at end of file diff --git a/blazor/datagrid/row-drag-and-drop.md b/blazor/datagrid/row-drag-and-drop.md index b1477c6d3e..64a2da24ab 100644 --- a/blazor/datagrid/row-drag-and-drop.md +++ b/blazor/datagrid/row-drag-and-drop.md @@ -18,9 +18,7 @@ Enable row drag and drop by setting [AllowRowDragAndDrop](https://help.syncfusio ## Drag and drop within DataGrid -The drag and drop feature enables reordering of rows within the Syncfusion® Blazor DataGrid using the drag handle. Set the [AllowRowDragAndDrop](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_AllowRowDragAndDrop) property to `true` to enable this feature. By default, the value is `false`. - -Here is an example that enables row drag and drop within the grid: +The drag and drop feature enables reordering of rows within the Syncfusion® Blazor DataGrid using the drag handle. Set the [AllowRowDragAndDrop](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_AllowRowDragAndDrop) property to **true** to enable this feature. By default, the value is **false**. {% tabs %} {% highlight razor tabtitle="Index.razor" %} @@ -106,9 +104,7 @@ Here is an example that enables row drag and drop within the grid: ## Drag and drop to DataGrid -The Syncfusion® Blazor DataGrid supports dragging rows from one grid and dropping them into another. Enable this feature by setting the [AllowRowDragAndDrop](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_AllowRowDragAndDrop) property to `true` on both grids. To specify the target grid, configure the [RowDropSettings.TargetID](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridRowDropSettings.html#Syncfusion_Blazor_Grids_GridRowDropSettings_TargetID) property with the target grid's ID. - -The following example enables row drag and drop between two grids: +The Syncfusion® Blazor DataGrid supports dragging rows from one grid and dropping them into another. Enable this feature by setting the [AllowRowDragAndDrop](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_AllowRowDragAndDrop) property to **true** on both grids. To specify the target grid, configure the [RowDropSettings.TargetID](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridRowDropSettings.html#Syncfusion_Blazor_Grids_GridRowDropSettings_TargetID) property with the target grid's ID. {% tabs %} {% highlight razor tabtitle="Index.razor" %} @@ -287,7 +283,7 @@ public class OrdersDetails ## Drag and drop to custom component -The Syncfusion® Blazor DataGrid supports dragging rows into custom components. Enable [AllowRowDragAndDrop] and set [RowDropSettings.TargetID](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridRowDropSettings.html#Syncfusion_Blazor_Grids_GridRowDropSettings_TargetID) to the `ID` of the target component. +The Syncfusion® Blazor DataGrid supports dragging rows into custom components. Enable [AllowRowDragAndDrop] and set [RowDropSettings.TargetID](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridRowDropSettings.html#Syncfusion_Blazor_Grids_GridRowDropSettings_TargetID) to the **ID** of the target component. In the following example, selected grid rows are dropped into a TreeGrid using the [RowDropped](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridEvents-1.html#Syncfusion_Blazor_Grids_GridEvents_1_RowDropped) event. After the drop, the corresponding rows are removed from the source grid and added to the target: @@ -795,4 +791,4 @@ public class OrderData - A single row can be dragged and dropped within the same grid even if multiple selection is not enabled. - Row drag and drop does not have built-in support when combined with sorting, filtering, hierarchy grid, or row template features. - Row drag and drop with grouping does not support lazy-load grouping. -- Drag and drop within the same group key is not supported. Dragging multiple rows from different grouped collections is not supported. \ No newline at end of file +- Dragging and dropping within the same group key is not supported. The grid does not allow drag-and-drop for multiple rows that belong to different grouped collections. \ No newline at end of file diff --git a/blazor/datagrid/row-template.md b/blazor/datagrid/row-template.md index fe1eaf17b9..a75adefcef 100644 --- a/blazor/datagrid/row-template.md +++ b/blazor/datagrid/row-template.md @@ -21,8 +21,6 @@ For an overview of `row templates` in the Grid, watch the following video. {% youtube "youtube:https://www.youtube.com/watch?v=Dft0kerEGUQ" %} -The following example demonstrates a row template that displays employee information with a photo in the first column and details such as name, address, and other fields in the second column for each row. - {% tabs %} {% highlight razor tabtitle="Index.razor" %} @@ -197,8 +195,6 @@ Typically, the Syncfusion® Blazor DataGrid To format values inside a row template, apply .NET formatting in the template (for example, using `ToString` with a format string) or invoke a helper method to produce the desired output such as dates, currency, or custom text. -The following example formats the hire date within the template using a custom date format: - {% tabs %} {% highlight razor tabtitle="Index.razor" %} @@ -518,8 +514,6 @@ The Syncfusion® Blazor DataGrid supports em To render a Syncfusion® Blazor Chart in a row template, use the [RowTemplate](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridTemplates.html#Syncfusion_Blazor_Grids_GridTemplates_RowTemplate) property to define the row layout and include the chart markup within the template. -The following example renders a Syncfusion® chart alongside order details in each row: - {% tabs %} {% highlight razor tabtitle="Index.razor" %} @page "/" diff --git a/blazor/datagrid/row.md b/blazor/datagrid/row.md index 8667942787..12663e5543 100644 --- a/blazor/datagrid/row.md +++ b/blazor/datagrid/row.md @@ -227,9 +227,6 @@ To change the background color of the selected row, add the following CSS: background-color: #f9920b; } ``` - -The following example uses the `.e-selectionbackground` class to style the selected row: - {% tabs %} {% highlight razor tabtitle="Index.razor" %} @@ -317,8 +314,6 @@ public class OrderData The Syncfusion® Blazor DataGrid supports customizing row height to display more or less content as needed. Use the [RowHeight](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_RowHeight) property to change the height of all rows in the Grid. -The following example demonstrates dynamically changing the row height using the `RowHeight` property: - {% tabs %} {% highlight razor tabtitle="Index.razor" %} @@ -425,8 +420,6 @@ public class OrderData Customize the row height for a specific row when a single record needs additional space or emphasis. Use the [RowHeight](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_RowHeight) property in combination with the [RowDataBound](https://blazor.syncfusion.com/documentation/datagrid/events#rowdatabound) event to apply a CSS class conditionally. -In the following example, the row with `OrderID` '10249' is assigned a custom height via a CSS class in the `RowDataBound` event: - {% tabs %} {% highlight razor tabtitle="Index.razor" %} @@ -524,9 +517,7 @@ public class OrderData The row hover feature applies a visual effect when the mouse pointer is over a row, improving readability and helping to identify the focused record. Enable or disable the effect using the [EnableHover](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_EnableHover) property. -By default, `EnableHover` is `true`. Set it to `false` to disable row hover. - -The following example enables or disables row hover using a [Switch](https://blazor.syncfusion.com/documentation/toggle-switch-button/getting-started-webapp) component: +By default, `EnableHover` is **true**. Set it to **false** to disable row hover. {% tabs %} {% highlight razor tabtitle="Index.razor" %} @@ -617,9 +608,7 @@ The following example enables or disables row hover using a [Switch](https://bla ## Row pinning (Frozen) -The Syncfusion® Blazor DataGrid can freeze rows to keep them visible while scrolling vertically through large datasets. This maintains important context as users navigate data. - -To know about frozen rows in Grid, you can check this video. +The Syncfusion® Blazor DataGrid provides an option to freeze rows, keeping them visible while scrolling vertically through large datasets. This feature helps maintain important information in view for better readability. {% youtube "youtube:https://www.youtube.com/watch?v=L2NvKyBomhM"%} @@ -746,8 +735,6 @@ Apply the following CSS to change the default line color: } ``` -The following example demonstrates changing the frozen rows’ line color using CSS: - {% tabs %} {% highlight razor tabtitle="Index.razor" %} @@ -851,10 +838,9 @@ The Syncfusion® Blazor DataGrid supports pr The `AddRecordAsync` method takes two parameters: -> The **data** object representing the new row to be added -> The **index** at which the new row should be inserted. If no index is specified, the new row is added at the end. + - The **data** object representing the new row to be added + - The **index** at which the new row should be inserted. If no index is specified, the new row is added at the end. -The following example shows how to add a new row using `AddRecordAsync`: {% tabs %} {% highlight razor tabtitle="Index.razor" %} @@ -1032,8 +1018,6 @@ The Syncfusion® Blazor DataGrid can display Use the [RowSelected](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridEvents-1.html#Syncfusion_Blazor_Grids_GridEvents_1_RowSelected) event on the master Grid to obtain the selected record. Apply a filter through the [Query](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_Query) property of the detail Grid and bind the resulting collection to its [DataSource](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_DataSource). -In the following sample, selecting a row in the master Grid displays the corresponding orders in the detail Grid: - {% tabs %} {% highlight razor tabtitle="Index.razor" %} From ed39f45f62fc8f932757600854ceedfb07610979 Mon Sep 17 00:00:00 2001 From: SadhanaBaskaran Date: Wed, 26 Nov 2025 12:36:48 +0530 Subject: [PATCH 151/266] 993738: Updated the UG content and samples for Connecting to DataBase section in Blazor DataGrid --- .../datagrid/connecting-to-database/dapper.md | 333 +++++++++------ .../microsoft-sql-server.md | 380 ++++++++++++------ .../connecting-to-database/mysql-server.md | 277 +++++++------ 3 files changed, 637 insertions(+), 353 deletions(-) diff --git a/blazor/datagrid/connecting-to-database/dapper.md b/blazor/datagrid/connecting-to-database/dapper.md index b056c801d7..ca9dabdd85 100644 --- a/blazor/datagrid/connecting-to-database/dapper.md +++ b/blazor/datagrid/connecting-to-database/dapper.md @@ -9,39 +9,83 @@ documentation: ug # Connecting SQL data to a Blazor DataGrid Component using Dapper -This section describes how to connect and retrieve data from a Microsoft SQL Server database using [Dapper](https://github.com/DapperLib/Dapper) and [System.Data.SqlClient](https://www.nuget.org/packages/System.Data.SqlClient/4.8.6?_src=template) and bind it to the Blazor DataGrid component. +The Syncfusion® Blazor DataGrid component supports binding data from Microsoft SQL Server using [Dapper](https://github.com/DapperLib/Dapper) and [System.Data.SqlClient](https://www.nuget.org/packages/System.Data.SqlClient/4.8.6?_src=template). **Dapper** is a lightweight object-relational mapper (ORM) that simplifies executing SQL queries and mapping results to C# domain models. -Microsoft SQL Server database can be bound to the Blazor DataGrid component using **Dapper** in different ways (i.e.) using [DataSource](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_DataSource) property, [CustomAdaptor](https://blazor.syncfusion.com/documentation/datagrid/custom-binding) feature and remote data binding using various adaptors. In this documentation, two approaches will be examined to connect a Microsoft SQL Server database to a Blazor DataGrid component using **Dapper**. Both the approaches have capability to handle data and CRUD operations with built-in methods as well as can be customized as per your own. +Data from SQL Server can be integrated into the Blazor DataGrid using multiple approaches: -**Dapper** +- Using the [DataSource](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_DataSource) property for local binding. +- [CustomAdaptor](https://blazor.syncfusion.com/documentation/datagrid/connecting-to-adaptors/custom-adaptor) for advanced customization of data operations. +- Remote data binding using adaptors such as [UrlAdaptor](https://blazor.syncfusion.com/documentation/datagrid/connecting-to-adaptors/url-adaptor). -Dapper is an open-source and micro **ORM** (object-relational mapping) product developed by the StackOverflow team. It is very lightweight and straightforward to use with a project. It supports **PostgreSQL**, **MySQL**, **SQL** Server, and other databases. +This guide demonstrates two approaches for integrating SQL Server data with the Blazor DataGrid using **Dapper**: -Dapper expands upon the functionality of the [IDbConnection interface](https://learn.microsoft.com/en-us/dotnet/api/system.data.idbconnection?view=net-8.0), which offers a connection to a data source compatible with the .NET Framework. Additionally, Dapper facilitates writing queries. It simplifies the execution of SQL queries on a database and the mapping of results to C# domain classes. +* **Remote binding via API service using UrlAdaptor** - Dapper can be used to interact with a Microsoft SQL Server database in conjunction with **System.Data.SqlClient**. +This approach connects the DataGrid to a REST API endpoint that returns data in the required format. The [UrlAdaptor](https://blazor.syncfusion.com/documentation/datagrid/connecting-to-adaptors/url-adaptor) handles communication between the component and the API, enabling server-side operations such as **paging**, **sorting**, and **filtering**. -* **Using UrlAdaptor** +* **Custom binding using CustomAdaptor** -The [UrlAdaptor](https://blazor.syncfusion.com/documentation/data/adaptors#url-adaptor) serves as the base adaptor for facilitating communication between remote data services and an UI component. It enables the remote binding of data to the Blazor DataGrid component by connecting to an existing pre-configured API service linked to the Microsoft SQL Server database. While the Blazor DataGrid component supports various adaptors to fulfill this requirement, including [Web API](https://blazor.syncfusion.com/documentation/data/adaptors#web-api-adaptor), [OData](https://blazor.syncfusion.com/documentation/data/adaptors#odata-adaptor), [ODataV4](https://blazor.syncfusion.com/documentation/data/adaptors#odatav4-adaptor), [Url](https://blazor.syncfusion.com/documentation/data/adaptors#url-adaptor), and [GraphQL](https://blazor.syncfusion.com/documentation/data/adaptors#graphql-service-binding), the `UrlAdaptor` is particularly useful for the scenarios where a custom API service with unique logic for handling data and CRUD operations is in place. This approach allows for custom handling of data and CRUD operations, and the resultant data returned in the `result` and `count` format for display in the Blazor DataGrid component. +This approach provides complete control over data operations by implementing a [CustomAdaptor](https://blazor.syncfusion.com/documentation/datagrid/connecting-to-adaptors/custom-adaptor) class. It allows overriding methods for reading, updating, inserting, and deleting data, making it suitable for scenarios requiring custom business logic or complex queries. -* **Using CustomAdaptor** +This guide demonstrates both approaches for integrating SQL Server data with the Blazor DataGrid using Dapper. Each approach supports built-in and customizable CRUD operations. -The [CustomAdaptor](https://blazor.syncfusion.com/documentation/datagrid/custom-binding) serves as a mediator between the UI component and the database for data binding. While the data source from the database can be directly bound to the `SfGrid` component locally using the [DataSource](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_DataSource) property, the `CustomAdaptor` approach is preferred as it allows for customization of both data operations and CRUD operations according to specific requirements. In this approach, for every action in the Blazor DataGrid component, a corresponding request with action details is sent to the `CustomAdaptor`. The Blazor DataGrid component provides predefined methods to perform data operations such as **searching**, **filtering**, **sorting**, **aggregation**, **paging** and **grouping**. Alternatively, your own custom methods can be employed to execute operations and return the data in the `Result` and `Count` format of the `DataResult` class for displaying in the Blazor DataGrid component. Additionally, for CRUD operations, predefined methods can be overridden to provide custom functionality. Further details on this can be found in the latter part of the documentation. +## Dapper Overview + +Dapper is a lightweight, open-source micro ORM (Object-Relational Mapper) developed by the Stack Overflow team. It extends the functionality of the [IDbConnection interface](https://learn.microsoft.com/en-us/dotnet/api/system.data.idbconnection?view=net-8.0), enabling efficient execution of SQL queries and automatic mapping of query results to objects. + +**Key characteristics of Dapper:** + +* **Performance-focused**: Provides near raw ADO.NET performance while simplifying data access. +* **Cross-database support**: Compatible with Microsoft SQL Server, PostgreSQL, MySQL, and other relational databases. +* **Minimal overhead**: Does not require complex configurations or heavy abstractions. + +Dapper simplifies database operations by: + +* Executing SQL queries directly against the database. +* Mapping query results to strongly typed C# models without manual data transformation. +* Reducing boilerplate code compared to traditional ADO.NET approaches. + +When combined with S**ystem.Data.SqlClient**, Dapper offers a streamlined way to interact with SQL Server in Blazor applications. ## Binding data using Dapper from Microsoft SQL Server via an API service. -This section describes step by step process how to use Dapper to retrieve data from a Microsoft SQL Server using an API service and bind it to the Blazor DataGrid component. +This section explains how to retrieve data from a Microsoft SQL Server database using **Dapper** and expose it through an ASP.NET Core API service for remote binding in the Syncfusion® Blazor DataGrid component. The API service acts as an intermediary between the database and the DataGrid, enabling server-side operations such as paging, sorting, filtering, and CRUD actions. ### Creating an API service -**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 create an ASP.NET Core API service that retrieves data from Microsoft SQL Server using Dapper: + +**Step 1: Create an ASP.NET Core Web API Project** + +In Visual Studio, create a new **ASP.NET Core Web API** project named **MyWebService**. + +Refer to [Microsoft documentation](https://learn.microsoft.com/en-us/visualstudio/get-started/csharp/tutorial-aspnet-core?view=vs-2022) for detailed steps. + +**Step 2: Install Required NuGet Packages** + +- To enable **Dapper** and **SQL Server** access in the Blazor application, install the following packages: + + - [System.Data.SqlClient](https://www.nuget.org/packages/System.Data.SqlClient/4.8.6?_src=template) + - [Dapper](https://www.nuget.org/packages/Dapper) + +- Use **NuGet Package Manager** in Visual Studio: + +*Tools → NuGet Package Manager → Manage NuGet Packages* for Solution, then search and install both packages. + +- Alternatively, run these commands in the **Package Manager Console**: + +```powershell +Install-Package System.Data.SqlClient +Install-Package Dapper +``` + +**Step3: Create an API Controller** -**2.** To use Dapper and access the Microsoft SQL Server database in our Blazor application, need to install the [System.Data.SqlClient](https://www.nuget.org/packages/System.Data.SqlClient/4.8.6?_src=template) and [Dapper](https://www.nuget.org/packages/Dapper) NuGet packages. To add **System.Data.SqlClient** and Dapper in the app, open the NuGet package manager in Visual Studio (Tools → NuGet Package Manager → Manage NuGet Packages for Solution), search and install it. +Create a controller named **GridController.cs** under the Controllers folder. -**3.** Create an API controller (aka, GridController.cs) file under **Controllers** folder that helps to establish data communication with the Blazor DataGrid component. +**Step 4: Implement Data Retrieval Logic** -**4** In the API controller (aka, GridController), a connection is established to Microsoft SQL Server within the **Get()** method using **SqlConnection** which implements the **IDbConnection** interface. The SQL query string to retrieve data from the database is prepared. Using Dapper, the query is executed and data is fetched directly into a list of `Order` objects. Dapper automates the mapping process, eliminating the need for manual mapping using **SqlDataAdapter** and **DataTable** as shown in the following code snippet. +In the controller, establish a connection to SQL Server using **SqlConnection** which implements IDbConnection interfface. Execute the query using **Dapper** and map the results to a strongly typed collection. {% tabs %} {% highlight razor tabtitle="GridController.cs"%} @@ -89,91 +133,81 @@ namespace MyWebService.Controllers {% endhighlight %} {% endtabs %} -**5.** Run the application and it will be hosted within the URL `https://localhost:xxxx`. +5. **Run and test the application** -**6.** Finally, the retrieved data from Microsoft SQL Server database using Dapper which is in the form of list of array can be found in an API controller available in the URL link `https://localhost:xxxx/api/Grid`, as shown in the browser page below. +Start the API and access **https://localhost:xxxx/api/Grid** to view the data. ![Hosted API URL](../images/Ms-Sql-data.png) ### Connecting Blazor DataGrid to an API service -**1.** Create a simple Blazor DataGrid component by following steps. This section briefly explains about how to include [Blazor DataGrid](https://www.syncfusion.com/blazor-components/blazor-datagrid) component in your Blazor Web App using [Visual Studio](https://visualstudio.microsoft.com/vs/). +After hosting the API service, configure the Blazor DataGrid to consume data from the API endpoint using the [SfDataManager](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Data.SfDataManager.html) component and [UrlAdaptor](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Adaptors.html#Syncfusion_Blazor_Adaptors_UrlAdaptor). This enables remote data binding and supports server-side operations such as **paging**, **sorting**, **filtering**, and **CRUD**. **Prerequisites** * [System requirements for Blazor components](https://blazor.syncfusion.com/documentation/system-requirements) -**Create a new Blazor Web App** - -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). +1. **Create a 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. +Create a **Blazor Web App** using Visual Studio 2022. Use [Microsoft Templates](https://learn.microsoft.com/en-us/aspnet/core/blazor/tooling?view=aspnetcore-9.0&pivots=vs) or the Syncfusion® Blazor Extension. -**Install Syncfusion® Blazor Grid and Themes NuGet in the Blazor Web App** +> Configure the [Interactive render mode](https://learn.microsoft.com/en-us/aspnet/core/blazor/components/render-modes?view=aspnetcore-9.0#render-modes) and [Interactivity location](https://learn.microsoft.com/en-us/aspnet/core/blazor/tooling?view=aspnetcore-9.0&pivots=vs) during project creation. -To add **Blazor DataGrid** 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.Grid](https://www.nuget.org/packages/Syncfusion.Blazor.Grid/) and [Syncfusion.Blazor.Themes](https://www.nuget.org/packages/Syncfusion.Blazor.Themes/). +2. **Install Syncfusion Packages** -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. +* Open the NuGet Package Manager in Visual Studio (*Tools → NuGet Package Manager → Manage NuGet Packages for Solution*). Search and install the following packages: -Alternatively, you can utilize the following package manager command to achieve the same. + - [Syncfusion.Blazor.Grid](https://www.nuget.org/packages/Syncfusion.Blazor.Grid/) + - [Syncfusion.Blazor.Themes](https://www.nuget.org/packages/Syncfusion.Blazor.Themes/) -{% tabs %} -{% highlight C# tabtitle="Package Manager" %} +* Alternatively, use the Package Manager Console: +```powershell Install-Package Syncfusion.Blazor.Grid -Version {{ site.releaseversion }} Install-Package Syncfusion.Blazor.Themes -Version {{ site.releaseversion }} +``` -{% endhighlight %} -{% endtabs %} +> When using **WebAssembly** or **Auto** render modes in a Blazor Web App, install Syncfusion® Blazor component NuGet packages within the client project. -> 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. +> Syncfusion® Blazor components are available on [nuget.org](https://www.nuget.org/packages?q=syncfusion.blazor). Refer to the [NuGet packages](https://blazor.syncfusion.com/documentation/nuget-packages) topic for a complete list of available packages. -**Register Syncfusion® Blazor Service** +3. **Register Syncfusion Blazor service** -Open **~/_Imports.razor** file and import the `Syncfusion.Blazor` and `Syncfusion.Blazor.Grids` namespace. +- Add the required namespaces in **~/_Imports.razor**: ```cshtml - @using Syncfusion.Blazor @using Syncfusion.Blazor.Grids ``` -Now, register the Syncfusion® Blazor Service in the **~/Program.cs** file of your Blazor Web App. For a app with `WebAssembly` or `Auto (Server and WebAssembly)` interactive render mode, register the Syncfusion® Blazor service in both **~/Program.cs** files of your web app. +- For apps using **WebAssembly** or **Auto** (Server and WebAssembly) render modes, register the service in both **~/Program.cs** files. ```cshtml - -.... using Syncfusion.Blazor; -.... -builder.Services.AddSyncfusionBlazor(); -.... +builder.Services.AddSyncfusionBlazor(); ``` -**Add stylesheet and script resources** +4. **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: +Access the theme stylesheet and script from NuGet using [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 **~/Components/App.razor**: ```html - .... -.... + - .... ``` -> * 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. -> * In this Blazor Web app, set the `rendermode` as either **InteractiveServer** or **InteractiveAuto** as per your configuration. +> * Refer to [Blazor Themes](https://blazor.syncfusion.com/documentation/appearance/themes) for additional methods such as [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). +> * Set the render mode to **InteractiveServer** or **InteractiveAuto** in the Blazor Web App configuration. -**2.** Map the hosted API's URL link `https://localhost:xxxx/api/Grid` to the Blazor DataGrid component in **Index.razor** by using the [Url](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataManager.html#Syncfusion_Blazor_DataManager_Url) property of [SfDataManager](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Data.SfDataManager.html). To interact with remote data source, provide the endpoint `Url`. +5. **Configure DataGrid with UrlAdaptor** -**3.** The `SfDataManager` offers multiple adaptor options to connect with remote database based on an API service. Below is an example of the [UrlAdaptor](https://blazor.syncfusion.com/documentation/data/adaptors#url-adaptor) configuration where an API service are set up to return the resulting data in the `result` and `count` format. - -**4.** The `UrlAdaptor` acts as the base adaptor for interacting with remote data service. Most of the built-in adaptors are derived from the `UrlAdaptor`. +The [SfDataManager](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Data.SfDataManager.html) component supports multiple adaptors for remote data binding. For API services, set the [Adaptor](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Adaptors.html) property to [Adaptors.UrlAdaptor](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Adaptors.html#Syncfusion_Blazor_Adaptors_UrlAdaptor) and specify the service endpoint in the [Url](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataManager.html#Syncfusion_Blazor_DataManager_Url) property. {% tabs %} {% highlight razor tabtitle="Index.razor"%} @@ -260,16 +294,27 @@ The theme stylesheet and script can be accessed from NuGet through [Static Web A > In the above Blazor DataGrid component, [AllowSearching](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridColumn.html#Syncfusion_Blazor_Grids_GridColumn_AllowSearching), [AllowSorting](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_AllowSorting), [AllowFiltering](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_AllowFiltering), [AllowPaging](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_AllowPaging), [AllowGrouping](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_AllowGrouping) and CRUD-related properties have been enabled. The details on how to handle these actions are explained below. -When you run the application, the resultant Blazor DataGrid component will look like this - ![Blazor DataGrid component bound with Microsoft SQL Server data](../images/blazor-Grid-Ms-SQL-databinding.png) -> * The Syncfusion® Blazor DataGrid component provides built-in support for handling various data operations such as **searching**, **sorting**, **filtering**, **aggregate** and **paging** on the server-side. These operations can be handled using methods such as `PerformSearching`, `PerformFiltering`, `PerformSorting`, `PerformAggregation`, `PerformTake` and `PerformSkip` available in the **Syncfusion.Blazor.Data** package. Let's explore how to manage these data operations using the `UrlAdaptor`. -> * In an API service project, add **Syncfusion.Blazor.Data** by opening the NuGet package manager in Visual Studio (Tools → NuGet Package Manager → Manage NuGet Packages for Solution), search and install it. +### Handling data operations in UrlAdaptor + +The Syncfusion® Blazor DataGrid supports server-side operations such as **searching**, **sorting**, **filtering**, **aggregating**, and **paging** when using the [UrlAdaptor](https://blazor.syncfusion.com/documentation/data/adaptors#url-adaptor). + +The [DataManagerRequest](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataManagerRequest.html) object provides details for each operation, and these can be applied using built-in methods from the [DataOperations](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataOperations.html) class: + +* [PerformSearching](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataOperations.html#Syncfusion_Blazor_DataOperations_PerformSearching__1_System_Linq_IQueryable___0__System_Collections_Generic_List_Syncfusion_Blazor_Data_SearchFilter__) -Applies search criteria to the data source based on search filters. +* [PerformFiltering](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataOperations.html#Syncfusion_Blazor_DataOperations_PerformFiltering__1_System_Linq_IQueryable___0__System_Collections_Generic_List_Syncfusion_Blazor_Data_WhereFilter__System_String_) - Filters the data source using conditions specified in the request. +* [PerformSorting](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataOperations.html#Syncfusion_Blazor_DataOperations_PerformSorting__1_System_Linq_IQueryable___0__System_Collections_Generic_List_Syncfusion_Blazor_Data_Sort__) - Sorts the data source according to one or more sort descriptors. +* [PerformTake](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataOperations.html#Syncfusion_Blazor_DataOperations_PerformTake__1_System_Linq_IQueryable___0__System_Int32_) - Retrieves a specified number of records for paging. +* [PerformSkip](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataOperations.html#Syncfusion_Blazor_DataOperations_PerformSkip__1_System_Linq_IQueryable___0__System_Int32_) - Skips a defined number of records before returning results. + +These methods enable efficient handling of large datasets by performing operations on the server side. The following sections demonstrate how to manage these operations using the `UrlAdaptor`. + +> * To enable these operations, add the **Syncfusion.Blazor.Data** package to the API service project using NuGet Package Manager in Visual Studio (*Tools → NuGet Package Manager → Manage NuGet Packages for Solution*). ### Handling searching operation -To handle searching operation, ensure that your API endpoint supports custom searching criteria. Implement the searching logic on the server-side using the [PerformSearching](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataOperations.html#Syncfusion_Blazor_DataOperations_PerformSearching__1_System_Collections_Generic_IEnumerable___0__System_Collections_Generic_List_Syncfusion_Blazor_Data_SearchFilter__) method from the [DataOperations](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataOperations.html) class. This allows the custom data source to undergo searching based on the criteria specified in the incoming [DataManagerRequest](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataManagerRequest.html) object. +Enable server-side searching by implementing logic in the API controller with the [PerformSearching](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataOperations.html#Syncfusion_Blazor_DataOperations_PerformSearching__1_System_Collections_Generic_IEnumerable___0__System_Collections_Generic_List_Syncfusion_Blazor_Data_SearchFilter__) method from the [DataOperations](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataOperations.html) class. This method applies search criteria to the collection based on filters specified in the incoming [DataManagerRequest](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataManagerRequest.html). {% highlight razor %} @@ -292,7 +337,7 @@ public object Post([FromBody] DataManagerRequest DataManagerRequest) ### Handling filtering operation -To handle filtering operation, ensure that your API endpoint supports custom filtering criteria. Implement the filtering logic on the server-side using the [PerformFiltering](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataOperations.html#Syncfusion_Blazor_DataOperations_PerformFiltering_System_Collections_IEnumerable_System_Collections_Generic_List_Syncfusion_Blazor_Data_WhereFilter__System_String_) method from the [DataOperations](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataOperations.html) class. This allows the custom data source to undergo filtering based on the criteria specified in the incoming [DataManagerRequest](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataManagerRequest.html) object. +Enable server-side filtering by implementing logic in the API controller using the [PerformFiltering](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataOperations.html#Syncfusion_Blazor_DataOperations_PerformFiltering__1_System_Collections_Generic_IEnumerable___0__System_Collections_Generic_List_Syncfusion_Blazor_Data_WhereFilter__System_String_) method from the [DataOperations](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataOperations.html) class. This method applies filter conditions to the collection based on the criteria specified in the incoming [DataManagerRequest](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataManagerRequest.html). {% highlight razor %} [HttpPost] @@ -315,7 +360,7 @@ public object Post([FromBody] DataManagerRequest DataManagerRequest) ### Handling sorting operation -To handle sorting operation, ensure that your API endpoint supports custom sorting criteria. Implement the sorting logic on the server-side using the [PerformSorting](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataOperations.html#Syncfusion_Blazor_DataOperations_PerformSorting__1_System_Collections_Generic_IEnumerable___0__System_Collections_Generic_List_Syncfusion_Blazor_Data_Sort__) method from the [DataOperations](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataOperations.html) class. This allows the custom data source to undergo sorting based on the criteria specified in the incoming [DataManagerRequest](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataManagerRequest.html) object. +Enable server-side sorting by implementing logic in the API controller using the [PerformSorting](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataOperations.html#Syncfusion_Blazor_DataOperations_PerformSorting__1_System_Collections_Generic_IEnumerable___0__System_Collections_Generic_List_Syncfusion_Blazor_Data_Sort__) method from the [DataOperations](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataOperations.html) class. This method sorts the collection based on one or more sort descriptors specified in the incoming [DataManagerRequest](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataManagerRequest.html). {% highlight razor %} [HttpPost] @@ -337,7 +382,7 @@ public object Post([FromBody] DataManagerRequest DataManagerRequest) ### Handling aggregate operation -To handle aggregate operation, ensure that your API endpoint supports custom aggregate criteria. Implement the aggregate logic on the server-side using the [PerformAggregation](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Data.DataUtil.html#Syncfusion_Blazor_Data_DataUtil_PerformAggregation_System_Collections_IEnumerable_System_Collections_Generic_List_Syncfusion_Blazor_Data_Aggregate__) method from the [DataUtil](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Data.DataUtil.html) class. This allows the custom data source to undergo aggregate based on the criteria specified in the incoming [DataManagerRequest](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataManagerRequest.html) object. +Enable server-side aggregation by implementing logic in the API controller using the [PerformAggregation](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Data.DataUtil.html#Syncfusion_Blazor_Data_DataUtil_PerformAggregation_System_Collections_IEnumerable_System_Collections_Generic_List_Syncfusion_Blazor_Data_Aggregate__) method from the [DataUtil](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Data.DataUtil.html) class. This method calculates aggregate values such as **Sum**, **Average**, **Min**, and **Max** for the specified fields based on the incoming [DataManagerRequest](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataManagerRequest.html). {% highlight razor %} [HttpPost] @@ -358,11 +403,11 @@ To handle aggregate operation, ensure that your API endpoint supports custom agg } {% endhighlight %} -> The server-side management of the `PerformAggregation` method is necessary only for the [Footer Template](https://blazor.syncfusion.com/documentation/datagrid/footer-aggregate) aggregation. There is no need for explicit handling of the Aggregate operation for the [Group Footer template](https://blazor.syncfusion.com/documentation/datagrid/group-and-caption-aggregate#group-footer-aggregates) and [Group Caption template](https://blazor.syncfusion.com/documentation/datagrid/group-and-caption-aggregate#group-caption-aggregates). +> The server-side implementation of the `PerformAggregation` method is required only for [Footer aggregates](https://blazor.syncfusion.com/documentation/datagrid/footer-aggregate). Explicit handling is not necessary for[ Group Footer aggregates](https://blazor.syncfusion.com/documentation/datagrid/group-and-caption-aggregate#group-footer-aggregates) or [Group Caption aggregates](https://blazor.syncfusion.com/documentation/datagrid/group-and-caption-aggregate#group-caption-aggregates). ### Handling paging operation -To handle paging operation, ensure that your API endpoint supports custom paging criteria. Implement the paging logic on the server-side using the [PerformTake](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataOperations.html#Syncfusion_Blazor_DataOperations_PerformTake_System_Collections_IEnumerable_System_Int32_) and [PerformSkip](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataOperations.html#Syncfusion_Blazor_DataOperations_PerformSkip__1_System_Collections_Generic_IEnumerable___0__System_Int32_) method from the [DataOperations](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataOperations.html) class. This allows the custom data source to undergo paging based on the criteria specified in the incoming [DataManagerRequest](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataManagerRequest.html) object. +Enable server-side paging by implementing logic in the API controller using the [PerformSkip](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataOperations.html#Syncfusion_Blazor_DataOperations_PerformSkip__1_System_Collections_Generic_IEnumerable___0__System_Int32_) and [PerformTake](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataOperations.html#Syncfusion_Blazor_DataOperations_PerformTake__1_System_Collections_Generic_IEnumerable___0__System_Int32_) methods from the [DataOperations](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataOperations.html) class. These methods apply paging based on the **Skip** and **Take** values provided in the incoming [DataManagerRequest](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataManagerRequest.html). {% highlight razor %} [HttpPost] @@ -387,13 +432,21 @@ public object Post([FromBody] DataManagerRequest DataManagerRequest) } {% endhighlight %} -> For optimal performance, it is recommended to follow this sequence of operations(Searching, Filtering, Sorting, Aggregate and Paging) in the [ReadAsync](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataAdaptor.html#Syncfusion_Blazor_DataAdaptor_ReadAsync_Syncfusion_Blazor_DataManagerRequest_System_String_) method. +N> For optimal performance, apply operations in the following sequence: **Searching → Filtering → Sorting → Aggregation → Paging → Grouping** in [ReadAsync](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataAdaptor.html#Syncfusion_Blazor_DataAdaptor_ReadAsync_Syncfusion_Blazor_DataManagerRequest_System_String_) method. ### Handling CRUD operations -To enable editing in this Blazor DataGrid component, utilize the [GridEditSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridEditSettings.html) component. The Blazor DataGrid offers multiple edit modes including the [Inline/Normal](https://blazor.syncfusion.com/documentation/datagrid/in-line-editing), [Dialog](https://blazor.syncfusion.com/documentation/datagrid/dialog-editing), and [Batch](https://blazor.syncfusion.com/documentation/datagrid/batch-editing) editing. For more details, refer to the Blazor DataGrid component [editing](https://blazor.syncfusion.com/documentation/datagrid/editing) documentation. +The Syncfusion® Blazor DataGrid supports Create, Read, Update, and Delete operations through API endpoints. These operations can be implemented using **Dapper**, which executes parameterized queries and maps data efficiently, reducing boilerplate code and improving maintainability. + +These operations are mapped to API endpoints using properties such as: + +* [InsertUrl](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataManager.html#Syncfusion_Blazor_DataManager_InsertUrl) – API endpoint for inserting new records. +* [UpdateUrl](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataManager.html#Syncfusion_Blazor_DataManager_UpdateUrl) – API endpoint for updating existing records. +* [RemoveUrl](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataManager.html#Syncfusion_Blazor_DataManager_UpdateUrl) – API endpoint for deleting records. +* [CrudUrl](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataManager.html#Syncfusion_Blazor_DataManager_CrudUrl) – Single endpoint for all CRUD operations. +* [BatchUrl](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataManager.html#Syncfusion_Blazor_DataManager_BatchUrl) – API endpoint for batch editing. -In this scenario, the inline edit `Mode` and [Toolbar](https://blazor.syncfusion.com/documentation/datagrid/tool-bar) property are configured to display toolbar items for editing purposes. +To enable editing, configure the [Toolbar](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_Toolbar) and [GridEditSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridEditSettings.html) properties, and set the Mode property to [EditMode.Normal](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.EditMode.html#Syncfusion_Blazor_Grids_EditMode_Normal) to allow adding, editing, and deleting records. {% tabs %} {% highlight razor %} @@ -411,12 +464,15 @@ In this scenario, the inline edit `Mode` and [Toolbar](https://blazor.syncfusion {% endhighlight %} {% endtabs %} -> * Normal/Inline editing is the default edit [Mode](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridEditSettings.html#Syncfusion_Blazor_Grids_GridEditSettings_Mode) for the Blazor DataGrid component. To enable CRUD operations, ensure that the [IsPrimaryKey](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridColumn.html#Syncfusion_Blazor_Grids_GridColumn_IsPrimaryKey) property is set to **true** for a specific `GridColumn`, ensuring that its value is unique. -> * If database has an Autogenerated column, ensure to define [IsIdentity](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridColumn.html#Syncfusion_Blazor_Grids_GridColumn_IsIdentity) property of `GridColumn` to disable them during adding or editing operations. +> * Normal(Inline) editing is the default [Mode](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridEditSettings.html#Syncfusion_Blazor_Grids_GridEditSettings_Mode) for the Blazor DataGrid component. +> * To enable CRUD operations, set the [IsPrimaryKey](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridColumn.html#Syncfusion_Blazor_Grids_GridColumn_IsPrimaryKey) property to **true** for a column that contains unique values. +> * If the database includes an auto-generated column, set the [IsIdentity](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridColumn.html#Syncfusion_Blazor_Grids_GridColumn_IsIdentity) property for that column to disable editing during **add** or **update** operations. **Insert Operation:** -To insert a new row, simply click the **Add** toolbar button. The new record edit form will be displayed as shown below. Upon clicking the **Update** toolbar button, the record will be inserted into the Orders table by calling the following **POST** method of an API. Utilizing `Dapper` simplifies database interaction by providing an easy-to-use interface to execute queries and map results to objects, enhancing code readability and maintainability, as shown in the following code snippet. +To add a new record, click the **Add** toolbar button in the DataGrid. This displays the inline edit form. After entering the required values, click **Update** to submit the changes. The DataGrid sends a **POST** request to the API endpoint, which inserts the record into the Orders table using **Dapper**. + +**Dapper** simplifies database interaction by executing parameterized queries and mapping results directly to objects, improving performance and maintainability. {% tabs %} {% highlight c# tabtitle="OrdersController.cs" %} @@ -446,7 +502,7 @@ public void Insert([FromBody] CRUDModel Value) **Update Operation:** -To edit a row, first select desired row and click the **Edit** toolbar button. The edit form will be displayed and proceed to modify any column value as per your requirement. Clicking the **Update** toolbar button will update the edit record in the Orders table by involving the following **Post** method of an API. Utilizing `Dapper` simplifies database interaction by providing an easy-to-use interface to execute queries and map results to objects, enhancing code readability and maintainability, as shown in the following code snippet. +To modify an existing record, select the row and click the **Edit** toolbar button. Update the required values in the inline edit form and click **Update**. The DataGrid sends a **POST** request to the API endpoint, which updates the record in the Orders table using **Dapper**. {% tabs %} {% highlight c# tabtitle="OrdersController.cs" %} @@ -476,7 +532,7 @@ public void Update([FromBody] CRUDModel Value) **Delete Operation:** -To delete a row, simply select the desired row and click the **Delete** toolbar button. This action will trigger a **DELETE** request to an API, containing the primary key value of the selected record. As a result corresponding record will be removed from the Orders table. Utilizing `Dapper` simplifies database interaction by providing an easy-to-use interface to execute queries and map results to objects, enhancing code readability and maintainability, as shown in the following code snippet. +To remove a record, select the row and click the **Delete** toolbar button. The DataGrid sends a **POST** request to the API endpoint, which deletes the record from the Orders table using **Dapper**. {% tabs %} {% highlight c# tabtitle="OrdersController.cs" %} @@ -507,7 +563,13 @@ public void Delete([FromBody] CRUDModel Value) **Batch Operation:** -To perform batch operation, define the edit [Mode](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridEditSettings.html#Syncfusion_Blazor_Grids_GridEditSettings_Mode) as `Batch` and specify the [BatchUrl](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataManager.html#Syncfusion_Blazor_DataManager_BatchUrl) property in the `SfDataManager`. Use the **Add** toolbar button to insert new row in batch editing mode. To edit a cell, double-click the desired cell and update the value as required. To delete a record, simply select the record and press the **Delete** toolbar button. Now, all CRUD operations will be executed in batch editing mode. Clicking the **Update** toolbar button will update the newly added, edited, or deleted records from the Orders table using a single API **POST** request. Utilizing `Dapper` simplifies database interaction by providing an easy-to-use interface to execute queries and map results to objects, enhancing code readability and maintainability, as shown in the following code snippet. +To perform batch editing, set the [Mode](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridEditSettings.html#Syncfusion_Blazor_Grids_GridEditSettings_Mode) property in [GridEditSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridEditSettings.html) to **Batch** and specify the [BatchUrl](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataManager.html#Syncfusion_Blazor_DataManager_BatchUrl) property in [SfDataManager](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Data.SfDataManager.html). + +- Use the **Add** toolbar button to insert a new row in batch mode. +- Double-click a cell to edit its value. +- Select a record and click **Delete** to remove it. + +-All changes (insert, update, delete) are sent to the API in a single **POST** request when the **Update** toolbar button is clicked. {% highlight razor %} [HttpPost] @@ -570,23 +632,34 @@ public void Batch([FromBody] CRUDModel Value) } {% endhighlight %} -When you run the application, the resultant Blazor DataGrid component will look like this - ![Blazor DataGrid component bound with Microsoft SQL Server data using Dapper](../images/blazor-Grid-Ms-SQl-databinding-Gif.gif) -> Find the sample from this [GitHub location](https://github.com/SyncfusionExamples/connecting-databases-to-blazor-datagrid-component/tree/master/Binding%20Dapper%20using%20UrlAdaptor). +> Find the complete implementation in this [GitHub](https://github.com/SyncfusionExamples/connecting-databases-to-blazor-datagrid-component/tree/master/Binding%20Dapper%20using%20UrlAdaptor) repository. ## Binding data from Microsoft SQL Server using Dapper with CustomAdaptor -This section describes step by step process how to use Dapper to retrieve data from a Microsoft SQL Server using `CustomAdaptor` and bind it to the Blazor DataGrid component. +This section explains how to use **Dapper** with a [CustomAdaptor](https://blazor.syncfusion.com/documentation/datagrid/connecting-to-adaptors/custom-adaptor) to retrieve data from **Microsoft SQL Server** and bind it to the Syncfusion® Blazor DataGrid component. + +**Step 1: Create the Blazor DataGrid Component** + +Follow the procedure described in [Connecting Blazor DataGrid to an API service](#connecting-blazor-datagrid-to-an-api-service). -**1.** To create a simple Blazor DataGrid component, the procedure is explained in the above-mentioned topic on [Connecting Blazor DataGrid to an API service](#connecting-blazor-datagrid-to-an-api-service) +> * Set the rendermode to **InteractiveServer** or **InteractiveAuto** based on application configuration. -> * In this Blazor Web app, set the `rendermode` as either **InteractiveServer** or **InteractiveAuto** as per your configuration. +**Step 2: Install MySql NuGet Package** -**2.** To use `Dapper` and access the Microsoft SQL Server database in our Blazor application, we need to install the [System.Data.SqlClient](https://www.nuget.org/packages/System.Data.SqlClient/4.8.6?_src=template) and [Dapper](https://www.nuget.org/packages/Dapper) NuGet packages. To add **System.Data.SqlClient** and `Dapper` in the app, open the NuGet package manager in Visual Studio (Tools → NuGet Package Manager → Manage NuGet Packages for Solution), search and install it. +Add the following packages to the Blazor application: -**3.** If you intend to inject your own service into the `CustomAdaptor` and utilize it, you can achieve this as follows. +- [System.Data.SqlClient](https://www.nuget.org/packages/System.Data.SqlClient/4.8.6?_src=template) +- [Dapper](https://www.nuget.org/packages/Dapper) + +Use **NuGet Package Manager** in Visual Studio: + +*Tools → NuGet Package Manager → Manage NuGet Packages* for Solution, then search and install both packages. + +**Step 3: Configure the DataGrid with CustomAdaptor** + +Inject a custom service into the `CustomAdaptor` and configure the component as shown below: {% tabs %} {% highlight razor tabtitle="Index.razor" %} @@ -655,11 +728,14 @@ This section describes step by step process how to use Dapper to retrieve data f {% endhighlight %} {% endtabs %} -**4.** Within the `CustomAdaptor` [ReadAsync](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataAdaptor.html#Syncfusion_Blazor_DataAdaptor_ReadAsync_Syncfusion_Blazor_DataManagerRequest_System_String_) method, fetch the data from the service by calling the `GetOrdersAsync` method. +**Step 4: Implement Data Retrieval Logic** -* In this `GetOrdersAsync` method, a connection is established to Microsoft SQL Server using **SqlConnection** which implements the **IDbConnection** interface. The SQL query string to retrieve data from the database is prepared. Using Dapper, the query is executed and data is fetched directly into a list of `Order` objects. Dapper automates the mapping process, eliminating the need for manual mapping using **SqlDataAdapter** and **DataTable** +Implement the [ReadAsync](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataAdaptor.html#Syncfusion_Blazor_DataAdaptor_ReadAsync_Syncfusion_Blazor_DataManagerRequest_System_String_) method in `CustomAdaptor` to retrieve data from the database using **Dapper**. -* Finally, return the response as a `Result` and `Count` pair object in the `ReadAsync` method to bind the data to the Blazor DataGrid component. +- Establish a connection to Microsoft SQL Server using **SqlConnection**, which implements the [IDbConnection interface](https://learn.microsoft.com/en-us/dotnet/api/system.data.idbconnection?view=net-9.0). +- Prepare the SQL query string to fetch records from the database. +- Execute the query using **Dapper** and map the results directly to a strongly typed collection of Order objects. +- Return the response as a **Result** and **Count** pair in a [DataResult](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Data.DataResult-1.html) object within the `ReadAsync` method for binding to the Blazor DataGrid. {% tabs %} {% highlight razor tabtitle="Index.razor" %} @@ -759,15 +835,42 @@ public class OrderData > * The `DataManagerRequest` encompasses details about the Blazor DataGrid component actions such as searching, filtering, sorting, aggregate, paging and grouping. > * In the above Blazor DataGrid, [AllowSearching](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridColumn.html#Syncfusion_Blazor_Grids_GridColumn_AllowSearching), [AllowSorting](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_AllowSorting), [AllowFiltering](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_AllowFiltering), [AllowPaging](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_AllowPaging), [AllowGrouping](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_AllowGrouping) and CRUD-related properties have been enabled. The details on how to handle these actions are explained below. -When the application is executed, the Blazor DataGrid component will appear as depicted below. - ![Blazor DataGrid component bound with Microsoft SQL Server data](../images/blazor-Grid-Ms-SQL-databinding.png) +### Handling data operations in a Custom Adaptor + +The Syncfusion® Blazor DataGrid supports server-side operations such as **searching**, **filtering**, **sorting**, **paging**, and **aggregating** when using a `CustomAdaptor`. These operations are implemented by overriding the [Read](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataAdaptor.html#Syncfusion_Blazor_DataAdaptor_Read_Syncfusion_Blazor_DataManagerRequest_System_String_) or [ReadAsync](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataAdaptor.html#Syncfusion_Blazor_DataAdaptor_ReadAsync_Syncfusion_Blazor_DataManagerRequest_System_String_) method of the [DataAdaptor](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataAdaptor.html) abstract class. + +The [DataManagerRequest](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataManagerRequest.html) object provides the necessary details for each operation, and these can be applied using built-in methods from the [DataOperations](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataOperations.html) and [DataUtil](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Data.DataUtil.html) classes: + +* [PerformSearching](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataOperations.html#Syncfusion_Blazor_DataOperations_PerformSearching__1_System_Collections_Generic_IEnumerable___0__System_Collections_Generic_List_Syncfusion_Blazor_Data_SearchFilter__) – Applies search criteria to the data source based on search filters. + +* [PerformFiltering](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataOperations.html#Syncfusion_Blazor_DataOperations_PerformFiltering__1_System_Collections_Generic_IEnumerable___0__System_Collections_Generic_List_Syncfusion_Blazor_Data_WhereFilter__System_String_) – Filters the data source using conditions specified in the request. + +* [PerformSorting](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataOperations.html#Syncfusion_Blazor_DataOperations_PerformSorting__1_System_Collections_Generic_IEnumerable___0__System_Collections_Generic_List_Syncfusion_Blazor_Data_SortedColumn__) – Sorts the data source according to one or more sort descriptors. + +* [PerformSkip](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataOperations.html#Syncfusion_Blazor_DataOperations_PerformSkip__1_System_Collections_Generic_IEnumerable___0__System_Int32_) – Retrieves a specified number of records for paging. + +* [PerformTake](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataOperations.html#Syncfusion_Blazor_DataOperations_PerformTake__1_System_Collections_Generic_IEnumerable___0__System_Int32_) – Skips a defined number of records before returning results. + +* [PerformAggregation](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Data.DataUtil.html#Syncfusion_Blazor_Data_DataUtil_PerformAggregation_System_Collections_IEnumerable_System_Collections_Generic_List_Syncfusion_Blazor_Data_Aggregate__) – Applies aggregate details to calculate summary values such as Sum, Average, Min, and Max. + +When using **Dapper**, data retrieval is performed by executing parameterized SQL queries and mapping results directly to strongly typed objects. The ReadAsync method typically includes: + +- Establishing a connection using **SqlConnection** (implements IDbConnection). +- Executing the query with **connection.QueryAsync()** to fetch data. +- Applying operations such as searching, filtering, sorting, paging, and aggregation using the above methods. +- Returning the response as a `DataResult` object containing **Result** and **Count** for binding to the DataGrid. + +N> To enable these operations, install the **Syncfusion.Blazor.Data** package using NuGet Package Manager in Visual Studio: + +(*Tools → NuGet Package Manager → Manage NuGet Packages for Solution*). + ### Handling searching operation -When utilizing the `CustomAdaptor`, managing the searching operation involves overriding the [Read](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataAdaptor.html#Syncfusion_Blazor_DataAdaptor_Read_Syncfusion_Blazor_DataManagerRequest_System_String_) or [ReadAsync](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataAdaptor.html#Syncfusion_Blazor_DataAdaptor_ReadAsync_Syncfusion_Blazor_DataManagerRequest_System_String_) method of the [DataAdaptor](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataAdaptor.html) abstract class. +When using `CustomAdaptor`, the searching operation is implemented by overriding the [Read](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataAdaptor.html#Syncfusion_Blazor_DataAdaptor_Read_Syncfusion_Blazor_DataManagerRequest_System_String_) or [ReadAsync](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataAdaptor.html#Syncfusion_Blazor_DataAdaptor_ReadAsync_Syncfusion_Blazor_DataManagerRequest_System_String_) method of the [DataAdaptor](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataAdaptor.html) abstract class. -In the code example below, searching a custom data source can be accomplished by employing the built-in [PerformSearching](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataOperations.html#Syncfusion_Blazor_DataOperations_PerformSearching_System_Collections_IEnumerable_System_Collections_Generic_List_Syncfusion_Blazor_Data_SearchFilter__) method of the [DataOperations](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataOperations.html) class. Alternatively, you can implement your own method for searching operation and bind the resultant data to the Blazor DataGrid component. +The built-in [PerformSearching](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataOperations.html#Syncfusion_Blazor_DataOperations_PerformSearching__1_System_Collections_Generic_IEnumerable___0__System_Collections_Generic_List_Syncfusion_Blazor_Data_SearchFilter__) method of the [DataOperations](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataOperations.html) class applies search criteria from the [DataManagerRequest](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataManagerRequest.html) to the data source. Custom logic can also be implemented to handle searching as required. {% highlight razor %} public class CustomAdaptor : DataAdaptor @@ -793,9 +896,9 @@ public class CustomAdaptor : DataAdaptor ### Handling filtering operation -When employing the `CustomAdaptor`, handling the filtering operation involves overriding the [Read](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataAdaptor.html#Syncfusion_Blazor_DataAdaptor_Read_Syncfusion_Blazor_DataManagerRequest_System_String_) or [ReadAsync](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataAdaptor.html#Syncfusion_Blazor_DataAdaptor_ReadAsync_Syncfusion_Blazor_DataManagerRequest_System_String_) method of the [DataAdaptor](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataAdaptor.html) abstract class. +When implementing `CustomAdaptor`, the filtering operation is managed by overriding the[Read](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataAdaptor.html#Syncfusion_Blazor_DataAdaptor_Read_Syncfusion_Blazor_DataManagerRequest_System_String_) or [ReadAsync](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataAdaptor.html#Syncfusion_Blazor_DataAdaptor_ReadAsync_Syncfusion_Blazor_DataManagerRequest_System_String_) method of the [DataAdaptor](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataAdaptor.html) abstract class. -In the code example below, filtering a custom data source can be achieved by utilizing the built-in [PerformFiltering](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataOperations.html#Syncfusion_Blazor_DataOperations_PerformFiltering__1_System_Collections_Generic_IEnumerable___0__System_Collections_Generic_List_Syncfusion_Blazor_Data_WhereFilter__System_String_) method of the [DataOperations](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataOperations.html) class. Alternatively, you can implement your own method for filtering operation and bind the resulting data to the Blazor DataGrid component. +The built-in [PerformFiltering](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataOperations.html#Syncfusion_Blazor_DataOperations_PerformFiltering__1_System_Collections_Generic_IEnumerable___0__System_Collections_Generic_List_Syncfusion_Blazor_Data_WhereFilter__System_String_) method in the [DataOperations](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataOperations.html) class applies filter criteria from the [DataManagerRequest](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataManagerRequest.html) to the data collection. Custom filtering logic can also be implemented to meet specific requirements. {% highlight razor %} public class CustomAdaptor : DataAdaptor @@ -821,9 +924,9 @@ public class CustomAdaptor : DataAdaptor ### Handling sorting operation -When utilizing the `CustomAdaptor`, managing the sorting operation involves overriding the [Read](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataAdaptor.html#Syncfusion_Blazor_DataAdaptor_Read_Syncfusion_Blazor_DataManagerRequest_System_String_) or [ReadAsync](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataAdaptor.html#Syncfusion_Blazor_DataAdaptor_ReadAsync_Syncfusion_Blazor_DataManagerRequest_System_String_) method of the [DataAdaptor](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataAdaptor.html) abstract class. +When implementing `CustomAdaptor`, the sorting operation is handled by overriding the [Read](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataAdaptor.html#Syncfusion_Blazor_DataAdaptor_Read_Syncfusion_Blazor_DataManagerRequest_System_String_) or [ReadAsync](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataAdaptor.html#Syncfusion_Blazor_DataAdaptor_ReadAsync_Syncfusion_Blazor_DataManagerRequest_System_String_) method of the [DataAdaptor](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataAdaptor.html) abstract class. -In the code example below, sorting a custom data source can be accomplished by employing the built-in [PerformSorting](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataOperations.html#Syncfusion_Blazor_DataOperations_PerformSorting__1_System_Collections_Generic_IEnumerable___0__System_Collections_Generic_List_Syncfusion_Blazor_Data_Sort__) method of the [DataOperations](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataOperations.html) class. Alternatively, you can implement your own method for sorting operation and bind the resulting data to the Blazor DataGrid component. +The built-in [PerformSorting](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataOperations.html#Syncfusion_Blazor_DataOperations_PerformSorting__1_System_Collections_Generic_IEnumerable___0__System_Collections_Generic_List_Syncfusion_Blazor_Data_Sort__) method in the [DataOperations](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataOperations.html) class applies sort criteria from the [DataManagerRequest](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataManagerRequest.html) to the data collection. Custom sorting logic can also be implemented to meet specific requirements. {% highlight razor %} public class CustomAdaptor : DataAdaptor @@ -849,7 +952,9 @@ public class CustomAdaptor : DataAdaptor ### Handling aggregate operation -When employing `CustomAdaptor`, the aggregate operation must be managed within the [Read](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataAdaptor.html#Syncfusion_Blazor_DataAdaptor_Read_Syncfusion_Blazor_DataManagerRequest_System_String_) or [ReadAsync](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataAdaptor.html#Syncfusion_Blazor_DataAdaptor_ReadAsync_Syncfusion_Blazor_DataManagerRequest_System_String_) method of the `CustomAdaptor`. +When implementing `CustomAdaptor`, aggregate operations are managed by overriding the [Read](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataAdaptor.html#Syncfusion_Blazor_DataAdaptor_Read_Syncfusion_Blazor_DataManagerRequest_System_String_) or [ReadAsync](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataAdaptor.html#Syncfusion_Blazor_DataAdaptor_ReadAsync_Syncfusion_Blazor_DataManagerRequest_System_String_) method of the [DataAdaptor](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataAdaptor-1.html) abstract class. + +The built-in [PerformAggregation](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Data.DataUtil.html#Syncfusion_Blazor_Data_DataUtil_PerformAggregation_System_Collections_IEnumerable_System_Collections_Generic_List_Syncfusion_Blazor_Data_Aggregate__) method in the [DataUtil](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Data.DataUtil.html) class calculates aggregate values based on the criteria specified in the [DataManagerRequest](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataManagerRequest.html). Custom aggregation logic can also be implemented when specific requirements exist. The provided sample code illustrated how to implement the aggregate operation within `CustomAdaptor`, @@ -875,13 +980,13 @@ public class CustomAdaptor : DataAdaptor } {% endhighlight %} -> The server-side management of the `PerformAggregation` method is necessary only for the [Footer Template](https://blazor.syncfusion.com/documentation/datagrid/footer-aggregate) aggregation. There is no need for explicit handling of the Aggregate operation for the [Group Footer template](https://blazor.syncfusion.com/documentation/datagrid/group-and-caption-aggregate#group-footer-aggregates) and [Group Caption template](https://blazor.syncfusion.com/documentation/datagrid/group-and-caption-aggregate#group-caption-aggregates). +> The server-side implementation of the `PerformAggregation` method is required only for [Footer aggregates](https://blazor.syncfusion.com/documentation/datagrid/footer-aggregate). Explicit handling is not necessary for[ Group Footer aggregates](https://blazor.syncfusion.com/documentation/datagrid/group-and-caption-aggregate#group-footer-aggregates) or [Group Caption aggregates](https://blazor.syncfusion.com/documentation/datagrid/group-and-caption-aggregate#group-caption-aggregates). ### Handling paging operation -When employing the `CustomAdaptor`, handling paging operation involves overriding the [Read](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataAdaptor.html#Syncfusion_Blazor_DataAdaptor_Read_Syncfusion_Blazor_DataManagerRequest_System_String_) or [ReadAsync](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataAdaptor.html#Syncfusion_Blazor_DataAdaptor_ReadAsync_Syncfusion_Blazor_DataManagerRequest_System_String_) method of the [DataAdaptor](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataAdaptor.html) abstract class. +When implementing `CustomAdaptor`, paging is managed by overriding the [Read](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataAdaptor.html#Syncfusion_Blazor_DataAdaptor_Read_Syncfusion_Blazor_DataManagerRequest_System_String_) or [ReadAsync](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataAdaptor.html#Syncfusion_Blazor_DataAdaptor_ReadAsync_Syncfusion_Blazor_DataManagerRequest_System_String_) method of the [DataAdaptor](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataAdaptor.html) abstract class. -In the code example below, paging a custom data source can be achieved by utilizing the built-in [PerformTake](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataOperations.html#Syncfusion_Blazor_DataOperations_PerformTake_System_Collections_IEnumerable_System_Int32_) and [PerformSkip](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataOperations.html#Syncfusion_Blazor_DataOperations_PerformSkip__1_System_Collections_Generic_IEnumerable___0__System_Int32_) method of the [DataOperations](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataOperations.html) class. Alternatively, you can use your own method for paging operation and bind the resulting data to the Blazor DataGrid component. +The built-in [PerformSkip](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataOperations.html#Syncfusion_Blazor_DataOperations_PerformSkip__1_System_Collections_Generic_IEnumerable___0__System_Int32_) and [PerformTake](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataOperations.html#Syncfusion_Blazor_DataOperations_PerformTake__1_System_Collections_Generic_IEnumerable___0__System_Int32_) methods in the [DataOperations](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataOperations.html) class apply paging criteria from the [DataManagerRequest](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataManagerRequest.html) to the data collection. Custom paging logic can also be implemented when specific requirements exist. {% highlight razor %} public class CustomAdaptor : DataAdaptor @@ -912,9 +1017,9 @@ public class CustomAdaptor : DataAdaptor ### Handling grouping operation -When employing `CustomAdaptor`, the grouping operation must be managed within the [Read](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataAdaptor.html#Syncfusion_Blazor_DataAdaptor_Read_Syncfusion_Blazor_DataManagerRequest_System_String_) or [ReadAsync](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataAdaptor.html#Syncfusion_Blazor_DataAdaptor_ReadAsync_Syncfusion_Blazor_DataManagerRequest_System_String_) method of the `CustomAdaptor`. +When implementing `CustomAdaptor`, grouping is managed by overriding the [Read](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataAdaptor.html#Syncfusion_Blazor_DataAdaptor_Read_Syncfusion_Blazor_DataManagerRequest_System_String_) or [ReadAsync](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataAdaptor.html#Syncfusion_Blazor_DataAdaptor_ReadAsync_Syncfusion_Blazor_DataManagerRequest_System_String_) method of the [DataAdaptor](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataAdaptor.html) abstract class. -In the code example below, grouping a custom data source can be achieved by utilizing the [Group](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Data.DataUtil.html#Syncfusion_Blazor_Data_DataUtil_Group__1_System_Collections_IEnumerable_System_String_System_Collections_Generic_List_Syncfusion_Blazor_Data_Aggregate__System_Int32_System_Collections_Generic_IDictionary_System_String_System_String__System_Boolean_System_Boolean_) method from the [DataUtil](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Data.DataUtil.html) class. Alternatively, you can use your own method for grouping operation and bind the resulting data to the Blazor DataGrid component. +The built-in [Group](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Data.DataUtil.html#Syncfusion_Blazor_Data_DataUtil_Group__1_System_Collections_IEnumerable_System_String_System_Collections_Generic_List_Syncfusion_Blazor_Data_Aggregate__System_Int32_System_Collections_Generic_IDictionary_System_String_System_String__System_Boolean_System_Boolean_) method in the [DataUtil](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Data.DataUtil.html) class applies grouping logic based on the configuration in the [DataManagerRequest](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataManagerRequest.html). Custom grouping logic can also be implemented when specific requirements exist. {% highlight razor %} public class CustomAdaptor : DataAdaptor @@ -946,8 +1051,7 @@ public class CustomAdaptor : DataAdaptor } {% endhighlight %} -> * For optimal performance, it is recommended to follow this sequence of operations(Searching, Filtering, Sorting, Aggregate, Paging and Grouping) in the `ReadAsync` method. -> * If both grouping and aggregate operations are enabled, the code provided below demonstrates how to implement these operations within the `CustomAdaptor`. +N> For optimal performance, apply operations in the following sequence: **Searching → Filtering → Sorting → Aggregation → Paging → Grouping** in [ReadAsync](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataAdaptor.html#Syncfusion_Blazor_DataAdaptor_ReadAsync_Syncfusion_Blazor_DataManagerRequest_System_String_) method. ```cshtml public class CustomAdaptor : DataAdaptor @@ -990,9 +1094,16 @@ public class CustomAdaptor : DataAdaptor ### Handling CRUD operations -To enable editing in the Blazor DataGrid component, utilize the [GridEditSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridEditSettings.html) component. The Blazor DataGrid component offers multiple edit modes including the Inline/Normal, Dialog and Batch editing. For more details, refer to the Blazor DataGrid component [editing](https://blazor.syncfusion.com/documentation/datagrid/editing) documentation. +The Syncfusion® Blazor DataGrid component supports Create, Read, Update, and Delete (CRUD) operations through the [GridEditSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridEditSettings.html) configuration. Multiple edit modes are available, including **Inline**, **Dialog**, and **Batch** editing. For details, refer to the [Editing](https://blazor.syncfusion.com/documentation/datagrid/editing) documentation. + +When using `CustomAdaptor`, CRUD operations are implemented by overriding the following methods of the [DataAdaptor](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataAdaptor-1.html) class: -In this scenario, the inline edit `Mode` and [Toolbar](https://blazor.syncfusion.com/documentation/datagrid/tool-bar) property configured to display toolbar items for editing purpose. +* [Insert](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataAdaptor.html#Syncfusion_Blazor_DataAdaptor_Insert_Syncfusion_Blazor_DataManager_System_Object_System_String_) / [InsertAsync](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataAdaptor.html#Syncfusion_Blazor_DataAdaptor_InsertAsync_Syncfusion_Blazor_DataManager_System_Object_System_String_) – Handles record insertion. +* [Update](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataAdaptor.html#Syncfusion_Blazor_DataAdaptor_Update_Syncfusion_Blazor_DataManager_System_Object_System_String_System_String_) / [UpdateAsync](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataAdaptor.html#Syncfusion_Blazor_DataAdaptor_UpdateAsync_Syncfusion_Blazor_DataManager_System_Object_System_String_System_String_) – Handles record updates. +* [Remove](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataAdaptor.html#Syncfusion_Blazor_DataAdaptor_Remove_Syncfusion_Blazor_DataManager_System_Object_System_String_System_String_) / [RemoveAsync](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataAdaptor.html#Syncfusion_Blazor_DataAdaptor_RemoveAsync_Syncfusion_Blazor_DataManager_System_Object_System_String_System_String_) – Handles record deletion. +* [BatchUpdate](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataAdaptor.html#Syncfusion_Blazor_DataAdaptor_BatchUpdate_Syncfusion_Blazor_DataManager_System_Object_System_Object_System_Object_System_String_System_String_System_Nullable_System_Int32__) / [BatchUpdateAsync](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataAdaptor.html#Syncfusion_Blazor_DataAdaptor_BatchUpdateAsync_Syncfusion_Blazor_DataManager_System_Object_System_Object_System_Object_System_String_System_String_System_Nullable_System_Int32__) – Handles batch operations (insert, update, delete). + +Each method can be customized to execute SQL commands against the Microsoft SQL Server database using **Dapper**, which simplifies database interaction by providing an easy-to-use interface for executing queries and mapping results to objects. {% highlight razor %} @@ -1008,21 +1119,13 @@ In this scenario, the inline edit `Mode` and [Toolbar](https://blazor.syncfusion {% endhighlight %} -> * Normal/Inline editing is the default edit [Mode](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridEditSettings.html#Syncfusion_Blazor_Grids_GridEditSettings_Mode) for the Blazor DataGrid component. To enable CRUD operations, ensure that the [IsPrimaryKey](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridColumn.html#Syncfusion_Blazor_Grids_GridColumn_IsPrimaryKey) property is set to **true** for a specific `GridColumn`, ensuring that its value is unique. -> * If database has an Autogenerated column, ensure to define [IsIdentity](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridColumn.html#Syncfusion_Blazor_Grids_GridColumn_IsIdentity) property of `GridColumn` to disable them during adding or editing operations. - -The CRUD operations can be performed and customized on our own by overriding the following CRUD methods of the [DataAdaptor](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataAdaptor.html) abstract class. - -* Insert/InsertAsync -* Remove/RemoveAsync -* Update/UpdateAsync -* BatchUpdate/BatchUpdateAsync - -Let's see how to perform CRUD operations using `Dapper` in Microsoft SQL Server data with the Syncfusion® Blazor DataGrid component. +> * Normal(Inline) editing is the default [Mode](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridEditSettings.html#Syncfusion_Blazor_Grids_GridEditSettings_Mode) for the Blazor DataGrid component. +> * To enable CRUD operations, set the [IsPrimaryKey](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridColumn.html#Syncfusion_Blazor_Grids_GridColumn_IsPrimaryKey) property to **true** for a column that contains unique values. +> * If the database includes an auto-generated column, set the [IsIdentity](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridColumn.html#Syncfusion_Blazor_Grids_GridColumn_IsIdentity) property for that column to disable editing during **add** or **update** operations. **Insert Operation:** -To execute the insert operation, you will need to override the [Insert](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataAdaptor.html#Syncfusion_Blazor_DataAdaptor_Insert_Syncfusion_Blazor_DataManager_System_Object_System_String_) or [InsertAsync](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataAdaptor.html#Syncfusion_Blazor_DataAdaptor_InsertAsync_Syncfusion_Blazor_DataManager_System_Object_System_String_) method of the `CustomAdaptor`. Then, integrate the following code snippet into the `CustomAdaptor` class. The below code snippet demonstrated how to handle the insertion of new records within the `InsertAsync` method of `CustomAdaptor` component. Modify the logic within this method according to the requirements of your application. Utilizing `Dapper` simplifies database interaction by providing an easy-to-use interface to execute queries and map results to objects, enhancing code readability and maintainability, as shown in the following code snippet. +To enable insertion in a Blazor DataGrid using a custom data binding approach, override the [Insert](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataAdaptor.html#Syncfusion_Blazor_DataAdaptor_Insert_Syncfusion_Blazor_DataManager_System_Object_System_String_) or [InsertAsync](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataAdaptor.html#Syncfusion_Blazor_DataAdaptor_InsertAsync_Syncfusion_Blazor_DataManager_System_Object_System_String_) method of the `CustomAdaptor` class. This method is invoked when a new record is added to the grid. {% tabs %} {% highlight razor tabtitle="Index.razor"%} @@ -1058,7 +1161,7 @@ public async Task AddOrderAsync(Order Value) **Update Operation:** -To execute the update operation, override the [Update](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataAdaptor.html#Syncfusion_Blazor_DataAdaptor_Update_Syncfusion_Blazor_DataManager_System_Object_System_String_System_String_) or [UpdateAsync](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataAdaptor.html#Syncfusion_Blazor_DataAdaptor_UpdateAsync_Syncfusion_Blazor_DataManager_System_Object_System_String_System_String_) method of the `CustomAdaptor`. Then, integrate the following code snippet into the `CustomAdaptor` class. The below code snippet demonstrated how to handle the updating of existing records within the `UpdateAsync` method of the `CustomAdaptor` component. Modify the logic within this method according to the requirements of your application. Utilizing `Dapper` simplifies database interaction by providing an easy-to-use interface to execute queries and map results to objects, enhancing code readability and maintainability, as shown in the following code snippet. +To enable record updates in a Blazor DataGrid using a custom data binding approach, override the [Update](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataAdaptor.html#Syncfusion_Blazor_DataAdaptor_Update_Syncfusion_Blazor_DataManager_System_Object_System_String_System_String_) or [UpdateAsync](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataAdaptor.html#Syncfusion_Blazor_DataAdaptor_UpdateAsync_Syncfusion_Blazor_DataManager_System_Object_System_String_System_String_) method of the `CustomAdaptor` class. This method is triggered when an existing record is modified in the grid. {% tabs %} {% highlight razor tabtitle="Index.razor"%} @@ -1095,7 +1198,7 @@ public async Task UpdateOrderAsync(Order Value) **Delete Operation:** -To perform the delete operation, you need to override the [Remove](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataAdaptor.html#Syncfusion_Blazor_DataAdaptor_Remove_Syncfusion_Blazor_DataManager_System_Object_System_String_System_String_) or [RemoveAsync](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataAdaptor.html#Syncfusion_Blazor_DataAdaptor_RemoveAsync_Syncfusion_Blazor_DataManager_System_Object_System_String_System_String_) method of the `CustomAdaptor`. Below is the code snippet that you can add to `CustomAdaptor` class. The below code snippet demonstrated how to handle the deletion of existing records within the `RemoveAsync` method of `CustomAdaptor` component. Modify the logic within this method according to the requirements of your application. Utilizing `Dapper` simplifies database interaction by providing an easy-to-use interface to execute queries and map results to objects, enhancing code readability and maintainability, as shown in the following code snippet. +To enable deletion in a Blazor DataGrid using a custom data binding approach, override the [Remove](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataAdaptor.html#Syncfusion_Blazor_DataAdaptor_Remove_Syncfusion_Blazor_DataManager_System_Object_System_String_System_String_) or [RemoveAsync](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataAdaptor.html#Syncfusion_Blazor_DataAdaptor_RemoveAsync_Syncfusion_Blazor_DataManager_System_Object_System_String_System_String_) method of the `CustomAdaptor` class. This method is invoked when a record is removed from the grid. {% tabs %} {% highlight razor tabtitle="Index.razor"%} @@ -1132,7 +1235,7 @@ public async Task RemoveOrderAsync(int? Key) **Batch Operation:** -To perform the batch operation, override the [BatchUpdate](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataAdaptor.html#Syncfusion_Blazor_DataAdaptor_BatchUpdate_Syncfusion_Blazor_DataManager_System_Object_System_Object_System_Object_System_String_System_String_System_Nullable_System_Int32__) or [BatchUpdateAsync](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataAdaptor.html#Syncfusion_Blazor_DataAdaptor_BatchUpdateAsync_Syncfusion_Blazor_DataManager_System_Object_System_Object_System_Object_System_String_System_String_System_Nullable_System_Int32__) method of the `CustomAdaptor` and add the following code in the `CustomAdaptor`. The below code snippet demonstrated how to handle the batch update request within the `BatchUpdateAsync` method of `CustomAdaptor` component. Modify the logic within this method according to the requirements of your application. +To enable batch editing in a Blazor DataGrid using a custom data binding approach, override the [BatchUpdate](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataAdaptor.html#Syncfusion_Blazor_DataAdaptor_BatchUpdate_Syncfusion_Blazor_DataManager_System_Object_System_Object_System_Object_System_String_System_String_System_Nullable_System_Int32__) or [BatchUpdateAsync](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataAdaptor.html#Syncfusion_Blazor_DataAdaptor_BatchUpdateAsync_Syncfusion_Blazor_DataManager_System_Object_System_Object_System_Object_System_String_System_String_System_Nullable_System_Int32__) method of the `CustomAdaptor` class. This method is invoked when multiple records are added, updated, or deleted in batch mode. {% highlight razor %} /// @@ -1175,4 +1278,4 @@ public override async Task BatchUpdateAsync(DataManager DataManager, obj ![Blazor DataGrid component bound with Microsoft SQL Server data using Dapper](../images/blazor-Grid-Ms-SQl-databinding-Gif.gif) -> You can find the sample in this [GitHub location](https://github.com/SyncfusionExamples/connecting-databases-to-blazor-datagrid-component/tree/master/Binding%20Dapper%20using%20CustomAdaptor). +> The complete sample is available in this [GitHub](https://github.com/SyncfusionExamples/connecting-databases-to-blazor-datagrid-component/tree/master/Binding%20Dapper%20using%20CustomAdaptor) repository. diff --git a/blazor/datagrid/connecting-to-database/microsoft-sql-server.md b/blazor/datagrid/connecting-to-database/microsoft-sql-server.md index 3881b4026e..8e48662522 100644 --- a/blazor/datagrid/connecting-to-database/microsoft-sql-server.md +++ b/blazor/datagrid/connecting-to-database/microsoft-sql-server.md @@ -7,41 +7,67 @@ control: DataGrid documentation: ug --- -# Connecting Microsoft SQL Server data in to Blazor DataGrid Component +# Connecting Microsoft SQL Server data to Blazor DataGrid -This section describes how to connect and retrieve data from a Microsoft SQL Server database using [System.Data.SqlClient](https://www.nuget.org/packages/System.Data.SqlClient/4.8.6?_src=template) and bind it to the Blazor DataGrid component. +The Syncfusion® Blazor DataGrid component supports multiple approaches for binding data from Microsoft SQL Server: -Microsoft SQL Server database can be bound to the Blazor DataGrid component in different ways (i.e.) using [DataSource](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_DataSource) property, [CustomAdaptor](https://blazor.syncfusion.com/documentation/datagrid/custom-binding) feature and remote data binding using various adaptors. In this documentation, two approaches will be examined to connect a Microsoft SQL Server database to a Blazor DataGrid component. Both the approaches have capability to handle data and CRUD operations with built-in methods as well as can be customized as per your own. +* Configure the [DataSource](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_DataSource) property for local data binding. +* Implement a [CustomAdaptor](https://blazor.syncfusion.com/documentation/datagrid/connecting-to-adaptors/custom-adaptor) for custom server-side logic. +* Use remote data binding with adaptors such as [UrlAdaptor](https://blazor.syncfusion.com/documentation/datagrid/connecting-to-adaptors/url-adaptor). -* **Using UrlAdaptor** +This guide explains two primary approaches for integrating Microsoft SQL Server data with the Blazor DataGrid: -The [UrlAdaptor](https://blazor.syncfusion.com/documentation/data/adaptors#url-adaptor) serves as the base adaptor for facilitating communication between remote data services and an UI component. It enables the remote binding of data to the Blazor DataGrid component by connecting to an existing pre-configured API service linked to the Microsoft SQL Server database. While the Blazor DataGrid component supports various adaptors to fulfill this requirement, including [Web API](https://blazor.syncfusion.com/documentation/data/adaptors#web-api-adaptor), [OData](https://blazor.syncfusion.com/documentation/data/adaptors#odata-adaptor), [ODataV4](https://blazor.syncfusion.com/documentation/data/adaptors#odatav4-adaptor), [Url](https://blazor.syncfusion.com/documentation/data/adaptors#url-adaptor), and [GraphQL](https://blazor.syncfusion.com/documentation/data/adaptors#graphql-service-binding), the `UrlAdaptor` is particularly useful for the scenarios where a custom API service with unique logic for handling data and CRUD operations is in place. This approach allows for custom handling of data and CRUD operations, and the resultant data returned in the `result` and `count` format for display in the Blazor DataGrid component. - -To know about how to connect Microsoft SQL Server to Blazor DataGrid with UrlAdaptor in Blazor DataGrid Component, you can check this video. +* **Remote Data Binding using UrlAdaptor**: Enables communication between the DataGrid and a remote API service connected to SQL Server. This approach is suitable when the API implements custom logic for data operations and returns results in the **result** and **count** format. {% youtube "youtube:https://www.youtube.com/watch?v=Y3grzt0ZdLk" %} -* **Using CustomAdaptor** +* **Custom Data Binding using CustomAdaptor**: Provides full control over data operations and CRUD functionality. It allows implementing custom logic for **searching**, **filtering**, **sorting**, **paging**, and **grouping** directly in server-side code. -The [CustomAdaptor](https://blazor.syncfusion.com/documentation/datagrid/custom-binding) serves as a mediator between the UI component and the database for data binding. While the data source from the database can be directly bound to the `SfGrid` component locally using the [DataSource](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_DataSource) property, the `CustomAdaptor` approach is preferred as it allows for customization of both data operations and CRUD operations according to specific requirements. In this approach, for every action in the Blazor DataGrid component, a corresponding request with action details is sent to the `CustomAdaptor`. The Blazor DataGrid component provides predefined methods to perform data operations such as **searching**, **filtering**, **sorting**, **aggregation**, **paging** and **grouping**. Alternatively, your own custom methods can be employed to execute operations and return the data in the `Result` and `Count` format of the `DataResult` class for displaying in the Blazor DataGrid component. Additionally, for CRUD operations, predefined methods can be overridden to provide custom functionality. Further details on this can be found in the latter part of the documentation. +{% youtube "youtube:https://www.youtube.com/watch?v=8yLpSCJLcXI" %} -To know about how to connect Microsoft SQL Server to Blazor DataGrid with custom adaptor in Blazor DataGrid Component, you can check this video. +Both approaches support CRUD operations and can be customized to meet application-specific requirements. + +## Microsoft SQL Server Overview + +Microsoft SQL Server is a relational database management system (**RDBMS**) developed by Microsoft. It is designed to store, retrieve, and manage data efficiently for enterprise applications. SQL Server uses Structured Query Language (**SQL**) for querying and manipulating data. + +**Key Features** + +**Relational Database Model**: Organizes data into tables with rows and columns. +**T-SQL Support**: Provides **Transact-SQL** for advanced querying and procedural programming. +**High Availability**: Features like Always On Availability Groups for failover and disaster recovery. +**Security**: Includes **encryption**, **authentication**, and **role-based access** control. +**Integration**: Works with .NET applications, Azure services, and supports REST APIs. +**Scalability**: Handles large datasets and supports both on-premises and cloud deployments. + +For more details, refer to the official [Microsoft documentation](https://learn.microsoft.com/en-us/sql/sql-server/what-is-sql-server?view=sql-server-ver17). -{% youtube "youtube:https://www.youtube.com/watch?v=8yLpSCJLcXI" %} ## Binding data from Microsoft SQL Server using an API service -This section describes step by step process how to retrieve data from a Microsoft SQL Server using an API service and bind it to the Blazor DataGrid component. +Data from Microsoft SQL Server can be retrieved through an ASP.NET Core Web API and bound to the Syncfusion® Blazor DataGrid using UrlAdaptor. This approach enables server-side operations such as paging, sorting, and filtering. ### Creating an API service -**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 API Project** + +Create a new **ASP.NET Core Web API** project in Visual Studio. Refer to [Microsoft documentation](https://learn.microsoft.com/en-us/visualstudio/get-started/csharp/tutorial-aspnet-core?view=vs-2022) for detailed instructions. -**2.** To connect a Microsoft SQL Server database using the Microsoft SQL driver in your application, you need to install the [System.Data.SqlClient](https://www.nuget.org/packages/System.Data.SqlClient/4.8.6?_src=template) NuGet package. To add **System.Data.SqlClient** in the app, open the NuGet package manager in Visual Studio (Tools → NuGet Package Manager → Manage NuGet Packages for Solution), search and install it. +**Step 2: Install SQL Client Package** -**3.** Create an API controller (aka, GridController.cs) file under **Controllers** folder that helps to establish data communication with the Blazor DataGrid component. +* Install the **System.Data.SqlClient** package using **NuGet Package Manager**: -**4.** In an API controller (aka, GridController), connect to Microsoft SQL Server. In the **Get()** method **SqlConnection** helps to connect the Microsoft SQL Server database. 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. + *Tools → NuGet Package Manager → Manage NuGet Packages for Solution*. + +* Alternatively, use the **Package Manager Console**: + +```powershell +Install-Package System.Data.SqlClient +``` + +**Step 3: Add API Controller** + +Create a controller named **GridController.cs** under the Controllers folder. Implement logic to fetch data from SQL Server and return it as a collection of **Order** objects. {% tabs %} {% highlight razor tabtitle="GridController.cs" %} @@ -102,91 +128,95 @@ namespace MyWebService.Controllers {% endhighlight %} {% endtabs %} -**5.** Run the application and it will be hosted within the URL `https://localhost:xxxx`. +**Step 4: Run and test the API** -**6.** Finally, the retrieved data from Microsoft SQL Server database which is in the form of list of array can be found in an API controller available in the URL link `https://localhost:xxxx/api/Grid`, as shown in the browser page below. +Start the API and verify the endpoint (e.g., **https://localhost:xxxx/api/Grid**) returns data. ![Hosted API URL](../images/Ms-Sql-data.png) ### Connecting Blazor DataGrid to an API service -**1.** Create a simple Blazor DataGrid component by following steps. This section briefly explains about how to include [Blazor DataGrid](https://www.syncfusion.com/blazor-components/blazor-datagrid) component in your Blazor Web App using [Visual Studio](https://visualstudio.microsoft.com/vs/). +After creating and testing the API, configure the Syncfusion® Blazor DataGrid to bind data from the API endpoint using [UrlAdaptor](https://blazor.syncfusion.com/documentation/datagrid/connecting-to-adaptors/url-adaptor). **Prerequisites** * [System requirements for Blazor components](https://blazor.syncfusion.com/documentation/system-requirements) -**Create a new Blazor Web App** +**Step 1: Create a Blazor Web App** -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&pivots=vs) or the [Syncfusion® Blazor Extension](https://blazor.syncfusion.com/documentation/visual-studio-integration/template-studio). +Create a Blazor Web App in Visual Studio 2022 using [Microsoft templates](https://learn.microsoft.com/en-us/aspnet/core/blazor/tooling?view=aspnetcore-10.0&pivots=vs) or the Syncfusion® Blazor Extension. +Configure: -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=vs) while creating a Blazor Web Application. +* [Interactive render mode](https://learn.microsoft.com/en-us/aspnet/core/blazor/components/render-modes?view=aspnetcore-10.0#render-modes) +* [Interactivity location](https://learn.microsoft.com/en-us/aspnet/core/blazor/tooling?view=aspnetcore-10.0&pivots=vs) -**Install Syncfusion® Blazor Grid and Themes NuGet in the Blazor Web App** +**Step 2: Install Syncfusion Packages** -To add **Blazor DataGrid** 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.Grid](https://www.nuget.org/packages/Syncfusion.Blazor.Grid/) and [Syncfusion.Blazor.Themes](https://www.nuget.org/packages/Syncfusion.Blazor.Themes/). +1. Open **NuGet Package Manager** in Visual Studio: -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. + *Tools → NuGet Package Manager → Manage NuGet Packages for Solution*. -Alternatively, you can utilize the following package manager command to achieve the same. +2. Search and install the following packages: -{% tabs %} -{% highlight C# tabtitle="Package Manager" %} + - [Syncfusion.Blazor.Grid](https://www.nuget.org/packages/Syncfusion.Blazor.Grid/) + - [Syncfusion.Blazor.Themes](https://www.nuget.org/packages/Syncfusion.Blazor.Themes/) + +3. For projects using **WebAssembly** or **Auto** interactive render modes, ensure these packages are installed in the **Client** project. +4. Alternatively, use the **Package Manager Console**: + +```powershell Install-Package Syncfusion.Blazor.Grid -Version {{ site.releaseversion }} Install-Package Syncfusion.Blazor.Themes -Version {{ site.releaseversion }} +``` -{% endhighlight %} -{% endtabs %} - -> 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 packages, refer to [NuGet packages](https://blazor.syncfusion.com/documentation/nuget-packages). -**Register Syncfusion® Blazor Service** +**Step 3: Register Syncfusion Blazor service** -Open **~/_Imports.razor** file and import the `Syncfusion.Blazor` and `Syncfusion.Blazor.Grids` namespace. +1. Add the required namespaces in **~/_Imports.razor**: ```cshtml - @using Syncfusion.Blazor @using Syncfusion.Blazor.Grids ``` -Now, register the Syncfusion® Blazor Service in the **~/Program.cs** file of your Blazor Web App. For a app with `WebAssembly` or `Auto (Server and WebAssembly)` interactive render mode, register the Syncfusion® Blazor service in both **~/Program.cs** files of your web app. +2. For apps using **WebAssembly** or **Auto** (Server and WebAssembly) render modes, register the service in both **~/Program.cs** files. ```cshtml - -.... using Syncfusion.Blazor; -.... + builder.Services.AddSyncfusionBlazor(); -.... ``` -**Add stylesheet and script resources** +**Step 4: 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 theme and script references in **App.razor**: ```html - .... -.... + - .... ``` -> * 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. -> * In this Blazor Web app, set the `rendermode` as either **InteractiveServer** or **InteractiveAuto** as per your configuration. +N> +* Refer to [Blazor Themes](https://blazor.syncfusion.com/documentation/appearance/themes) for various methods to reference themes in a Blazor application: + + * [Static Web Assets](https://blazor.syncfusion.com/documentation/appearance/themes#static-web-assets) + * [CDN](https://blazor.syncfusion.com/documentation/appearance/themes#cdn-reference) + * [Custom Resource Generator (CRG)](https://blazor.syncfusion.com/documentation/common/custom-resource-generator) -**2.** Map the hosted API's URL link `https://localhost:xxxx/api/Grid` to the Blazor DataGrid component in **Index.razor** by using the [Url](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataManager.html#Syncfusion_Blazor_DataManager_Url) property of [SfDataManager](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Data.SfDataManager.html). To interact with remote data source, provide the endpoint `Url`. +* For script reference options, see [Adding Script References](https://blazor.syncfusion.com/documentation/common/adding-script-references). +* Set the render mode to **InteractiveServer** or **InteractiveAuto** in the Blazor Web App configuration. -**3.** The `SfDataManager` offers multiple adaptor options to connect with remote database based on an API service. Below is an example of the [UrlAdaptor](https://blazor.syncfusion.com/documentation/data/adaptors#url-adaptor) configuration where an API service are set up to return the resulting data in the `result` and `count` format. +**Step 5: Configure DataGrid with UrlAdaptor** -**4.** The `UrlAdaptor` acts as the base adaptor for interacting with remote data service. Most of the built-in adaptors are derived from the `UrlAdaptor`. +Use [SfDataManager](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Data.SfDataManager.html) to connect the DataGrid to the API endpoint and set the [Adaptor](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Adaptors.html) property to [Adaptors.UrlAdaptor](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Adaptors.html#Syncfusion_Blazor_Adaptors_UrlAdaptor). {% tabs %} {% highlight razor tabtitle="Index.razor" %} @@ -271,18 +301,28 @@ The theme stylesheet and script can be accessed from NuGet through [Static Web A {% endhighlight %} {% endtabs %} -> In the above Blazor DataGrid component, [AllowSearching](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridColumn.html#Syncfusion_Blazor_Grids_GridColumn_AllowSearching), [AllowSorting](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_AllowSorting), [AllowFiltering](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_AllowFiltering), [AllowPaging](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_AllowPaging), [AllowGrouping](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_AllowGrouping) and CRUD-related properties have been enabled. The details on how to handle these actions are explained below. +![Blazor DataGrid component bound with Microsoft SQL Server data](../images/blazor-Grid-Ms-SQL-databinding.png) -When you run the application, the resultant Blazor DataGrid component will look like this +### Perform data operations in UrlAdaptor -![Blazor DataGrid component bound with Microsoft SQL Server data](../images/blazor-Grid-Ms-SQL-databinding.png) +When `UrlAdaptor` is used, the Syncfusion® Blazor DataGrid sends operation details to the API through a [DataManagerRequest](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataManagerRequest.html) object. These details can be applied to the data source using methods from the [DataOperations](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataOperations.html) class. + +**Common Methods in DataOperations** + +* [PerformSearching](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataOperations.html#Syncfusion_Blazor_DataOperations_PerformSearching__1_System_Linq_IQueryable___0__System_Collections_Generic_List_Syncfusion_Blazor_Data_SearchFilter__) - Applies search criteria to the collection. +* [PerformFiltering](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataOperations.html#Syncfusion_Blazor_DataOperations_PerformFiltering__1_System_Linq_IQueryable___0__System_Collections_Generic_List_Syncfusion_Blazor_Data_WhereFilter__System_String_) - Filters data based on conditions. +* [PerformSorting](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataOperations.html#Syncfusion_Blazor_DataOperations_PerformSorting__1_System_Linq_IQueryable___0__System_Collections_Generic_List_Syncfusion_Blazor_Data_Sort__) - Sorts data by one or more fields. +* [PerformSkip](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataOperations.html#Syncfusion_Blazor_DataOperations_PerformSkip__1_System_Linq_IQueryable___0__System_Int32_) - Skips a defined number of records for paging. +* [PerformTake](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataOperations.html#Syncfusion_Blazor_DataOperations_PerformTake__1_System_Linq_IQueryable___0__System_Int32_) - Retrieves a specified number of records for paging. +* [PerformAggregation](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Data.DataUtil.html#Syncfusion_Blazor_Data_DataUtil_PerformAggregation_System_Collections_IEnumerable_System_Collections_Generic_List_Syncfusion_Blazor_Data_Aggregate__) – Calculates aggregate values such as Sum, Average, Min, and Max. -> * The Syncfusion® Blazor DataGrid component provides built-in support for handling various data operations such as **searching**, **sorting**, **filtering**, **aggregate** and **paging** on the server-side. These operations can be handled using methods such as `PerformSearching`, `PerformFiltering`, `PerformSorting`, `PerformAggregation`, `PerformTake` and `PerformSkip` available in the **Syncfusion.Blazor.Data** package. Let's explore how to manage these data operations using the `UrlAdaptor`. -> * In an API service project, add **Syncfusion.Blazor.Data** by opening the NuGet package manager in Visual Studio (Tools → NuGet Package Manager → Manage NuGet Packages for Solution), search and install it. +These methods enable efficient handling of large datasets by performing operations on the server side. The following sections demonstrate how to manage these operations using the `UrlAdaptor`. + +> * To enable these operations, add the **Syncfusion.Blazor.Data** package to the API service project using NuGet Package Manager in Visual Studio (*Tools → NuGet Package Manager → Manage NuGet Packages for Solution*). ### Handling searching operation -To handle searching operation, ensure that your API endpoint supports custom searching criteria. Implement the searching logic on the server-side using the [PerformSearching](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataOperations.html#Syncfusion_Blazor_DataOperations_PerformSearching__1_System_Collections_Generic_IEnumerable___0__System_Collections_Generic_List_Syncfusion_Blazor_Data_SearchFilter__) method from the [DataOperations](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataOperations.html) class. This allows the custom data source to undergo searching based on the criteria specified in the incoming [DataManagerRequest](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataManagerRequest.html) object. +When using `UrlAdaptor`, server-side searching can be implemented by applying the [PerformSearching](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataOperations.html#Syncfusion_Blazor_DataOperations_PerformSearching__1_System_Collections_Generic_IEnumerable___0__System_Collections_Generic_List_Syncfusion_Blazor_Data_SearchFilter__) method from the `DataOperations` class. This method applies search criteria from the `DataManagerRequest` object to the data collection. {% highlight razor %} @@ -303,9 +343,15 @@ public object Post([FromBody] DataManagerRequest DataManagerRequest) } {% endhighlight %} +**Key Points** + +* `request.Search` contains search descriptors sent from the DataGrid. +* `PerformSearching` applies these descriptors to the collection. +* Custom logic can be added if required before or after applying the built-in method. + ### Handling filtering operation -To handle filtering operation, ensure that your API endpoint supports custom filtering criteria. Implement the filtering logic on the server-side using the [PerformFiltering](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataOperations.html#Syncfusion_Blazor_DataOperations_PerformFiltering_System_Collections_IEnumerable_System_Collections_Generic_List_Syncfusion_Blazor_Data_WhereFilter__System_String_) method from the [DataOperations](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataOperations.html) class. This allows the custom data source to undergo filtering based on the criteria specified in the incoming [DataManagerRequest](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataManagerRequest.html) object. +When using `UrlAdaptor`, server-side filtering can be implemented by applying the [PerformFiltering](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataOperations.html#Syncfusion_Blazor_DataOperations_PerformFiltering__1_System_Collections_Generic_IEnumerable___0__System_Collections_Generic_List_Syncfusion_Blazor_Data_WhereFilter__System_String_) method from the `DataOperations` class. This method applies filter conditions from the `DataManagerRequest` object to the data collection. {% highlight razor %} [HttpPost] @@ -326,9 +372,16 @@ public object Post([FromBody] DataManagerRequest DataManagerRequest) {% endhighlight %} +**Key Points** + +* `request.Where` contains filter descriptors sent from the DataGrid. +* `PerformFiltering` applies these descriptors to the collection. +* The `Operator` property determines how conditions are combined (e.g., AND, OR). +* Custom logic can be added before or after applying the built-in method. + ### Handling sorting operation -To handle sorting operation, ensure that your API endpoint supports custom sorting criteria. Implement the sorting logic on the server-side using the [PerformSorting](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataOperations.html#Syncfusion_Blazor_DataOperations_PerformSorting__1_System_Collections_Generic_IEnumerable___0__System_Collections_Generic_List_Syncfusion_Blazor_Data_Sort__) method from the [DataOperations](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataOperations.html) class. This allows the custom data source to undergo sorting based on the criteria specified in the incoming [DataManagerRequest](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataManagerRequest.html) object. +When using `UrlAdaptor`, server-side sorting can be implemented by applying the [PerformSorting](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataOperations.html#Syncfusion_Blazor_DataOperations_PerformSorting__1_System_Collections_Generic_IEnumerable___0__System_Collections_Generic_List_Syncfusion_Blazor_Data_Sort__) method from the `DataOperations` class. This method applies sort descriptors from the `DataManagerRequest` object to the data collection. {% highlight razor %} [HttpPost] @@ -348,9 +401,16 @@ public object Post([FromBody] DataManagerRequest DataManagerRequest) } {% endhighlight %} +**Key Points** + +* `request.Sorted` contains sort descriptors sent from the DataGrid. +* `PerformSorting` applies these descriptors to the collection. +* Supports multiple sort fields and directions (**ascending** or **descending**). +* Custom sorting logic can be added before or after applying the built-in method. + ### Handling aggregate operation -To handle aggregate operation, ensure that your API endpoint supports custom aggregate criteria. Implement the aggregate logic on the server-side using the [PerformAggregation](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Data.DataUtil.html#Syncfusion_Blazor_Data_DataUtil_PerformAggregation_System_Collections_IEnumerable_System_Collections_Generic_List_Syncfusion_Blazor_Data_Aggregate__) method from the [DataUtil](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Data.DataUtil.html) class. This allows the custom data source to undergo aggregate based on the criteria specified in the incoming [DataManagerRequest](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataManagerRequest.html) object. +Enable server-side aggregation by implementing logic in the API controller using the [PerformAggregation](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Data.DataUtil.html#Syncfusion_Blazor_Data_DataUtil_PerformAggregation_System_Collections_IEnumerable_System_Collections_Generic_List_Syncfusion_Blazor_Data_Aggregate__) method from the [DataUtil](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Data.DataUtil.html) class. This method calculates aggregate values such as **Sum**, **Average**, **Min**, and **Max** for the specified fields based on the incoming [DataManagerRequest](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataManagerRequest.html). {% highlight razor %} [HttpPost] @@ -371,11 +431,41 @@ To handle aggregate operation, ensure that your API endpoint supports custom agg } {% endhighlight %} -> The server-side management of the `PerformAggregation` method is necessary only for the [Footer Template](https://blazor.syncfusion.com/documentation/datagrid/footer-aggregate) aggregation. There is no need for explicit handling of the Aggregate operation for the [Group Footer template](https://blazor.syncfusion.com/documentation/datagrid/group-and-caption-aggregate#group-footer-aggregates) and [Group Caption template](https://blazor.syncfusion.com/documentation/datagrid/group-and-caption-aggregate#group-caption-aggregates). +> The server-side implementation of the `PerformAggregation` method is required only for [Footer aggregates](https://blazor.syncfusion.com/documentation/datagrid/footer-aggregate). Explicit handling is not necessary for[ Group Footer aggregates](https://blazor.syncfusion.com/documentation/datagrid/group-and-caption-aggregate#group-footer-aggregates) or [Group Caption aggregates](https://blazor.syncfusion.com/documentation/datagrid/group-and-caption-aggregate#group-caption-aggregates). + +### Handling Aggregation Operation + +When using `UrlAdaptor`, server-side aggregation can be implemented by applying the [PerformAggregation](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Data.DataUtil.html#Syncfusion_Blazor_Data_DataUtil_PerformAggregation_System_Collections_IEnumerable_System_Collections_Generic_List_Syncfusion_Blazor_Data_Aggregate__) method from the DataUtil class. This method calculates aggregate values such as **Sum**, **Average**, **Min**, and **Max** based on the configuration in the `DataManagerRequest` object. + +{% highlight razor %} +[HttpPost] +[Route("api/[controller]")] +public object Post([FromBody] DataManagerRequest request) +{ + IEnumerable dataSource = GetOrderData(); + int count = dataSource.Count(); + + // Apply aggregation + IDictionary aggregates = null; + if (request.Aggregates != null) + { + aggregates = DataUtil.PerformAggregation(dataSource, request.Aggregates); + } + + return new { result = dataSource, count, aggregates }; +} +{% endhighlight %} + +**Key Points** + +* `request.Aggregates` contains aggregate descriptors sent from the DataGrid. +* `PerformAggregation` calculates summary values for specified fields. +* The server-side implementation of the `PerformAggregation` method is required only for [Footer aggregates](https://blazor.syncfusion.com/documentation/datagrid/footer-aggregate). +* [Group Footer aggregates](https://blazor.syncfusion.com/documentation/datagrid/group-and-caption-aggregate#group-footer-aggregates) and [Group Caption aggregates](https://blazor.syncfusion.com/documentation/datagrid/group-and-caption-aggregate#group-caption-aggregates) are calculated automatically by the DataGrid and do not require explicit handling. ### Handling paging operation -To handle paging operation, ensure that your API endpoint supports custom paging criteria. Implement the paging logic on the server-side using the [PerformTake](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataOperations.html#Syncfusion_Blazor_DataOperations_PerformTake_System_Collections_IEnumerable_System_Int32_) and [PerformSkip](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataOperations.html#Syncfusion_Blazor_DataOperations_PerformSkip__1_System_Collections_Generic_IEnumerable___0__System_Int32_) method from the [DataOperations](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataOperations.html) class. This allows the custom data source to undergo paging based on the criteria specified in the incoming [DataManagerRequest](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataManagerRequest.html) object. +When using `UrlAdaptor`, server-side paging can be implemented by applying the [PerformSkip](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataOperations.html#Syncfusion_Blazor_DataOperations_PerformSkip__1_System_Collections_Generic_IEnumerable___0__System_Int32_) and [PerformTake](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataOperations.html#Syncfusion_Blazor_DataOperations_PerformTake__1_System_Collections_Generic_IEnumerable___0__System_Int32_) methods from the `DataOperations` class. These methods apply paging details from the `DataManagerRequest` object to the data collection. {% highlight razor %} [HttpPost] @@ -400,13 +490,30 @@ public object Post([FromBody] DataManagerRequest DataManagerRequest) } {% endhighlight %} -> For optimal performance, it is recommended to follow this sequence of operations(Searching, Filtering, Sorting, Aggregate and Paging) in the [ReadAsync](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataAdaptor.html#Syncfusion_Blazor_DataAdaptor_ReadAsync_Syncfusion_Blazor_DataManagerRequest_System_String_) method. +**Key Points** -### Handling CRUD operations +* `request.Skip` specifies the number of records to skip. +* `request.Take` specifies the number of records to retrieve. +* `PerformSkip` and `PerformTake` enable efficient server-side paging. +* Custom paging logic can be added before or after applying these methods. -To enable editing in this Blazor DataGrid component, utilize the [GridEditSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridEditSettings.html) component. The Blazor DataGrid offers multiple edit modes including the [Inline/Normal](https://blazor.syncfusion.com/documentation/datagrid/in-line-editing), [Dialog](https://blazor.syncfusion.com/documentation/datagrid/dialog-editing), and [Batch](https://blazor.syncfusion.com/documentation/datagrid/batch-editing) editing. For more details, refer to the Blazor DataGrid component [editing](https://blazor.syncfusion.com/documentation/datagrid/editing) documentation. +> **Best Practice**: -In this scenario, the inline edit `Mode` and [Toolbar](https://blazor.syncfusion.com/documentation/datagrid/tool-bar) property are configured to display toolbar items for editing purposes. +For optimal performance, apply operations in the following sequence on the server side: + +**Searching → Filtering → Sorting → Aggregation → Paging** + +### Handling CRUD operations Using UrlAdaptor + +The Syncfusion® Blazor DataGrid supports **Create**, **Read**, **Update**, and **Delete** (**CRUD**) operations through the [SfDataManager](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Data.SfDataManager.html) component. API endpoints for these operations are mapped using properties such as: + +* [InsertUrl](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataManager.html#Syncfusion_Blazor_DataManager_InsertUrl) – API endpoint for inserting new records. +* [UpdateUrl](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataManager.html#Syncfusion_Blazor_DataManager_UpdateUrl) – API endpoint for updating existing records. +* [RemoveUrl](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataManager.html#Syncfusion_Blazor_DataManager_UpdateUrl) – API endpoint for deleting records. +* [CrudUrl](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataManager.html#Syncfusion_Blazor_DataManager_CrudUrl) – Single endpoint for all CRUD operations. +* [BatchUrl](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataManager.html#Syncfusion_Blazor_DataManager_BatchUrl) – API endpoint for batch editing. + +To enable [editing](https://blazor.syncfusion.com/documentation/datagrid/editing), configure the [Toolbar](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_Toolbar) and [GridEditSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridEditSettings.html) properties. Set the [Mode](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridEditSettings.html#Syncfusion_Blazor_Grids_GridEditSettings_Mode) property to [EditMode.Normal](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.EditMode.html#Syncfusion_Blazor_Grids_EditMode_Normal) for inline editing. {% tabs %} {% highlight razor %} @@ -424,12 +531,12 @@ In this scenario, the inline edit `Mode` and [Toolbar](https://blazor.syncfusion {% endhighlight %} {% endtabs %} -> * Normal/Inline editing is the default edit [Mode](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridEditSettings.html#Syncfusion_Blazor_Grids_GridEditSettings_Mode) for the Blazor DataGrid component. To enable CRUD operations, ensure that the [IsPrimaryKey](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridColumn.html#Syncfusion_Blazor_Grids_GridColumn_IsPrimaryKey) property is set to **true** for a specific `GridColumn`, ensuring that its value is unique. -> * If database has an Autogenerated column, ensure to define [IsIdentity](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridColumn.html#Syncfusion_Blazor_Grids_GridColumn_IsIdentity) property of `GridColumn` to disable them during adding or editing operations. +> * Set [IsPrimaryKey](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridColumn.html#Syncfusion_Blazor_Grids_GridColumn_IsPrimaryKey) to **true** for a column that contains unique values. +> * If the database includes an a**uto-generated column**, set [IsIdentity](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridColumn.html#Syncfusion_Blazor_Grids_GridColumn_IsIdentity) for that column to disable editing during **add** or **update** operations. **Insert Operation:** -To insert a new row, simply click the **Add** toolbar button. The new record edit form will be displayed as shown below. Upon clicking the **Update** toolbar button, record will inserted into the Orders table by calling the following **POST** method of an API. +To insert a new record, click **Add** in the toolbar. After entering the required values, click **Update**. This action inserts the record into the **Orders** table by calling a **POST** API method: {% tabs %} {% highlight c# tabtitle="OrdersController.cs" %} @@ -459,7 +566,7 @@ public void Insert([FromBody] CRUDModel Value) **Update Operation:** -To edit a row, first select desired row and click the **Edit** toolbar button. The edit form will be displayed and proceed to modify any column value as per your requirement. Clicking the **Update** toolbar button will update the edit record in the Orders table by involving the following **Post** method of an API. +To update an existing record, select the row and click **Edit** in the toolbar. Modify the required values in the edit form, then click **Update**. This action updates the record in the Orders table by calling a **POST** API method: {% tabs %} {% highlight c# tabtitle="OrdersController.cs" %} @@ -490,7 +597,7 @@ public void Update([FromBody] CRUDModel Value) **Delete Operation:** -To delete a row, simply select the desired row and click the **Delete** toolbar button. This action will trigger a **DELETE** request to an API, containing the primary key value of the selected record. As a result corresponding record will be removed from the Orders table. +To delete a record, select the row and click **Delete** in the toolbar. This action removes the record from the Orders table by calling a **POST** API method: {% tabs %} {% highlight c# tabtitle="OrdersController.cs" %} @@ -521,7 +628,13 @@ public void Delete([FromBody] CRUDModel Value) **Batch Operation:** -To perform batch operation, define the edit [Mode](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridEditSettings.html#Syncfusion_Blazor_Grids_GridEditSettings_Mode) as `Batch` and specify the [BatchUrl](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataManager.html#Syncfusion_Blazor_DataManager_BatchUrl) property in the `SfDataManager`. Use the **Add** toolbar button to insert new row in batch editing mode. To edit a cell, double-click the desired cell and update the value as required. To delete a record, simply select the record and press the **Delete** toolbar button. Now, all CRUD operations will be executed in batch editing mode. Clicking the **Update** toolbar button will update the newly added, edited, or deleted records from the Orders table using a single API **POST** request. +To perform batch updates, set the edit [Mode](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridEditSettings.html#Syncfusion_Blazor_Grids_GridEditSettings_Mode) to **Batch** in the [GridEditSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridEditSettings.html) component and configure the [BatchUrl](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataManager.html#Syncfusion_Blazor_DataManager_BatchUrl) property in the [SfDataManager](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Data.SfDataManager.html). +In batch mode: + +- Use the **Add** toolbar button to insert new rows. +- Double-click a cell to edit its value. +- Select a row and click **Delete** to remove it. +- Click **Update** to commit all changes (insert, update, delete) in a single request from the Orders table using a single API **POST** request. {% highlight razor %} [HttpPost] @@ -587,23 +700,29 @@ public void Batch([FromBody] CRUDModel Value) } {% endhighlight %} -When you run the application, the resultant Blazor DataGrid component will look like this - ![Blazor DataGrid component bound with Microsoft SQL Server data](../images/blazor-Grid-Ms-SQl-databinding-Gif.gif) -> Find the sample from this [GitHub location](https://github.com/SyncfusionExamples/connecting-databases-to-blazor-datagrid-component/tree/master/Binding%20MS%20SQL%20database%20using%20UrlAdaptor). +> Find the complete implementation in this [GitHub](https://github.com/SyncfusionExamples/connecting-databases-to-blazor-datagrid-component/tree/master/Binding%20MS%20SQL%20database%20using%20UrlAdaptor) repository. ## Binding data from Microsoft SQL Server using CustomAdaptor -This section describes step by step process how to retrieve data from a Microsoft SQL Server using `CustomAdaptor` and bind it to the Blazor DataGrid component. +The Syncfusion® Blazor DataGrid can bind data from a **Microsoft SQL Server** database using a [CustomAdaptor](https://blazor.syncfusion.com/documentation/datagrid/connecting-to-adaptors/custom-adaptor) for scenarios that require full control over data operations. This approach allows implementing custom logic for fetching, updating, and managing data directly within the application without relying on API endpoints. + +**Steps to Configure CustomAdaptor** + +**1: Create the Blazor DataGrid Component** + +Set up the Blazor DataGrid by following the steps outlined in [Connecting Blazor DataGrid to an API service](#connecting-blazor-datagrid-to-an-api-service). -**1.** To create a simple Blazor DataGrid component, the procedure is explained in the above-mentioned topic on [Connecting Blazor DataGrid to an API service](#connecting-blazor-datagrid-to-an-api-service) +**Step 2: Install Required NuGet Package** -> * In this Blazor Web app, set the `rendermode` as either **InteractiveServer** or **InteractiveAuto** as per your configuration. +Install the **System.Data.SqlClient** package to connect to Microsoft SQL Server. -**2.** To connect a Microsoft SQL Server database using the Microsoft SQL driver in your application, you need to install the [System.Data.SqlClient](https://www.nuget.org/packages/System.Data.SqlClient/4.8.6?_src=template) NuGet package. To add **System.Data.SqlClient** in the app, open the NuGet package manager in Visual Studio (Tools → NuGet Package Manager → Manage NuGet Packages for Solution), search and install it. +In Visual Studio, open *Tools → NuGet Package Manager → Manage NuGet Packages* for Solution, search for **System.Data.SqlClient**, and install it. -**3.** If you intend to inject your own service into the `CustomAdaptor` and utilize it, you can achieve this as follows. +**Step 3: Configure the DataGrid with CustomAdaptor** + +Inject a custom service into the `CustomAdaptor` and configure the component as shown below: {% tabs %} {% highlight razor tabtitle="Index.razor" %} @@ -672,13 +791,13 @@ This section describes step by step process how to retrieve data from a Microsof {% endhighlight %} {% endtabs %} -**4.** Within the `CustomAdaptor’s` [ReadAsync](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataAdaptor.html#Syncfusion_Blazor_DataAdaptor_ReadAsync_Syncfusion_Blazor_DataManagerRequest_System_String_) method, fetch the data from the service by calling the `GetOrdersAsync` method. - -* In this `GetOrdersAsync` method, the Microsoft SQL Server database data is fetch by using the **SqlDataAdapter** class. +**Step 4: Implement Data Retrieval Logic** -* Employ the **Fill** method of the **DataAdapter** to populate a **DataSet** with the results of the `Select` command of the **DataAdapter**, followed by conversion of the **DataSet** into a List. +Implement the [ReadAsync](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataAdaptor.html#Syncfusion_Blazor_DataAdaptor_ReadAsync_Syncfusion_Blazor_DataManagerRequest_System_String_) method in `CustomAdaptor` to fetch data from the service by calling **GetOrdersAsync**. -* Finally, return the response as a `Result` and `Count` pair object in the `ReadAsync` method to bind the data to the Blazor DataGrid component. +* Use `SqlDataAdapter` to retrieve data from Microsoft SQL Server. +* Populate a **DataSet** using the **Fill** method and convert it into a List. +* Return the response as a **Result** and **Count** pair in the `ReadAsync` method to bind data to the Blazor DataGrid. {% tabs %} {% highlight razor tabtitle="Index.razor" %} @@ -788,18 +907,37 @@ public class OrderData {% endhighlight %} {% endtabs %} -> * The `DataManagerRequest` encompasses details about the Blazor DataGrid component actions such as searching, filtering, sorting, aggregate, paging and grouping. -> * In the above Blazor DataGrid, [AllowSearching](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridColumn.html#Syncfusion_Blazor_Grids_GridColumn_AllowSearching), [AllowSorting](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_AllowSorting), [AllowFiltering](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_AllowFiltering), [AllowPaging](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_AllowPaging), [AllowGrouping](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_AllowGrouping) and CRUD-related properties have been enabled. The details on how to handle these actions are explained below. +![Blazor DataGrid component bound with Microsoft SQL Server data](../images/blazor-Grid-Ms-SQL-databinding.png) + +### Perform Data Operations in a Custom Adaptor -When the application is executed, the Blazor DataGrid component will appear as depicted below. +The Syncfusion® Blazor DataGrid supports server-side operations such as **searching**, **filtering**, **sorting**, **paging**, and **aggregating** when using a `CustomAdaptor`. These operations are implemented by overriding the [Read](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataAdaptor.html#Syncfusion_Blazor_DataAdaptor_Read_Syncfusion_Blazor_DataManagerRequest_System_String_) or [ReadAsync](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataAdaptor.html#Syncfusion_Blazor_DataAdaptor_ReadAsync_Syncfusion_Blazor_DataManagerRequest_System_String_) method of the [DataAdaptor](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataAdaptor.html) abstract class. -![Blazor DataGrid component bound with Microsoft SQL Server data](../images/blazor-Grid-Ms-SQL-databinding.png) +The [DataManagerRequest](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataManagerRequest.html) object provides the necessary details for each operation, and these can be applied using built-in methods from the [DataOperations](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataOperations.html) and [DataUtil](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Data.DataUtil.html) classes: + +* [PerformSearching](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataOperations.html#Syncfusion_Blazor_DataOperations_PerformSearching__1_System_Collections_Generic_IEnumerable___0__System_Collections_Generic_List_Syncfusion_Blazor_Data_SearchFilter__) – Applies search criteria to the data source based on search filters. + +* [PerformFiltering](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataOperations.html#Syncfusion_Blazor_DataOperations_PerformFiltering__1_System_Collections_Generic_IEnumerable___0__System_Collections_Generic_List_Syncfusion_Blazor_Data_WhereFilter__System_String_) – Filters the data source using conditions specified in the request. + +* [PerformSorting](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataOperations.html#Syncfusion_Blazor_DataOperations_PerformSorting__1_System_Collections_Generic_IEnumerable___0__System_Collections_Generic_List_Syncfusion_Blazor_Data_SortedColumn__) – Sorts the data source according to one or more sort descriptors. + +* [PerformSkip](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataOperations.html#Syncfusion_Blazor_DataOperations_PerformSkip__1_System_Collections_Generic_IEnumerable___0__System_Int32_) – Retrieves a specified number of records for paging. + +* [PerformTake](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataOperations.html#Syncfusion_Blazor_DataOperations_PerformTake__1_System_Collections_Generic_IEnumerable___0__System_Int32_) – Skips a defined number of records before returning results. + +* [PerformAggregation](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Data.DataUtil.html#Syncfusion_Blazor_Data_DataUtil_PerformAggregation_System_Collections_IEnumerable_System_Collections_Generic_List_Syncfusion_Blazor_Data_Aggregate__) – Applies aggregate details to calculate summary values such as Sum, Average, Min, and Max. + +These methods enable efficient server-side data handling in a custom adaptor implementation for **Microsoft SQL Server**. + +N> To enable these operations, install the **Syncfusion.Blazor.Data** package using NuGet Package Manager in Visual Studio: + +(*Tools → NuGet Package Manager → Manage NuGet Packages for Solution*). ### Handling searching operation -When utilizing the `CustomAdaptor`, managing the searching operation involves overriding the [Read](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataAdaptor.html#Syncfusion_Blazor_DataAdaptor_Read_Syncfusion_Blazor_DataManagerRequest_System_String_) or [ReadAsync](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataAdaptor.html#Syncfusion_Blazor_DataAdaptor_ReadAsync_Syncfusion_Blazor_DataManagerRequest_System_String_) method of the [DataAdaptor](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataAdaptor.html) abstract class. +When using `CustomAdaptor`, the searching operation is implemented by overriding the [Read](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataAdaptor.html#Syncfusion_Blazor_DataAdaptor_Read_Syncfusion_Blazor_DataManagerRequest_System_String_) or [ReadAsync](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataAdaptor.html#Syncfusion_Blazor_DataAdaptor_ReadAsync_Syncfusion_Blazor_DataManagerRequest_System_String_) method of the [DataAdaptor](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataAdaptor.html) abstract class. -In the code example below, searching a custom data source can be accomplished by employing the built-in [PerformSearching](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataOperations.html#Syncfusion_Blazor_DataOperations_PerformSearching_System_Collections_IEnumerable_System_Collections_Generic_List_Syncfusion_Blazor_Data_SearchFilter__) method of the [DataOperations](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataOperations.html) class. Alternatively, you can implement your own method for searching operation and bind the resultant data to the Blazor DataGrid component. +The built-in [PerformSearching](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataOperations.html#Syncfusion_Blazor_DataOperations_PerformSearching__1_System_Collections_Generic_IEnumerable___0__System_Collections_Generic_List_Syncfusion_Blazor_Data_SearchFilter__) method of the [DataOperations](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataOperations.html) class applies search criteria from the [DataManagerRequest](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataManagerRequest.html) to the data source. Custom logic can also be implemented to handle searching as required. {% highlight razor %} public class CustomAdaptor : DataAdaptor @@ -824,9 +962,9 @@ public class CustomAdaptor : DataAdaptor ### Handling filtering operation -When employing the `CustomAdaptor`, handling the filtering operation involves overriding the [Read](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataAdaptor.html#Syncfusion_Blazor_DataAdaptor_Read_Syncfusion_Blazor_DataManagerRequest_System_String_) or [ReadAsync](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataAdaptor.html#Syncfusion_Blazor_DataAdaptor_ReadAsync_Syncfusion_Blazor_DataManagerRequest_System_String_) method of the [DataAdaptor](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataAdaptor.html) abstract class. +When implementing `CustomAdaptor`, the filtering operation is managed by overriding the[Read](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataAdaptor.html#Syncfusion_Blazor_DataAdaptor_Read_Syncfusion_Blazor_DataManagerRequest_System_String_) or [ReadAsync](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataAdaptor.html#Syncfusion_Blazor_DataAdaptor_ReadAsync_Syncfusion_Blazor_DataManagerRequest_System_String_) method of the [DataAdaptor](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataAdaptor.html) abstract class. -In the code example below, filtering a custom data source can be achieved by utilizing the built-in [PerformFiltering](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataOperations.html#Syncfusion_Blazor_DataOperations_PerformFiltering__1_System_Collections_Generic_IEnumerable___0__System_Collections_Generic_List_Syncfusion_Blazor_Data_WhereFilter__System_String_) method of the [DataOperations](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataOperations.html) class. Alternatively, you can implement your own method for filtering operation and bind the resulting data to the Blazor DataGrid component. +The built-in [PerformFiltering](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataOperations.html#Syncfusion_Blazor_DataOperations_PerformFiltering__1_System_Collections_Generic_IEnumerable___0__System_Collections_Generic_List_Syncfusion_Blazor_Data_WhereFilter__System_String_) method in the [DataOperations](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataOperations.html) class applies filter criteria from the [DataManagerRequest](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataManagerRequest.html) to the data collection. Custom filtering logic can also be implemented to meet specific requirements. {% highlight razor %} public class CustomAdaptor : DataAdaptor @@ -851,9 +989,9 @@ public class CustomAdaptor : DataAdaptor ### Handling sorting operation -When utilizing the `CustomAdaptor`, managing the sorting operation involves overriding the [Read](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataAdaptor.html#Syncfusion_Blazor_DataAdaptor_Read_Syncfusion_Blazor_DataManagerRequest_System_String_) or [ReadAsync](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataAdaptor.html#Syncfusion_Blazor_DataAdaptor_ReadAsync_Syncfusion_Blazor_DataManagerRequest_System_String_) method of the [DataAdaptor](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataAdaptor.html) abstract class. +When implementing `CustomAdaptor`, the sorting operation is handled by overriding the [Read](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataAdaptor.html#Syncfusion_Blazor_DataAdaptor_Read_Syncfusion_Blazor_DataManagerRequest_System_String_) or [ReadAsync](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataAdaptor.html#Syncfusion_Blazor_DataAdaptor_ReadAsync_Syncfusion_Blazor_DataManagerRequest_System_String_) method of the [DataAdaptor](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataAdaptor.html) abstract class. -In the code example below, sorting a custom data source can be accomplished by employing the built-in [PerformSorting](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataOperations.html#Syncfusion_Blazor_DataOperations_PerformSorting__1_System_Collections_Generic_IEnumerable___0__System_Collections_Generic_List_Syncfusion_Blazor_Data_Sort__) method of the [DataOperations](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataOperations.html) class. Alternatively, you can implement your own method for sorting operation and bind the resulting data to the Blazor DataGrid component. +The built-in [PerformSorting](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataOperations.html#Syncfusion_Blazor_DataOperations_PerformSorting__1_System_Collections_Generic_IEnumerable___0__System_Collections_Generic_List_Syncfusion_Blazor_Data_Sort__) method in the [DataOperations](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataOperations.html) class applies sort criteria from the [DataManagerRequest](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataManagerRequest.html) to the data collection. Custom sorting logic can also be implemented to meet specific requirements. {% highlight razor %} public class CustomAdaptor : DataAdaptor @@ -878,9 +1016,9 @@ public class CustomAdaptor : DataAdaptor ### Handling aggregate operation -When employing `CustomAdaptor`, the aggregate operation must be managed within the [Read](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataAdaptor.html#Syncfusion_Blazor_DataAdaptor_Read_Syncfusion_Blazor_DataManagerRequest_System_String_) or [ReadAsync](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataAdaptor.html#Syncfusion_Blazor_DataAdaptor_ReadAsync_Syncfusion_Blazor_DataManagerRequest_System_String_) method of the `CustomAdaptor`. +When implementing `CustomAdaptor`, aggregate operations are managed by overriding the [Read](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataAdaptor.html#Syncfusion_Blazor_DataAdaptor_Read_Syncfusion_Blazor_DataManagerRequest_System_String_) or [ReadAsync](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataAdaptor.html#Syncfusion_Blazor_DataAdaptor_ReadAsync_Syncfusion_Blazor_DataManagerRequest_System_String_) method of the [DataAdaptor](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataAdaptor-1.html) abstract class. -The provided sample code illustrated how to implement the aggregate operation within `CustomAdaptor`, +The built-in [PerformAggregation](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Data.DataUtil.html#Syncfusion_Blazor_Data_DataUtil_PerformAggregation_System_Collections_IEnumerable_System_Collections_Generic_List_Syncfusion_Blazor_Data_Aggregate__) method in the [DataUtil](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Data.DataUtil.html) class calculates aggregate values based on the criteria specified in the [DataManagerRequest](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataManagerRequest.html). Custom aggregation logic can also be implemented when specific requirements exist. {% highlight razor %} public class CustomAdaptor : DataAdaptor @@ -903,13 +1041,13 @@ public class CustomAdaptor : DataAdaptor } {% endhighlight %} -> The server-side management of the `PerformAggregation` method is necessary only for the [Footer Template](https://blazor.syncfusion.com/documentation/datagrid/footer-aggregate) aggregation. There is no need for explicit handling of the Aggregate operation for the [Group Footer template](https://blazor.syncfusion.com/documentation/datagrid/group-and-caption-aggregate#group-footer-aggregates) and [Group Caption template](https://blazor.syncfusion.com/documentation/datagrid/group-and-caption-aggregate#group-caption-aggregates). +> The server-side implementation of the `PerformAggregation` method is required only for [Footer aggregates](https://blazor.syncfusion.com/documentation/datagrid/footer-aggregate). Explicit handling is not necessary for[ Group Footer aggregates](https://blazor.syncfusion.com/documentation/datagrid/group-and-caption-aggregate#group-footer-aggregates) or [Group Caption aggregates](https://blazor.syncfusion.com/documentation/datagrid/group-and-caption-aggregate#group-caption-aggregates). ### Handling paging operation -When employing the `CustomAdaptor`, handling paging operation involves overriding the [Read](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataAdaptor.html#Syncfusion_Blazor_DataAdaptor_Read_Syncfusion_Blazor_DataManagerRequest_System_String_) or [ReadAsync](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataAdaptor.html#Syncfusion_Blazor_DataAdaptor_ReadAsync_Syncfusion_Blazor_DataManagerRequest_System_String_) method of the [DataAdaptor](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataAdaptor.html) abstract class. +When implementing `CustomAdaptor`, paging is managed by overriding the [Read](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataAdaptor.html#Syncfusion_Blazor_DataAdaptor_Read_Syncfusion_Blazor_DataManagerRequest_System_String_) or [ReadAsync](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataAdaptor.html#Syncfusion_Blazor_DataAdaptor_ReadAsync_Syncfusion_Blazor_DataManagerRequest_System_String_) method of the [DataAdaptor](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataAdaptor.html) abstract class. -In the code example below, paging a custom data source can be achieved by utilizing the built-in [PerformTake](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataOperations.html#Syncfusion_Blazor_DataOperations_PerformTake_System_Collections_IEnumerable_System_Int32_) and [PerformSkip](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataOperations.html#Syncfusion_Blazor_DataOperations_PerformSkip__1_System_Collections_Generic_IEnumerable___0__System_Int32_) method of the [DataOperations](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataOperations.html) class. Alternatively, you can use your own method for paging operation and bind the resulting data to the Blazor DataGrid component. +The built-in [PerformSkip](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataOperations.html#Syncfusion_Blazor_DataOperations_PerformSkip__1_System_Collections_Generic_IEnumerable___0__System_Int32_) and [PerformTake](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataOperations.html#Syncfusion_Blazor_DataOperations_PerformTake__1_System_Collections_Generic_IEnumerable___0__System_Int32_) methods in the [DataOperations](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataOperations.html) class apply paging criteria from the [DataManagerRequest](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataManagerRequest.html) to the data collection. Custom paging logic can also be implemented when specific requirements exist. {% highlight razor %} public class CustomAdaptor : DataAdaptor @@ -940,9 +1078,9 @@ public class CustomAdaptor : DataAdaptor ### Handling grouping operation -When employing `CustomAdaptor`, the grouping operation must be managed within the [Read](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataAdaptor.html#Syncfusion_Blazor_DataAdaptor_Read_Syncfusion_Blazor_DataManagerRequest_System_String_) or [ReadAsync](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataAdaptor.html#Syncfusion_Blazor_DataAdaptor_ReadAsync_Syncfusion_Blazor_DataManagerRequest_System_String_) method of the `CustomAdaptor`. +When implementing `CustomAdaptor`, grouping is managed by overriding the [Read](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataAdaptor.html#Syncfusion_Blazor_DataAdaptor_Read_Syncfusion_Blazor_DataManagerRequest_System_String_) or [ReadAsync](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataAdaptor.html#Syncfusion_Blazor_DataAdaptor_ReadAsync_Syncfusion_Blazor_DataManagerRequest_System_String_) method of the [DataAdaptor](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataAdaptor.html) abstract class. -In the code example below, grouping a custom data source can be achieved by utilizing the [Group](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Data.DataUtil.html#Syncfusion_Blazor_Data_DataUtil_Group__1_System_Collections_IEnumerable_System_String_System_Collections_Generic_List_Syncfusion_Blazor_Data_Aggregate__System_Int32_System_Collections_Generic_IDictionary_System_String_System_String__System_Boolean_System_Boolean_) method from the [DataUtil](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Data.DataUtil.html) class. Alternatively, you can use your own method for grouping operation and bind the resulting data to the Blazor DataGrid component. +The built-in [Group](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Data.DataUtil.html#Syncfusion_Blazor_Data_DataUtil_Group__1_System_Collections_IEnumerable_System_String_System_Collections_Generic_List_Syncfusion_Blazor_Data_Aggregate__System_Int32_System_Collections_Generic_IDictionary_System_String_System_String__System_Boolean_System_Boolean_) method in the [DataUtil](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Data.DataUtil.html) class applies grouping logic based on the configuration in the [DataManagerRequest](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataManagerRequest.html). Custom grouping logic can also be implemented when specific requirements exist. {% highlight razor %} public class CustomAdaptor : DataAdaptor @@ -973,9 +1111,6 @@ public class CustomAdaptor : DataAdaptor } {% endhighlight %} -> * For optimal performance, it is recommended to follow this sequence of operations(Searching, Filtering, Sorting, Aggregate, Paging and Grouping) in the `ReadAsync` method. -> * If both grouping and aggregate operations are enabled, the code provided below demonstrates how to implement these operations within the `CustomAdaptor`. - ```cshtml public class CustomAdaptor : DataAdaptor { @@ -1014,11 +1149,20 @@ public class CustomAdaptor : DataAdaptor } ``` +N> **Best Practice**: For optimal performance, apply operations in the following sequence: **Searching → Filtering → Sorting → Aggregation → Paging → Grouping** in [ReadAsync](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataAdaptor.html#Syncfusion_Blazor_DataAdaptor_ReadAsync_Syncfusion_Blazor_DataManagerRequest_System_String_) method. + ### Handling CRUD operations -To enable editing in the Blazor DataGrid component, utilize the [GridEditSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridEditSettings.html) component. The Blazor DataGrid component offers multiple edit modes including the Inline/Normal, Dialog and Batch editing. For more details, refer to the Blazor DataGrid component [editing](https://blazor.syncfusion.com/documentation/datagrid/editing) documentation. +The Syncfusion® Blazor DataGrid component supports Create, Read, Update, and Delete (CRUD) operations through the [GridEditSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridEditSettings.html) configuration. Multiple edit modes are available, including **Inline**, **Dialog**, and **Batch** editing. For details, refer to the [Editing](https://blazor.syncfusion.com/documentation/datagrid/editing) documentation. -In this scenario, the inline edit `Mode` and [Toolbar](https://blazor.syncfusion.com/documentation/datagrid/tool-bar) property configured to display toolbar items for editing purpose. +When using `CustomAdaptor`, CRUD operations are implemented by overriding the following methods of the [DataAdaptor](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataAdaptor-1.html) class: + +* [Insert](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataAdaptor.html#Syncfusion_Blazor_DataAdaptor_Insert_Syncfusion_Blazor_DataManager_System_Object_System_String_) / [InsertAsync](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataAdaptor.html#Syncfusion_Blazor_DataAdaptor_InsertAsync_Syncfusion_Blazor_DataManager_System_Object_System_String_) – Handles record insertion. +* [Update](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataAdaptor.html#Syncfusion_Blazor_DataAdaptor_Update_Syncfusion_Blazor_DataManager_System_Object_System_String_System_String_) / [UpdateAsync](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataAdaptor.html#Syncfusion_Blazor_DataAdaptor_UpdateAsync_Syncfusion_Blazor_DataManager_System_Object_System_String_System_String_) – Handles record updates. +* [Remove](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataAdaptor.html#Syncfusion_Blazor_DataAdaptor_Remove_Syncfusion_Blazor_DataManager_System_Object_System_String_System_String_) / [RemoveAsync](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataAdaptor.html#Syncfusion_Blazor_DataAdaptor_RemoveAsync_Syncfusion_Blazor_DataManager_System_Object_System_String_System_String_) – Handles record deletion. +* [BatchUpdate](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataAdaptor.html#Syncfusion_Blazor_DataAdaptor_BatchUpdate_Syncfusion_Blazor_DataManager_System_Object_System_Object_System_Object_System_String_System_String_System_Nullable_System_Int32__) / [BatchUpdateAsync](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataAdaptor.html#Syncfusion_Blazor_DataAdaptor_BatchUpdateAsync_Syncfusion_Blazor_DataManager_System_Object_System_Object_System_Object_System_String_System_String_System_Nullable_System_Int32__) – Handles batch operations (insert, update, delete). + +Each method can be customized to execute SQL commands against the **Microsoft SQL Server** database. {% highlight razor %} @@ -1034,21 +1178,13 @@ In this scenario, the inline edit `Mode` and [Toolbar](https://blazor.syncfusion {% endhighlight %} -> * Normal/Inline editing is the default edit [Mode](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridEditSettings.html#Syncfusion_Blazor_Grids_GridEditSettings_Mode) for the Blazor DataGrid component. To enable CRUD operations, ensure that the [IsPrimaryKey](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridColumn.html#Syncfusion_Blazor_Grids_GridColumn_IsPrimaryKey) property is set to **true** for a specific `GridColumn`, ensuring that its value is unique. -> * If database has an Autogenerated column, ensure to define [IsIdentity](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridColumn.html#Syncfusion_Blazor_Grids_GridColumn_IsIdentity) property of `GridColumn` to disable them during adding or editing operations. - -The CRUD operations can be performed and customized on our own by overriding the following CRUD methods of the [DataAdaptor](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataAdaptor.html) abstract class. - -* Insert/InsertAsync -* Remove/RemoveAsync -* Update/UpdateAsync -* BatchUpdate/BatchUpdateAsync - -Let’s see how to perform CRUD operation using Microsoft SQL Server data with Syncfusion® Blazor DataGrid component. +> * Normal(Inline) editing is the default [Mode](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridEditSettings.html#Syncfusion_Blazor_Grids_GridEditSettings_Mode) for the Blazor DataGrid component. +> * To enable CRUD operations, set the [IsPrimaryKey](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridColumn.html#Syncfusion_Blazor_Grids_GridColumn_IsPrimaryKey) property to **true** for a column that contains unique values. +> * If the database includes an auto-generated column, set the [IsIdentity](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridColumn.html#Syncfusion_Blazor_Grids_GridColumn_IsIdentity) property for that column to disable editing during **add** or **update** operations. **Insert Operation:** -To execute the insert operation, you will need to override the [Insert](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataAdaptor.html#Syncfusion_Blazor_DataAdaptor_Insert_Syncfusion_Blazor_DataManager_System_Object_System_String_) or [InsertAsync](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataAdaptor.html#Syncfusion_Blazor_DataAdaptor_InsertAsync_Syncfusion_Blazor_DataManager_System_Object_System_String_) method of the `CustomAdaptor`. Then, integrate the following code snippet into the `CustomAdaptor` class. The below code snippet demonstrated how to handle the insertion of new records within the `InsertAsync` method of `CustomAdaptor` component. Modify the logic within this method according to the requirements of your application. +To implement record insertion, override the [Insert](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataAdaptor.html#Syncfusion_Blazor_DataAdaptor_Insert_Syncfusion_Blazor_DataManager_System_Object_System_String_) or [InsertAsync](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataAdaptor.html#Syncfusion_Blazor_DataAdaptor_InsertAsync_Syncfusion_Blazor_DataManager_System_Object_System_String_) method in the `CustomAdaptor` class. {% tabs %} {% highlight razor tabtitle="Index.razor" %} @@ -1085,7 +1221,7 @@ public override async Task InsertAsync(DataManager DataManager, object V **Update Operation:** -To execute the update operation, override the [Update](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataAdaptor.html#Syncfusion_Blazor_DataAdaptor_Update_Syncfusion_Blazor_DataManager_System_Object_System_String_System_String_) or [UpdateAsync](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataAdaptor.html#Syncfusion_Blazor_DataAdaptor_UpdateAsync_Syncfusion_Blazor_DataManager_System_Object_System_String_System_String_) method of the `CustomAdaptor`. Then, integrate the following code snippet into the `CustomAdaptor` class. The below code snippet demonstrated how to handle the updating of existing records within the `UpdateAsync` method of the `CustomAdaptor` component. Modify the logic within this method according to the requirements of your application. +To implement record updates, override the [Update](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataAdaptor.html#Syncfusion_Blazor_DataAdaptor_Update_Syncfusion_Blazor_DataManager_System_Object_System_String_System_String_) or [UpdateAsync](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataAdaptor.html#Syncfusion_Blazor_DataAdaptor_UpdateAsync_Syncfusion_Blazor_DataManager_System_Object_System_String_System_String_) method in the `CustomAdaptor` class. {% tabs %} {% highlight razor tabtitle="Index.razor" %} @@ -1123,7 +1259,7 @@ public async Task UpdateOrderAsync(Order Value) **Delete Operation:** -To perform the delete operation, you need to override the [Remove](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataAdaptor.html#Syncfusion_Blazor_DataAdaptor_Remove_Syncfusion_Blazor_DataManager_System_Object_System_String_System_String_) or [RemoveAsync](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataAdaptor.html#Syncfusion_Blazor_DataAdaptor_RemoveAsync_Syncfusion_Blazor_DataManager_System_Object_System_String_System_String_) method of the `CustomAdaptor`. Below is the code snippet that you can add to `CustomAdaptor` class. The below code snippet demonstrated how to handle the deletion of existing records within the `RemoveAsync` method of `CustomAdaptor` component. Modify the logic within this method according to the requirements of your application. +To perform record deletion, override the [Remove](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataAdaptor.html#Syncfusion_Blazor_DataAdaptor_Remove_Syncfusion_Blazor_DataManager_System_Object_System_String_System_String_) or [RemoveAsync](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataAdaptor.html#Syncfusion_Blazor_DataAdaptor_RemoveAsync_Syncfusion_Blazor_DataManager_System_Object_System_String_System_String_) method in the `CustomAdaptor` class. {% tabs %} {% highlight razor tabtitle="Index.razor" %} @@ -1161,7 +1297,7 @@ public async Task RemoveOrderAsync(int? Key) **Batch Operation:** -To perform the batch operation, override the [BatchUpdate](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataAdaptor.html#Syncfusion_Blazor_DataAdaptor_BatchUpdate_Syncfusion_Blazor_DataManager_System_Object_System_Object_System_Object_System_String_System_String_System_Nullable_System_Int32__) or [BatchUpdateAsync](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataAdaptor.html#Syncfusion_Blazor_DataAdaptor_BatchUpdateAsync_Syncfusion_Blazor_DataManager_System_Object_System_Object_System_Object_System_String_System_String_System_Nullable_System_Int32__) method of the `CustomAdaptor` and add the following code in the `CustomAdaptor`. The below code snippet demonstrated how to handle the batch update request within the `BatchUpdateAsync` method of `CustomAdaptor` component. Modify the logic within this method according to the requirements of your application. +To implement batch updates such as insert, update, and delete in a single request, override the [BatchUpdate](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataAdaptor.html#Syncfusion_Blazor_DataAdaptor_BatchUpdate_Syncfusion_Blazor_DataManager_System_Object_System_Object_System_Object_System_String_System_String_System_Nullable_System_Int32__) or [BatchUpdateAsync](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataAdaptor.html#Syncfusion_Blazor_DataAdaptor_BatchUpdateAsync_Syncfusion_Blazor_DataManager_System_Object_System_Object_System_Object_System_String_System_String_System_Nullable_System_Int32__) method in the `CustomAdaptor` class. {% highlight razor %} /// @@ -1204,4 +1340,4 @@ public override async Task BatchUpdateAsync(DataManager DataManager, obj ![Blazor DataGrid component bound with Microsoft SQL Server data](../images/blazor-Grid-Ms-SQl-databinding-Gif.gif) -> You can find the sample in this [GitHub location](https://github.com/SyncfusionExamples/connecting-databases-to-blazor-datagrid-component/tree/master/Binding%20MS%20SQL%20database%20using%20CustomAdaptor). +> A complete sample implementation is available in the [GitHub](https://github.com/SyncfusionExamples/connecting-databases-to-blazor-datagrid-component/tree/master/Binding%20MS%20SQL%20database%20using%20CustomAdaptor) repository. diff --git a/blazor/datagrid/connecting-to-database/mysql-server.md b/blazor/datagrid/connecting-to-database/mysql-server.md index 6e9fb2a651..37b69e6345 100644 --- a/blazor/datagrid/connecting-to-database/mysql-server.md +++ b/blazor/datagrid/connecting-to-database/mysql-server.md @@ -9,17 +9,19 @@ documentation: ug # Connecting MySQL Server data in to Blazor DataGrid Component -This section describes how to connect and retrieve data from a MySQL Server database using [MySQL data](https://www.nuget.org/packages/MySql.Data) and bind it to the Blazor DataGrid component. +The Syncfusion® Blazor DataGrid component supports binding data from a MySQL Server database using multiple approaches. Common methods include: -MySQL Server database can be bound to the Blazor DataGrid component in different ways (i.e.) using [DataSource](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_DataSource) property, [CustomAdaptor](https://blazor.syncfusion.com/documentation/datagrid/custom-binding) feature and remote data binding using various adaptors. In this documentation, two approaches will be examined to connect a MySQL Server database to a Blazor DataGrid component. Both the approaches have capability to handle data and CRUD operations with built-in methods as well as can be customized as per your own. +- Using the [DataSource](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_DataSource) property for local binding. +- Implementing a [CustomAdaptor](https://blazor.syncfusion.com/documentation/datagrid/connecting-to-adaptors/custom-adaptor) for custom logic. +- Configuring remote data binding through adaptors such as [UrlAdaptor](https://blazor.syncfusion.com/documentation/data/adaptors#url-adaptor). -* **Using UrlAdaptor** +* **Remote Data Binding using UrlAdaptor** -The [UrlAdaptor](https://blazor.syncfusion.com/documentation/data/adaptors#url-adaptor) serves as the base adaptor for facilitating communication between remote data services and an UI component. It enables the remote binding of data to the Blazor DataGrid component by connecting to an existing pre-configured API service linked to the MySQL Server database. While the Blazor DataGrid component supports various adaptors to fulfill this requirement, including [Web API](https://blazor.syncfusion.com/documentation/data/adaptors#web-api-adaptor), [OData](https://blazor.syncfusion.com/documentation/data/adaptors#odata-adaptor), [ODataV4](https://blazor.syncfusion.com/documentation/data/adaptors#odatav4-adaptor), [Url](https://blazor.syncfusion.com/documentation/data/adaptors#url-adaptor), and [GraphQL](https://blazor.syncfusion.com/documentation/data/adaptors#graphql-service-binding), the `UrlAdaptor` is particularly useful for the scenarios where a custom API service with unique logic for handling data and CRUD operations is in place. This approach allows for custom handling of data and CRUD operations, and the resultant data returned in the `result` and `count` format for display in the Blazor DataGrid component. +The [UrlAdaptor](https://blazor.syncfusion.com/documentation/data/adaptors#url-adaptor) enables communication between the DataGrid and a remote API service connected to **MySQL** Server. This approach is suitable when the API implements custom logic for data operations and returns results in the **result** and **count** format. -* **Using CustomAdaptor** +* **Custom Data Binding using CustomAdaptor** -The [CustomAdaptor](https://blazor.syncfusion.com/documentation/datagrid/custom-binding) serves as a mediator between the UI component and the database for data binding. While the data source from the database can be directly bound to the `SfGrid` component locally using the [DataSource](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_DataSource) property, the `CustomAdaptor` approach is preferred as it allows for customization of both data operations and CRUD operations according to specific requirements. In this approach, for every action in the Blazor DataGrid component, a corresponding request with action details is sent to the `CustomAdaptor`. The Blazor DataGrid component provides predefined methods to perform data operations such as **searching**, **filtering**, **sorting**, **aggregation**, **paging** and **grouping**. Alternatively, your own custom methods can be employed to execute operations and return the data in the `Result` and `Count` format of the `DataResult` class for displaying in the Blazor DataGrid component. Additionally, for CRUD operations, predefined methods can be overridden to provide custom functionality. Further details on this can be found in the latter part of the documentation. +The [CustomAdaptor](https://blazor.syncfusion.com/documentation/datagrid/connecting-to-adaptors/custom-adaptor) provides full control over data operations and CRUD functionality. It allows implementing custom logic for **searching**, **filtering**, **sorting**, **paging**, and **grouping** directly in the server-side code. ## Binding data from MySQL Server using an API service @@ -27,16 +29,26 @@ This section describes step by step process how to retrieve data from a MySQL Se ### Creating an API service -**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). +1. **Create an ASP.NET Core Web API Project** -**2.** To connect a MySQL Server database using the MySQL driver in your application, you need to install the [MySQL.Data](https://www.nuget.org/packages/MySql.Data) NuGet package. To add **MySQL.Data** in the app, open the NuGet package manager in Visual Studio (Tools → NuGet Package Manager → Manage NuGet Packages for Solution), search and install it. +In Visual Studio, create a new **ASP.NET Core Web API** project named **MyWebService**. -**3.** Create an API controller (aka, GridController.cs) file under **Controllers** folder that helps to establish data communication with the Blazor DataGrid component. +Refer to [Microsoft documentation](https://learn.microsoft.com/en-us/visualstudio/get-started/csharp/tutorial-aspnet-core?view=vs-2022) for detailed steps. -**4.** In an API controller (aka, GridController), connect to MySQL Server. In the **Get()** method **MySqlConnection** helps to connect the MySQL Server database. Next, using **MySqlCommand** and **MySqlDataAdapter** you can process the desired MySQL query string and retrieve data from the database. The **Fill** method of the **DataAdapter** is used to populate the MySQL data into a **DataTable** as shown in the following code snippet. +2. **Install SQL Client Package** + +Add the [MySQL.Data](https://www.nuget.org/packages/MySql.Data) NuGet package to the project using NuGet Package Manager (*Tools → NuGet Package Manager → Manage NuGet Packages for Solution*). + +3. **Add API Controller** + +Create a controller named **GridController.cs** under the Controllers folder. + +4. **Fetch Data from SQL Server** + +Use **SqlConnection** and **SqlDataAdapter** to retrieve data and convert it into a collection of Order objects: {% tabs %} -{% highlight razor tabtitle="GridController.cs"%} +{% highlight razor tabtitle="GridController.cs" %} using Microsoft.AspNetCore.Mvc; using MySql.Data.MySqlClient; using System.Data; @@ -95,91 +107,81 @@ namespace MyWebService.Controllers {% endhighlight %} {% endtabs %} -**5.** Run the application and it will be hosted within the URL `https://localhost:xxxx`. +5. **Run and test the application** -**6.** Finally, the retrieved data from MySQL Server database which is in the form of list of array can be found in an API controller available in the URL link `https://localhost:xxxx/api/Grid`, as shown in the browser page below. +Start the API and access **https://localhost:xxxx/api/Grid** to view the data. ![Hosted API URL](../images/Ms-Sql-data.png) ### Connecting Blazor DataGrid to an API service -**1.** Create a simple Blazor DataGrid component by following steps. This section briefly explains about how to include [Blazor DataGrid](https://www.syncfusion.com/blazor-components/blazor-datagrid) component in your Blazor Web App using [Visual Studio](https://visualstudio.microsoft.com/vs/). +This section explains how to retrieve data from a **MySQL** Server database using `UrlAdaptor` and bind it to the Syncfusion® Blazor DataGrid component. **Prerequisites** * [System requirements for Blazor components](https://blazor.syncfusion.com/documentation/system-requirements) -**Create a new Blazor Web App** +1. **Create a Blazor Web App** -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). +Create a **Blazor Web App** using Visual Studio 2022. Use [Microsoft Templates](https://learn.microsoft.com/en-us/aspnet/core/blazor/tooling?view=aspnetcore-9.0&pivots=vs) or the Syncfusion® Blazor Extension. -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. +> Configure the [Interactive render mode](https://learn.microsoft.com/en-us/aspnet/core/blazor/components/render-modes?view=aspnetcore-9.0#render-modes) and [Interactivity location](https://learn.microsoft.com/en-us/aspnet/core/blazor/tooling?view=aspnetcore-9.0&pivots=vs) during project creation. -**Install Syncfusion® Blazor Grid and Themes NuGet in the Blazor Web App** +2. **Install Syncfusion Packages** -To add **Blazor DataGrid** 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.Grid](https://www.nuget.org/packages/Syncfusion.Blazor.Grid/) and [Syncfusion.Blazor.Themes](https://www.nuget.org/packages/Syncfusion.Blazor.Themes/). +* Open the NuGet Package Manager in Visual Studio (*Tools → NuGet Package Manager → Manage NuGet Packages for Solution*). Search and install the following packages: -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. + - [Syncfusion.Blazor.Grid](https://www.nuget.org/packages/Syncfusion.Blazor.Grid/) + - [Syncfusion.Blazor.Themes](https://www.nuget.org/packages/Syncfusion.Blazor.Themes/) -Alternatively, you can utilize the following package manager command to achieve the same. - -{% tabs %} -{% highlight C# tabtitle="Package Manager" %} +* Alternatively, use the Package Manager Console: +```powershell Install-Package Syncfusion.Blazor.Grid -Version {{ site.releaseversion }} Install-Package Syncfusion.Blazor.Themes -Version {{ site.releaseversion }} +``` -{% endhighlight %} -{% endtabs %} +> When using **WebAssembly** or **Auto** render modes in a Blazor Web App, install Syncfusion® Blazor component NuGet packages within the client project. -> 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. +> Syncfusion® Blazor components are available on [nuget.org](https://www.nuget.org/packages?q=syncfusion.blazor). Refer to the [NuGet packages](https://blazor.syncfusion.com/documentation/nuget-packages) topic for a complete list of available packages. -**Register Syncfusion® Blazor Service** +3. **Register Syncfusion Blazor service** -Open **~/_Imports.razor** file and import the `Syncfusion.Blazor` and `Syncfusion.Blazor.Grids` namespace. +- Add the required namespaces in **~/_Imports.razor**: ```cshtml - @using Syncfusion.Blazor @using Syncfusion.Blazor.Grids ``` -Now, register the Syncfusion® Blazor Service in the **~/Program.cs** file of your Blazor Web App. For a app with `WebAssembly` or `Auto (Server and WebAssembly)` interactive render mode, register the Syncfusion® Blazor service in both **~/Program.cs** files of your web app. +- For apps using **WebAssembly** or **Auto** (Server and WebAssembly) render modes, register the service in both **~/Program.cs** files. ```cshtml - -.... using Syncfusion.Blazor; -.... -builder.Services.AddSyncfusionBlazor(); -.... +builder.Services.AddSyncfusionBlazor(); ``` -**Add stylesheet and script resources** +4. **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: +Access the theme stylesheet and script from NuGet using [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 **~/Components/App.razor**: ```html - .... -.... + - .... ``` -> * 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. -> * In this Blazor Web app, set the `rendermode` as either **InteractiveServer** or **InteractiveAuto** as per your configuration. - -**2.** Map the hosted API's URL link `https://localhost:xxxx/api/Grid` to the Blazor DataGrid component in **Index.razor** by using the [Url](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataManager.html#Syncfusion_Blazor_DataManager_Url) property of [SfDataManager](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Data.SfDataManager.html). To interact with remote data source, provide the endpoint `Url`. +> * Refer to [Blazor Themes](https://blazor.syncfusion.com/documentation/appearance/themes) for additional methods such as [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). +> * Set the render mode to **InteractiveServer** or **InteractiveAuto** in the Blazor Web App configuration. -**3.** The `SfDataManager` offers multiple adaptor options to connect with remote database based on an API service. Below is an example of the [UrlAdaptor](https://blazor.syncfusion.com/documentation/data/adaptors#url-adaptor) configuration where an API service are set up to return the resulting data in the `result` and `count` format. +5. **Configure DataGrid with UrlAdaptor** -**4.** The `UrlAdaptor` acts as the base adaptor for interacting with remote data service. Most of the built-in adaptors are derived from the `UrlAdaptor`. +The [SfDataManager](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Data.SfDataManager.html) component supports multiple adaptors for remote data binding. For API services, set the [Adaptor](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Adaptors.html) property to [Adaptors.UrlAdaptor](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Adaptors.html#Syncfusion_Blazor_Adaptors_UrlAdaptor) and specify the service endpoint in the [Url](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataManager.html#Syncfusion_Blazor_DataManager_Url) property. {% tabs %} {% highlight razor tabtitle="Index.razor"%} @@ -263,18 +265,25 @@ public class GridController : ControllerBase {% endhighlight %} {% endtabs %} -> In the above Blazor DataGrid component, [AllowSearching](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridColumn.html#Syncfusion_Blazor_Grids_GridColumn_AllowSearching), [AllowSorting](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_AllowSorting), [AllowFiltering](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_AllowFiltering), [AllowPaging](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_AllowPaging), [AllowGrouping](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_AllowGrouping) and CRUD-related properties have been enabled. The details on how to handle these actions are explained below. +### Handling data operations in UrlAdaptor -When you run the application, the resultant Blazor DataGrid component will look like this +The Syncfusion® Blazor DataGrid supports server-side operations such as **searching**, **sorting**, **filtering**, **aggregating**, and **paging** when using the [UrlAdaptor](https://blazor.syncfusion.com/documentation/data/adaptors#url-adaptor). -![Blazor DataGrid component bound with MySQL Server data](../images/blazor-Grid-Ms-SQL-databinding.png) +The [DataManagerRequest](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataManagerRequest.html) object provides details for each operation, and these can be applied using built-in methods from the [DataOperations](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataOperations.html) class: -> * The Syncfusion® Blazor DataGrid component provides built-in support for handling various data operations such as **searching**, **sorting**, **filtering**, **aggregate** and **paging** on the server-side. These operations can be handled using methods such as `PerformSearching`, `PerformFiltering`, `PerformSorting`, `PerformAggregation`, `PerformTake` and `PerformSkip` available in the **Syncfusion.Blazor.Data** package. Let's explore how to manage these data operations using the `UrlAdaptor`. -> * In an API service project, add **Syncfusion.Blazor.Data** by opening the NuGet package manager in Visual Studio (Tools → NuGet Package Manager → Manage NuGet Packages for Solution), search and install it. +* [PerformSearching](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataOperations.html#Syncfusion_Blazor_DataOperations_PerformSearching__1_System_Linq_IQueryable___0__System_Collections_Generic_List_Syncfusion_Blazor_Data_SearchFilter__) -Applies search criteria to the data source based on search filters. +* [PerformFiltering](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataOperations.html#Syncfusion_Blazor_DataOperations_PerformFiltering__1_System_Linq_IQueryable___0__System_Collections_Generic_List_Syncfusion_Blazor_Data_WhereFilter__System_String_) - Filters the data source using conditions specified in the request. +* [PerformSorting](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataOperations.html#Syncfusion_Blazor_DataOperations_PerformSorting__1_System_Linq_IQueryable___0__System_Collections_Generic_List_Syncfusion_Blazor_Data_Sort__) - Sorts the data source according to one or more sort descriptors. +* [PerformTake](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataOperations.html#Syncfusion_Blazor_DataOperations_PerformTake__1_System_Linq_IQueryable___0__System_Int32_) - Retrieves a specified number of records for paging. +* [PerformSkip](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataOperations.html#Syncfusion_Blazor_DataOperations_PerformSkip__1_System_Linq_IQueryable___0__System_Int32_) - Skips a defined number of records before returning results. + +These methods enable efficient handling of large datasets by performing operations on the server side. The following sections demonstrate how to manage these operations using the `UrlAdaptor`. + +> * To enable these operations, add the **Syncfusion.Blazor.Data** package to the API service project using NuGet Package Manager in Visual Studio (*Tools → NuGet Package Manager → Manage NuGet Packages for Solution*). ### Handling searching operation -To handle searching operation, ensure that your API endpoint supports custom searching criteria. Implement the searching logic on the server-side using the [PerformSearching](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataOperations.html#Syncfusion_Blazor_DataOperations_PerformSearching__1_System_Collections_Generic_IEnumerable___0__System_Collections_Generic_List_Syncfusion_Blazor_Data_SearchFilter__) method from the [DataOperations](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataOperations.html) class. This allows the custom data source to undergo searching based on the criteria specified in the incoming [DataManagerRequest](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataManagerRequest.html) object. +Enable server-side searching by implementing logic in the API controller with the [PerformSearching](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataOperations.html#Syncfusion_Blazor_DataOperations_PerformSearching__1_System_Collections_Generic_IEnumerable___0__System_Collections_Generic_List_Syncfusion_Blazor_Data_SearchFilter__) method from the [DataOperations](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataOperations.html) class. This method applies search criteria to the collection based on filters specified in the incoming [DataManagerRequest](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataManagerRequest.html). {% highlight razor %} @@ -297,7 +306,7 @@ public object Post([FromBody] DataManagerRequest DataManagerRequest) ### Handling filtering operation -To handle filtering operation, ensure that your API endpoint supports custom filtering criteria. Implement the filtering logic on the server-side using the [PerformFiltering](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataOperations.html#Syncfusion_Blazor_DataOperations_PerformFiltering_System_Collections_IEnumerable_System_Collections_Generic_List_Syncfusion_Blazor_Data_WhereFilter__System_String_) method from the [DataOperations](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataOperations.html) class. This allows the custom data source to undergo filtering based on the criteria specified in the incoming [DataManagerRequest](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataManagerRequest.html) object. +Enable server-side filtering by implementing logic in the API controller using the [PerformFiltering](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataOperations.html#Syncfusion_Blazor_DataOperations_PerformFiltering__1_System_Collections_Generic_IEnumerable___0__System_Collections_Generic_List_Syncfusion_Blazor_Data_WhereFilter__System_String_) method from the [DataOperations](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataOperations.html) class. This method applies filter conditions to the collection based on the criteria specified in the incoming [DataManagerRequest](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataManagerRequest.html). {% highlight razor %} [HttpPost] @@ -320,7 +329,7 @@ public object Post([FromBody] DataManagerRequest DataManagerRequest) ### Handling sorting operation -To handle sorting operation, ensure that your API endpoint supports custom sorting criteria. Implement the sorting logic on the server-side using the [PerformSorting](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataOperations.html#Syncfusion_Blazor_DataOperations_PerformSorting__1_System_Collections_Generic_IEnumerable___0__System_Collections_Generic_List_Syncfusion_Blazor_Data_Sort__) method from the [DataOperations](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataOperations.html) class. This allows the custom data source to undergo sorting based on the criteria specified in the incoming [DataManagerRequest](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataManagerRequest.html) object. +Enable server-side sorting by implementing logic in the API controller using the [PerformSorting](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataOperations.html#Syncfusion_Blazor_DataOperations_PerformSorting__1_System_Collections_Generic_IEnumerable___0__System_Collections_Generic_List_Syncfusion_Blazor_Data_Sort__) method from the [DataOperations](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataOperations.html) class. This method sorts the collection based on one or more sort descriptors specified in the incoming [DataManagerRequest](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataManagerRequest.html). {% highlight razor %} [HttpPost] @@ -342,7 +351,7 @@ public object Post([FromBody] DataManagerRequest DataManagerRequest) ### Handling aggregate operation -To handle aggregate operation, ensure that your API endpoint supports custom aggregate criteria. Implement the aggregate logic on the server-side using the [PerformAggregation](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Data.DataUtil.html#Syncfusion_Blazor_Data_DataUtil_PerformAggregation_System_Collections_IEnumerable_System_Collections_Generic_List_Syncfusion_Blazor_Data_Aggregate__) method from the [DataUtil](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Data.DataUtil.html) class. This allows the custom data source to undergo aggregate based on the criteria specified in the incoming [DataManagerRequest](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataManagerRequest.html) object. +Enable server-side aggregation by implementing logic in the API controller using the [PerformAggregation](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Data.DataUtil.html#Syncfusion_Blazor_Data_DataUtil_PerformAggregation_System_Collections_IEnumerable_System_Collections_Generic_List_Syncfusion_Blazor_Data_Aggregate__) method from the [DataUtil](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Data.DataUtil.html) class. This method calculates aggregate values such as **Sum**, **Average**, **Min**, and **Max** for the specified fields based on the incoming [DataManagerRequest](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataManagerRequest.html). {% highlight razor %} [HttpPost] @@ -363,11 +372,11 @@ To handle aggregate operation, ensure that your API endpoint supports custom agg } {% endhighlight %} -> The server-side management of the `PerformAggregation` method is necessary only for the [Footer Template](https://blazor.syncfusion.com/documentation/datagrid/footer-aggregate) aggregation. There is no need for explicit handling of the Aggregate operation for the [Group Footer template](https://blazor.syncfusion.com/documentation/datagrid/group-and-caption-aggregate#group-footer-aggregates) and [Group Caption template](https://blazor.syncfusion.com/documentation/datagrid/group-and-caption-aggregate#group-caption-aggregates). +> The server-side implementation of the `PerformAggregation` method is required only for [Footer aggregates](https://blazor.syncfusion.com/documentation/datagrid/footer-aggregate). Explicit handling is not necessary for[ Group Footer aggregates](https://blazor.syncfusion.com/documentation/datagrid/group-and-caption-aggregate#group-footer-aggregates) or [Group Caption aggregates](https://blazor.syncfusion.com/documentation/datagrid/group-and-caption-aggregate#group-caption-aggregates). ### Handling paging operation -To handle paging operation, ensure that your API endpoint supports custom paging criteria. Implement the paging logic on the server-side using the [PerformTake](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataOperations.html#Syncfusion_Blazor_DataOperations_PerformTake_System_Collections_IEnumerable_System_Int32_) and [PerformSkip](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataOperations.html#Syncfusion_Blazor_DataOperations_PerformSkip__1_System_Collections_Generic_IEnumerable___0__System_Int32_) method from the [DataOperations](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataOperations.html) class. This allows the custom data source to undergo paging based on the criteria specified in the incoming [DataManagerRequest](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataManagerRequest.html) object. +Enable server-side paging by implementing logic in the API controller using the [PerformSkip](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataOperations.html#Syncfusion_Blazor_DataOperations_PerformSkip__1_System_Collections_Generic_IEnumerable___0__System_Int32_) and [PerformTake](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataOperations.html#Syncfusion_Blazor_DataOperations_PerformTake__1_System_Collections_Generic_IEnumerable___0__System_Int32_) methods from the [DataOperations](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataOperations.html) class. These methods apply paging based on the **Skip** and **Take** values provided in the incoming [DataManagerRequest](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataManagerRequest.html). {% highlight razor %} [HttpPost] @@ -392,13 +401,19 @@ public object Post([FromBody] DataManagerRequest DataManagerRequest) } {% endhighlight %} -> For optimal performance, it is recommended to follow this sequence of operations(Searching, Filtering, Sorting, Aggregate and Paging ) in the [ReadAsync](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataAdaptor.html#Syncfusion_Blazor_DataAdaptor_ReadAsync_Syncfusion_Blazor_DataManagerRequest_System_String_) method. +N> For optimal performance, apply operations in the following sequence: **Searching → Filtering → Sorting → Aggregation → Paging → Grouping** in [ReadAsync](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataAdaptor.html#Syncfusion_Blazor_DataAdaptor_ReadAsync_Syncfusion_Blazor_DataManagerRequest_System_String_) method. ### Handling CRUD operations -To enable editing in this Blazor DataGrid component, utilize the [GridEditSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridEditSettings.html) component. The Blazor DataGrid offers multiple edit modes including the [Inline/Normal](https://blazor.syncfusion.com/documentation/datagrid/in-line-editing), [Dialog](https://blazor.syncfusion.com/documentation/datagrid/dialog-editing), and [Batch](https://blazor.syncfusion.com/documentation/datagrid/batch-editing) editing. For more details, refer to the Blazor DataGrid component [editing](https://blazor.syncfusion.com/documentation/datagrid/editing) documentation. +The Syncfusion® Blazor DataGrid supports Create, Read, Update, and Delete (CRUD) operations through the [SfDataManager](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Data.SfDataManager.html) component. These operations are mapped to API endpoints using properties such as: + +* [InsertUrl](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataManager.html#Syncfusion_Blazor_DataManager_InsertUrl) – API endpoint for inserting new records. +* [UpdateUrl](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataManager.html#Syncfusion_Blazor_DataManager_UpdateUrl) – API endpoint for updating existing records. +* [RemoveUrl](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataManager.html#Syncfusion_Blazor_DataManager_UpdateUrl) – API endpoint for deleting records. +* [CrudUrl](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataManager.html#Syncfusion_Blazor_DataManager_CrudUrl) – Single endpoint for all CRUD operations. +* [BatchUrl](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataManager.html#Syncfusion_Blazor_DataManager_BatchUrl) – API endpoint for batch editing. -In this scenario, the inline edit `Mode` and [Toolbar](https://blazor.syncfusion.com/documentation/datagrid/tool-bar) property are configured to display toolbar items for editing purposes. +To enable editing, configure the [Toolbar](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_Toolbar) and [GridEditSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridEditSettings.html) properties, and set the Mode property to [EditMode.Normal](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.EditMode.html#Syncfusion_Blazor_Grids_EditMode_Normal) to allow adding, editing, and deleting records. {% tabs %} {% highlight razor %} @@ -416,12 +431,13 @@ In this scenario, the inline edit `Mode` and [Toolbar](https://blazor.syncfusion {% endhighlight %} {% endtabs %} -> * Normal/Inline editing is the default edit [Mode](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridEditSettings.html#Syncfusion_Blazor_Grids_GridEditSettings_Mode) for the Blazor DataGrid component. To enable CRUD operations, ensure that the [IsPrimaryKey](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridColumn.html#Syncfusion_Blazor_Grids_GridColumn_IsPrimaryKey) property is set to **true** for a specific `GridColumn`, ensuring that its value is unique. -> * If database has an Autogenerated column, ensure to define [IsIdentity](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridColumn.html#Syncfusion_Blazor_Grids_GridColumn_IsIdentity) property of `GridColumn` to disable them during adding or editing operations. +> * Normal(Inline) editing is the default [Mode](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridEditSettings.html#Syncfusion_Blazor_Grids_GridEditSettings_Mode) for the Blazor DataGrid component. +> * To enable CRUD operations, set the [IsPrimaryKey](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridColumn.html#Syncfusion_Blazor_Grids_GridColumn_IsPrimaryKey) property to **true** for a column that contains unique values. +> * If the database includes an auto-generated column, set the [IsIdentity](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridColumn.html#Syncfusion_Blazor_Grids_GridColumn_IsIdentity) property for that column to disable editing during **add** or **update** operations. **Insert Operation:** -To insert a new row, simply click the **Add** toolbar button. The new record edit form will be displayed as shown below. Upon clicking the **Update** toolbar button, record will inserted into the Orders table by calling the following **POST** method of an API. +To insert a new record, click the **Add** toolbar button. This action displays the edit form for entering the new record details. After providing the required values, click the **Update** toolbar button. The record will be added to the Orders table by invoking the following **POST** API method. {% tabs %} {% highlight c# tabtitle="OrdersController.cs" %} @@ -482,7 +498,7 @@ public void Update([FromBody] CRUDModel Value) **Delete Operation:** -To delete a row, simply select the desired row and click the **Delete** toolbar button. This action will trigger a **DELETE** request to an API, containing the primary key value of the selected record. As a result corresponding record will be removed from the Orders table. +To remove a record, select the desired row and click the **Delete** toolbar button. This action sends a **DELETE** request to the configured API endpoint, passing the primary key of the selected record. The corresponding entry will be deleted from the Orders table by invoking the following **POST** API method. {% tabs %} {% highlight c# tabtitle="OrdersController.cs" %} @@ -513,7 +529,13 @@ public void Delete([FromBody] CRUDModel Value) **Batch Operation:** -To perform batch operation, define the edit [Mode](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridEditSettings.html#Syncfusion_Blazor_Grids_GridEditSettings_Mode) as `Batch` and specify the [BatchUrl](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataManager.html#Syncfusion_Blazor_DataManager_BatchUrl) property in the `SfDataManager`. Use the **Add** toolbar button to insert new row in batch editing mode. To edit a cell, double-click the desired cell and update the value as required. To delete a record, simply select the record and press the **Delete** toolbar button. Now, all CRUD operations will be executed in batch editing mode. Clicking the **Update** toolbar button will update the newly added, edited, or deleted records from the Orders table using a single API **POST** request. +To perform batch updates, set the edit [Mode](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridEditSettings.html#Syncfusion_Blazor_Grids_GridEditSettings_Mode) to **Batch** in the [GridEditSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridEditSettings.html) component and configure the [BatchUrl](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataManager.html#Syncfusion_Blazor_DataManager_BatchUrl) property in the [SfDataManager](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Data.SfDataManager.html). +In batch mode: + +- Use the **Add** toolbar button to insert new rows. +- Double-click a cell to edit its value. +- Select a row and click **Delete** to remove it. +- Click **Update** to commit all changes (insert, update, delete) in a single request from the Orders table using a single API **POST** request. {% highlight razor %} [HttpPost] @@ -579,23 +601,29 @@ public void Batch([FromBody] CRUDModel Value) } {% endhighlight %} -When you run the application, the resultant Blazor DataGrid component will look like this - ![Blazor DataGrid component bound with MySQL Server data](../images/blazor-Grid-Ms-SQl-databinding-Gif.gif) -> Find the sample from this [GitHub location](https://github.com/SyncfusionExamples/connecting-databases-to-blazor-datagrid-component/tree/master/Binding%20MySQL%20database%20using%20UrlAdaptor). +> Find the complete implementation in this [GitHub](https://github.com/SyncfusionExamples/connecting-databases-to-blazor-datagrid-component/tree/master/Binding%20MS%20SQL%20database%20using%20UrlAdaptor) repository. ## Binding data from MySQL Server using CustomAdaptor -This section describes step by step process how to retrieve data from a MySQL Server using `CustomAdaptor` and bind it to the Blazor DataGrid component. +This section explains how to retrieve data from a Microsoft SQL Server database using [CustomAdaptor](https://blazor.syncfusion.com/documentation/datagrid/connecting-to-adaptors/custom-adaptor) and bind it to the Blazor DataGrid component. -**1.** To create a simple Blazor DataGrid component, the procedure is explained in the above-mentioned topic on [Connecting Blazor DataGrid to an API service](#connecting-blazor-datagrid-to-an-api-service) +**Step 1: Create the Blazor DataGrid Component** -> * In this Blazor Web app, set the `rendermode` as either **InteractiveServer** or **InteractiveAuto** as per your configuration. +Follow the procedure described in [Connecting Blazor DataGrid to an API service](#connecting-blazor-datagrid-to-an-api-service). -**2.** To connect a MySQL Server database using the MySQL driver in your application, you need to install the [MySQL.Data](https://www.nuget.org/packages/MySql.Data) NuGet package. To add **MySQL.Data** in the app, open the NuGet package manager in Visual Studio (Tools → NuGet Package Manager → Manage NuGet Packages for Solution), search and install it. +> * Set the rendermode to **InteractiveServer** or **InteractiveAuto** based on application configuration. -**3.** If you intend to inject your own service into the `CustomAdaptor` and utilize it, you can achieve this as follows. +**Step 2: Install MySql NuGet Package** + +Install the **MySql.Data** package to connect to MySQL Server. + +In Visual Studio, open (*Tools → NuGet Package Manager → Manage NuGet Packages*) for Solution, search for **MySql.Data**, and install it. + +**Step 3: Configure the DataGrid with CustomAdaptor** + +Inject a custom service into the `CustomAdaptor` and configure the component as shown below: {% tabs %} {% highlight razor tabtitle="Index.razor" %} @@ -664,13 +692,13 @@ This section describes step by step process how to retrieve data from a MySQL Se {% endhighlight %} {% endtabs %} -**4.** Within the `CustomAdaptor’s` [ReadAsync](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataAdaptor.html#Syncfusion_Blazor_DataAdaptor_ReadAsync_Syncfusion_Blazor_DataManagerRequest_System_String_) method, fetch the data from the service by calling the `GetOrdersAsync` method. - -* In this `GetOrdersAsync` method, the MySQL Server database data is fetch by using the **MySqlDataAdapter** class. +**Step 4: Implement Data Retrieval Logic** -* Employ the **Fill** method of the **DataAdapter** to populate a **DataSet** with the results of the `Select` command of the **DataAdapter**, followed by conversion of the **DataSet** into a List. +Implement the [ReadAsync](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataAdaptor.html#Syncfusion_Blazor_DataAdaptor_ReadAsync_Syncfusion_Blazor_DataManagerRequest_System_String_) method in `CustomAdaptor` to fetch data from the service by calling **GetOrdersAsync**. -* Finally, return the response as a `Result` and `Count` pair object in the `ReadAsync` method to bind the data to the Blazor DataGrid component. +* Use `SqlDataAdapter` to retrieve data from Microsoft SQL Server. +* Populate a **DataSet** using the **Fill** method and convert it into a List. +* Return the response as a **Result** and **Count** pair in the `ReadAsync` method to bind data to the Blazor DataGrid. {% tabs %} {% highlight razor tabtitle="Index.razor" %} @@ -781,18 +809,37 @@ public class OrderData {% endhighlight %} {% endtabs %} -> * The `DataManagerRequest` encompasses details about the Blazor DataGrid component actions such as searching, filtering, sorting, aggregate, paging and grouping. -> * In the above Blazor DataGrid, [AllowSearching](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridColumn.html#Syncfusion_Blazor_Grids_GridColumn_AllowSearching), [AllowSorting](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_AllowSorting), [AllowFiltering](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_AllowFiltering), [AllowPaging](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_AllowPaging), [AllowGrouping](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_AllowGrouping) and CRUD-related properties have been enabled. The details on how to handle these actions are explained below. +![Blazor DataGrid component bound with MySQL Server data](../images/blazor-Grid-Ms-SQL-databinding.png) -When the application is executed, the Blazor DataGrid component will appear as depicted below. +### Handling data operations in a Custom Adaptor -![Blazor DataGrid component bound with MySQL Server data](../images/blazor-Grid-Ms-SQL-databinding.png) +The Syncfusion® Blazor DataGrid supports server-side operations such as **searching**, **filtering**, **sorting**, **paging**, and **aggregating** when using a `CustomAdaptor`. These operations are implemented by overriding the [Read](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataAdaptor.html#Syncfusion_Blazor_DataAdaptor_Read_Syncfusion_Blazor_DataManagerRequest_System_String_) or [ReadAsync](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataAdaptor.html#Syncfusion_Blazor_DataAdaptor_ReadAsync_Syncfusion_Blazor_DataManagerRequest_System_String_) method of the [DataAdaptor](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataAdaptor.html) abstract class. + +The [DataManagerRequest](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataManagerRequest.html) object provides the necessary details for each operation, and these can be applied using built-in methods from the [DataOperations](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataOperations.html) and [DataUtil](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Data.DataUtil.html) classes: + +* [PerformSearching](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataOperations.html#Syncfusion_Blazor_DataOperations_PerformSearching__1_System_Collections_Generic_IEnumerable___0__System_Collections_Generic_List_Syncfusion_Blazor_Data_SearchFilter__) – Applies search criteria to the data source based on search filters. + +* [PerformFiltering](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataOperations.html#Syncfusion_Blazor_DataOperations_PerformFiltering__1_System_Collections_Generic_IEnumerable___0__System_Collections_Generic_List_Syncfusion_Blazor_Data_WhereFilter__System_String_) – Filters the data source using conditions specified in the request. + +* [PerformSorting](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataOperations.html#Syncfusion_Blazor_DataOperations_PerformSorting__1_System_Collections_Generic_IEnumerable___0__System_Collections_Generic_List_Syncfusion_Blazor_Data_SortedColumn__) – Sorts the data source according to one or more sort descriptors. + +* [PerformSkip](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataOperations.html#Syncfusion_Blazor_DataOperations_PerformSkip__1_System_Collections_Generic_IEnumerable___0__System_Int32_) – Retrieves a specified number of records for paging. + +* [PerformTake](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataOperations.html#Syncfusion_Blazor_DataOperations_PerformTake__1_System_Collections_Generic_IEnumerable___0__System_Int32_) – Skips a defined number of records before returning results. + +* [PerformAggregation](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Data.DataUtil.html#Syncfusion_Blazor_Data_DataUtil_PerformAggregation_System_Collections_IEnumerable_System_Collections_Generic_List_Syncfusion_Blazor_Data_Aggregate__) – Applies aggregate details to calculate summary values such as Sum, Average, Min, and Max. + +These methods enable efficient server-side data handling in a custom adaptor implementation for **MySQL Server**. + +N> To enable these operations, install the **Syncfusion.Blazor.Data** package using NuGet Package Manager in Visual Studio: + +(*Tools → NuGet Package Manager → Manage NuGet Packages for Solution*). ### Handling searching operation -When utilizing the `CustomAdaptor`, managing the searching operation involves overriding the [Read](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataAdaptor.html#Syncfusion_Blazor_DataAdaptor_Read_Syncfusion_Blazor_DataManagerRequest_System_String_) or [ReadAsync](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataAdaptor.html#Syncfusion_Blazor_DataAdaptor_ReadAsync_Syncfusion_Blazor_DataManagerRequest_System_String_) method of the [DataAdaptor](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataAdaptor.html) abstract class. +When using `CustomAdaptor`, the searching operation is implemented by overriding the [Read](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataAdaptor.html#Syncfusion_Blazor_DataAdaptor_Read_Syncfusion_Blazor_DataManagerRequest_System_String_) or [ReadAsync](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataAdaptor.html#Syncfusion_Blazor_DataAdaptor_ReadAsync_Syncfusion_Blazor_DataManagerRequest_System_String_) method of the [DataAdaptor](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataAdaptor.html) abstract class. -In the code example below, searching a custom data source can be accomplished by employing the built-in [PerformSearching](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataOperations.html#Syncfusion_Blazor_DataOperations_PerformSearching_System_Collections_IEnumerable_System_Collections_Generic_List_Syncfusion_Blazor_Data_SearchFilter__) method of the [DataOperations](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataOperations.html) class. Alternatively, you can implement your own method for searching operation and bind the resultant data to the Blazor DataGrid component. +The built-in [PerformSearching](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataOperations.html#Syncfusion_Blazor_DataOperations_PerformSearching__1_System_Collections_Generic_IEnumerable___0__System_Collections_Generic_List_Syncfusion_Blazor_Data_SearchFilter__) method of the [DataOperations](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataOperations.html) class applies search criteria from the [DataManagerRequest](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataManagerRequest.html) to the data source. Custom logic can also be implemented to handle searching as required. {% highlight razor %} public class CustomAdaptor : DataAdaptor @@ -817,9 +864,9 @@ public class CustomAdaptor : DataAdaptor ### Handling filtering operation -When employing the `CustomAdaptor`, handling the filtering operation involves overriding the [Read](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataAdaptor.html#Syncfusion_Blazor_DataAdaptor_Read_Syncfusion_Blazor_DataManagerRequest_System_String_) or [ReadAsync](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataAdaptor.html#Syncfusion_Blazor_DataAdaptor_ReadAsync_Syncfusion_Blazor_DataManagerRequest_System_String_) method of the [DataAdaptor](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataAdaptor.html) abstract class. +When implementing `CustomAdaptor`, the filtering operation is managed by overriding the[Read](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataAdaptor.html#Syncfusion_Blazor_DataAdaptor_Read_Syncfusion_Blazor_DataManagerRequest_System_String_) or [ReadAsync](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataAdaptor.html#Syncfusion_Blazor_DataAdaptor_ReadAsync_Syncfusion_Blazor_DataManagerRequest_System_String_) method of the [DataAdaptor](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataAdaptor.html) abstract class. -In the code example below, filtering a custom data source can be achieved by utilizing the built-in [PerformFiltering](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataOperations.html#Syncfusion_Blazor_DataOperations_PerformFiltering__1_System_Collections_Generic_IEnumerable___0__System_Collections_Generic_List_Syncfusion_Blazor_Data_WhereFilter__System_String_) method of the [DataOperations](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataOperations.html) class. Alternatively, you can implement your own method for filtering operation and bind the resulting data to the Blazor DataGrid component. +The built-in [PerformFiltering](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataOperations.html#Syncfusion_Blazor_DataOperations_PerformFiltering__1_System_Collections_Generic_IEnumerable___0__System_Collections_Generic_List_Syncfusion_Blazor_Data_WhereFilter__System_String_) method in the [DataOperations](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataOperations.html) class applies filter criteria from the [DataManagerRequest](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataManagerRequest.html) to the data collection. Custom filtering logic can also be implemented to meet specific requirements. {% highlight razor %} public class CustomAdaptor : DataAdaptor @@ -844,9 +891,9 @@ public class CustomAdaptor : DataAdaptor ### Handling sorting operation -When utilizing the `CustomAdaptor`, managing the sorting operation involves overriding the [Read](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataAdaptor.html#Syncfusion_Blazor_DataAdaptor_Read_Syncfusion_Blazor_DataManagerRequest_System_String_) or [ReadAsync](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataAdaptor.html#Syncfusion_Blazor_DataAdaptor_ReadAsync_Syncfusion_Blazor_DataManagerRequest_System_String_) method of the [DataAdaptor](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataAdaptor.html) abstract class. +When implementing `CustomAdaptor`, the sorting operation is handled by overriding the [Read](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataAdaptor.html#Syncfusion_Blazor_DataAdaptor_Read_Syncfusion_Blazor_DataManagerRequest_System_String_) or [ReadAsync](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataAdaptor.html#Syncfusion_Blazor_DataAdaptor_ReadAsync_Syncfusion_Blazor_DataManagerRequest_System_String_) method of the [DataAdaptor](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataAdaptor.html) abstract class. -In the code example below, sorting a custom data source can be accomplished by employing the built-in [PerformSorting](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataOperations.html#Syncfusion_Blazor_DataOperations_PerformSorting__1_System_Collections_Generic_IEnumerable___0__System_Collections_Generic_List_Syncfusion_Blazor_Data_Sort__) method of the [DataOperations](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataOperations.html) class. Alternatively, you can implement your own method for sorting operation and bind the resulting data to the Blazor DataGrid component. +The built-in [PerformSorting](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataOperations.html#Syncfusion_Blazor_DataOperations_PerformSorting__1_System_Collections_Generic_IEnumerable___0__System_Collections_Generic_List_Syncfusion_Blazor_Data_Sort__) method in the [DataOperations](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataOperations.html) class applies sort criteria from the [DataManagerRequest](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataManagerRequest.html) to the data collection. Custom sorting logic can also be implemented to meet specific requirements. {% highlight razor %} public class CustomAdaptor : DataAdaptor @@ -871,9 +918,9 @@ public class CustomAdaptor : DataAdaptor ### Handling aggregate operation -When employing `CustomAdaptor`, the aggregate operation must be managed within the [Read](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataAdaptor.html#Syncfusion_Blazor_DataAdaptor_Read_Syncfusion_Blazor_DataManagerRequest_System_String_) or [ReadAsync](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataAdaptor.html#Syncfusion_Blazor_DataAdaptor_ReadAsync_Syncfusion_Blazor_DataManagerRequest_System_String_) method of the `CustomAdaptor`. +When implementing `CustomAdaptor`, aggregate operations are managed by overriding the [Read](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataAdaptor.html#Syncfusion_Blazor_DataAdaptor_Read_Syncfusion_Blazor_DataManagerRequest_System_String_) or [ReadAsync](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataAdaptor.html#Syncfusion_Blazor_DataAdaptor_ReadAsync_Syncfusion_Blazor_DataManagerRequest_System_String_) method of the [DataAdaptor](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataAdaptor-1.html) abstract class. -The provided sample code illustrated how to implement the aggregate operation within `CustomAdaptor`, +The built-in [PerformAggregation](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Data.DataUtil.html#Syncfusion_Blazor_Data_DataUtil_PerformAggregation_System_Collections_IEnumerable_System_Collections_Generic_List_Syncfusion_Blazor_Data_Aggregate__) method in the [DataUtil](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Data.DataUtil.html) class calculates aggregate values based on the criteria specified in the [DataManagerRequest](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataManagerRequest.html). Custom aggregation logic can also be implemented when specific requirements exist. {% highlight razor %} public class CustomAdaptor : DataAdaptor @@ -896,13 +943,13 @@ public class CustomAdaptor : DataAdaptor } {% endhighlight %} -> The server-side management of the `PerformAggregation` method is necessary only for the [Footer Template](https://blazor.syncfusion.com/documentation/datagrid/footer-aggregate) aggregation. There is no need for explicit handling of the Aggregate operation for the [Group Footer template](https://blazor.syncfusion.com/documentation/datagrid/group-and-caption-aggregate#group-footer-aggregates) and [Group Caption template](https://blazor.syncfusion.com/documentation/datagrid/group-and-caption-aggregate#group-caption-aggregates). +> The server-side implementation of the `PerformAggregation` method is required only for [Footer aggregates](https://blazor.syncfusion.com/documentation/datagrid/footer-aggregate). Explicit handling is not necessary for[ Group Footer aggregates](https://blazor.syncfusion.com/documentation/datagrid/group-and-caption-aggregate#group-footer-aggregates) or [Group Caption aggregates](https://blazor.syncfusion.com/documentation/datagrid/group-and-caption-aggregate#group-caption-aggregates). ### Handling paging operation -When employing the `CustomAdaptor`, handling paging operation involves overriding the [Read](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataAdaptor.html#Syncfusion_Blazor_DataAdaptor_Read_Syncfusion_Blazor_DataManagerRequest_System_String_) or [ReadAsync](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataAdaptor.html#Syncfusion_Blazor_DataAdaptor_ReadAsync_Syncfusion_Blazor_DataManagerRequest_System_String_) method of the [DataAdaptor](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataAdaptor.html) abstract class. +When implementing `CustomAdaptor`, paging is managed by overriding the [Read](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataAdaptor.html#Syncfusion_Blazor_DataAdaptor_Read_Syncfusion_Blazor_DataManagerRequest_System_String_) or [ReadAsync](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataAdaptor.html#Syncfusion_Blazor_DataAdaptor_ReadAsync_Syncfusion_Blazor_DataManagerRequest_System_String_) method of the [DataAdaptor](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataAdaptor.html) abstract class. -In the code example below, paging a custom data source can be achieved by utilizing the built-in [PerformTake](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataOperations.html#Syncfusion_Blazor_DataOperations_PerformTake_System_Collections_IEnumerable_System_Int32_) and [PerformSkip](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataOperations.html#Syncfusion_Blazor_DataOperations_PerformSkip__1_System_Collections_Generic_IEnumerable___0__System_Int32_) method of the [DataOperations](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataOperations.html) class. Alternatively, you can use your own method for paging operation and bind the resulting data to the Blazor DataGrid component. +The built-in [PerformSkip](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataOperations.html#Syncfusion_Blazor_DataOperations_PerformSkip__1_System_Collections_Generic_IEnumerable___0__System_Int32_) and [PerformTake](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataOperations.html#Syncfusion_Blazor_DataOperations_PerformTake__1_System_Collections_Generic_IEnumerable___0__System_Int32_) methods in the [DataOperations](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataOperations.html) class apply paging criteria from the [DataManagerRequest](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataManagerRequest.html) to the data collection. Custom paging logic can also be implemented when specific requirements exist. {% highlight razor %} public class CustomAdaptor : DataAdaptor @@ -933,9 +980,9 @@ public class CustomAdaptor : DataAdaptor ### Handling grouping operation -When employing `CustomAdaptor`, the grouping operation must be managed within the [Read](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataAdaptor.html#Syncfusion_Blazor_DataAdaptor_Read_Syncfusion_Blazor_DataManagerRequest_System_String_) or [ReadAsync](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataAdaptor.html#Syncfusion_Blazor_DataAdaptor_ReadAsync_Syncfusion_Blazor_DataManagerRequest_System_String_) method of the `CustomAdaptor`. +When implementing `CustomAdaptor`, grouping is managed by overriding the [Read](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataAdaptor.html#Syncfusion_Blazor_DataAdaptor_Read_Syncfusion_Blazor_DataManagerRequest_System_String_) or [ReadAsync](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataAdaptor.html#Syncfusion_Blazor_DataAdaptor_ReadAsync_Syncfusion_Blazor_DataManagerRequest_System_String_) method of the [DataAdaptor](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataAdaptor.html) abstract class. -In the code example below, grouping a custom data source can be achieved by utilizing the [Group](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Data.DataUtil.html#Syncfusion_Blazor_Data_DataUtil_Group__1_System_Collections_IEnumerable_System_String_System_Collections_Generic_List_Syncfusion_Blazor_Data_Aggregate__System_Int32_System_Collections_Generic_IDictionary_System_String_System_String__System_Boolean_System_Boolean_) method from the [DataUtil](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Data.DataUtil.html) class. Alternatively, you can use your own method for grouping operation and bind the resulting data to the Blazor DataGrid component. +The built-in [Group](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Data.DataUtil.html#Syncfusion_Blazor_Data_DataUtil_Group__1_System_Collections_IEnumerable_System_String_System_Collections_Generic_List_Syncfusion_Blazor_Data_Aggregate__System_Int32_System_Collections_Generic_IDictionary_System_String_System_String__System_Boolean_System_Boolean_) method in the [DataUtil](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Data.DataUtil.html) class applies grouping logic based on the configuration in the [DataManagerRequest](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataManagerRequest.html). Custom grouping logic can also be implemented when specific requirements exist. {% highlight razor %} public class CustomAdaptor : DataAdaptor @@ -966,8 +1013,7 @@ public class CustomAdaptor : DataAdaptor } {% endhighlight %} -> * For optimal performance, it is recommended to follow this sequence of operations(Searching, Filtering, Sorting, Aggregate, Paging and Grouping) in the `ReadAsync` method. -> * If both grouping and aggregate operations are enabled, the code provided below demonstrates how to implement these operations within the `CustomAdaptor`. +N> For optimal performance, apply operations in the following sequence: **Searching → Filtering → Sorting → Aggregation → Paging → Grouping** in [ReadAsync](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataAdaptor.html#Syncfusion_Blazor_DataAdaptor_ReadAsync_Syncfusion_Blazor_DataManagerRequest_System_String_) method. ```cshtml public class CustomAdaptor : DataAdaptor @@ -1009,9 +1055,16 @@ public class CustomAdaptor : DataAdaptor ### Handling CRUD operations -To enable editing in the Blazor DataGrid component, utilize the [GridEditSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridEditSettings.html) component. The Blazor DataGrid component offers multiple edit modes including the Inline/Normal, Dialog and Batch editing. For more details, refer to the Blazor DataGrid component [editing](https://blazor.syncfusion.com/documentation/datagrid/editing) documentation. +The Syncfusion® Blazor DataGrid component supports Create, Read, Update, and Delete (CRUD) operations through the [GridEditSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridEditSettings.html) configuration. Multiple edit modes are available, including **Inline**, **Dialog**, and **Batch** editing. For details, refer to the [Editing](https://blazor.syncfusion.com/documentation/datagrid/editing) documentation. -In this scenario, the inline edit `Mode` and [Toolbar](https://blazor.syncfusion.com/documentation/datagrid/tool-bar) property configured to display toolbar items for editing purpose. +When using `CustomAdaptor`, CRUD operations are implemented by overriding the following methods of the [DataAdaptor](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataAdaptor-1.html) class: + +* [Insert](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataAdaptor.html#Syncfusion_Blazor_DataAdaptor_Insert_Syncfusion_Blazor_DataManager_System_Object_System_String_) / [InsertAsync](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataAdaptor.html#Syncfusion_Blazor_DataAdaptor_InsertAsync_Syncfusion_Blazor_DataManager_System_Object_System_String_) – Handles record insertion. +* [Update](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataAdaptor.html#Syncfusion_Blazor_DataAdaptor_Update_Syncfusion_Blazor_DataManager_System_Object_System_String_System_String_) / [UpdateAsync](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataAdaptor.html#Syncfusion_Blazor_DataAdaptor_UpdateAsync_Syncfusion_Blazor_DataManager_System_Object_System_String_System_String_) – Handles record updates. +* [Remove](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataAdaptor.html#Syncfusion_Blazor_DataAdaptor_Remove_Syncfusion_Blazor_DataManager_System_Object_System_String_System_String_) / [RemoveAsync](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataAdaptor.html#Syncfusion_Blazor_DataAdaptor_RemoveAsync_Syncfusion_Blazor_DataManager_System_Object_System_String_System_String_) – Handles record deletion. +* [BatchUpdate](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataAdaptor.html#Syncfusion_Blazor_DataAdaptor_BatchUpdate_Syncfusion_Blazor_DataManager_System_Object_System_Object_System_Object_System_String_System_String_System_Nullable_System_Int32__) / [BatchUpdateAsync](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataAdaptor.html#Syncfusion_Blazor_DataAdaptor_BatchUpdateAsync_Syncfusion_Blazor_DataManager_System_Object_System_Object_System_Object_System_String_System_String_System_Nullable_System_Int32__) – Handles batch operations (insert, update, delete). + +Each method can be customized to execute SQL commands against the **Microsoft SQL Server** database. {% highlight razor %} @@ -1027,21 +1080,13 @@ In this scenario, the inline edit `Mode` and [Toolbar](https://blazor.syncfusion {% endhighlight %} -> * Inline/Normal editing is the default edit [Mode](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridEditSettings.html#Syncfusion_Blazor_Grids_GridEditSettings_Mode) for the Blazor DataGrid component. To enable CRUD operations, ensure that the [IsPrimaryKey](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridColumn.html#Syncfusion_Blazor_Grids_GridColumn_IsPrimaryKey) property is set to **true** for a specific `GridColumn`, ensuring that its value is unique. -> * If database has an Autogenerated column, ensure to define [IsIdentity](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridColumn.html#Syncfusion_Blazor_Grids_GridColumn_IsIdentity) property of `GridColumn` to disable them during adding or editing operations. - -The CRUD operations can be performed and customized on our own by overriding the following CRUD methods of the [DataAdaptor](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataAdaptor.html) abstract class. - -* Insert/InsertAsync -* Remove/RemoveAsync -* Update/UpdateAsync -* BatchUpdate/BatchUpdateAsync - -Let’s see how to perform CRUD operation using MySQL Server data with Syncfusion® Blazor DataGrid component. +> * Normal(Inline) editing is the default [Mode](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridEditSettings.html#Syncfusion_Blazor_Grids_GridEditSettings_Mode) for the Blazor DataGrid component. +> * To enable CRUD operations, set the [IsPrimaryKey](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridColumn.html#Syncfusion_Blazor_Grids_GridColumn_IsPrimaryKey) property to **true** for a column that contains unique values. +> * If the database includes an auto-generated column, set the [IsIdentity](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridColumn.html#Syncfusion_Blazor_Grids_GridColumn_IsIdentity) property for that column to disable editing during **add** or **update** operations. **Insert Operation:** -To execute the insert operation, you will need to override the [Insert](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataAdaptor.html#Syncfusion_Blazor_DataAdaptor_Insert_Syncfusion_Blazor_DataManager_System_Object_System_String_) or [InsertAsync](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataAdaptor.html#Syncfusion_Blazor_DataAdaptor_InsertAsync_Syncfusion_Blazor_DataManager_System_Object_System_String_) method of the `CustomAdaptor`. Then, integrate the following code snippet into the `CustomAdaptor` class. The below code snippet demonstrated how to handle the insertion of new records within the `InsertAsync` method of `CustomAdaptor` component. Modify the logic within this method according to the requirements of your application. +To implement record insertion, override the [Insert](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataAdaptor.html#Syncfusion_Blazor_DataAdaptor_Insert_Syncfusion_Blazor_DataManager_System_Object_System_String_) or [InsertAsync](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataAdaptor.html#Syncfusion_Blazor_DataAdaptor_InsertAsync_Syncfusion_Blazor_DataManager_System_Object_System_String_) method in the `CustomAdaptor` class. {% tabs %} {% highlight razor tabtitle="Index.razor"%} @@ -1078,7 +1123,7 @@ public override async Task InsertAsync(DataManager DataManager, object V **Update Operation:** -To execute the update operation, override the [Update](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataAdaptor.html#Syncfusion_Blazor_DataAdaptor_Update_Syncfusion_Blazor_DataManager_System_Object_System_String_System_String_) or [UpdateAsync](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataAdaptor.html#Syncfusion_Blazor_DataAdaptor_UpdateAsync_Syncfusion_Blazor_DataManager_System_Object_System_String_System_String_) method of the `CustomAdaptor`. Then, integrate the following code snippet into the `CustomAdaptor` class. The below code snippet demonstrated how to handle the updating of existing records within the `UpdateAsync` method of the `CustomAdaptor` component. Modify the logic within this method according to the requirements of your application. +To implement record updates, override the [Update](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataAdaptor.html#Syncfusion_Blazor_DataAdaptor_Update_Syncfusion_Blazor_DataManager_System_Object_System_String_System_String_) or [UpdateAsync](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataAdaptor.html#Syncfusion_Blazor_DataAdaptor_UpdateAsync_Syncfusion_Blazor_DataManager_System_Object_System_String_System_String_) method in the `CustomAdaptor` class. {% tabs %} {% highlight razor tabtitle="Index.razor"%} @@ -1116,7 +1161,7 @@ public async Task UpdateOrderAsync(Order Value) **Delete Operation:** -To perform the delete operation, you need to override the [Remove](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataAdaptor.html#Syncfusion_Blazor_DataAdaptor_Remove_Syncfusion_Blazor_DataManager_System_Object_System_String_System_String_) or [RemoveAsync](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataAdaptor.html#Syncfusion_Blazor_DataAdaptor_RemoveAsync_Syncfusion_Blazor_DataManager_System_Object_System_String_System_String_) method of the `CustomAdaptor`. Below is the code snippet that you can add to `CustomAdaptor` class. The below code snippet demonstrated how to handle the deletion of existing records within the `RemoveAsync` method of `CustomAdaptor` component. Modify the logic within this method according to the requirements of your application. +To perform record deletion, override the [Remove](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataAdaptor.html#Syncfusion_Blazor_DataAdaptor_Remove_Syncfusion_Blazor_DataManager_System_Object_System_String_System_String_) or [RemoveAsync](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataAdaptor.html#Syncfusion_Blazor_DataAdaptor_RemoveAsync_Syncfusion_Blazor_DataManager_System_Object_System_String_System_String_) method in the `CustomAdaptor` class. {% tabs %} {% highlight razor tabtitle="Index.razor"%} @@ -1154,7 +1199,7 @@ public async Task RemoveOrderAsync(int? Key) **Batch Operation:** -To perform the batch operation, override the [BatchUpdate](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataAdaptor.html#Syncfusion_Blazor_DataAdaptor_BatchUpdate_Syncfusion_Blazor_DataManager_System_Object_System_Object_System_Object_System_String_System_String_System_Nullable_System_Int32__) or [BatchUpdateAsync](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataAdaptor.html#Syncfusion_Blazor_DataAdaptor_BatchUpdateAsync_Syncfusion_Blazor_DataManager_System_Object_System_Object_System_Object_System_String_System_String_System_Nullable_System_Int32__) method of the `CustomAdaptor` and add the following code in the `CustomAdaptor`. The below code snippet demonstrated how to handle the batch update request within the `BatchUpdateAsync` method of `CustomAdaptor` component. Modify the logic within this method according to the requirements of your application. +To implement batch updates such as insert, update, and delete in a single request, override the [BatchUpdate](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataAdaptor.html#Syncfusion_Blazor_DataAdaptor_BatchUpdate_Syncfusion_Blazor_DataManager_System_Object_System_Object_System_Object_System_String_System_String_System_Nullable_System_Int32__) or [BatchUpdateAsync](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataAdaptor.html#Syncfusion_Blazor_DataAdaptor_BatchUpdateAsync_Syncfusion_Blazor_DataManager_System_Object_System_Object_System_Object_System_String_System_String_System_Nullable_System_Int32__) method in the `CustomAdaptor` class. {% highlight razor %} /// @@ -1197,4 +1242,4 @@ public override async Task BatchUpdateAsync(DataManager DataManager, obj ![Blazor DataGrid component bound with MySQL Server data](../images/blazor-Grid-Ms-SQl-databinding-Gif.gif) -> You can find the sample in this [GitHub location](https://github.com/SyncfusionExamples/connecting-databases-to-blazor-datagrid-component/tree/master/Binding%20MySQL%20database%20using%20CustomAdaptor). +> A complete sample implementation is available in the [GitHub](https://github.com/SyncfusionExamples/connecting-databases-to-blazor-datagrid-component/tree/master/Binding%20MySQL%20database%20using%20CustomAdaptor) repository. From f810ea498fd889ddf2de5417a1ce9571aa5c1eb3 Mon Sep 17 00:00:00 2001 From: SadhanaBaskaran Date: Tue, 2 Dec 2025 10:16:57 +0530 Subject: [PATCH 152/266] 993738: Updated the UG content and samples for Connecting to DataBase Section in Blazor DataGrid --- .../datagrid/connecting-to-database/dapper.md | 8 ++--- .../microsoft-sql-server.md | 30 +++++++++---------- .../connecting-to-database/mysql-server.md | 8 ++--- 3 files changed, 22 insertions(+), 24 deletions(-) diff --git a/blazor/datagrid/connecting-to-database/dapper.md b/blazor/datagrid/connecting-to-database/dapper.md index ca9dabdd85..c4c0368f88 100644 --- a/blazor/datagrid/connecting-to-database/dapper.md +++ b/blazor/datagrid/connecting-to-database/dapper.md @@ -9,7 +9,7 @@ documentation: ug # Connecting SQL data to a Blazor DataGrid Component using Dapper -The Syncfusion® Blazor DataGrid component supports binding data from Microsoft SQL Server using [Dapper](https://github.com/DapperLib/Dapper) and [System.Data.SqlClient](https://www.nuget.org/packages/System.Data.SqlClient/4.8.6?_src=template). **Dapper** is a lightweight object-relational mapper (ORM) that simplifies executing SQL queries and mapping results to C# domain models. +The Syncfusion® Blazor DataGrid component supports binding data from Microsoft SQL Server using [Dapper](https://github.com/DapperLib/Dapper) and [System.Data.SqlClient](https://www.nuget.org/packages/System.Data.SqlClient/4.8.6?_src=template).**Dapper** is a lightweight object-relational mapper (ORM) that simplifies executing SQL queries and mapping results to C# domain models. Data from SQL Server can be integrated into the Blazor DataGrid using multiple approaches: @@ -19,11 +19,11 @@ Data from SQL Server can be integrated into the Blazor DataGrid using multiple a This guide demonstrates two approaches for integrating SQL Server data with the Blazor DataGrid using **Dapper**: -* **Remote binding via API service using UrlAdaptor** +**Using UrlAdaptor** This approach connects the DataGrid to a REST API endpoint that returns data in the required format. The [UrlAdaptor](https://blazor.syncfusion.com/documentation/datagrid/connecting-to-adaptors/url-adaptor) handles communication between the component and the API, enabling server-side operations such as **paging**, **sorting**, and **filtering**. -* **Custom binding using CustomAdaptor** +**Using CustomAdaptor** This approach provides complete control over data operations by implementing a [CustomAdaptor](https://blazor.syncfusion.com/documentation/datagrid/connecting-to-adaptors/custom-adaptor) class. It allows overriding methods for reading, updating, inserting, and deleting data, making it suitable for scenarios requiring custom business logic or complex queries. @@ -207,7 +207,7 @@ Access the theme stylesheet and script from NuGet using [Static Web Assets](http 5. **Configure DataGrid with UrlAdaptor** -The [SfDataManager](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Data.SfDataManager.html) component supports multiple adaptors for remote data binding. For API services, set the [Adaptor](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Adaptors.html) property to [Adaptors.UrlAdaptor](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Adaptors.html#Syncfusion_Blazor_Adaptors_UrlAdaptor) and specify the service endpoint in the [Url](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataManager.html#Syncfusion_Blazor_DataManager_Url) property. +The [DataManager](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Data.SfDataManager.html) component supports multiple adaptors for remote data binding. For API services, set the [Adaptor](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Adaptors.html) property to [Adaptors.UrlAdaptor](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Adaptors.html#Syncfusion_Blazor_Adaptors_UrlAdaptor) and specify the service endpoint in the [Url](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataManager.html#Syncfusion_Blazor_DataManager_Url) property. {% tabs %} {% highlight razor tabtitle="Index.razor"%} diff --git a/blazor/datagrid/connecting-to-database/microsoft-sql-server.md b/blazor/datagrid/connecting-to-database/microsoft-sql-server.md index 8e48662522..5e5b3036ce 100644 --- a/blazor/datagrid/connecting-to-database/microsoft-sql-server.md +++ b/blazor/datagrid/connecting-to-database/microsoft-sql-server.md @@ -17,11 +17,11 @@ The Syncfusion® Blazor DataGrid component s This guide explains two primary approaches for integrating Microsoft SQL Server data with the Blazor DataGrid: -* **Remote Data Binding using UrlAdaptor**: Enables communication between the DataGrid and a remote API service connected to SQL Server. This approach is suitable when the API implements custom logic for data operations and returns results in the **result** and **count** format. +**Using UrlAdaptor**: Enables communication between the DataGrid and a remote API service connected to SQL Server. This approach is suitable when the API implements custom logic for data operations and returns results in the **result** and **count** format. {% youtube "youtube:https://www.youtube.com/watch?v=Y3grzt0ZdLk" %} -* **Custom Data Binding using CustomAdaptor**: Provides full control over data operations and CRUD functionality. It allows implementing custom logic for **searching**, **filtering**, **sorting**, **paging**, and **grouping** directly in server-side code. +**Using CustomAdaptor**: Provides full control over data operations and CRUD functionality. It allows implementing custom logic for **searching**, **filtering**, **sorting**, **paging**, and **grouping** directly in server-side code. {% youtube "youtube:https://www.youtube.com/watch?v=8yLpSCJLcXI" %} @@ -33,12 +33,12 @@ Microsoft SQL Server is a relational database management system (**RDBMS**) deve **Key Features** -**Relational Database Model**: Organizes data into tables with rows and columns. -**T-SQL Support**: Provides **Transact-SQL** for advanced querying and procedural programming. -**High Availability**: Features like Always On Availability Groups for failover and disaster recovery. -**Security**: Includes **encryption**, **authentication**, and **role-based access** control. -**Integration**: Works with .NET applications, Azure services, and supports REST APIs. -**Scalability**: Handles large datasets and supports both on-premises and cloud deployments. +- **Relational Database Model**: Organizes data into tables with rows and columns. +- **T-SQL Support**: Provides **Transact-SQL** for advanced querying and procedural programming. +- **High Availability**: Features like Always On Availability Groups for failover and disaster recovery. +- **Security**: Includes **encryption**, **authentication**, and **role-based access** control. +- **Integration**: Works with .NET applications, Azure services, and supports REST APIs. +- **Scalability**: Handles large datasets and supports both on-premises and cloud deployments. For more details, refer to the official [Microsoft documentation](https://learn.microsoft.com/en-us/sql/sql-server/what-is-sql-server?view=sql-server-ver17). @@ -216,7 +216,7 @@ N> **Step 5: Configure DataGrid with UrlAdaptor** -Use [SfDataManager](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Data.SfDataManager.html) to connect the DataGrid to the API endpoint and set the [Adaptor](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Adaptors.html) property to [Adaptors.UrlAdaptor](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Adaptors.html#Syncfusion_Blazor_Adaptors_UrlAdaptor). +Use [DataManager](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Data.SfDataManager.html) to connect the DataGrid to the API endpoint and set the [Adaptor](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Adaptors.html) property to [Adaptors.UrlAdaptor](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Adaptors.html#Syncfusion_Blazor_Adaptors_UrlAdaptor). {% tabs %} {% highlight razor tabtitle="Index.razor" %} @@ -492,20 +492,18 @@ public object Post([FromBody] DataManagerRequest DataManagerRequest) **Key Points** -* `request.Skip` specifies the number of records to skip. -* `request.Take` specifies the number of records to retrieve. -* `PerformSkip` and `PerformTake` enable efficient server-side paging. +* **request.Skip** specifies the number of records to skip. +* **request.Take** specifies the number of records to retrieve. +* **PerformSkip** and **PerformTake** enable efficient server-side paging. * Custom paging logic can be added before or after applying these methods. > **Best Practice**: - For optimal performance, apply operations in the following sequence on the server side: - **Searching → Filtering → Sorting → Aggregation → Paging** ### Handling CRUD operations Using UrlAdaptor -The Syncfusion® Blazor DataGrid supports **Create**, **Read**, **Update**, and **Delete** (**CRUD**) operations through the [SfDataManager](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Data.SfDataManager.html) component. API endpoints for these operations are mapped using properties such as: +The Syncfusion® Blazor DataGrid supports **Create**, **Read**, **Update**, and **Delete** (**CRUD**) operations through the [DataManager](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Data.SfDataManager.html) component. API endpoints for these operations are mapped using properties such as: * [InsertUrl](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataManager.html#Syncfusion_Blazor_DataManager_InsertUrl) – API endpoint for inserting new records. * [UpdateUrl](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataManager.html#Syncfusion_Blazor_DataManager_UpdateUrl) – API endpoint for updating existing records. @@ -628,7 +626,7 @@ public void Delete([FromBody] CRUDModel Value) **Batch Operation:** -To perform batch updates, set the edit [Mode](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridEditSettings.html#Syncfusion_Blazor_Grids_GridEditSettings_Mode) to **Batch** in the [GridEditSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridEditSettings.html) component and configure the [BatchUrl](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataManager.html#Syncfusion_Blazor_DataManager_BatchUrl) property in the [SfDataManager](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Data.SfDataManager.html). +To perform batch updates, set the edit [Mode](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridEditSettings.html#Syncfusion_Blazor_Grids_GridEditSettings_Mode) to **Batch** in the [GridEditSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridEditSettings.html) component and configure the [BatchUrl](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataManager.html#Syncfusion_Blazor_DataManager_BatchUrl) property in the [DataManager](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Data.SfDataManager.html). In batch mode: - Use the **Add** toolbar button to insert new rows. diff --git a/blazor/datagrid/connecting-to-database/mysql-server.md b/blazor/datagrid/connecting-to-database/mysql-server.md index 37b69e6345..f477a34df0 100644 --- a/blazor/datagrid/connecting-to-database/mysql-server.md +++ b/blazor/datagrid/connecting-to-database/mysql-server.md @@ -15,11 +15,11 @@ The Syncfusion® Blazor DataGrid component s - Implementing a [CustomAdaptor](https://blazor.syncfusion.com/documentation/datagrid/connecting-to-adaptors/custom-adaptor) for custom logic. - Configuring remote data binding through adaptors such as [UrlAdaptor](https://blazor.syncfusion.com/documentation/data/adaptors#url-adaptor). -* **Remote Data Binding using UrlAdaptor** +**Using UrlAdaptor** The [UrlAdaptor](https://blazor.syncfusion.com/documentation/data/adaptors#url-adaptor) enables communication between the DataGrid and a remote API service connected to **MySQL** Server. This approach is suitable when the API implements custom logic for data operations and returns results in the **result** and **count** format. -* **Custom Data Binding using CustomAdaptor** +**Using CustomAdaptor** The [CustomAdaptor](https://blazor.syncfusion.com/documentation/datagrid/connecting-to-adaptors/custom-adaptor) provides full control over data operations and CRUD functionality. It allows implementing custom logic for **searching**, **filtering**, **sorting**, **paging**, and **grouping** directly in the server-side code. @@ -467,7 +467,7 @@ public void Insert([FromBody] CRUDModel Value) **Update Operation:** -To edit a row, first select desired row and click the **Edit** toolbar button. The edit form will be displayed and proceed to modify any column value as per your requirement. Clicking the **Update** toolbar button will update the edit record in the Orders table by involving the following **Post** method of an API. +To edit a row, select the required row and click the **Edit** button in the toolbar. An edit form will appear, allowing changes to any column value. After making the changes, click the **Update** button in the toolbar to save the record in the Orders table. This action triggers the following **POST** method in the API. {% tabs %} {% highlight c# tabtitle="OrdersController.cs" %} @@ -529,7 +529,7 @@ public void Delete([FromBody] CRUDModel Value) **Batch Operation:** -To perform batch updates, set the edit [Mode](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridEditSettings.html#Syncfusion_Blazor_Grids_GridEditSettings_Mode) to **Batch** in the [GridEditSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridEditSettings.html) component and configure the [BatchUrl](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataManager.html#Syncfusion_Blazor_DataManager_BatchUrl) property in the [SfDataManager](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Data.SfDataManager.html). +To perform batch updates, set the edit [Mode](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridEditSettings.html#Syncfusion_Blazor_Grids_GridEditSettings_Mode) to **Batch** in the [GridEditSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridEditSettings.html) component and configure the [BatchUrl](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataManager.html#Syncfusion_Blazor_DataManager_BatchUrl) property in the [DataManager](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Data.SfDataManager.html). In batch mode: - Use the **Add** toolbar button to insert new rows. From 521918107710df25b3c4a56c1b95495f0f772440 Mon Sep 17 00:00:00 2001 From: SadhanaBaskaran Date: Tue, 2 Dec 2025 10:45:32 +0530 Subject: [PATCH 153/266] 993738: Updated the UG content and samples for Connecting to DataBase Section in Blazor DataGrid --- .../datagrid/connecting-to-database/dapper.md | 26 +++++++++---------- .../microsoft-sql-server.md | 2 +- .../connecting-to-database/mysql-server.md | 20 +++++++------- 3 files changed, 24 insertions(+), 24 deletions(-) diff --git a/blazor/datagrid/connecting-to-database/dapper.md b/blazor/datagrid/connecting-to-database/dapper.md index c4c0368f88..a12462ab38 100644 --- a/blazor/datagrid/connecting-to-database/dapper.md +++ b/blazor/datagrid/connecting-to-database/dapper.md @@ -45,7 +45,7 @@ Dapper simplifies database operations by: * Mapping query results to strongly typed C# models without manual data transformation. * Reducing boilerplate code compared to traditional ADO.NET approaches. -When combined with S**ystem.Data.SqlClient**, Dapper offers a streamlined way to interact with SQL Server in Blazor applications. +When combined with **System.Data.SqlClient**, Dapper offers a streamlined way to interact with SQL Server in Blazor applications. ## Binding data using Dapper from Microsoft SQL Server via an API service. @@ -85,10 +85,10 @@ Create a controller named **GridController.cs** under the Controllers folder. **Step 4: Implement Data Retrieval Logic** -In the controller, establish a connection to SQL Server using **SqlConnection** which implements IDbConnection interfface. Execute the query using **Dapper** and map the results to a strongly typed collection. +In the controller, establish a connection to SQL Server using **SqlConnection** which implements IDbConnection interface. Execute the query using **Dapper** and map the results to a strongly typed collection. {% tabs %} -{% highlight razor tabtitle="GridController.cs"%} +{% highlight razor tabtitle="GridController.cs" %} using Microsoft.AspNetCore.Mvc; using Newtonsoft.Json; using Syncfusion.Blazor.Data; @@ -210,7 +210,7 @@ Access the theme stylesheet and script from NuGet using [Static Web Assets](http The [DataManager](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Data.SfDataManager.html) component supports multiple adaptors for remote data binding. For API services, set the [Adaptor](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Adaptors.html) property to [Adaptors.UrlAdaptor](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Adaptors.html#Syncfusion_Blazor_Adaptors_UrlAdaptor) and specify the service endpoint in the [Url](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataManager.html#Syncfusion_Blazor_DataManager_Url) property. {% tabs %} -{% highlight razor tabtitle="Index.razor"%} +{% highlight razor tabtitle="Index.razor" %} @using Syncfusion.Blazor.Grids @using Syncfusion.Blazor.Data @using Syncfusion.Blazor @@ -272,7 +272,7 @@ The [DataManager](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Data.S } } {% endhighlight %} -{% highlight c# tabtitle="GridController.cs"%} +{% highlight c# tabtitle="GridController.cs" %} public class GridController : ControllerBase { /// @@ -646,7 +646,7 @@ Follow the procedure described in [Connecting Blazor DataGrid to an API service] > * Set the rendermode to **InteractiveServer** or **InteractiveAuto** based on application configuration. -**Step 2: Install MySql NuGet Package** +**Step 2: Install MySQL NuGet Package** Add the following packages to the Blazor application: @@ -716,7 +716,7 @@ Inject a custom service into the `CustomAdaptor` and configure the component as SfGrid Grid { get; set; } } {% endhighlight %} -{% highlight razor tabtitle="Orderdata.cs"%} +{% highlight razor tabtitle="Orderdata.cs" %} public class Order { public int? OrderID { get; set; } @@ -1128,7 +1128,7 @@ Each method can be customized to execute SQL commands against the Microsoft SQL To enable insertion in a Blazor DataGrid using a custom data binding approach, override the [Insert](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataAdaptor.html#Syncfusion_Blazor_DataAdaptor_Insert_Syncfusion_Blazor_DataManager_System_Object_System_String_) or [InsertAsync](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataAdaptor.html#Syncfusion_Blazor_DataAdaptor_InsertAsync_Syncfusion_Blazor_DataManager_System_Object_System_String_) method of the `CustomAdaptor` class. This method is invoked when a new record is added to the grid. {% tabs %} -{% highlight razor tabtitle="Index.razor"%} +{% highlight razor tabtitle="Index.razor" %} /// /// Inserts a new data item into the data collection. /// @@ -1144,7 +1144,7 @@ public override async Task InsertAsync(DataManager DataManager, object V return Value; } {% endhighlight %} -{% highlight razor tabtitle="Orderdata.cs"%} +{% highlight razor tabtitle="Orderdata.cs" %} public async Task AddOrderAsync(Order Value) { //Create query to insert the specific into the database by accessing its properties @@ -1164,7 +1164,7 @@ public async Task AddOrderAsync(Order Value) To enable record updates in a Blazor DataGrid using a custom data binding approach, override the [Update](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataAdaptor.html#Syncfusion_Blazor_DataAdaptor_Update_Syncfusion_Blazor_DataManager_System_Object_System_String_System_String_) or [UpdateAsync](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataAdaptor.html#Syncfusion_Blazor_DataAdaptor_UpdateAsync_Syncfusion_Blazor_DataManager_System_Object_System_String_System_String_) method of the `CustomAdaptor` class. This method is triggered when an existing record is modified in the grid. {% tabs %} -{% highlight razor tabtitle="Index.razor"%} +{% highlight razor tabtitle="Index.razor" %} /// /// Updates an existing data item in the data collection. /// @@ -1181,7 +1181,7 @@ public override async Task UpdateAsync(DataManager DataManager, object V return Value; } {% endhighlight %} -{% highlight razor tabtitle="Orderdata.cs"%} +{% highlight razor tabtitle="Orderdata.cs" %} public async Task UpdateOrderAsync(Order Value) { //Create query to update the changes into the database by accessing its properties @@ -1201,7 +1201,7 @@ public async Task UpdateOrderAsync(Order Value) To enable deletion in a Blazor DataGrid using a custom data binding approach, override the [Remove](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataAdaptor.html#Syncfusion_Blazor_DataAdaptor_Remove_Syncfusion_Blazor_DataManager_System_Object_System_String_System_String_) or [RemoveAsync](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataAdaptor.html#Syncfusion_Blazor_DataAdaptor_RemoveAsync_Syncfusion_Blazor_DataManager_System_Object_System_String_System_String_) method of the `CustomAdaptor` class. This method is invoked when a record is removed from the grid. {% tabs %} -{% highlight razor tabtitle="Index.razor"%} +{% highlight razor tabtitle="Index.razor" %} /// /// Removes a data item from the data collection. /// @@ -1218,7 +1218,7 @@ public override async Task RemoveAsync(DataManager DataManager, object V return Value; } {% endhighlight %} -{% highlight razor tabtitle="Orderdata.cs"%} +{% highlight razor tabtitle="Orderdata.cs" %} public async Task RemoveOrderAsync(int? Key) { //Create query to remove the specific from database by passing the primary key column value. diff --git a/blazor/datagrid/connecting-to-database/microsoft-sql-server.md b/blazor/datagrid/connecting-to-database/microsoft-sql-server.md index 5e5b3036ce..6f842de5f4 100644 --- a/blazor/datagrid/connecting-to-database/microsoft-sql-server.md +++ b/blazor/datagrid/connecting-to-database/microsoft-sql-server.md @@ -530,7 +530,7 @@ To enable [editing](https://blazor.syncfusion.com/documentation/datagrid/editing {% endtabs %} > * Set [IsPrimaryKey](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridColumn.html#Syncfusion_Blazor_Grids_GridColumn_IsPrimaryKey) to **true** for a column that contains unique values. -> * If the database includes an a**uto-generated column**, set [IsIdentity](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridColumn.html#Syncfusion_Blazor_Grids_GridColumn_IsIdentity) for that column to disable editing during **add** or **update** operations. +> * If the database includes an **auto-generated column**, set [IsIdentity](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridColumn.html#Syncfusion_Blazor_Grids_GridColumn_IsIdentity) for that column to disable editing during **add** or **update** operations. **Insert Operation:** diff --git a/blazor/datagrid/connecting-to-database/mysql-server.md b/blazor/datagrid/connecting-to-database/mysql-server.md index f477a34df0..fcd1125fea 100644 --- a/blazor/datagrid/connecting-to-database/mysql-server.md +++ b/blazor/datagrid/connecting-to-database/mysql-server.md @@ -184,7 +184,7 @@ Access the theme stylesheet and script from NuGet using [Static Web Assets](http The [SfDataManager](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Data.SfDataManager.html) component supports multiple adaptors for remote data binding. For API services, set the [Adaptor](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Adaptors.html) property to [Adaptors.UrlAdaptor](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Adaptors.html#Syncfusion_Blazor_Adaptors_UrlAdaptor) and specify the service endpoint in the [Url](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataManager.html#Syncfusion_Blazor_DataManager_Url) property. {% tabs %} -{% highlight razor tabtitle="Index.razor"%} +{% highlight razor tabtitle="Index.razor" %} @using Syncfusion.Blazor.Grids @using Syncfusion.Blazor.Data @using Syncfusion.Blazor @@ -244,7 +244,7 @@ The [SfDataManager](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Data } } {% endhighlight %} -{% highlight c# tabtitle="GridController.cs"%} +{% highlight c# tabtitle="GridController.cs" %} [ApiController] public class GridController : ControllerBase { @@ -615,7 +615,7 @@ Follow the procedure described in [Connecting Blazor DataGrid to an API service] > * Set the rendermode to **InteractiveServer** or **InteractiveAuto** based on application configuration. -**Step 2: Install MySql NuGet Package** +**Step 2: Install MySQL NuGet Package** Install the **MySql.Data** package to connect to MySQL Server. @@ -680,7 +680,7 @@ Inject a custom service into the `CustomAdaptor` and configure the component as SfGrid Grid { get; set; } } {% endhighlight %} -{% highlight razor tabtitle="Orderdata.cs"%} +{% highlight razor tabtitle="Orderdata.cs" %} public class Order { public int? OrderID { get; set; } @@ -1089,7 +1089,7 @@ Each method can be customized to execute SQL commands against the **Microsoft SQ To implement record insertion, override the [Insert](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataAdaptor.html#Syncfusion_Blazor_DataAdaptor_Insert_Syncfusion_Blazor_DataManager_System_Object_System_String_) or [InsertAsync](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataAdaptor.html#Syncfusion_Blazor_DataAdaptor_InsertAsync_Syncfusion_Blazor_DataManager_System_Object_System_String_) method in the `CustomAdaptor` class. {% tabs %} -{% highlight razor tabtitle="Index.razor"%} +{% highlight razor tabtitle="Index.razor" %} /// /// Inserts a new data item into the data collection. /// @@ -1105,7 +1105,7 @@ public override async Task InsertAsync(DataManager DataManager, object V return Value; } {% endhighlight %} -{% highlight razor tabtitle="Orderdata.cs"%} +{% highlight razor tabtitle="Orderdata.cs" %} public async Task AddOrderAsync(Order Value) { //Create query to insert the specific into the database by accessing its properties @@ -1126,7 +1126,7 @@ public override async Task InsertAsync(DataManager DataManager, object V To implement record updates, override the [Update](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataAdaptor.html#Syncfusion_Blazor_DataAdaptor_Update_Syncfusion_Blazor_DataManager_System_Object_System_String_System_String_) or [UpdateAsync](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataAdaptor.html#Syncfusion_Blazor_DataAdaptor_UpdateAsync_Syncfusion_Blazor_DataManager_System_Object_System_String_System_String_) method in the `CustomAdaptor` class. {% tabs %} -{% highlight razor tabtitle="Index.razor"%} +{% highlight razor tabtitle="Index.razor" %} /// /// Updates an existing data item in the data collection. /// @@ -1143,7 +1143,7 @@ public override async Task UpdateAsync(DataManager DataManager, object V return Value; } {% endhighlight %} -{% highlight razor tabtitle="Orderdata.cs"%} +{% highlight razor tabtitle="Orderdata.cs" %} public async Task UpdateOrderAsync(Order Value) { //Create query to update the changes into the database by accessing its properties @@ -1164,7 +1164,7 @@ public async Task UpdateOrderAsync(Order Value) To perform record deletion, override the [Remove](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataAdaptor.html#Syncfusion_Blazor_DataAdaptor_Remove_Syncfusion_Blazor_DataManager_System_Object_System_String_System_String_) or [RemoveAsync](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataAdaptor.html#Syncfusion_Blazor_DataAdaptor_RemoveAsync_Syncfusion_Blazor_DataManager_System_Object_System_String_System_String_) method in the `CustomAdaptor` class. {% tabs %} -{% highlight razor tabtitle="Index.razor"%} +{% highlight razor tabtitle="Index.razor" %} /// /// Removes a data item from the data collection. /// @@ -1181,7 +1181,7 @@ public override async Task RemoveAsync(DataManager DataManager, object V return Value; } {% endhighlight %} -{% highlight razor tabtitle="Orderdata.cs"%} +{% highlight razor tabtitle="Orderdata.cs" %} public async Task RemoveOrderAsync(int? Key) { //Create query to remove the specific from database by passing the primary key column value. From 3c11bd22b362b2b444cc97258b20ef662b01b909 Mon Sep 17 00:00:00 2001 From: SadhanaBaskaran Date: Tue, 2 Dec 2025 10:50:17 +0530 Subject: [PATCH 154/266] 993738: Updated the UG content and samples for Connecting to DataBase Section in Blazor DataGrid --- .../postgresql-server.md | 22 +++++++++---------- .../connecting-to-database/sqlite-server.md | 20 ++++++++--------- 2 files changed, 21 insertions(+), 21 deletions(-) diff --git a/blazor/datagrid/connecting-to-database/postgresql-server.md b/blazor/datagrid/connecting-to-database/postgresql-server.md index 9f9bea6950..fb98c6513e 100644 --- a/blazor/datagrid/connecting-to-database/postgresql-server.md +++ b/blazor/datagrid/connecting-to-database/postgresql-server.md @@ -12,7 +12,7 @@ documentation: ug The Syncfusion® Blazor DataGrid component supports binding data from a [PostgreSQL](https://www.nuget.org/packages/Npgsql.EntityFrameworkCore.PostgreSQL) Server database using multiple approaches. Common methods include: - Using the [DataSource](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_DataSource) property for local binding. -- Implementing a [CustomAdaptor](https://blazor.syncfusion.com/documentation/datagrid/custom-binding) for custom logic. +- Implementing a [CustomAdaptor](https://blazor.syncfusion.com/documentation/datagrid/connecting-to-adaptors/custom-adaptor) for custom logic. - Configuring remote data binding through adaptors such as [UrlAdaptor](https://blazor.syncfusion.com/documentation/data/adaptors#url-adaptor). This section explains how to connect and retrieve data from a PostgreSQL Server database using [Npgsql EntityFrameworkCore PostgreSQL](https://www.nuget.org/packages/Npgsql.EntityFrameworkCore.PostgreSQL) and bind the data to a Blazor DataGrid component through the following methods: @@ -50,7 +50,7 @@ Add a controller named **GridController.cs** under the **Controllers** folder. T Use **NpgsqlConnection**, **NpgsqlCommand**, and **NpgsqlDataAdapter** to execute queries and fetch data from **PostgreSQL**. Populate the data into a DataTable and convert it into a strongly typed collection. {% tabs %} -{% highlight razor tabtitle="GridController.cs"%} +{% highlight razor tabtitle="GridController.cs" %} using Microsoft.AspNetCore.Mvc; using Npgsql; using System.Data; @@ -186,7 +186,7 @@ Access the theme stylesheet and script from NuGet using [Static Web Assets](http The [DataManager](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Data.SfDataManager.html) component supports multiple adaptors for remote data binding. For API services, set the [Adaptor](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Adaptors.html) property to [Adaptors.UrlAdaptor](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Adaptors.html#Syncfusion_Blazor_Adaptors_UrlAdaptor) and specify the service endpoint in the [Url](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataManager.html#Syncfusion_Blazor_DataManager_Url) property. {% tabs %} -{% highlight razor tabtitle="Index.razor"%} +{% highlight razor tabtitle="Index.razor" %} @using Syncfusion.Blazor.Grids @using Syncfusion.Blazor.Data @using Syncfusion.Blazor @@ -246,7 +246,7 @@ The [DataManager](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Data.S } } {% endhighlight %} -{% highlight c# tabtitle="GridController.cs"%} +{% highlight c# tabtitle="GridController.cs" %} [ApiController] public class GridController : ControllerBase { @@ -683,7 +683,7 @@ Inject a custom service into the `CustomAdaptor` and configure the component as SfGrid Grid { get; set; } } {% endhighlight %} -{% highlight razor tabtitle="Orderdata.cs"%} +{% highlight razor tabtitle="Orderdata.cs" %} public class Order { public int? OrderID { get; set; } @@ -1094,7 +1094,7 @@ Each method can be customized to execute SQL commands against the **PostgreSQL** To implement record insertion, override the [Insert](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataAdaptor.html#Syncfusion_Blazor_DataAdaptor_Insert_Syncfusion_Blazor_DataManager_System_Object_System_String_) or [InsertAsync](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataAdaptor.html#Syncfusion_Blazor_DataAdaptor_InsertAsync_Syncfusion_Blazor_DataManager_System_Object_System_String_) method in the `CustomAdaptor` class. {% tabs %} -{% highlight razor tabtitle="Index.razor"%} +{% highlight razor tabtitle="Index.razor" %} /// /// Inserts a new data item into the data collection. /// @@ -1110,7 +1110,7 @@ public override async Task InsertAsync(DataManager DataManager, object V return Value; } {% endhighlight %} -{% highlight razor tabtitle="Orderdata.cs"%} +{% highlight razor tabtitle="Orderdata.cs" %} public async Task AddOrderAsync(Order Value) { // Create query to insert the specific into the database by accessing its properties @@ -1131,7 +1131,7 @@ public async Task AddOrderAsync(Order Value) To implement record updates, override the [Update](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataAdaptor.html#Syncfusion_Blazor_DataAdaptor_Update_Syncfusion_Blazor_DataManager_System_Object_System_String_System_String_) or [UpdateAsync](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataAdaptor.html#Syncfusion_Blazor_DataAdaptor_UpdateAsync_Syncfusion_Blazor_DataManager_System_Object_System_String_System_String_) method in the `CustomAdaptor` class. {% tabs %} -{% highlight razor tabtitle="Index.razor"%} +{% highlight razor tabtitle="Index.razor" %} /// /// Updates an existing data item in the data collection. /// @@ -1148,7 +1148,7 @@ public override async Task UpdateAsync(DataManager DataManager, object V return Value; } {% endhighlight %} -{% highlight razor tabtitle="Orderdata.cs"%} +{% highlight razor tabtitle="Orderdata.cs" %} public async Task UpdateOrderAsync(Order Value) { //Create query to update the changes into the database by accessing its properties @@ -1169,7 +1169,7 @@ public async Task UpdateOrderAsync(Order Value) To perform record deletion, override the [Remove](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataAdaptor.html#Syncfusion_Blazor_DataAdaptor_Remove_Syncfusion_Blazor_DataManager_System_Object_System_String_System_String_) or [RemoveAsync](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataAdaptor.html#Syncfusion_Blazor_DataAdaptor_RemoveAsync_Syncfusion_Blazor_DataManager_System_Object_System_String_System_String_) method in the `CustomAdaptor` class. {% tabs %} -{% highlight razor tabtitle="Index.razor"%} +{% highlight razor tabtitle="Index.razor" %} /// /// Removes a data item from the data collection. /// @@ -1186,7 +1186,7 @@ public override async Task RemoveAsync(DataManager DataManager, object V return Value; } {% endhighlight %} -{% highlight razor tabtitle="Orderdata.cs"%} +{% highlight razor tabtitle="Orderdata.cs" %} public async Task RemoveOrderAsync(int? Key) { //Create query to remove the specific from database by passing the primary key column value. diff --git a/blazor/datagrid/connecting-to-database/sqlite-server.md b/blazor/datagrid/connecting-to-database/sqlite-server.md index d56b917388..543f2e4166 100644 --- a/blazor/datagrid/connecting-to-database/sqlite-server.md +++ b/blazor/datagrid/connecting-to-database/sqlite-server.md @@ -52,7 +52,7 @@ Create a controller named **GridController.cs** under the Controllers folder. Use **SqliteConnection** and **SqliteCommand** to execute queries and populate a collection of model objects. {% tabs %} -{% highlight razor tabtitle="GridController.cs"%} +{% highlight razor tabtitle="GridController.cs" %} using Microsoft.AspNetCore.Mvc; using System.Data; using System.Data.SqlClient; @@ -197,7 +197,7 @@ Access the theme stylesheet and script from NuGet using [Static Web Assets](http The [SfDataManager](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Data.SfDataManager.html) component supports multiple adaptors for remote data binding. For API services, set the [Adaptor](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Adaptors.html) property to [Adaptors.UrlAdaptor](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Adaptors.html#Syncfusion_Blazor_Adaptors_UrlAdaptor) and specify the service endpoint in the [Url](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataManager.html#Syncfusion_Blazor_DataManager_Url) property. {% tabs %} -{% highlight razor tabtitle="Index.razor"%} +{% highlight razor tabtitle="Index.razor" %} @using Syncfusion.Blazor.Grids @using Syncfusion.Blazor.Data @using Syncfusion.Blazor @@ -259,7 +259,7 @@ The [SfDataManager](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Data } } {% endhighlight %} -{% highlight c# tabtitle="GridController.cs"%} +{% highlight c# tabtitle="GridController.cs" %} public class GridController : ControllerBase { /// @@ -697,7 +697,7 @@ Inject a custom service into the `CustomAdaptor` and configure the component as SfGrid Grid { get; set; } } {% endhighlight %} -{% highlight razor tabtitle="Orderdata.cs"%} +{% highlight razor tabtitle="Orderdata.cs" %} public class Order { public int? OrderID { get; set; } @@ -1115,7 +1115,7 @@ Each method can be customized to execute SQL commands against the **SQLite Serve To implement record insertion, override the [Insert](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataAdaptor.html#Syncfusion_Blazor_DataAdaptor_Insert_Syncfusion_Blazor_DataManager_System_Object_System_String_) or [InsertAsync](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataAdaptor.html#Syncfusion_Blazor_DataAdaptor_InsertAsync_Syncfusion_Blazor_DataManager_System_Object_System_String_) method in the `CustomAdaptor` class. {% tabs %} -{% highlight razor tabtitle="Index.razor"%} +{% highlight razor tabtitle="Index.razor" %} /// /// Inserts a new data item into the data collection. /// @@ -1131,7 +1131,7 @@ public override async Task InsertAsync(DataManager DataManager, object V return Value; } {% endhighlight %} -{% highlight razor tabtitle="Orderdata.cs"%} +{% highlight razor tabtitle="Orderdata.cs" %} public async Task AddOrderAsync(Order Value) { //Create query to insert the specific into the database by accessing its properties @@ -1152,7 +1152,7 @@ public async Task AddOrderAsync(Order Value) To implement record updates, override the [Update](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataAdaptor.html#Syncfusion_Blazor_DataAdaptor_Update_Syncfusion_Blazor_DataManager_System_Object_System_String_System_String_) or [UpdateAsync](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataAdaptor.html#Syncfusion_Blazor_DataAdaptor_UpdateAsync_Syncfusion_Blazor_DataManager_System_Object_System_String_System_String_) method in the `CustomAdaptor` class. {% tabs %} -{% highlight razor tabtitle="Index.razor"%} +{% highlight razor tabtitle="Index.razor" %} /// /// Updates an existing data item in the data collection. /// @@ -1169,7 +1169,7 @@ public override async Task UpdateAsync(DataManager DataManager, object V return Value; } {% endhighlight %} -{% highlight razor tabtitle="Orderdata.cs"%} +{% highlight razor tabtitle="Orderdata.cs" %} public async Task UpdateOrderAsync(Order Value) { //Create query to update the changes into the database by accessing its properties @@ -1190,7 +1190,7 @@ public override async Task UpdateAsync(DataManager DataManager, object V To perform record deletion, override the [Remove](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataAdaptor.html#Syncfusion_Blazor_DataAdaptor_Remove_Syncfusion_Blazor_DataManager_System_Object_System_String_System_String_) or [RemoveAsync](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DataAdaptor.html#Syncfusion_Blazor_DataAdaptor_RemoveAsync_Syncfusion_Blazor_DataManager_System_Object_System_String_System_String_) method in the `CustomAdaptor` class. {% tabs %} -{% highlight razor tabtitle="Index.razor"%} +{% highlight razor tabtitle="Index.razor" %} /// /// Removes a data item from the data collection. /// @@ -1207,7 +1207,7 @@ public override async Task RemoveAsync(DataManager DataManager, object V return Value; } {% endhighlight %} -{% highlight razor tabtitle="Orderdata.cs"%} +{% highlight razor tabtitle="Orderdata.cs" %} public async Task RemoveOrderAsync(int? Key) { //Create query to remove the specific from database by passing the primary key column value. From 4a913c23ce5e960175b437e3258341e079a98d56 Mon Sep 17 00:00:00 2001 From: SadhanaBaskaran Date: Tue, 2 Dec 2025 11:01:17 +0530 Subject: [PATCH 155/266] 984957: Updated the UG content and samples for Row in Blazor DataGrid --- blazor/datagrid/detail-template.md | 4 ++-- blazor/datagrid/row-template.md | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/blazor/datagrid/detail-template.md b/blazor/datagrid/detail-template.md index b494822110..e65d57512f 100644 --- a/blazor/datagrid/detail-template.md +++ b/blazor/datagrid/detail-template.md @@ -11,7 +11,7 @@ documentation: ug The detail template in the Syncfusion® Blazor DataGrid displays expandable sections for each row to show additional, context-specific information. This is useful when rows contain nested or supplementary data that would otherwise clutter the main grid view. Define the template using the [DetailTemplate](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridTemplates.html#Syncfusion_Blazor_Grids_GridTemplates_DetailTemplate) property, which supports any HTML content, Syncfusion® components, or custom Blazor components. -> Review the [templates](https://blazor.syncfusion.com/documentation/datagrid/templates) topic before adding a detail template to configure required settings. +> Review the [templates](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridTemplates.html#Syncfusion_Blazor_Grids_GridTemplates) topic before adding a detail template to configure required settings. For an overview of the `detail template` in the grid, watch the following video. @@ -2111,7 +2111,7 @@ In this example, the **.e-indentcell** class targets the grouping indent cell el Customize the toolbar appearance in the detail grid using CSS. The following examples style the toolbar root and button elements. -**Customizing the Detail Grid toolbar Root Rlement** +**Customizing the Detail Grid toolbar Root Element** To customize the appearance of the detail Grid's toolbar root element, use the following CSS code: diff --git a/blazor/datagrid/row-template.md b/blazor/datagrid/row-template.md index a75adefcef..dca9947a39 100644 --- a/blazor/datagrid/row-template.md +++ b/blazor/datagrid/row-template.md @@ -14,8 +14,8 @@ The [RowTemplate](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids. To enable and configure the `RowTemplate` feature in the Grid, follow these steps: 1. **Set up the row template:** Define a custom row layout using the `RowTemplate`. -2. **Define row layout using the GridTemplates component:** Wrap the `RowTemplate` content inside [GridTemplates](https://blazor.syncfusion.com/documentation/datagrid/templates#gridtemplates-component). Each row template must contain the same number of `` elements as the Grid’s column count to ensure alignment. -3. **Template configuration:** For more guidance on configuring templates, see the [templates](https://blazor.syncfusion.com/documentation/datagrid/templates#templates) documentation. +2. **Define row layout using the GridTemplates component:** Wrap the `RowTemplate` content inside [GridTemplates](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridTemplates.html#Syncfusion_Blazor_Grids_GridTemplates). Each row template must contain the same number of `` elements as the Grid’s column count to ensure alignment. +3. **Template configuration:** For more guidance on configuring templates, see the [templates](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridTemplates.html#Syncfusion_Blazor_Grids_GridTemplates) documentation. For an overview of `row templates` in the Grid, watch the following video. @@ -644,7 +644,7 @@ The row template feature is not compatible with all Grid features and has limite - Column chooser - Column menu - Detail Row -- Foreignkey column +- Foreign key column - Resizing - Reordering - Aggregates From 8a7ef03661466b252b7b81c9af00b0f8e8b05b30 Mon Sep 17 00:00:00 2001 From: JafarAli Date: Tue, 2 Dec 2025 15:19:41 +0530 Subject: [PATCH 156/266] 993788: Need to update the blazor file manager documentation for sequential upload sample --- blazor/file-manager/end-user-capabilities.md | 10 +++++++ .../images/blazor-filemanager-fileupload.PNG | Bin 0 -> 76899 bytes .../blazor-filemanager-folderupload.PNG | Bin 0 -> 76539 bytes .../blazor-filemanager-sequentialupload.png | Bin 0 -> 45393 bytes blazor/file-manager/upload.md | 26 ++++++++++++++++++ 5 files changed, 36 insertions(+) create mode 100644 blazor/file-manager/images/blazor-filemanager-fileupload.PNG create mode 100644 blazor/file-manager/images/blazor-filemanager-folderupload.PNG create mode 100644 blazor/file-manager/images/blazor-filemanager-sequentialupload.png diff --git a/blazor/file-manager/end-user-capabilities.md b/blazor/file-manager/end-user-capabilities.md index 34cf943126..e6a0148b7c 100644 --- a/blazor/file-manager/end-user-capabilities.md +++ b/blazor/file-manager/end-user-capabilities.md @@ -141,6 +141,16 @@ Refer to the [Toolbar](https://blazor.syncfusion.com/documentation/file-manager/ ![Download a file in Blazor FileManger](./images/blazor-filemanager-download-operation.png) +### Upload Files or Folders via context menu + +In the Blazor File Manager component, you can perform the files or folder [upload](https://blazor.syncfusion.com/documentation/file-manager/file-operations#uploading-files) operations with the help of Context Menu items by switching between the Files or Folder from Upload menu item. + +Refer to the [Context Menu](https://blazor.syncfusion.com/documentation/file-manager/context-menu) sections to learn more about the items that are present in Context Menu. + +![Upload a file in Blazor FileManger](./images/blazor-filemanager-fileupload.png) + +![Download a folder in Blazor FileManger](./images/blazor-filemanager-folderupload.png) + ### Searching Files and Folders In the Blazor File Manager component, you are able to [search](https://blazor.syncfusion.com/documentation/file-manager/file-operations#searching-files-and-folders) for the wanted files and folders using the default input search functionality option. diff --git a/blazor/file-manager/images/blazor-filemanager-fileupload.PNG b/blazor/file-manager/images/blazor-filemanager-fileupload.PNG new file mode 100644 index 0000000000000000000000000000000000000000..b5d21a7fd90ea6a28568bbbb8f8ba5f01ad11e8a GIT binary patch literal 76899 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 literal 0 HcmV?d00001 diff --git a/blazor/file-manager/images/blazor-filemanager-folderupload.PNG b/blazor/file-manager/images/blazor-filemanager-folderupload.PNG new file mode 100644 index 0000000000000000000000000000000000000000..16b7d656896eb745635795b3d3ee1d5c9f0c1f68 GIT binary patch literal 76539 zcmZ^L2|UyP|2RTYQmK?%LMN4*7%3`egd(QoJ|<_58C|+i$$d=jBS)^~*rpP>Z*y+$ zW5X~uHnabmj!&P@@Be-5@z~?N_wjr`U(fq`?S-MfHWw!!CleDB*R`vcjhL9&7MYk> zR5;jyGik+@;Y>{Xn66#cxcQKIZkQ|aruQ&|K{?=OY#kTRCsJ{w(mK<}hJIcBpxiK9 zvm3Jd02f0eC;LuoM!KE(jGWbpY;pRfjD)7VrqW|2xLlssW}Q{QdcT9u{)7#qn)M`Y|#GWR86`_!43S^xe@>1R74%)%iO z%*4VWn^N-zSkMpU-79d(qdI&cXlVlX4hS^Tv0+3V|>0kSE{S@xMMTFs^g; z&F3*pzdq{MFg5#@cK*i3L4>*TC4j>=BEP=W^EgU9n9wFuu@8=I;rG|I_C}W1g4@rA zJUb*3j4LwMuHXN2Z7F1y(&zuaJ6L_5m16|cs$3-={`cayX_2zdc0}|ia9fUjHPSmG zQh&cm{Vbcq?%x>xf?ftdLi7d(q)qPs_Z0wGJUDp&Hm0(lnV2`&;p&wUzY*!y3O4=E ztDVlOGogFON+s|9XK}#K7U>#}?e#Ps76}H+ivnx>4e6#uF!k3`fATWK^dLZimnGN% z8@rX?sQ|HNEp;dszOUo#M~Z{rb<1TQBI=4rU614mp;YupLqO z7s0o#%A%RXE(7m8b=(lgv>84>fJ(b0_JQv&d5Sj-78U)2sYtN;DqA@N`ik0H(CrIB z-Ue4qQM-Lg4l~>{gdW~|Wz}y*S9?-sh+*0!20bj3+8pJ%OCJ+pxw5;ubp52Of5ptb z{F}j_{>%Gdb<*y0msoQp7ng&BC_mDuw$`-asW&M@;W1^iOJDq8>ubSQFFW*x2N7zy zDk#5vsbq%W@N!L>KmO?lzV(H-{)l0$+)dal>?Vl*#n-Dp3WKK#gK|L_#W!FK6Uvi9 z59f>c>>nd7hq*D5p}lF`0AXag-C2WEZGRB12v%uz{id?|j@|9vf34q$1?F#vk$`mh z!iLgRSO$I3P-KB+nRryk#ks!JC;2TMG;%Lkh;U<>pg@qM7xsQ6 zcyo-O=VYJViE74-IgvO>7 zBDf7}2eppfTzLqVIDsxRh;R|i-un_qp~ zHk-!_&oSORXrSqNrOCJ7Kszxov*3E5e*HY7SjgNz4MiIqU|sU`zP6!}vY)kj1X%~w z6&}#>uivSbN!csqs*%kGC!~~;#xUJz;(bj=1#ieNW;qb zK7A;aCyBa7!{z%{Z@ynZkE>L!#SgC3*kOfU4zF~G0?bOe%>42nA+6Q5#vq&`-aKCx zf(Y_;c6=BZ&lk#k^m_lCah_>>Y9x2(;+ykN$@YC3%1d+o)RkMa zzP{MZsJ2`@EY&9;FX-69p4{OI4}>f4l^c{qXNCOW0Cio-Y?gEj$h3YDGN@*QM_)#= zdCFTo(_P#=*rGCz9Qd|(G@saWbQ+$jwQCGxA7q3X76+BwE5lj&eP1tqQu4$!Wi@L7 z)j@yshD{ZpH)rk;5>>@gf=OxBLA)lurgjDSXZG&> z+eW2Cu^u_i@{~<}-QFn-5)V`P&PwF&S=j7APPXgrV}OD_#B4Z64r(7l(abGGQjZvkTngPDx^!PU<32)u7$=zacTxc^hvVEsE3yLzzD4;DeCYoYkYK04 zUuzJ%A_Mw3N{-DJW%YqDV%1#HA`=sutKlyxeOy0+ZsaJm=s_B}kxnc*&UVVIgmTj3`g=t#TE9w(yS9?^beOo+R}UQ_tPgo{w%nMbdJV_^^T8 zWrj=FSN*WClT-SxX^?aGwk!H4R@h>1Qq4XRjKrJVo(sOHJd;@ys(?PTF4khlXz{;o z0FqZEYJvhT!QSRHP2{W|QJ`lUNOP%N5>`15YpRNv@4mtdPI;yFz;LbQTh5rEw%~_R zY0B(dy&N8shuJ%f4{5#4YJ5=A_TbUkh6F+>);AgT_6ZY9KMQPq{yLNr3Tng(J-l9c z-~RM$Htg|>38BspmRf|h7t26yOz3EXHLNpF# z9;mQ)Jtds4+!7tIku%mbb+)760o&%gHjBi|e>tFS_01JCTs6n7cSz|CO&9u?X4$ug zg*Y?Te4wQSG5;*gE2vtkvD&haD!l}7mdkzMvO?pSm1=ozn(B0HaVSbU53&ORt+Pbq5`Ag=ts+h))5p&YkM>T#r%h10;YniN@9kepgm$4$ zs=O&6%7mOx(A}6gr>LPy-=m5ssTm_4ZIMCayA+wvmki?=Y6 zZoAQ^hN1~HT82F%B?~U}V<6d&EN*fv7&Q7MGF|ep!;SaSVS@K*aT;wQD*{=h)(%^8 zS&g3?=)=Udh3d<ZsSALYAneuW}|*^O9jV{Oi^F&%f0;gf6{;uBJ#*7a{^y zBDo4rGLYc`&N$VKX>c}HdCg?k2&imK3wqWM`ej~{T=yd@$ow4K7?UKwcK*4{z>8~U zgh5NAHl-LvjmX5Oi6V_k12Yz+K1-saiCgEj*5QqQ9m&sM1XLd&OzG#1J&8!lRZB_7 zOH()fAzypYH*l(+J$GBZGEwb|=JuBN6>cfmYE+?;%pv^+9rNT-ne`pg^3NSuLb1HZ z2R!ohQ5ImYM_QSp#H{us$iPaAY0DGCBP-)*uPNqPR-aVPjZF#YF;|DFjirQcN0uMP zmmayqol3LXA%W9ttkgGcQLVi*-j8{~b;=HGK*=U7c)mX~KKp*wd6J?9KW70(u08tb zik;QYK1LYL0`J6T6{%+_@HzKB&_^Gj^eK5FOgtx9CuB7GZ@Q_}Q-%zOLK(QLx^lw-C4M}MZz|%) zt9{b-4=xD@oS;SNvI^)1+;^NFKJCRg%gE7Y z2xS!e61wbzbZL7VTC0e)206}*InVFHanr++Z8r>}t5hj!&?SmzS)(7)Yq}k!M6i;c z(!1}8RRh_^xL=?_Bf$C1I4;q`vi(+BuGVU6L;BT{0hi0UH=O}C8pIOT-f3Wrd`|wK zMCyb_is;MgTr+S)dxt76pCQv57Pm+EywNwYgZ-PiytU8YRQxy-vQPVMhUa~d1HOXl z^p$m#(Bk%?ZHYOLA^sZkCY^eU_W@w;iymR_V|TpWdp^5h6C%E_yk?+)#E(xS9kiR z15P3BNe+l|L0ux)t4p;QTt0)^KT@u^+|2O6es+%-!ac2@nTp)C=wnIo3)2-`HhfgW zGq23hM}OEg(LYkKYizoD_r+zobC>L~anPjK7fAx%@h^11p%NUQiw4=>(brun5_C}q z>bh93Br3G&1`lChfWBiZ1OjEmU8CulQItFQirIj;Y1C?wr@$R!T(SV$r^(;70O@;# zfHtLm=fwmCK9?c{36dU;@SNcc`lHyr86TUMDtuVqjeE=F?vn42>XuaT zRyLh$+kug~NF9q87vMs-1BC4G8n*%07za5JU0Z>w;&H$9M^pRo23+lVuU7XRz$7#U z`OOG@ldY~HM}Npn*iTw;BgM~UFa+|IJX;c&hJiRBa+vG6cQOx0aQ5(R;%CTX{v_X+ z(V57Ao+^da9-Wv<+X$hj8RE!fj~v)G}#8l{E(WT6ER=LTm-+d8L5d1Rhb z&{_4Msql#*yQwf)`(4R%1_RkF&iGJdhr+TtZLFg(tToF&d@pR=P;xd9mk<`me7FRW zpe0ZY_mR%L%C(FlJ@GUa{!U8_KL`7?m(d>Ax+Di*MJG=ZuR6tva1Bq}#Cs2X5Rd3U zoyXsiCiBSpUuxK0f~$Q1FPYv$egBR$K)XCed^v>VLiK6|B>CWpYLcth!WIX1T3WDK z!M-|=p80Raelo;tXE$`bCnv+Hura85%#NOpgYi;-CY(zdA%U$+J(c9F9fxjTQ0ggp z&JDp>K_WMcS1VZ7;a!>bE_<9HVMk0v@{+sYR&U4yr1_^8q7$u>n1ULHbKJhXwYQqa zHVARlDCR3``0_k4$iD`!7+*eadsboWOq!{Chd6WxoEovo^sciO{NlpIfi;rmuzA($ymD%ZF?{nfS$-)PjsLI!C$w3O=7TT>L7Qes z+RR*F`OwKwv?a^~zkC6Me*p0oP;9Qf3h$MeTraUHN$z**1QO;n%K3=(AbHjNEZ;p{ z8apd=7ABg^oy@O%<;#$_qIrmUO?i9vEY-5uvYgAYN?*{O)6Ks|#6DP0Xs+y@wY@M@ z6_ZpopET)d0u892lQH+E@SF;Ae6^pClzbEX66!!S)P8^AZT*pq;(>{E(l`hs z4I`gcz0ok0OpWSQTlS>4s_hr+B@E5SlibV|o@37UV&w$$zn%|~uJO{jf@b%ZR?_wn zTri1XU{X|I!nJ-AV05el`9?IHWc(~zY+gsU&8~1WL zU)a@}U|61?Fhs;C%90%4c|qs?DXslHGCUa~I0YIE5K28MtaeFQ`9gq-)B9boX%LhQ zjnRG%Nn6}vnRbNQW#XHyG~p&DwO57;73AAoPNNb7ztpwBI)n2Uhlx^0Jm&+}ZXjhp zYHEj4*c$A4)N1r`Gw3EIsh$DhpF*zKvBm z52`u`snF#jMc?Q(?nqP)Uz(7Q9{>x zlPD}MzRor;G}I7aAUO`HIuRiKsc9`S9g+oN8(FOlxHwSps!uAzy@QXKDC<7>w9$N1 zyQ4lfC*ua0-1`EIy38wJkr9y>s}MAogixIhlvotx1d2eCXAQxa5xF99nV3y!y>dbi z+%w`}JjOfRpG#3g)03;fqxUMpRuAMd?1LFJ@^zIosI2v+tECM}$^(wu z)o#wd$V%k>p=S^)Inrk=OZ37~C#I5yV#<*pPYjZe;WFlt6VPQ4DDgvK#buwI$Q56( zZlyVH0dOXfYLRknKyIZ4E(LSUF;b1P9=!o8;S6^-I2*)a1Yqc)@^mk_i%^MQp~`L@ z>XV3^ln|Jfu97iBRv%AW3X5la(_XbFNkIGD%OTJ^zJVmI;ZGX=km(1-xJaSs!fMY2 zLcS3$YYf`3$op8QFV?vURM;{2nyf6i5zuhEQV(U|dbK0rxa5D`)LF4bA3>GxwW-Os zGc1f0;@Cq`w3!`cM8nxANulltc+|6S8 zq)g4=GgYC^SmJX+Ttc{J+uONfox6|%ui zXi~*{pzh09zU}|yJ)Bl6x=EP5G^-rYdK@!aziUjm1R-Nk6`>-o@(@BLRS8?=7m61~ zl;=MjczTT9@2`SV!KhNWS`e8{dAw*ick04&vuAgXq!HL5ptJxw zbTO+`-8istP*A};d&1z_W&b2HsBqrfrm*8c^juE-fkR?H8vyF#yV`AjYOVQY>$#Kh zwvY>!3FBRxv>;tx%Lj1sJ={XzmexL| ztEk|F$Y0gM72ihIhM>fP;YMbVjS z(^}Yeht^}7?c>T#k8<2Xg}R|+kI%V6*FiV^I1Sf<_X7~3fLteQz|NJc?=xglz1q~i z1gVJ3UnpLTF?`ZJ-N#xGQKYo;lAScDwA4A5mLL=>9BH`5_okTCr~I|xRd-qZLW!je z$Xlw>+lgv43*TSg+KZ7!T?MPQR1Y4_-ax{u)xmm~2dBJIDu&98yX7%{o5~WsHttHk zR@E2D9aOt%Pkhte8EN4}lJ41sKuZ*Dn9H5TR+E2pAP)K#;ByNFP^&mKRj4=?bdk9)L_%ka*N!Zst?Oh!KH! zXNg5VycJJB=B=mH8);Qfv>O8U7@ROf8nwBOxDzMn^fSo+T`kz> zpdW(S%ybpaJLWJARTW8j^Q#G$z$ zDkIV!UrX2YG+DX-amU&r!IM#PnKh!q82h^Z44DE9`i{TJ`rss{%AjagxR6?96Sm7L z!HQe3Ji*UKB0b;ond6#JNBQvS{b^jYms||!O9AG6XT6i%y1Aa!qVr2aK-sMEz}=_s~c?$ zW1w>-PoF?oy!ULF+UlZILAq=k7~S-?yN)*s^k zOtGHTpz3E*YvYu~j%)eW@k+N}F(x;aD&GesJzM}3xkPlSx-B`UFgZY1q7Q!3WE?r{ z)!tCDx~h~!Z68eT()10~<^?|}ld@O@+F##(Iahvo~%}3Ce4d;iSN7NY3tBr|l^%71M38wFdjOvLkW!+`< zm-d5`R5@FH?@pMzW!%-$)c&g{`8L{mKq)^L!8e)eQ#cVF-fYy!Om^7Cb*s3VoF~ zaEt?4QupEeksG$(9z0PO+pS12p1viFd|Q77=PW&PN5?13^AV-2KI;nW_5CS({_SLd z5MmFsDF`3?Ftt_Dxg6!c#Fpb)ZU-e_77X|il#B6bWnHxKSL!(XE6n((2<{NXto5^< ztgZ%hP}jY#{^<_zX$L3&r#UGb2Q+>q651R0gqr`|O4;V@pH8#-5F5uxJ@nZO(0QLs z-qrZK7VtCPY3E>B`A=^-WsHS&@wEQ+r<0t9Lcde+KREtrJ0IL?7WX|D_^kv?EK7$| zeE<0c9H|>~?yG?`I@%g$>^3~`KS70w0=?<;Q!lLkSzoP5aL_+(vn^Cj4gjwczm zgEm-SM}8zB7-3l%{5iBD2RY2l9VF zIUElWWze#wYo9Uy86)^TPQZjw@4zrIVn!H7|91kx1j+uanuwzu;%DEwxQb$TKr3TX zn&CUN=cVQMd}jauf5zOo+IJRc7KDryFh{qa|8h3yZ;a@jvLnX8^2pyyd9s-^w21zq?)SC#ds057&u>GyNb?Vb;#_8SVtQ?YCg(lyFQi zRA^v24QdrlGtyu}-_dB?qLMAAp}^mC+_HBbteeXi*8y@TZl!z_(lfK4wyf%Ko-U=> z8zk*EPthV5w`tM>OWSm48)v51^_b8Cs*V3}c?<0_-jpjp^`Mi5yccH%4zQ%5J*APh zl;Q5)-e`RrU}^&|*52DYby0Yp)TsuVCzW<51EUir;U3!}#&M40-+C0Hb@<`zB$_ZE zut&@t_apLFB&zGGD(k?&K;m>3G&y=ejd{ap@& z{z$!S56F+0H5^X%i&rup5@OyMtNszT^`M~!bMBvN_fJlpFtDC(O&WrNg+w!)McNzn zO3TU`)C_dw0Kv@_nEacafQAAC83DhQMO|l?Y#5yQO2}_WXp~eKpwbUs#6tbGp#R#qjH2S}MnK(^2;jd63?BQ4urT z(mf?+rD5u%UGG&=pY0vd7OdvNN`n?|oduOI`gDc1y)<|ATbC$vB&CW{dmJZCG=Ha5 zzwAgz^gio1TkNxC-Rvz)hO}VJ4j1+aKa1!(nU$0SQzhyqJy=#mx^`(+F7cDRhZ}>C zMsdB_Y|N~U2ag!ptv@^I_IOQr&^L_J74FO^C`k@_u*2DyBBxo}!aDJIaLRKaF}GE< zUJu=%G{*arfU5^nT>lmnhif5dx~a}4eJ6EYC6mApMypTjCuCE?`n3b9U4_F`T~gIn zzk7NQn`Ht5aXYtAitehzx&%Y6cqBR3nMV@tHtnc9_MqZ0$TYIoA^jR_PNaX6s7`Jg9BCQ;VFHG+@&j{?WBtPemv1mCMBvkIk4$E&j#jJ()sbCInKQx%lrc) zSYqw&W`5o*!j66x0a3&E>fKo%3pDnr*P3UXHgma3|iL6A)s}Px4h4?_wa+FK@ zFvx8XojM#=$&QL?v(Uj=Xo9-pMAPLNko(%L*@`lA@~zQRLuF&qX6{_;x(ztxrlp6ot>c|IyLXeB z((J+2;1GJ)Bofw!lKxyZsXNn=cHKa& zT66m0mEO6V%aqPRU_wJ8ptZXU?ibkHm#~vke+#zg;~Rt9G9meF*nokI>sC?y`U;Rs zcw!p?#&Ehsfpk|Yl!mHru+97$xZ4)!)%|^zkWZi1UO*>$OPr;uw6oj;G#akQaZd7W4Py(#VljA>Y^KCR1WRvz9^f}yIEEcZDf zhJ2Ah(1)ks2(Jj9ShO)=!?`D6S-#G$NiiXZFhsmo0@PSkTt6l&K(nvBsa{-zIb*9o z8(T=g^HzL!#cnFmr_6LX-V4~}v zAh6}(qwvaCC}+J=^H$YTJxG9U7K)dn4!6dO*l^&fj>&04_32%-eV!PMT6+xGmu@rb z+R=J^Y(w1qh;RJnocFuKYHKN`n}iz!-vySp?)Vcoi0?Ms7s9z~PuJ&90Z!kD3YQBZ z_3W-|-_Df@E1vO>Q*Y&NKKI3o-zCT`A9a`L#?8L0=Z>^T%5KWyl$U6NdAB1evdk+1 ztAv|SpR?ktx%~Es! zT!@}(d3z?Js8R_d%c9vRbnVo07?`0yy!Kd-8goi2VVvlE&G!fG^ob%cL4jj0_M4Xj zMII_vgrb+HHLtI<=|kOH_4DN*?*rAMB36lAia=pj-GwzMvuSQw*^GY1KEg`)p?ZUK z;)v82Pu-YSDg{2fu3*#;W+0=%s|?5G^9u)5BMoSkLI8j|z(&0nRlo7ayM&k??jvS% zJL2kzCfy^;(KJ0KXknV{dhmrF-J<>q&x?XT+RmIT`Of+SjtfZ5v}YU6pp#3!;PVIG z9pX^*qv1+)~W z((*!`KGi%TOq&WuI)jjwDXnyN``s!$jvICNK**GU!lutpd%jmp9XbIDhPVQ{6#2@> z)Vn2MP*(om=gGxgHX?ZVp z&ONmCg2s9egi(4ph~YyY0f%=sotDCYh8MGQR=rgn9#OzxalNWJiL;E&C~9{$@5*bx z@y_G_7Phj3Dfv?e`bcTitX-XW;h}skSQDt!OdgwWVTw+n=uxxDjc_^tT%I3{^g8Fq zs04F(kag4UR^|29;q_USKD{@av2PQ5Sp5dWxqeqWh+;j0tV;h7(4(+daCm zAE{SAnBnp0g;F@A+A$PGk(_lUFVF@26t@Dto5t3*Uy(Xk`lZ3brl3&Q59FZLZ$v`F zutBFugY-<=JdH3CDcv*I&`CNSu&Sb(XD^??hgGtQlnlpI4Mg|n$f)a%rR)zgzh`9y)Nh5N9%ozw-Ys`uBYW_ZBa9vzwvv?mXO z4+ZQv238Tzyuybzrl{d{Kg)y92ayBVHgNk#?vI*vaqe-Pcx&Pum*CWsfT5C;T00ea z434HIY#fy=n>Cv*t*{3u8z(PVR=ARi48SS5y#Vh4^0|A*7qMMZCd;QFDpx`e&J9Ya zuCFz9Hc@7DcrJWl)Sfb4oQx^eOOsn4C%#R#%q$64(F0eG3aPHAUJHoq|JCXJS%(NQ zJz)LOWPhKY@LJ%d7d)W^3{DUKwGf-l4_nkc`)LpXxjELE?zTSfp0vCkDd*$c6=FtR zP2-QwE!GG$CSqyM>3;4Dv9MNFQb}~<`CV)<-J?}c^gjgVOxg$0`+6@a5#CufuFX@J z`wWCxF^s|{CWlf97B0b>!f3;MBFeXZR4UAdm`&+L;OsCJpbR~3TxnO!y&xhbSzc+{ zbs$xKoe)vs14Pw;IRD3w1-^w1?j3 zrB9&?dS<&AAi6`%@x?8Z`~Hl&#y^JQHBj;J?Y8&+j*-Tgslh&~oxAt>8ehQ;ZK1q4 zPic(zi#EL2cz9>UbQEtbq6xdl96$Lpr1`a%N|FoTb5t4ZXyBS?a22~HLmL$l?4-5X+~dx%b0spTiOTLr8m?hbrEKFj48 z(^2n4-pKHuVd!J3tN?pTaVtLQ@{c|MN9wMu<{zR&HOnxu52!!ROFB=@N)n!Mhj;ZM zpV?`l%+@smtGb&ia=ZtV>IV_ZI-||XL(X=>_KvYKb*}Bc^!0)OQ{lzvrheir%eS0g zRlH*Z(P|sl`>WcK=F4gWWfbYe6LBIav&|twP~O{6-U7;KX(lm+SYi%pyUEEp8M?=|kekj2UV1~s?qwF}yo|8aVPq=ERCF~mR zmJywU+~s&W5B9j}J~c@EOMo`QJ4g;#Bm1BVks6IE#b2-_EjGV&2^}U!_QpZA1{_#c zctfW4DY}FQm5z8p-6{3n1QTAo&a_0-#w^Hd@q_$T&>b->`D2jRccpl8gQwT*_1RiK z%xrOlGG*%3pEBuoz@fgIqt^L(j>zVkYUpgux4I0LsU`d|q(({{8=rD8M6!;32?B-{ z&smb9`dpHJ$^{#%ntx8vYWw3#eA?ah@Lm&%d9xV7d5LEef}5k#GZqLOp?fJWbfE`N z1m|~gf6}1(&cym5oV|&U^#?R58(>TC<$$3K@1cRUpUL}srnuh~#1Kx7Sdq<-ItMBj z*XXAWj{`1+n;jiH@AOUJ>ZdFB|m1M+{e6c?{BQOV5J;oJ@R+<6Sh_JS(<*c zAHcATEnE1Xm;QWnEGJNKa0E&a=jSaSd%s#ZX2`}&+i-DqK3!qQvL@bjV{2!|pE}+? z4&ISpGaO|H`n+Ql2vKI>JQL4Sz(`%;?Axl89KL-f37Ef#eN8=bc$tF9(ck+UI?IVl(uylg=#aQZz?tZm2dze|LI_g@iu+(kDr@6 zTjh+f^zA5t1zEvhlO`W~N@-#x+>q#uHX(M__D|4tl^>Lbq9FNBA6kWEpEnYTmLA(qWQaUsP1XCgS-ll&|mJjQNaA?6VhA39_u_6|JP2Z zl!^l8g&IW1S^2G{zF=FMx&J~~Fn?ToK2~Px^wH+qY0mCT7k-fg@KZ@!Ta5n3PDBe>*lyjra93x}i8nqMNpk%n zXrwW&srf&02fX+97A1gL@mnSHbmzwu$V7z>4z`oQPq#PCHp%_f=L(THV142j>Hc7R zf7ia6wy_h$8uq36cPdZI1ubHf3A4PIf#7Ie{w(q*(ZSM;fkcy|JOBIOpKVs^z=k?t zjq#&N(z)|3G}FMrrLpBpXG60Lz#lic2qonf-1<(byXJh)9_5hkdSs6|-pnuf0()3M zN%Ln-=ij?iwuxD*56DRJ$^MGf>t*zDQ7%6k^C6rIQU#url(jl@E%Kd23i`7#;axpp zqoYr)oVUs!nl3NKtU82k!2G>8`ySkOo(`2R<0-B~m9XmJt4oN5 zW**TwOZjNDUqg-)qCO!yw+WL;%L%@ziuFs7u2S|qIOlxnw#@^)s)>$##sC@5M`%JQ zkG@|0X!|a@#e+Q9H5;N9yF7Y0^US|})s}4Svth1$1{{<=1MGMpse173x>1uso&yt@ zuSczJ#W5}U0<&9*Sbq7Jx!VJ=pQTIeHgli6zi2goo7sF2x$12@%NiZvK>D6BG4+dktl(F#PBg*7Uk zRq4nhsI?Hztye3sN=PQjyHs6=fz^#7WmCj6xk=n)XlU@KqI+Y%#;`d`%bC)&|0UM< zP63`Hna6mPDTr*STjPHtqApVWwm(TaA{L>H?6h^>3=i9P->FimIw;p$z9KKrBKXDsV#JgNAqm$3I&+T z6J-#5%*l-N^P(Y}Cnit7mFx*UR8p4%{RmUBBGFED1n1kN+ev{7EwZX~7W;hSA@l$h z{Vf~+FDC7CaAVd2niBcP0cJVc1*lVeD7Fjfz6;kQ&VB9{T(0m8@7CBkt)GAOdM>vy zZvbInr;v_$qhz&xoH;hk;C*;pAuzsgaNJZKVEHgeXbZ~m7M`Ny?JzG+Yf!i!@M$!ioy?ZUm5`>!# zJNMHJJ?Nrrl9FY;1>ZmpcSQY^4qXe@{a+@^=`^sIVBd_Gilz9xJ4mE5Y)&z$?4vQl z?W)teY7kH9Iqw+1UZeAX&N`b$)JYz8%q%gbUu~%t{jk(zm!mq$J(l2aTpy`F_n!KW z+IgVL4rRfJuRTMO2(AKeLb^hgGP$}!KceDaVvZj$Pa9*rJ~}9RmT)7}#qOfV=4be= z_Am2%lLDlFHrA%pvB>_b^}`12vE^mTHTTHz#U+UNR_*GuFTee+WaTyJAsoLtkxn%e zKVEh7wVB;@BOBdKH=;f?!Fy$oH{{mGoZH?B{sxKG#^S~iNQ>dy9ug*P#XR%=%WfW5 zf)eD}S9?m!tmph1t51IT0n=(pOv}M{+|CRqf67r{F0S*fo)WIUML%>WS<++r$1OJI z-2eI_rjRLK>n9wgTM^_XPqn#;OG?*uq?Lm~Mlvy3y%5|R`e%2KWGTfj>nGMF9quOk zYqwPE&{1B4nI*{^%SVAqNzz4>4Z_R~c^h&hmQ@ncE6Lv6@CIcU<=IKR4)v&+padn7 z2)49|q<2F;!)k*H3LEt&xgSxEN|ApHXNW0}b@gA|l??`vVTqhL<8AC!gjCPSM3t+y zNxgY-ABbcRGE-mtmc2hFy=7~2adzm|67UjzY7>^Pddk}-i!~_MT{QRJvdT8;{9D%m zr+wt;FFo7>@fKi?_T38_8|9-(hjx!>JHERJAfqnJ?D6lYa_c0pQTMCqAz*iMu1wqK ze*u+aJ0kZ7sQNd+y+C4fQq#5`+F+g8|L4+gv2owZH3ku<&z1?M^JOdH+NV zDI7r5e#QFjp{+9_`YbCzf9f~kejNefRGIcwCUn^}yyM^YE?=zX>TfJV*m(fFt$DP3 zfiod?2m00ry8LZMUZx^|prA22KkLeAgzJ19qOOW17EzZVGiWo_a!M9kS1pH4?D#eJ z1Yi)Oj%?$pDWvS#Zt%9JvZx^PJIM8WyTk2KrYmGEMx1{d@rdLiE;Z1bU!G*DKrQC8 z!#0lPS$e#;`&|pLxI2~awqh&STpjftGxzl9?+yDRhNS>SQX5WeJ9)!hA%bmC#7C#O z;V}6%2#&RgW^2;x{*-_L9uFcpfO(sOCC0dikH}vwbIS0P)ic_k-Jp_jy(@*XO~SDlVV* zRZ0-n6~VOYXG8ZHe0sQYidqfTdpZ^6mp7bv0a8{{a9^j{LR`+-jF)7p;%xq>wLEsb zy^?uDv4sV?9ZEjW59W%kUTVhN8w4pIma3_KT2)IwLpn@3%1IO^9bPyY|_5_FovJXt5NkTBbd7$V_E1iAB65M>KwAi$%D{e1_X%$J8`O={DG} zmjC#W+N;2Fpc0Qwe~aoL3I8)-0u+0INLKn)#Mf@V-bqYmzJQ`*p~`vtbcS77;9izdm0um zy;E$982IBOtP06V^X!Yh{JEmv$d1qRTUNZMbyS^tMAS&8S(3VOEf*lREWJ63BvZ+? z3kkN^M%Hvipm1vt9KVe_pB1o@Zw8_}w#0|;>d0gje|CwezPfmuMMQ-+_QW3DM#yu_SiVg`knS!bHOLd3>>e%w7BQXe>?IL=^uZ$dF!3iVH+GG?L#cD_ipLYfo-TB_2qJG z9#>V8*W+E@;IKL1b23K(`2ji^zhOETZDYCxGyB$NylM9yjMLV;u0fuiR{+2#Df|=A zaftwK|5D`r|KvkGpUt}RNcG{yn0FxqK3?9J=4}jm-szRO%3pH6uaPpzHh|qIc&6a+ z?EFEMT`lLP?2hapnSNBanSwlXF599;PuCtBx2>y?iLD4X_k?;6KvDJYfR`|PZ3I+; zt0we6xYqY(wE9!O%c-V_ch$w!c>R!f&5`FdJ6f?V2iFgc?EP*uiMI&%%PWNC_Sx+~+b?Cg2*~{Y7I(Ik})gC&teS~CH z8W-8RxOLmME&FNEP63SY%k-S?J>5f&2$h|f-+42zWOX6X$0xZrO;YcAeDLO&e!h-S zA<0ZzT3a8mVktr_VH^AD<-<5Ick!*#hU)M4_+Bosl1yc9pW&=^#J*%3^)9~k>EQ%q z((hIMp7z~;EFS_8%^~?tvOOuI?zHQ&Upz)M|5iVLVNeG@>mBAGv33ELA_jFxpacIDNIuPulxE{kQH2x#o2Jcqld7Wkq|1D~7F#;P zN8L)w-Y-p;uq9USqHsN02|5L-YJecDk6O4bMxzbfHs8oG9@D)puoJGI2-xu0bg}Yq zB2#ug>7Bek2@G)Dw6I2qa*IrnMpOCtS`)`$Kb=qVeLG0K zzkKMnl?tibClU;YBG0N%~xe4p(AM+cde}DfFItU`e5)r0eHVl9nk>;; zI;wta`eo@r_M$UbZztvlRGK&UZ9Vn})E?Ui=<9M=V2iv5t_f+*=QkHNMDdso`&n^n z5wCIB=Wq!SlhwrT+)YhCb)Cbj4%NG`zHI_=M<-{F;^jkp&RV34Cp6DCB*o{dodr); zorYzcR6rV!(|VoL8pbxZ!+R&{{pk~{dBzAS_=g)gVu$Y3N#29IKqDg?@dybAw^U94 zVh}y^Ydl1v%#AuW7nnI@p3v6&c0k^3CbIdVL`HbV+xWPZRTXG5;El6isGERkP8S~a zx;*i7ZuYas0wK!5=T{0}EwHvBe#Z+xgNCiiJGC??TnM~y-lI!?xNs6G7%%^wx0-@) z<{U6+UzzQ!)IXoB&RHKn9|$xYIC$I0ZC2ZQERPl%_L1 z)=D|Gm6H~k(u7B&_Oe!JkfoB&4eU8pwkNzF__u{KY2*1x5Mn8@$oq2${m|+8c*>4S zM3upKRd~~oE4Zll&7LbO4N?JJYCegro%dF=qEWXA=#n5~bh8DgXxJV#Ij1R0Ja{O_ z+h;y*DfRI$^NXISC~A| ztc52I?BW$b&SKthyi1FW%u!%5a-NOQJ2BVf_Fb4YUQZ-^T=eR``r9XmB&YI=ZU}gu zgFHx#`U<^=<>dcAs}`IRC-5|-fQR)8&Z-Wy(WwZ z0RjXFEu?)X6!mxS{r<`G%nWnRK5Ol=*1O*I?$3KXx(nCCi_HKjCVS1XCbPt?BTk&< zwH}}8nX9e4uvk#0`>+IWmFQWp2Rv0BN{ajNEr~piPTwjh&d&973$@RTvr=tSNk257 zN^l&}YRK!L@D~_xjy3**I8xr8yy(FmI(o#~VovWxbz6u2@YU(lc_p`b<1zcsR5?$6q%-MPTB8nH zE>v9mCg(?FJ6Sbw3#p{VG#zo(9T(3nmF_KTNI(*+=PO`_#895sJ^XuQHRs@Q`P@jSS~ z*BLfnwXAd(U5WjIOdhX9eZxNkcV=)Zxde2o^1{zei--9d;{|@~l9La9F##;7jD2iJ z&(08%m;Gp68!zXn)S#%rRXyjb2vRKt6m5Z-8|TISgh=XcHuaZ1%>{K?bA&m@QdI?~ z#Sa)CHjoBMrNtezy^H?m%$q;i`I$oXSNk@No~oV9wK=m+{O?=n(|=bejz<%) zNOso=%I`Go=$XpeWhN(w4Fly@0+&qHsDb30}ihrCEx!-v(%fI zXW0LKw@eM-rQ8g={ZE0v_WA#-fw*1*o)jf(zxr2oETZmU_mRDINH=YMCGe<&AODX; z@wG+x|0TAwS1tZZKeWy`@7ov^R5BbTMYq>COWoIuu-e|8_C6`%#UaDLu{3ddQugsY zeyBEAox`n7+CG+jWmIX6%~=?z^Z{ibj{hg5cAc4rj%Yk~M(oF9zWXM&&^V~_Tc~2g zBGdn25c(g@y7kvbxdVQMKkSlw21*>eSiLaR&}V4?ugg79eQ)GyO$>h?!Gc?KxQL+F zvR=W;MJ0#7*qj^~t+|)=?8-f$=>ET)+MRW>Gpn@$pv?Ze7xtxl2%&`w6VO!GWZ0?D zYjMe{5TRg_gU~tYrkUaQcFzX%r3Y}KXB2ETB!1evmmvspQ$B* z*s3Z*b;h}ZY>i1$gFil(ZFDjR8{#H+2QL6cxaAY~RliE>qw_#bZ8tVg z=qq3I7%Y-~-bxry9iTlg9$6DA62hivf2VDvic;FZg!&FI(*{(0G3qotnf7n=)TXC( zfif3Z!lF`Q6ef)Ml#z-pLmnQ{1O11S*Eoh!!3Lw&tlX&!%3f({*!WnsP(;i<&ZbL zXGWXuy)jQZGcwkmV{tL6uWJhDk6Tq033tSQ@LxRIVK((`%_@(BKP50K-R7|ZAWe!8 zyL^pJek>2HJ*U%}(~=U{tr>kOcUVNEAN26CHnRQnP?Q^L*8B%kdWt)>QgLTaAHgRO!td;u&R_1(Y&DIUc?*ZhFJ-&1=^iDlxpFhNOT*1tE74D z_biNPV2#6E2G}?3IP=dRIF)i*yvG|0EZE*ccrgApfL@VS4S-5F1_qQ^&~}iOb(=u% zC?Iw6=T%`p7p~sK(#8AGx69+^nehK4D3>Lge?hc)(T zZ;gc~Tr7osRVX?xO=HwxuH{bBE=hQU)KY$jMGoA0)iF zOo;Umh@7R?dX-qt=DD}u2Q?yZ*13_dW4+siye|V~Mo=A<8l|ETUOTKQazv!^V zhfoJcB*F zkRnd$&}>qhN>)fCg=Tjo`Q^hhvs_h>U6=A`{Y_NrtxC04kJj|S)VCvt;tZyKo-Jis z-K)%583U(Gi<=}kYAZB;tEZy`N=K!BySKgYoIeKzM(a}Dvt7akm_{yJa1Q0 zPE?DNt@nZ`hnKC-8^1{KKA%W@@4qj<QIajKbTf+$uQ7T+XZX>m5Vj>`_vfa4~ z#38Blqofm3brr==lN*xBvF_z_guRkBXgNc2j!n2F?|YXiVKysafd=GrA4s6mH=4If zq$x{b1Lva$$&u27&J}~{76vu~zy+t^yD z6@8~6+e0+XfgpPPHbx}8S+fPwYbs6jA;=BB;lbLmvP8r>-yt4u2w&~1XecqQ{Lr~3 z^Y#{jltf3G4QN#yQZFo}&)L{$48@kn6R;9)i5x#i<($2ADd|o<=^jGG(rJHc)z4zp z6@VBxD%%}$5nv@NHy7$QPpi4Ca}25yG8<;oI~q?GvX>`0kjR8Fp}>2zBpP#CP1j;j zDr<%lOX>bJ+Luw<<=|`Fl6j=7*Vs$~XY*)|4xC+34y4QQVX;==DA8_yP`9-ofyecg z=%2ap^-Ay)a_9BBK#D|y+IJbZ>BEoV)DLq9m0uZL>goEi*nZ1i-?fRo6f@B;bq$b| zdOQ2EdLj1sRstSjkk?fyP#@USNt`V6?dwtycF5$3jpdoMGa2YOy>B+Z>H|5|TikSLH4!0(RHT^|Us8_(vN#(yZ7Z8R8%>*Q|1CBNF+ z&mm^o^j<;BU$gQ^%)NnfcxK#c|7r>1d6kl^i)xg))|;opOB!FxJFtQ2YG+>`DVKGs zU3MJpJ@C~oaQ2}YdilUKVL=Q3?I5I;taSJ5dwdEk!#GDk24zNQN(#}PtNVTcKKVs5 z?ars~kz%LnoZi&mIO*|~`^E=O-zhy8*QxXaG&2`*Y0!x<;*2K?XBVcvH|&s!@R?N8 zElfnVi)${PSooGYv>sY!d(2Lf;ww0aHN15~h>J(T^)$Z=F>Tg2w9IUni#x1@r~5b| z_^ST{V`{xV^lk^46cW*_-vhC^!NB3ih;6Vpk6QKJj_RXdKhbYfbv98RbgtnvMuk24-3Am*Q5SIe*CM=7y4O9-cZi`|KrSX)sr;hr_ zVCgSN%x0-$`p3pti49nj7QVaSAOF|ENkP~1s#eiSku)=^d~0PV5X9{Jnt7kG)2*yc z>Of3l)v!`&W|N8i)idX5k<;wbgpS~D#zhec@}S<$#eejj-~lItn_o@(=09sS7xGxY zqPXavxpu?ZyvWF|Xlzgei{~b7n7LQUPhKs9BLhvGP^rCNk{_I7e0^ebhG;{8|_KT{rC)NA~Mk^Cm5KD2rNfnGg_u+O$B3W|-X+0N)3Dtn8P zpXUmITh|JftjqBx!5BCFz}AUwpLJj{axvmKPwxiW;%%&7Ioc1RFA4`jc}LgiQXehE0n=&Qc3z~4t}0cY?}g}GS^T1M!bYs(S_-6^o+G#rz8>r{|m0y z*_SMDU#S{3Jz!LXv16z;U%18TcjtNvt;Ei)H_(5)Qr~uy1FfI8@*%oN+jM;g zOf%5`)3FquX`;+`;|}8KR8h6q{-#Gs8B}I9u{DSWou10xGwxYJZs z;QN5O2nd#)iE!f;_s5P7`8t|@rEgwgRpMGFgy2+>D?zVcRK6_?bBHVnC<@j%%l=BS zRA(}Ayu^ADKhQ8M(uvI6PpR-drtF428>G*(_E<@8iRe5T6zP5X*HvRjjs)|uQKh;w zE-$$6FP1J2G()@WWqiFfGqs>mM)s08BHzk}ya4H3Z|6+0rBkN$qK9J;=7wUXJI`vM z!+=M;QXqQ8A#!fH^zno*azN@rxf&3)4#|rnQUfu+>aTu(%ej~KsdoVg2Y1R*PEWy= z(y#8LSfAmn5O*;T=y%3Wwi<1E%Gq7VlsYDfI;wX(iwBIKW-AY1aw zss9F$)HPn}Oe+rG0?1P(O9O8MO4&I-j>TQ)2!+429nk>DiqcwD!N$o8pTiT*8xJO{ zjP;duPi=Zxamn%CuCeASjJBJak@ovwzb_)J@y3!*HrH0y2*$*X` zdV{+yo`TOI!p=QvMg}bM{kQ)Gx6^b7Se01$ba5KeEaPk6hBb7BI{New(Q&FI#i6{h zPHbJeIN6Ge8e9jy^$7yuQ#t1^es9{`#~$A#-@A}Fu|BR;=P%CEAg&Ppx)0%1NpX3x7u6>OF1N5ayQ8pI8PX_3n;bjPV`n}XVz)b zM3e6PV$aBw^jQ5HQX8vkfkv_e<)(;Xel)$-gfQs=HOjR8luA+i8fZH-<*TWc+}0<&3Cdq&AN-duD(63^vXC zF3q*0KgApMfO25K(&I#wQR|?nNlbf{+($k#sez}=0>#_Fe6|Y5H15w9yIXDNS zD-Q~CrtssS;;=|3fEfJ$o6>D!iKN09j8k-8{}G$54%Ce%6fO zZnBt*VV!5+DvdUM+bE+^Sj;XkTDy=PyEu@(mK$MW5n!LD*z~c?#QR~@EA?C&Rkhx2 z_Ty7YI4#X2&(UGjhxDcZmEn8n+hQX7>b2)t&-d|}_DyCp@lzf_vCi}X>aN_K# za>>`t)OKgGSO!_%NyT7cYmJrw*`S=~JY^@<3pb}Q+tPk1*5fM6de>qRp%PUwKGY$y z-N-i)yzT)mA=ud3tbu3Je74?EjK$zL^-*E1PU`J8&kfH*F3;aPx!i+CI8S$gXpeu` zC1>~g*8XHWXDlL(^-RXaoPH-c1XdP~4}C?E*cUiXnfD;gq?IL3sXjFpm!FFChy^#d zAHMPnpTtyVR_i%{ONXe)m4VlrVD$^hgV$4?xGW26p8(hvPF$yZD?;G(&5r@$`!;2;q-} ztYPQ4@nN@9fUSQ@zBxg;&ZBcZTjI@jrrV1+o9^8wR| zV;>NS>_XyWOmc>9urY<3&#M?9MH%4`yP=X`aYO0dchlcgLce*1PXFT;QTN_9z)8;X zh+B;{L*;B7gDKT3=122cq=N=E*f`S9Zc_wh@))w|oTs~VY);PPn%3^?vND+L78 zQB>0gFIrv4c$puDr=;a4IiN6!9OZm$9(2FB)h~Jvblb*0uL1-93Vy>IvBlcGO=VR7 z%0h1a_QJxh?GR;hWgR!fpCWPnV`|xi<1w=@qD4@?in&wiJ8cVRkW8!ec9JC^{@%D# zzQ-#rIp?tNWt5`T=tih@cJ#|I?8$@3z{RxTiw_i6z8%d|{lWd0^L|PI->@kCFYV~F zrwq+>v!!T%+<%Nb&2YVD~d*FWc^oIJT?ZxEmsed57_1z*X`ZZC`YxsU3AK*MVwn!0vA zZO_xrC!U#%jB;6f$<_PzkCI>))Zb;9|wW} zW~K+M$4A13N{-$1QX38^?AiYyg)}iV*DpUB6I`R$xED}_8-&|3-@OPJETQ*$-k#Hq znI0VE7*QQ6F?JNK6&MYuu&(fWt(KzR0)A$$vE~DY6xp%Wd(?Vi^}W8F*!t^=9Y9+J zsK9)CL)V6im^%oVRs2FZ0WUcxNTZxL|c!$8vFNZv>?^u8Nd9SES zeQ0dhw`MWHtJizY6*l12Bd|A{kJ5Q&>KwoaDmZL+MbqbZ4fhan4zmg)pvwjm?A}|v z&FuA{twp_6GKyjNFlaeiJKi+ut}-G=wyqg@hu%80i5-I5FW7;-%o_Qjlv+KS6e)+* z@K0-57MS^o49f5n>-K7X%#zO$k-|1VwCQS|O1tf!y1FH1iG9!4Cw9yxCh5u2X@zuZTZA+z+%M=gixdFqLzaGe~KF?PMpzr1yGl?lG1+n z68&R(ZBJGA*_rNI{7h>-TE=gwUfE^t7`e)8MBD(TtzWqoY~3FJ@1>aRwoO5vNbA*wl=%O{((E{`FK5H+=xj#J^`5)+!d5YY9IHh7=O*1|zZIpMP z#fkjK0BaiX&3l#$-EWyR)&+9Loh5F@KsH{|bb@SmF`S;e2ogeJ@mIIv?~*^hQsVj+N`RLN?J@L_q-OaevIiJ z0wCh6NyZS>mgqdcBxO{n-v6QgbLO>$!_3n>x1m6}q=k*(-fMVN>R{&WPKQjdPH*aZ z=P=Bl2s57BYJ);F%F+TK*(Iy!gI3jqp^yN0oZ>~35Jn}7JJ$6o%Y&BQwszn$eS95H zOl_2VpH4bL?Bn;{=?t)&>7{^or)yeC@+)IGcz7f&iYhJEC)&TgEt}p7cgKl$J5!(c z44kazt~sf-VuCdB)Cc3pf>H6oh51W+c&Km$l68^*q#PMT^LN?oYj>bsi1ho zmE1TlBpcgV9@jzkk2hAm{jEqcsKvOgma5&asj|1ufFp#N`7YFz8pwxLUB_uz*q41( zgPujE>uwi#QN4-@DiAn?IEByj7aD?%QD69#tXPro^drRss zZhTAmP-@P-cd`M;*A&ZLfscZv%}?O({nhF%#h{$b|IjVXYOUO>`-;3?w#Z@BeFy)js;n@cc9*86rc}ahZ$T_krF2;7|NmaLx#I`Sp_~ zN;q9yC>@22zN|^C($$t2FkN#a7Bb3D(%EW^)W@;o8eu!U`0iq+nuF8vy-&nFV0S5A zr$H}mYQ3HXP&%$G`22vnCqjuw*eUZQaZ>0EQKe~8~! zm9NW8>cObj=JHqVKi|=B`Sm`qdF#bR*Ul5Mm`qq&B{lfdI$*KeA%7v8>cAmxc6h?# z{_U1CRKdj-Jz4gj7WYp@7VU}x2Pr&Bizhu)Pm#+BUV&o|M`d8J^V ztj&II=*GphE!;C>bf=&Y=yD9|XqNFF79h^6Y*8@jK44p*YJ7yL1mGp^o`6|aOi{-^ z!m?r4$d>8Bm~M-;r@;LQWefH0phhzyN9_ydrH~rWWSKC}5Pf!$XR1Y7CfqIqNc+@N z=bAfhys}0nbO6is4ZR)(MQ3TWHQs-{ufESF(_Ml$v)cnbmQ&-&x!{YZF zCfDs3CozJ1Z%6JD#mS+P>quo5o zYN=Z_Ms#lE;6{7eZ{L0u4Z)u zS~@H2fET~zC}`5zzge}pArCNF6~85`*V8gRGR+dgHlTr}^nM$@w3-qvDsugOJmNS_i9AM@cxO zE4~eip6-MZ36=IL5uv^gz3;0%2}Ic4&VSoMgdndWij8%ga%*Ky9P7Zb08bpd5^B4( zeT%7jm+0V6KLRj?{cClEmWFBB5=hrjbk7K{wEm=y*le87$imGJ1O4`ymXqj~+45F6 zl1`&r%q`RNbNyQUphb2iy>N58fx7z>VDOH3GT3 z@pl{a+VN*#2AYrxt!I%3s?DB=SVsLj?9oROV;e3rrce{oggmwy{L5@BzhxeEgB!$v zx{x!MqGBPUtNC#O^ky}fe&T@F%#o7V*zIk)M98qjA+2Q4`>X2+IiS^}fmCP0 z5MmKK>L~zvnSz=|CCXc*h+A|d6t$Qu34Sd#jdd6&&MjjRiKtwz*uhSaps!bLi;dg= zJ?x`ej9c5i@W3^dQb#6WIFm%1EXx`zg6h2%9jj^K4;d2$?)|);TCuUh7rY0P0b)hy zH8Miy`0Ql218JM6Y9%H1Zgp!F0QJ6@#i_-jdYd>#OUs(XUFNPr+r!6WDep&DTYPgZ zIumZSuC1n@-w`pbj#ICBct59)H%GTmIljXMw_Kag{UlLs-pIJm{kz3`^`yqY(j?L5 zE9+AB3aQ?(P;iq>D#{!Epj0ch&70Wcn=_>d!c|$9t{NjP8d{9E)KC9)1d9qCB>-*x zPfmXhcE7*TEI)Uvea$NM^|V2Iv8Gx@NSgks^o}yBnBZZR?9>ouoHiTs)#wZy4Rv z^O9qtk#U*IWN%eO?^V9jd{Q5|m|&Zci%By8b-K8kD(Vz^i;TlnDa_)2$a;^yjnONS zbAbfrQ9@xYNZ`Y$-<-DlTVtrPKe3k;o#z=uPw1>nvr?|X?&2ikFu)YUm}=fa#kXZ_ zfF6%LPm#YJ1Gnj;IPg0O%3otKnt#FXT#mdxMInA(37);DUQef9Z_E zjy@!^@negM7<)Swea=dz3gjG1m8_c*!=iYF?9DUMm2xa-!e!CLGMH=c{8Ia;D`M_g zw^Wyt`>%38RW)_A>HEW|1BS)Cl-*Uejm8$=W>C|P{pI#A<4ywGJ;Ov~f)IP=>j*ic zGL6Hbt%wYm^-_~cEw&jUfE@ue&84&j==+$cNe39(jHtDL@zf&s_2Wdz%^68pC z4uvVgncE>0*pPNF@=e)2CDnn};jhdKD^rL>=cjR!Di$d!AbD%mx?w^9TgFDTR|=GX zBneVx12CE9u9#^_e=*a*b9vm3$H8d@ukQHgz3n;DsyzGXW3-z6nRbOS>iElaEs_V; zgqAJ82uCa`UJJDzP&i18mqa+D5;G(b3GCiqr;j9H|00nBT8#j9c1gPZs+AoB1K_r- zA1rgH%R2`HT4X#j#KtpVsR&0H9KMy35ppM$x`BfJkcI}M!PTTYqgB@ShAm#5zEHDw z3kE27zA;RV=9D_rA$_4AZC~2Whi$ykR9%k4)eO?^NVc!mQjWlN@T2@Re~%c7b&E`@ zqr0cT1<(B5Gj^+4B5~MqVM!o%M1HvhEnq z%E97sa{6Hbi%SUmW4qlZJ1;p(uT{i72F}H8kxn`a$GpPA)2xhkEN!Ysj{4O1d_sm` z=hG2@QgM+u@`<`9%e<_6nORvRdJU(>kwM4nc-%k@(xPy!RAdg4R z?c8O}$Sf+Nu16O>W+a=Z`G4E>d62J4Dq^~T(dqe;xG1V_fcS3^WIIFIS+73Ey6Q^HZdD!AC{Aml+Jj` zL9n$d@JwR4Z!L!$z$^V|hYBEUs07W^&$r&~Q?7FpmQN%*ttT-^v5;me=@Y@^+Pn`aI% z8L{}VkX|SVcJV6LLRd4Z+5)QFJP*pGs4tBGC6#4nz#(24?p`&XMOKb~$tOj)GL>Y! zWB>#%8DH)6yGHP^nTjr%>#NjvJV`&I#C@J^npNNc!S|KA4GVd&6pC4w58?}u&=vqr zs5@XnIt+MC+(q>Vd)@^E(*aidSlo|0^nVkv#nv5pY*Gnj5||O{G4Gy zxV6IC2@^S>d&4nx&|6%({%~~x^Y-vKt^|3aDuCJlx4exI{mOU7sDE~z+h-D9o6Y)& z<@9Id@W?0R0Th=nUzf+IgGQE3go^|%X{60y@U2Tn$wezL&3_&P%Xz87A?Ao07QdaS z;sUe5dhzh?jAZ+9C1)JkZZcp*chDc;@cMkvR5731+k&qvYkEJ)oH( zTX|RNazES817-HK3Ml3-R|uc^w+t~Cw)J;u4HsUj$Ff~k-nFBvAprIs6ZXb>75KGH-Om<2f|yEepR3W z*CMy!TfS4`^DU&Lw|B>xuu`mcDIq?k+R z;hZS(qe4R`g<|rKCdkjHC1O-hYQw9u@iy*kds2IyiEc z7)^1bLdr_CRlP%Ig=V8(^T5z0!)<(J&z(~tgT7}^cPR81v9zm3ZFAeG!2mg6<%95Z zHCgVZ1Iq@Awra)Q+@t$}x$&SBq7(qNigQdA@njotBs@y5!iv@RzmL*hPiz2Uj|+@f zcA>j&U?UK_3i%(lznV{PK}-=KJ@wu8p8qG}RT8mCFTpg-1+ynTtS-j(FMAgkGSO%i zi>Lwll6vPKn85=1a%OvDdbCs(HQV@m zHQ-T1O)n4g^(1n7it4cPwl*j5zs0it%UZ12K3Q?1gI9M$5IeFlw=O^-Hu;)CLVMAQ zcaUZc(>U(g-lvOJ!@0(^la>`1I(k(0EsBuIxL*g<7O-QU_X`s|JAN%R1iY(ip?!NX1a zfjQusu>8RB;Fvo#Q`(*W=%Q@HhQzXrn5gcy;H_>sKt}Y8`mvn}(*bk=W*)fz|7;tl z+yWXE6Q56P_~X!eR02AzEJ0kF)T=ZV`UtYEVN>>)nERg6J|Z3a`x_ey*Kn`dxGdN^J^zR^9|R>vj}?gHiiZIeHUQSVEuA2 zX&SFnK{C^#g=8+)ZC$YqEr2$fi^-YgJ7M=T@}5aF@AAP106N!$q0$BZy?RTkvo!g3 zW^tRT{WR{O9BR+_Y;40rkGVX~?1d!J+!7$iY*GX6v!0q}-?!!(0Vwb*Wb|I7H)Dq# zz+&_PBrk_GfqA6XJX0;WmTE2d<83CyBsOsQk~Z|x`p7y~vd>)#%+{~D-Ke5|jq%F% zsUs5sL_ERzKf5W}FmGzFa$xZ06-DHV0zWHaZLw~<`{Dr9W{i?wM-p5Nh(*_YP}3qc z*Q>qAkdQLmoLm+Ll_Sa<@q6fDicQwYwML)0jl?zl=*4A0tzno`6Cx9%WYOOSXP%YVFv$I)gd>pulR4I7OfcXj9@b#qrX60ZXp02dj+yahSP^|t; zPIc3m!zjcm$;#g6d_(}{&H5f18^`x^Pqr0LP{dQ3w5GOrrnV6AB0;J_eDhAXgZq42 z8?NpM&~1nGS;N3tjZOVA9^I8_6=o&H7}`5Rr|VzqoT;N(3Sj)xZX_$$11#rnZg+iN zd9Ojfgj#J}Lg3lr?mwi_oA@)gOu(S@Mbd=^#Nw}u zFEY;=K5r*1`Og3szPOxl`_>!A(8pufaxVxn$}?`TbSlb7uAZA7h6Ji^q2F}FoSjvT zRWHucE;Ri5^?Yf0Gm5vXaUZ&YtS>#SMruC|#<(fnlJD}k^WZ;P6r%Q?5B1xGU^dUSQT#XJVfx*N&+sJCY{JykEl-4a*WP&HdQ?0`4eI zE&I0R7`Y*sR&pRs7B42)bmZ>8^-p}K+WpbBZ+<)JjA1UrS9%7S3#8SVE~2A={D^YF zlt|42mHJ++-R?#kdoDN7C|%E~s;yHH(-LB@JE%HfElCT?NgTN~_1t(oKRK`f`XFyW zC??Tl5a{9I%Q>^t%9wH^YwV0|+{zvBCnSpz1xzLpSBSl2rzQyg$20*yI#~#^ZdmJ= zME;mpP^eAjo+YJf&wr&yEUO!vfBGU8yArz+)VH8f9F5`vWu6MUo#9`Vxe_dz~fZY zhCLkJvf(O3rcYO&bl5D=vZ45Q0D15*aG{gh(0Q~AxpU^KAfqHXvs-FifAd1NHe?kt zcb7Efch=hHVO$4ij-m+a*FAS}%GZ>U#J(>TtR+S-sdt99V-fbVuf@L4sAYP<-S?3* zJ!BtrI9XL820!sqtXAr?{rVoZjm4hR?@foCg+lXMdUK%~F)d?@&f>E$!baW3bPGfV zv_zLh1CYHqi~oQkA=-h81gc4^Q49t6feKpm(#ljw8eK^eXsbIh`mJDbYpZ@GRh=@T zfJ49~J?$Ek+n-v_^Q;l)4(W&$P+4as?^++fL*yIvL@Es%3%bC- zW8x?+%=qEyzzpSrtxswK08!LJNXCv{{xD(R6_PZ)bw>N>^BL-KJf!7nVE#LBYVzHPH8XEg#icmwjuqsVv4$*GX}1cjvNln55kvj1e~6 zzQof?sF*&N;k3J@v!P%@4zbM&874k*ArBh2tF}r{2D47l+Hxkn2JHISHr-hxW-+MP zmar(t=#8;mEAtA`w}#yqs%?*u=O4N-x1pkJ5Tc z$yNa>p@vI#s7w7KYL~BRL1aD!^zoGhwf6O1QERq(J?}9uSyuAH20U0ox*eQt)Omma zB)mu7XV8nS#jg@iPF0Mp7>%6ylkG4t83BhMw=qwE&pW=HoJ7u#g8+`Lnv!wu)FSiH zpcv`pPtT)jYd?JQ=IO+Fe~C>af+;afB-7ftTMN?*x!>!Bb^y9UbW`;3B0=^eH9d!O zwpF7IwIUqONCc%7dDy7}TMpak5hWLbxs&uYvWK}!ahpJktu!PMt>hK8nMR#_XQ#sF zM1sDQ@i)jbjimwG3=(m0QIXsVEs`Nlh{-jTdnnJRd36I0cX_!&7>gv!LgGs|@2WXdG)QrgMi z!2$fGD(K@0Ar=c2DD;R(M=iG0JxUF&cLb-oq`LJgWUyqzRcC8s;Xxe2{u^8{rx@}1 zuTzPEt|NEdBI5rK*4`B=+IOf=X^4BEg_Z`xt61HowWv620F3x1+;GTh%vU9>%1E^h zurP-Z_7)XR6rz|}3|xPGHz_`{1ueZ$b{2k}A}eO1V3CvBsua?)zVw#_Gy|&)XaYW>|ps^&*Bz zpdmB`00Ib~kYN6mJmN<4s!hxtFkmlH6o3_Jerzml)`G&DebL!^z|rB@NJJ4gysV_G z6`WqW0m*}a*Vd@Zo=g~zZaAR)Ed;D+vxhlWyE$ckhPv!Nk30U{A;?a=in+nVlwO!TX+I>dEH?sOst0%Tmp`9P#*0>gtR(heYJCy0w!H9-KGQkXz?zHUbBHX?1t4uX)5-v^M}2k>|p_&783SW?}BgrraoC2hM$$M03sma44WrAjswy@=6&H* zM;egd+9}|F*be{>*yP_zi}T*0yTzh1r-xm~6rVOna~P!cJA;o~;H za~lv;Poo>qO>TybK1f}rS1b|7Sq`y`ed_s))bv8z55V#9N0cnQQ!FyHn12et#s_a~ zrAWr8A?PzGQDo5ZHl%*V=g(DXSx=Z`%*^OEo67OowVCU`5qI}JwhO~o9Bb3fJoa5^ z!gdhtcpHFI?+_K9s!K5b0sjDP4&b<0pV+=;FiU~?lx8~1Prfd(8W8Y-Qi2tUZ9usu zQ3e>vge?s1*h1B8H*qKW;E;n7ZoAL|keTS6>t5Y=HXO5R(#5bd`CL^Z93~`#_=Jxq z05-9ZOFF5%zOwvGUHZ_kM)c<%GL}pVOSQpLz<}`@nEHN8g?s@#7)G9cB(M{THZV{? z09ML;IMSavhIfBt^gj-OrON{OLS-z^QG%xaaf*Ij5Vxg$k@KC{y&YoHc3iGr7{SO$ z<~h^5r^;t~%WpMoc zoKJwOo)+AvvoC>D;Tu;LR`%!_L(6^lQl2%d+hiQ*pVyMbMN^o2uk9Kh_^aCof3Z%q zy@&ekU0r8&Gi#)^QhN|cD?(RuyOi+!glFpK4h9W+y=x0~T<+K+Y@(({Hn1=fHFUjB zz?yH%Fy=w8a}n$1J&pEfMZheqLmsAV^F!3Lj5FwpSM=Zy-gD#2=bk2qp zPoL6p%Z|H3m5Q@Q+j9f3{^i@@(z||sZ4J1_o7Why1>GQ770m8EqYh^zgXaDJ83aqF zYcapz3YuPtDS(ju#KE~kZ+{Tzd*JQ-do7{Fo<>Dt@pINPBIcegyr#Hz49C zbCW~P#%-I~3-$KB)Aq$Z&1&r4M?44~k)80`+5cWQ6|EBV&L$t=#_AqsxnZ-#&fkdJ zk5FrAxE4z5ZpJALW~+hXAY~aBz}pp%z8m4@J41a&my8QS9ckV{l>vOUkSnXmyg7&I z$ecj|m!{}O%7BfcCa0R3Ruz^RCN2BG=ekF&ljumT;yYFo zYvl>!%W1;4l=3b4ViYG7rV(&VMI#ToF`*!l_d zj;cDqkW+9$+oh`w{JOQ8!nYVU_?EE>W$=}y=?t}--K>!l(@1S@%XeG?s3=sQJ6Q58 zalP|mYMEURefC~G*nMDUmL8%@UY`GV&l@r|>Tweeamr!mCE*)024XJI7?r0-BwE^3 zM>Kdssr+}aPjTt^Q)#jQhNt+hNMjB+(46Y?%LZur6b3{OIJ-b$g%W^-DIFp-mwJ{7 zI^2p=3`#5WER})sQzsotY$Wr6nVDY@v=lQDLf; z`>AB@S}Dn${ml-cxlml4vh!TJa>y~~=c+q}p6)YD2!U>o_2sFit{Z}RZu~tBizJPN zAG3h`LGG_reZAvQchL!!<+W$iW(v>j=jsaA(h7i?5*_RFXSX|ON-r1I+$(^cXFRmC zpbVqcFXwYBOXPV&hcB$%XrC;TMw0*;aebFv)FWlX2}Dfe^OykSxFj0&TVTY2KKs~H z@4H zRh7C|(Y%I&bS!16*nut_c(a$=<6YH_7Q|I!Y0ypAP16|*JU?WE0dR z*h-}L&y-h$R5cHYu@&C~-Osa*fRPJb56An$hwT@a>^>e@gmyzoy6556iSo8b|1KJ| z2R=H0ckLWk{)+zi$CFPfFOb#lpP?7QeLzDdv zujs}ct1v*Jgz~SqOkUL<1)ReT#6U76xH zqvaY?$~}oAK~>cfwYAz7FZa(_H`v!G$haEL9N&i$p}QM3B5mM}S6mye#^HGOTYN$> z&w>W?5!s4s1QZT^@%RD|etb>tWnB32EensPd1Qekb~&a- z+JS+d{xprTBSdaH1m*WUNxm&L5!Qt5O~JZh^^Yrjt%orB*-*1s@O^!9{=kW%T!P4> zuHrfWl(!wVrU0sjJ?UqFu9@CiQTOBP{J#fP72nfKiOnz4o*1`xT5?P1JL5bH{`$B@ z;d0C3Kpo7vy@sx!tx^=E&zt)e=nzYb(LCy}$+wtC=|5<~4uB4pH`LId#b z(00-qkZq&rdawf{Q;s=YPRK$LmF5lGXtWToD9}_;NriHXH>2{Db@8*6H(B_aONuZV zVI@}W-6faez3*HXsp(7`lv}pB%vl|0qG21@wPXu4$2e`C^^7?I2=`TuFDQUYV{1*V zRJD%*b=1n2;F>cpB%<@HO?k+{z9I##sC`o?<5d@kfwlp)=giZT{^B2@YsqqJT^EOs zeBDd7s_xAN3hp~$*#pQtAUXQ?^f~|KBh!N2Hd8O6^qWu_x*c5mS7*EkEhL|j+0#nb z44(UdRMb+|vb2h)F{vf|-lup?y#UoPtM=Wwr?t8Vn7Scq6G6y*4yoY-xxLa@yA_qt zmA()VaJSzLM#!#%$%8TizDRmwaVmu6{H!5wl+l>{?Fa=^SK_H{%NcQ|?mU3`r+}gR z3wmeAwqmoh57yH1RwliSuIHjvJuctMcg8>dn0OB^k4GQ;z^|+}BCKEVjc_nX9&{dV zFUz9GL41AnRCns{p&IK>5B4+wz_b@L{4=R=LEm>5T2$ zRU?26(_<9W$8M(sEGI(Vb!n%qoYgtiy2~2T*Nm(LZ(}EKq!JIMa~{yN*|iRV_I&36 zeWcMLLlfmMm}#aZx9O)oy6?`CH8NaI$otMb{`c3l2iD@2CgCq0V@}f#(x;mt(_@-k zJ_znSW~7l=}QoIj?c_93hMnCBzkpSvmfj#m2c+;;$D%Pr1!dT(zv z>y7HAOI%8A{dQ75gkI^Z&PEaI^Cyz#7yfv~XuSM6=FJ;$?i`W$JPwAD;vKfBzrCZ2S{ypB(ALnoXk$XVxlhlC<7>_$@YPZoo z8zbHNKf|x~U?9bQen~?ubt(SvbC+=rf!(frcJcrr07nZCZx%eM{@5~*`RExsu&H{` zo%;dzQHCQ``#R{cX*^(w9XS67xMEyhvn?<4ZMH@(odHpyeU3R zOoRTX4?l1n&|2)C)e9hnnR=6V`?lK#baQNZJDa8*rr1`_s$l>$TsuQ;x8j|-7wi7t ztbwgX-(k4L`bVyrXt^0#=PVq}rmUiMx7h4AM5DkCUwXIG zQgo|V+YSXdoCwZpPXWqd#w60i;YvGV5uh9&c07d^zS9fXA!V!}`~qTJfQ zOdeqE-^D~;-Udg0sV|hMh3ov)IAnCiZ`B1RkMk57=PZ?rHY|80sV# zL+h*NCi4^BG7DLP!-i$CEtok292iC)V`=jqzSwahl)Cx&khb z5v>g0@Va>Co40#iH#T8LYd;sE=)F|aM_;lv<^+h9SWNY9w6S8d^vyDac)WVqyC>~N zKi{ZY8#jKZq{uA) zWd8L*(0lekg(-+=pw76-P@kFJ0=0i^uipU#!=-!BeB18_&YRvlJ8vASaF%&VvR6c; zwd=jJracOx@(pHKZa*p{Ewemk;PIp6RD$=2vk7USzDn9H#$p2{#_PF$SJ|*o0G1z; zW;WdMQ{=r4Jt6u|jgubR8-Fv1{5YRLr zNHrGNkJ!<2QOSbr;-$A_4B3kjh+00QnF1 z21Ule#3bov0ArA;EotDzLCD2VMw3utqGVfX)GrBgng&U2+x*#%8+6iy{QBW82!q2J zRh~_HUtoJWCR=M0_hZo02)CXwWj$*FdnmAXnCgB`m@$Emo<1#7nv)#Z*B$?(G z=eEIpWWZ7B#ee$%+4NMphXGgRi#+^d>Vhz}=U(#5XvDP{+ch8eFFZPY24#Mjo0H#; ztn2GU-ti>|7@+cMQ)n%mY@K^*3|-`rbGh9~pFe^FGFYwsWJY=%yGceLRm7m_9=snD zXHNwe2)X@e`}l2h>?IAp(#)5D6PK@(05A{eGV^XlWdOAPV6f;)(9XyjGf4kt3oln8 z>l=KbK1gS5dGlvwO3ZJvsyuf#=Ey5s`uY7PMOm5&FyoKzg0h5z$HnC6mJSg0NCm0s z?aNx`VKVL>>n}>|vpK|~GbHqACEyzE|Mj83aWz2iZW5v`b6=Im54&`#&aL%DMO#Ik zAhfs3(qV+`HHzoRieqs!aKMP=_Wx^Y8bcev=&uHJNe!MkbbB*06vY12q3Li^>8$+p z!r#7PbeVtb?0YF*&b-T|O5egjGZIqW@1_hFSY|w$t62hp(@iE3K3aq84|y?FpD#Q-C&6qbQx z+luZpFT5VPu(;&xT^z4MkH&g{kDSY;v9j-L9_HCqw#$#6=;}3_9&2>&?$6YbAe!6? z`o5=81b~qOz{o&rzEeQZ8}R*UA%g9#G{`(?2`JceuZf zeZcb>2c_-EYtY7WT5I+Nlht@-m^rm3MLv9ykl}?et1>oN88kJ3SKgCGrk!~6wvhn= z2f7kgjh~h?o)i1fojH+nmyXP2c%u2QL{xXKpCIFyrUT}Q^!?>&x4wo8Kec^7Fl7DP z4E7dH{l}c!JYDvI^OFX!6aj6^6l;ZLNXad9vE!(1y86|D`Wp5QWX{Xz5Y6AGm0N&h zzf3Pf%Os?@|3t#4NTKzP>?fg6poh$p6J+T%B?PvhW$|2z1`Gs^o!RI~qC(@& z4a>3BjQ1*=q()wAS$Nu{^bc}?Q}$KQRrLVnA#Z|Fa$mJiTM1yDBD{J|NVmO-1cYx4tf4&bkkHqnJND*kZdlLR0i zQtR>(Jf=$%svM(i+E>exZ~dAecrKM5LErBm)tve^A(@>B(z6Uy1E%4vMnTIgSVS_r zghc?Ers*2D?pE%RfVezlo*y`0IecwJORGFtr}iW4DbBX52FZMkTr*-!=)@M!Hb?fNqy)Go;MLfpwoYSipic7{JPZ%)hr&?GSeY+neH+*O2 zUtm1%drc>*=3k}x_owLscf-U?_wEC{_*gl6b2#Ux%k(|Kw3ao7A={}o)USlf#`*+m zC7?GZbdn&;cXL;#FOF3EXJf!mGlcm9W2*9u)5`+_3;8JD5A)vpFyX%F`F`_k$DS+y zY2T?sw9?Xj>bujb*tCO{MeHovC70%-^1E6K^QSu>hj~yEG4h!X8!FXTT5nFB|9@uGZTH}Vc5n9u?$NI`K|6C0$0mJ!P<~sfAyZC?Vq_@pNvjbDWoRCfV2c*>KHf)j} zG;F2ZfKtGi-E73JJ|AGZCmzHPW$)T9qucopU|CrS`%Z2bcB?J}ATVl=-5MbT_|8}9 zp6u3q@6b$;{wJ;dt1$MWUHQ`U;14S_fmH-Z7-{Rxj&H(rJ za%Ak*k$x)JC;!i`Ho2M$U@-`rR$9s@>dxwSUjv+q3*S5e4NTbuLPI~qq-nxv6Jr7? z`~FE(ZQfZ(%ZRqv+Yjq?y6;@Jc`fZ@*L1(l11zf4En{!)aqxe1ZT|=!8urF%V_NpV z>W(PwN7v?Cvf_m2hW+c@(i&-9Dt!%V*SWqmzF ze{b*L(&mbR>_kdjh&qs*4GP@cP08oF76=KN?Bf-N+Q6i86Z^^^IU~#AshQNPpCC?X z)Ek-bQ#9iLL$$?&|KKjR_<=XpgoF3p8W?$FrOTagewM*8z3+J+$6M|WbC(fgY9{LF z&@9BDl)=;6Fq`6-10CvBW4U}+(K zf5EBjw?`KQ{-DdKb1N`@*@=~3i_iHtI%>4w9!+;mYaP;)Rt<6vEyf&AeiXvWTUJ@` zP9%r$y>Tbbkuu2h?=&06REJ(Ny$<^Sf2x}FX-oG! zYstTEs@igFEuW5^i;Yfpo{{118ZR zZ-qMxjLp2bEbVVAMi7`j! z-LEQ=V+xsDJTrwih z?jqfoe$3)Xfr#<~a~TDsq)d4gu<8Yi5&;F|`qV=PY_E6dBp1@s){RgjrYzX#sK z*cMPZcmWt|y0?_R*~7AqG98tJ0t%QTyqp{-4dX`V8CmO3yNKp zPDleqj=Bs+{PK(=30eL&=eCg5)|+L+2ZVU%Tj3x4g|DoYoew zf_By9_lyxYuj+x3M(~5jQ&wNBuB}oM{UH`Gh$1yPiK?g)E;j}u>8BJMil!tqthz6a zOh=6^oQ9l>3d7oNbV&{^PPB|Q5>^@MqEyzioL47`|C+TECh<9;_@#4uT(Ze7-M3Va zY}nTpueob+?xFAu+dS9;dt@nEU!^Hl+|&m30!-)zCFPAHyj}bJ#zx>TsZ-yd+qk#n_tMB6)2|#T(wzB%(Z$S-2{qw99uWYEtd*mLF%PzmMJddjCp1p1GSWZ30D1lP@vY;#XxaJ_ z+$8epAY~k_mh_32Zf%!8NPse$@YBMVA9 z$ar0M_UxxL+Is6^jsc8x%k^8N&>rB@&i!dG2mSpm*qUO*-$!nM1rU?)fpR(scsjn! za(?oUpEZhS={u$hIn3#V8uuorz?URnf{n3JXg4>sz>U(~Rc(Kf zD@5;*1UEg!pJYp(l}7N)jGkH!d35n|U@jVHpX zA*-e<7RZz&ycCk!pKDL)Uzsa~Q1Or-h+{jVo{ru4CcTL%4biVO0L-VR8a~|nzj!`+ z)Fb>-&Dz-gZv~u`MV7ylNK)~Pa--1r2l5$V{U+!#A6|t&U@j2C5%|;#Ml$oC^IFl5 zn)+Y9Ir|n6Kp^Wgx(pd%L3)CFu-n7>B{GA@b#}JkY+(Rj_s|x+dOOs&Nip_0$@EJbhrbA_c74Q5x$uk)}6XP^C4zo&duP3cqFN3Ps#3qH=a5-ezV zjkZ7ISq6_l;B9A)1Ni(MWN5MXD2(>L&xhWf-sp@vn@;T?tq;L5?e;Zl+mf?DIf8)#HkUl;>I(WIyDb%g6 zV%yMCK6bl;NsOM};g94q=r_SF_5q%+bA_%h&|yMCP2xn55a#=1o|%P z59)7JkC}aVT{pn~TQ0O^y+AH!edPFWG<2@`#D#y*(7_6bSW;@nX&P|sgax8#M0faQ z-FqSJ*%uCT9pA-MxCpR+NYXefnEq89-2iWy($d(XIfZzcI`tWRr`S zO4kuas8x2Z<;W#IZdtcnk)7RNYN83)@#@T4n!2ug%HH9!wcv*EIsu;a=ig*);!Bba zoc*-YLm%8AoO1^T?dd6#a0%(O8~}+46ri1sWAKVPBz*LncYq62m+hVT*#Zzp*^;Mi+QT`?4<^VK;K>iowEni{8|KCI46fmYB zpz6a}iOsvOdR-^L6khWRz^-QAfnA|agPLUlLrv54<$c43*Oj%X5G`{9dp0~IK+eP9i3hgJQOARc+lc0Y;xj>891fxCt#1G zJ8~&_^w@cs`HyR_Ahvs3gYDJ&3Vu2m=vs3^{2z+F_Q{1a zJMJO zc?kQVQRS9+Rm|n$4ga1?98Yjn#p{7HvqgKL1?V482*>8S-mYXVZnHW~9EH}w#5sRO zEXYP6u%lPX6>;q~%*lKm#5|r$!C_d5`oCkP&_~9O62vOq znh_PJD=>|>5A%ETVEEJ|unN1e7=wr2CbWW^fDKZ{N2GDad%VFBSr-AF?J{*9?Q=Eu zK@)Sm%99*9lY7}NHDF#kiLDPwL^f)2_A_3vkd}P@E!Tt~@)jpy>O{#ur?(6x8l5e39|B2B0#u9#=KumkmG+ZgE(4DRJbl5F}0M~b1&Ehvd6D>iWB zK1k(k0!v!xAyH_zCqulfl(!M@a66erO+v|!fWmc zLp4NEfU!H+)wtBqXpe>u()@^P@9y!kPkjtJwxv+jE$=daD~Z4-7aDlA4LS1grvsT1 zvr@$D569W&CC(NbAEROJB=R?RoIlcD&Kb?G`@Y|qA8nIq_SEGbi4U0+|5Z!WSAEe&WY|Z>F0x4fOkH0-q3 z=*v41=A)f56kU?1*LQ4NgjLyK1Zq6$GZ7bRvWD%`EVJucZgG_LcZ4jn;GTKf$U*!y zol66d9If==O_%wdLR1Hw&+Ufl06jp8iUWNK0_{{FsbmVA83W+k~akk^8>XsS~ z);cp^5HS9}d$wdU1$E8B#t478dZiuQccu-SXd?-yeD~RZ)x8h?4&XL}6`i%!J69EP zi>(xP!JSyZ5v*x@0PC1=wS4)L4Xz}f@&_Ad>T;2@mPO(ehYL*eC`Fu6142MeF|Gk0m%zCGSx@dRqc z_#nqVLaU5X#dA!c%`gwCjd+XH)|2;QlWms8Vqkhn=2vL=j6X=P@Ep+Gk7xq22%q95 zxg%pPEi*)x#=%HOtH-((6@D)htD;+ziO_!U*8~Ocfe{S=&S~+g4ak7Ma+0B|N>gNQ;n$B@L+5O67@wjb* zUc$2(VlDjcQXGk;XF{b=ew?;CpF@0;^a-8r=1wjWzCv9EgJqZs4dm-Kz5F||Z4chq zoxN@IF-2~|qiDrIaNOhTNE=>uXpM1{=NI?$fy|wd4vNG}wx()4WY6ED43&kJ2+I;Q|_vMx;2Kwu@u*(tCSof99&5;-6-9kS! zNeehQLU&_)pS+v)&nrgr{@IdYl-82|fJgq_Mi=Ms+*2<*Cs)(GNu}V+kwIPkd27#3v zlP$Hp%<$+W&FMWzkr}>`^pCCoN=Lxu9zLN|I+r4{fHrUrPmy)>^SVJyya!w3lN-Vp zE>*7P3SCFs@^4Aue?L$~PI58A^bu=g`n9;pE5>fTu74+20-igYjTC)=Qq!g9D9s~8 zTgl&E-VOX{=W6O|+~xXxB^J;yK71FpEBW{r1DDq<)|sm{pz)YS|JF-Oi@wg7X*{EG zR(xPPx&-Zl{Xpet|5V^Ol`% znZO+Wd9)wPJ@PZo+JCMKS34uyH%92fDV&i=QRG+dfxak&x)Yy7KB;waC-{tvzgX2P z9BG)qKGh3UIUE4I#2Wo|%kRE)l%a%?o$D|lTN&%`7;bCG%~%JAeDEEabzk!|gBp_g zk6iZ=p;lxBALkeIMAG%dC>6YhQkhm&Q_9zP3D)kPEx4pxPjxI5epQ2hR-?44B9<%k zN*5^>V}#0)nKa`xWbOGqA7gOZMX(om+(XO3m`b5tv2aym6dYX72jr z(91@ZcIIO|+!AMm!;d^H9JIC)s;b~Smq1)TwAL*{Jn%W@USrycyYZMYmdFGxP@(MO zy9QZt+zRLU&}YIxf+9FX{nIGB@{o6u(Yrxmy)_qAbrO*Y{E>G|r8qaK}x^f=(Pqm4cix~Oo zqhk;_h|+eFFNdxbV7-eOf9-mxVtO>;*G9@S*mUaY**a(eMm3QF8I$iq+)La?00=Mp zK1efg5`lb7XsnLGP58)3C6BpX^G9i2cN!VEP;LYn;eKAST$N%m1|<$TC;0~&=)JaI zoWzYZ_?oHYfAe0P9P9W{H&o|x>wy6B*Kdjc~;mBujrK)_>3zI|zyjN1-nD2XYbj8Iw5v&v5o``W|>4flY22q0j|KOI|Ow=`j% zGNWrd-Kw<*`7m?t%!H~=vVDM8+&>Qur8)Ps!Adnyb5vtu-njR_7EE;bqe{k_#Kogas$#VS*vVZO} zGMWiYvK35dTwK0MZ5Ywec0w!Ltl$ePNnS=j=coyT`_aG06-fxbb+6}2mc)5)tB;EF zpAgC$=1|gTu&>YfL#W>pUJ4unw5aB@3vsLo6(e;SM zfqRntaZmroV~MpM+fz5M*pi-m!$-ZJI1OJU&!(4 zO-KfkSZ5ol&c(dz1F~MTnbhXUs%1%B7PV9;b|PhiMbQD9Qa1j^uI5K9dIN%dCm}}; z6{kX5tmPM9Q5`e`my*23!L{RKF8xuB)e*>t4v9+$& z7q#GF&hvELSpiF@VM?rpuH;$60MRD_fRQQdxFof6Yb62g24hW?9fc!?k zYx%R``9`m&*lOJEr8D|sruju`;_@2{j$*%4qiWGd0~Qq&YsMg7E_;KQMzyhOZ!#dq zyd7SZ6Uqq_{n#rKDT3yE(xBm`sw5ES8!RUN6Z@mF>22Xlldo3)-ikO8FpyX~Q%HsA zChAyU`_o}0=9)qUnqHVJ2s_?ZszA2k8OHmfHfiXH(0~N*iMHm1KT4U{>$y zy~enBhxQCRX7e^9zPzdXkEvC;LegOou4wvKK9^ zyM8P_@gU{;-L9d3Mb+82$Lw6LXPoi8vsWdlzINk zu6okpp#zS1Hb7NNgHbi;R|5m5!47wk17v82>>R{znt$m1ivJ)Vd;&#Wx@*QzJGRl;hB+fTH*p^h#kKA{$4Dl^<&@p%#F|D%4?O`V)73o zWSbXq!c(rE`H&z7{w1^0QO;84g}?{;#>*J$1|Z{Uq>A+Z(M zR8{|!f#rRm2wT^2G?mLc1$Ou`GypZb^Fb{H5vk(f^TqRN@B^b`WPC%{V;kL~S*GH9 zkutIT-C~*`6w{N|!iGZqthkf!$Q2@|u6@=ZydQ%!J4|Thgz3(t_*aQPAcy2b_{6_34yOy2s6w0LisBTG6c) z@$YK{JJ#;#OlbJ|B%^OBf>rX20&aUU8fNyBMJ*T(>Znd^QDehf!2Pm*YEUAyr?=ys z=!eJ~%=e(Pka?2!Y_*Xkb^h;@We2BY?1O1WpFC^Nv(@KV)(BQ6tNKhIKpN{)`@ON3T2l zE2Mt@vXIYH%RI3?G7Ey5qbGY`TO2T$aAm(o|7J8Hw9cRDbYV?G!0LZaqH_I;h_NqI zcO%1e7IKXI5@V`mCMK_c0b(}c&w~24!lzk6Kx9^&DzxwK=ewgT@iz#C|TQbb%*u!#l&>o4MHKoAS9;q_)YHE zq<-huVTc7GqtCL`nZ#UYWxYvT@aurZ8#a}nZaV+EVKUllDe+UM`O%6pE#YBA858#+ zWzJ0G>4RPK{T7e<5e`Tei_ZBzy(&^Y&y6g`CO>l;sd#eLQTJA_VC1*Cr4DOD(?{8k z4ROvBJ~1{ULkU(R7O_*<+;Ro&cwEflQzx$i#*4NX}26>hkF5S)aL z`HbvuaW7vMeg3T%%LnAJELOfgrJ=%ZGeL3*L)#yL=L>F6@T(pVM&c8SC1vGDC=oz0 znV}KK&HL&I66Z&Ri;9z|)yLxe(-GwUGF^WsY<27aB!at>KivKOFe}QH_%-Vte7W_% z*zh;tv+mtI^a+uFnR?I%n&sv3gW33;oVp|Tf@@kM|3t5x<-R?(t*wR=tS?f;x@Z0Z) zz6K{GDb#%aQ8AKwgXrN>MtDooQ0&U7u23zXR9An z@9q;d61+dA-6A(wU&~L;8VUH3gR7S_e~kB?RK$qm;nVxe7G5L~-$k*GJzSG*Z^kdi zb<823yvuD;22*RqkC2eijbpb($i7_hGa0a@#AN7lx8nE(mJ9{GqE+UnNyCQPvvv7a-el*+ z_@tB2XxBd>heW*1MIVJXajguFX%k-k#ne7n#RLQpV1{Y3C&GHU!_HW%mJ|Xlx4F;2WB%j2ywCwD_v}u(0#pJ)?^ww$5n7`z2qJe|>G$@xKiu zH9iB+K9f0;i}`+^Hlo*qvD&yBem;-d0$m9Y74tDXM3`NTtr3U%Oq&tvrkvCn5l)f^ z6;t~QK|)g33xp6PHqHh!f2Zd5%)iwuWe&?G#cGVWKdGxh1h~?CkTRFygKFQ$9=HY1 zhZN*8MSOK0N96Syi?Er5pGViY_F9myS6e0xBKXmrmrsQ3=B6&9--E5&UoUn|)uxm{ zy)+^y{U7>_Ya7m9FY{}s$n>0T>Atx9WbWEmO+G`@+-!MpS-ZDI_0tyPyphYCuUxDS zF(>?ED8Ho@ahxl-C`t=G1hC(JPg9WL7lK#(ecJfm5WP%Bim~l7etn%b-Z!M~+$3HE z%{3@XhH>LNpQ7O!aS2Al9{DZOvrhP&J{5~h!z{yU+2R#{xvtNwyls(0PWwU81X7@M zJ(s;(iZZOnwHdksy$N063{ZJ7;r_(;TSMG^%RHYHx$>IhvP#q0WzAklm_NiiMX zp7=Jm#85v$|J~g=lyc`$?J|kXYH!>ukfjC`8<6mo`zEO*3PET=XE9G+dScT!0tc@) zubI^t!{kw4{47yMa^9vQ7y748fX-8|=PG8AbGEcUU}@PgvroMTY*zDUcjN!Du^57T z;o)R5HVv~ZzzI26wyZng3MvfwT#gvjU4bU~4;@2t%hna^%(}z5WnAI{6fbix6XoCv*WiwhA~vC zWP3K`V;pbTLhh8H*`%|i2Jf@>`fAzzdW9jIdE~)WoR$%!VUE8gtM9qHAAI{6*CXfF zT-Z2x2S`1FkfT0YE?+T!E1Ct*LFT8-?-@2r8FPSmdtu-Tv=}Qjw3d zDkho1dBVUsSJ{bm4SeL(&p=kb@UP!W4fo@`MWU*+19bE@rl7AHvFeHsN^Non+j5Da zwVmgv4io7at7^}Zyt;|k$c8UU7Hdw#isg*AlYgHwYAsC7PPHhDn{<0JcXu+sc;YU1 zZy;9f;^hrFp{$0Ni_p9Z_hBY8yCob7u3G*p^vhj6= zgQxL3KQ|%uJ;eAe*!mZAa#s2KAa{#YeiV04dnoa~Sv_?17dhG6wB`Ovs#*^5>QPr} zeLWD&<82Ngpu9g$e(cYI^*}H3Nq;Z$sN^l}xz+v@PgNoj=dOe~NJKdh!Rd*E>yL|Q za@1=)QE|5GNRwnaB5=W}4L7rui0iy69ZOCK0m_QrpKo6TWg?-QD3O2SV1R!LiCFI7!T7Y-ub5tUwq44~eo7}p|MHE{o=TBA#>Yn$Bkgzn^6Gt2_>{A+g!rT{CK zE4pJ2g)7rJ7l;5DTzR4W{U0URzyNzlOqW6>m-W3;9X5!Pto*d7^yH+@nwCY>-$VH| z`C5|abbgON_3OG-?B}f+u|hYyT364isZ7YS(J!rO3e*qLsNqxswAjgC6JHjc)+;(8 zQ77T=&|gz9BbGcyVx7kkqGU+=KeR(4LS3gPe;g=YEklsv6+PQ@%xA2y zPU$kbdvs+f2G}W}*zz0DtvX3ADLQcxdTZ@J7*`=vMcm1O8GG#~uXkbr>PhJ3&;f8V z*N3Z4#1E31X%<5CYX`lXO8<0A5II7A#(9)aiy00Z##cO~e_WaSH1XreN{}+!5rQAC z+z)=t@ab^jed?dM-iK?9}tc#yDZ%|QIMJVLTCMXd_`W^v}-#bu5MX) zJidaE6AW@I*WuYcL1L`KKtx@#_fDv6OPm*Lk z8ue(ye;qhV;t!50%U=2}`byJ|0Q%;kfI2%hG;1ZeS>imAH%}-7b!^c`8|$8aOfl(=*rTz4Ds7_iNFv$`j)N z5H1<3nCre(nGwEO)Hif2zPKNbEvS8jOeD8wO{*~ZG=fi;O`3rM5W{6$jSUa#m9PAY zyHY(n9(8x@?dmbz_eKiZC(Aj7UE+-&cy$)c2xGC%*UXW5_bf5QIzMLIOE0VTvi87Kbn z3uS{%%i0HBH+n6{^rPa(4m}5@z%#s!J%0U%Vhy73leXOa) zf1RedG{w9k_xm~m&$WgY&6brj5BgH&Zhzb*^swgu6NindU}Ls_>QGnp0vywL)zU&P zDAIiWroE8_q4$IYfQMK<)&(K)=(f8;oUq$#7g^qu=lJhxHNY;%@cv zW}Yi7M0Hp_N^-x7JIuy{wWVk9nSL5mYsxf;cU=4}jO&~X*3(_kqX={9`sjKU_e5W`P?T%Ro@0J8p4^U1!}}#E z0|O?sep&|NgF$ean%ts=LVi!?!0&SLERF@ zkdYA#0<$&mDNvecpT{gCQ&-)FS1hm@9XJ6tF(ml5+~Z0hH*VC2%oa)p{@|;2uU0>d zS>da|M!)nnR~m!~@vT>8g`!wXrxBe^+d(c%DO#FYYQ#BdHyxkao+~Olv;(K*~Y{3s{`d#3j z;Xirg1m+C_q!N8D`q!U4xe-@qp{h)8!*L`~INWv}@-5BFM>vtCT zsYdF(+^}nk{sfY^_M2L1N2!$aM_N@b1(Gtg;Un)!xX7FO@oS_SK;nVaV9IpcMo1?IbRlC4g@bN&_&ly_f4Wb+^Kj-?gR1>wv!B52>&do6=W4g9>TP%j+}(EjPKjC}~jYT`8u;BKe`z(<%j{ z$NW}}&^9fBbEkoZQ3pf0TB*wO#kPZ~WBM|r(9D5RX{w~+#*FCSl?3p*eaWQzVpTsh z|8Nz`eDOrFc!f zksJuNO|*_uAvh_{lo}!L+zANHK~03p;x?Lgl-#WiEw(Dm}v$gZ-o3PWU16IhX#gtuKLwy8r&S4~db4Y%`)#+1KoY ziZ)cr779fe5=IQhq_Pwyl{JhdONH#q*vg(g>)5l6ZAR9?SpJ_;`98mM{^vOLG@WO9 zulK(0>%Q)NONUwe?$de9i=EQmp@0Rv-<;9MzwQN;*QJH}x9w|aU%jVVx3#wUp#y_= z;_G=9BYkzY>p1834)|Thh{GqO!F0qCPomG}NnB_%;jmfaqR@1l=FCb)!oNvW+fr|g zEa@#mIg+8^K)ep19w)lZm&plOIXwBvO++H9{rZoDLIdieNgt)B{$_HX>S+X!S^r8; zr~?72vfRB!wB(g_LZzppBnN-2_ASO=tE$5y~$>LvuOWD&;a*bb0q4;6x^1*irIB3(Jw-)bN^^LJ)Nfyj-+BM}VOW zQTKI-Y?XdssiJM^0@(-Xtwx;9ckSyfT}gOEJu9a&rAH328A(KteL<%;-EZN@J~c7| zd2QT20epn%X{Or_;`0JSxZ&)l!_7Z6LBHB{)DkET$dxruJX*)5)C2Coz%aM_x(9#h z>oJLcNEw*7I$+AGPTxHQAOk&S;0><*rNA<oMAY%ab^P$(nXcq=UePZH50pg69aw| zzBR1rj@UrFD9sB6#&_+=pMo_JE_w<-8%UA%I@Es=BLW3X>AfTXNL6)s!sh>%%7jTV zkSMCSRmODu)sf2Kg=EkEUW3s`s*5Fc8s2MECwFaf2U1!`+KN&ohE;h5R&*B)F79nT zLJaWlwFyN}*H8V`(0?pmr*qrLO|icQh}6&+KC?HVlI-KP~j>N&h#GzE$pQADoSh$&R|2(Q|xYx<~+vT{+ zh9C~#R_F=e`!c+|{%YafM3mB)iF1SI#0g3OJh5;vr>rrI(!bb0yRxyq1jz33u^C#H z?_W7JkGzyP-1%X_j;dB)y#kdNtLb;#-KZP2+1oJ9zqLETN_=#6kVv|V+`Aq}d>79; zR6DAg08uOyQL?vsy7UCDev8*s493V)EnIA zQ{piaxw90z_4Q0WhZT1hQbOaaIZX=i``3isw#81(we5PJ-aRxMqD3UX3 zyW2`}%%NOInprIFb_fkFf9i4?Zm$|BTF4}I@<%}`xAx_!j+)E&6tGs!rujE?_V`p$ zgfH4F201bl>c3~o>vUApZ11~cGI>Is5nm?b-g+bwOPQ0u|#KRk8W=8v)6r+D^XPxS3)7b>aI zDDbd@cZ6i%cXy37I(J>y`6w;0#6VP8#iNH7tG}uhyF}nlPf*-*p8Z0*3B;{A@}(be zvFqC}kJdsIi6OfSiW@uuUa_%DUG9-}zel?MWwq|{QF$OX&l`4B!zIt)ZV2F*I=wOM z@OIKXu{vJ~Kc6@}z5UtBK4<7_{hj!NZ<;hkc2r{)*o}nameq@<>1xYwc9LJ^_dU)>Yq&pHV#TFAwfrtLebCv z5PSRbDPCPV&FxfQCmdc`s;V)}1y}Wc{paUmJaI5PFDm=d(Wl=pu76^Cn7Gk@8jh9N z?s0U27c7v}o7}1-b}z=qIgwi=W^FEJS3HiZI3+*ZzO1`AWYcHKd-7vAB&KlV&H3WW zL1z`I=E3~W;kv6&SNyu1aZbo}lebSLy4w3WeoyZtR*oVBkYPKdbG?I|Iz#=R2no)g zlfluFsQI-{Bno-9m}qGu<-Pj^IhF=ruM^H1?FqczIdJ*zy4ud~!#j-%qfyKM2QWkf zQ#|UkQsA*~%_V5FfUMhBD1*kHDdl-qzFlHjIdK_OMaB+OOkJ*7x+;32}Oy_KT@(gBwRDez6)`&zNHHWFR_gQPLnkNEb7N~I77!3At_ zfo^~5IO3#=ZofDSsP;SUK%R@AHYIQ`N^HlkxBlLUlY8hHODu0lF7g>)cx+L4N@XGl zmFpZRA#s-MS?L{4+|#OgqdQ#g0-xA$vm>sf9w{{Hq^R+^kVi*5LS~VA5c*@4TBtX0 z{NRJaiaz|YUBXoC5a=495hh=xlp)uL5pmZy!ix?x?^J6e1z4MQ*2IWEn|bLXY(A*k z`sD8!G`)p@Z>c)G29IzUDn@0it2#t@>Z{xX`SmM*nh&Z#CQomv;O^C2$v08LdEK&q z_;Se!r#4sP`RTaO$z?uV{rUyAJ5dR7UjU7H0#OceWx%9oWl_}?@?r1BAgUpBJ>A%^ znxa`a~Kw zFL3-%R<}zZMmTp+i2HAUc+b)4W|?#j`w5jakhULk0R=(ksB7{FpRBLPEb2VOxj>@V z8&@K9dkYc*QM(FBF{XTW2H|cFQplYAzBW?9`C^N^@Fz_r0L{aPqIvwvqNpvgYP6;} z`RYe`;*07V>-jlPQ!1Q#Bq_~%6jVP!=jdLp?|SiW3+0BoVtSN>)V&3gMQ6I%Zt=xr zP24Y+5496%aMqH~nWknS0P6fbN9f?wUndWyN@|CE#mNm>U}+-KAL2G@@NP7OO{PicC}pJIGm*G6 z?b|tW^vvM1_J)ela?KF7CstPt>Rq-St=q$Q36C|NY_pt8Ssg~?C=o=mmI_xSDY~8- zj`8ZP4T^a#i_ZBU&k-*-6tm3LdCb4w6mibeofZxMQMx&y>Ye%X6r#%4dcI9@S3moG z5umo(-PNZ&abMN%?3x5|&z#rAw^z-DuJfNp)nt=T?UL8=qn4XI>oKP-?Oggq5LM@_-TQkJ3fi28Uk?kR`i-`}IvSHlCn3XONUK@?ER^#po8|WA zicU>8a+&&;-PiElc0$D)2_c(7-zCkrHJaf8!wn|MD5+W-uKB$%=CVCiXii@%KRhdz zl=Jq) zhK|sm&h`nJ`ZySSI$JGisY-Xq(|Web*xLM^n>DcN6SYqhdM-~_CLT>zFYTWHZ0_|r zaZV=q9sC<%VlG_+FRPsN@$`hjj_r7Jctvs9mE)RwcU2n@13V-(lP6s1WKy}D;`VpB zz6P6>DeUm(X2x;9UN@pwtCj`QInLC@Q4#*CN(S{{iy4z~zjBl6(Qo^)5a4ohk*GA! zq4IK9^M{VUNX^mh(c%Yg#^EEmL+zCka&>l?(Xv+OB9Hagg{9EUi*)phYmf)&+lf*A zX?7a-_IAR}S}DdmAF_CtM`hx(no5p(Mz6RY$q$oqV^&%V}+ zbmAJxCwCGvciUSNL-safwpV0#2(v$INqa2_bG7=S@&C`_3;*B6es35h*Y zr-dV2MV?sXLyoj-%J2=AlW^ZON`@Cc@Kkj~7PEZz+_bSze(6h!Ysq<}p043IQY>rU zjxEOLvyQ&398bNvaIM+z4t&UoV4gAGy3Y6wJoPT)+7PECuc&KmFK?~v;D@FObErhUuNQ|E|Yosd|!fgg{GK9MzP z6yGK0OXdP)eXmDyc6ZyezLHgN?#;U&?z?76OD_I8;mOC|CIFP#bEh*{O~vJD2R2^yn6H;WN3!>lw-!^S?#oG)s#~H z@{pPGuYl*ZiCH+iD?%4J1%1b)co90wV&$k6?jym}DRPLV21HYd}t@yw7M8xCpUu(w8j;_0PY*=AqH z$=#vr2)rAl0Bj*^Q!JSA%EYE!V+$%h}Cn2XEKs4TKIvwh7`_PIS zoAj1E&2Syh+_hu*A#di!p2y(W^q)Na~%FfUq8i?Pl57TIPWl;=5Uo3%T5;U z&J-JM7woE}mG7tc&F!uQFNG)5TUtBQ(`aX}&SL?)BghUbODX^R8;+}aiNT>g^#`lQ zL~Xo*PBIccZ~SNNjE*W$rd&{pE2=bNN$-e`)FN8X3A`XK_KnD=dS7fV=XW-`)^m;CP(N z*Fekd(?t_Gl11sWoyx4cmjYgRfxmtKqUtj?Pvl8(M38%{@{!=Rl7S@k_250bbiA8E z{w?oow>QR^tG|~k-M`-}D4=}X0Se9kJAiA)fN(K=4lyTv5cmX$bX0Q6EBRsZeU%P8 zBS-z}vbVbh*E@?{q;bFC2!Jgv^hl3~OL+|sF0{H_pDecYE>fSj(=Y7W?HXJVDf+fM zmb3U(b$8WxVdJAkw{hb$4u8^!9HveyE%3Td54TU3sz#^f*7|YP2YtW-vs%KVigpE_ zYl2%RURR7W5(cJJ`|uB3sv1`x$1nK=!q(K;V%TIWhFP$<5`@C!e{_B?s5yDD495c% zGeBR6qCYkav{yLwI+xDt<0f3P^OP($#8n*@1=nK?PUlfv+w-EFD}NM`O1covafQYj zlzy%3Y%^s#=?`g8TMywbx2v8;!c76TPEj=RHUm>qB`&RX>z(0NHc{#TXvS~3aqOze zhkN2vG*{x*cf+k*`1`~+SknCHJ2ussE*}=P$uWdB2V7e$3>&|A&ywNYKQ0G|-Ssm=? zTRq^QUoLm7Aewd_dPYp(^XPB$y6>TpyxX65As6mFq3Kfmu z9v_5*18fWItEU&<=z@D+G@qhVKl+>eGw%UjYSe$`I`?g~?d$F$sf>E9p57uou)e(& z{{RJPawX}1z?|MdPaeNoep3TPH}k z`uaq``tTw|dT-jDV&ZiXt4@mo`z|I05`!KL??{~%UA&=Jzut3H$~G4>8*B`8V?e(- z+VSkqzo#SIF^sy-_TbU6|8xqg(;B1V!U)oFafZ)1i+hobvmQG+i&auTuBV<+3TvtW zk9(byntTTjUCGd&UhzHcxVZCBwk$_~l+sFpyA(WB<6fn-z<1MKNgX!pDFGm299jLI zrqARJg=N8z)YEh$C1i42)yN)JBG`MbIozZ-8hitmQj7v|&1<`o-X}Q#7N z>?aVq1&Lamh7x~mm%S)WisQ)k>ZkN*+w$X7dYd~n5$Q4h<7o2sQNBgD1*r-!fSRJL za-5pm1N^LwPWMdsCUWHXTI*Zwbl+3`_N;O%)1auQ)BE(Lo852we+N!=ghL8-A)9Dl zit1>nW;8QI+FoE0oK!!xyAgN+=;lUiUc{w3*Z9Q?+@uM-YF$IgiaX-nKAVMYBaZ!3g4DOG&w203!l!eVN0m60!S9?M zbN@M?CunvQgoK*|yekSX7|rLVzxLfZu``%jEyYOfOR_JVd>dEG>V#M5-*aG}AjAgzwS^2DX{|LyQw*>b z?6);-6?1;kQNPs1tpbAHGQ;4JnXJSWY(-U6Ar~OVk$%D8E=oNOyeEMB63A@)@xak> zE72O(*yWbfW64Oi9)XMj@B7TA8n)gUw71QFn>I0?)Zw#diUD&9Ms!}$#Nd-m1HG-p zKrxyw0m*_vWKf;VWOu0H>lbt7l2R@K4(#%S%cWj|pOn2&9m20z6(Pd8I1*i**VoM% zx){jgTjCw2;q)o2wz-}1ep)@;s#kb`+x;-$n$$;x!V3otBe=z}TbO@`0U%~*sDvd= zStJ+w2uBAebzP-<7+|eYnU&vE?zS^vcM@4LwuJMwDufj2f*}zy{mmkxetPv|fllme zWewV$AiUZ}lD(syrxgdbqaVEPtSdIH<2nM5=K$6D=uLmKQqtz6HyVQZRF3(N4-pLu zXr03txB4dNIvMl$sAIGauyq%)1(Hr!2R9^#{UX?PUk!Zk2xrF|U=7ngP{Ea7fQQ;Y zoB+g(=%!ONYoS+XoB|yV8^KwUJ_*LcF`L*=^zUCj$qQ2$kk~>y2yuAj@!Y!_X|!j| z6y&I*XjTKZm67(YxNpuV$3?#Vxabt7wjgbGvt~$Ftezn*T+$z$3qz@N6Y4JVOJb&; zb2K_(X1^_ptUe?Q9JE9OG&X0^bEq}_xyuDEz&MtKvGM!n_k<|T8r#QHQEE`1m@s|1xP;*DBM9O4Ya2njv=yy zcn^> z9z79Y^_WUjx%J$!)}V3TDjN9CCU13mCXK5kSA#q@6(++z(0+AR-5{ybPw54;S)xH_ zym=5Xj+$dSXECk!rM=C{1L*MHg4z=lK5J}Mx!|s)_1r$eC+2-bgDgZt$A7$uU{f*G=XaLD^wnNemu~Qty7Y#pmHy zTuS5W#uL#Ae}Jw9b!#9R%C^y8*jKYX^AC6TwGy;t(%PbmOW7}n%}W}_aM_G(;l9&=z|DmeVN zE^%}Z&O7Lkb3HcmLL+Iewe38cuF%fUxyF@e60|xqCDU;;nMG7Z)W$Z1e_EpqRx#|W z1#F~P_wv)~Kofs6O(S9gO)#*?a1Y=PE!)^tWZ%(Lw72}6EyOi3SU2g5nPOBGEs`c5 z0fsyC1ql^(#k}@1Hzk*{b~lve#KR(u!vY>!DI<~y(#l8+`#WX_eJQb2Bya-Ux}Rw9 zV|Yhh-S-Ule(*_w!1`0ZvCnn1)+!i=@v&{79-r_RE!0c<;ASZLQ|m-hg`k-HD6PRO z#*7XBegY4+7hIxx3>p?-dreS+kyF*yrn#q&##C^|D#u(PcHZM?VmLbWPL3kgg=11%$4qD|%dof@K z7Glb8y+f1}R8$vD(+3=#z57>hiPEf8jY{wF)mc1{YXt6v-H~9xFb>RPHr4s_l&K5+ zw#rJ?)}vYByTB(I*iZ>Mx*TR5Xxl=0#vTkVgXlOHi@00yNAx3rt`cY`@dlk9(Cs*a zmbK?FW1h0D_iw6=1XFEfB74PD-K!}{!^A|^<3We;Dm&cIH~VHh;Zp}G>uVZ-Wjwtn zG{-=>M4W zp%B;C+W&wcWd0<~zD#M0=2z+(Vm3>}EGO|n<jE)lFwPu#ji>iR#x_&prl{h zJ|~UZb@)1Ytzafk_0_U&#vJ3D#%%g`gG@Hi4+TRs>=TgcP>ULZ7Bp8!mI=u#oU60L zJFXIHmcw8bybj13NgLo9c|@orwG$^)NnhK2 z%CtxWF5%Nx1qN))B}Z(P21^k{51zrU$mw{CxvXhQYzA#&)9c}fT`Tl8RZ)f(^q-3K zjgpi>vJm&o;&H5-&+v$UiI;#6%+N-ai;yXI)BpUbn-e^uZqNh@V~`E>_;4hT-h!dP zij0?Fh--&mLOU^4hhk>9O1>qPNPoGaywxLPKsc9H$Qst7kZ^$~qfNwZn{GUpL>CN> z=(M>fUDo%5)z)KW9id|6hIMc>PJuuUqeA`GKMMTwBIqV+$>rqGIpTgDSACp60%(IE zElWosm3Il9f0Xa*-aswH;IkdPz5cT&OTueq_ZSa;KRSW{O&yF27Ss<@itgGvDmoRi z7LD2<5samElIDFnZ|=XWhe+PFHD70UdqZ-l8RJ73eqpTh^3&~Da10695@=j7>`Af@ z7$54RAFr1l>oUP+=qQqD#M%PbVu^-pUX~otkp`dz;rNjVuiu`k+7Y1m24~0V32doz zddVqNym~*>RI0_7!6%3@$gA${4Bdsk1xCC8)rzM;yL^QhWL1H)-WS>-0J;d_B6zHo z6@D9Y@W7>wQ>_FwBYA?^{;kN#uePb5AIbb%5UQ8>#$i%66zO?;_CAg%!815zb-uT) zYD;CXB<*wR%?@^)H6lG;*6ls~Fyv6}5vs7e6GWG*p&sSXob7Nts!Mxi1iGS?7DZ-{ zX^$IvP}Pnuh+!>hQsd?vX2Za4TNkqO6?QLaoCZiq^(o7L<1|#&G?vq5g;QnzowAQ30(K48aPzPz*^J(~2%gpxnjcnV#xt`Ij(>+I)+NgN+A{N3+ge zd10*~-;O)O+`5U`h@AsIwH0sB>S2$E8@{GJ^fAegeGOsoGPxZNxThpbsfJB8Da=%< zV2E3BDXfS6c3i`izq<$Y*h;8Q9>fBkiWE6t{nt}{-C&0KrZ91;ica`6Ro|Oy@q`HP zRcFbqFK@)H^sSASldXYlAkP;$+~%iwr^NQbAMCh-aJ$Kd@R_Em_~MV#JoT3dO$ilM zBfTFc!&~q!=8{3HZ25nb+ZViz(iJrqa5wFKR~hkKB3t^8n;Cuxw29Jf9EWzTxEdDd z$OhW3nn0aX0WgXe2&&3-$$~WcI6t#x-;n2qW`k;19@9DyJ^bt;^U9dI>KTtwozv(o z-}ft6UY>0XKA=@sZy_5*`^@au;o2g3=uQ6_hfu^TKWK1px3+*Sf~>&8HGw_v@?(Bv zM1Up5{IeI&^8a$M{xN(T-aLQ*TV2=N8fwlWbKr}qX}i}8;7vAKg^HVH*BYl!*%L-$*gb~K<%N?BkkVuyf&*&5?)!eDCCfrE{30`zgauKA00L zPvdllDOoKe+|5cAE$+hMN_1#EXa)nNJA-C41iS*xjM+ii#l2kyEN;4W+xYAq{~I}! z48f<>3+P2bF=tUt)mp zIKrdQvzXvpTo<}0HeHynIx)TT-p+I@-(kXOHfB5XbLcqR-jLai$xoqiDe9yGDT>>( zZha(U$;|!sJKJS+lUDE_`aE<$bSYG=6`t7H%}${>r0=YGjytlxoRZC zyQSP(RFGXBeS`A}$vvX4@Msu`)GbcxnOwt#%BAh;SMb|Ob9~5pm3*Mw;*3d+EzmmAwQKKsX?;26PS%o3-(nGx99t&?=r&A3 zmP#rg5Zd%^y@!t$o&<- z43QS4UXZDwEk$JSqs4*^bE0BmV(Od4@Ptw%A|HBAo$T=Z=5_M>_J~r4 z1|-Ccp!(FZp0jx9Wo*6a+PIn|Z)eBCX4$=eVD8pc=XbLc(6s=SQW7cp|X z|F{S-uS4;edy*7=D-7KN@#$~^T$nZ|p^O!Xp*qw8sq50Tzb+byQH&u=4^ZjKEmBpt zcAAzP(+?t&w^YU5<3_rc*CMpUN9D|4&bRK4rKv7t6Y~+%AuqE8W80N}zf!14 zv2z}%9CccYE%}y!y5#%xj;~rm)_*C-%H}G(RV4qo?qsb@*2X4#ajR2a+{9YM zz)Du%8OW9+x3;fP_h5|%5Np=HI1)P{yrOj@a9qs_JoD)d_<6xohC^PtGG#ENs;D0{ z#MzJ5)py3vDZ6)semIBL)QR%x4i0s02X+UnR{@Jnz3px+zH`Bad#(NaftJ_#2&3Js;MJ&Zet+kxcXBKOD3cr~jsc3$!WF zR$y|Z>{H>kiMi`F<2UrIX1IFPeW&G&4{@56Dd}ZPDNhj2g$5hN8~n1k;75AIHlO*T zjUy^OW1T}f8CD=5MEBK}Vc$yBk?E@vhV%v`gY%RzijUQWLRRiIhiifEUS|w))RJWa ziMok}0jvO*Z-*LrL!Yj7vtwc2sJIQ>x&~eHcpDXt76k*wRxn7p;cYKth@x1V`r#18 z>ehWL@lutnFvk!w|B^SO7_^7I#M`P8FtDiI-5GnZxx>^3!N@xy|0JH@9)lYGaREno zrRd%d!*U-1bk9kxmn7x|pw1dMrZQ+8Gy=G5y~@@EwJN`l@FAaUd}y3FQqnKt@nFkq z1&t!Ym#YhT9zZKXwvW;FtyhZ|iZ=*fOmXYl;iY0;cMY862a6w^ifcg8-%GDU@nffQ z_{UvVcr>K@??+7w_1%h+v*JIz?#tZcZCIeS=+;g%o+gPA;-B*X`?v5+116ya06kQj zaGg=C_G6eH`k~ci*b3J7b;Enc2!R=AaY7WK!$L44{9NC;_9QnUE}Ma#Mhdiv66VZ|Wy&80iHrSFSNGDtNo;&)E{$$vZW0KwndFjFZ zs8qfLU!N{UNae%~KP=kHMEC$t0Q=^`vyhj3huw&d*2U9&OTEihUUyuNj$p$R-zR3v zIZmZjDUGtqY=Xfp;)_yWj&CmKjGI-q%_1HYILF??Pe|bteW#ppn@S0>QgX6_5oF^W zR&50^^?Iy0!o~w^SJO%<*4jdvb9*$I;1F-+BDFwk zHSw16@|wXMM(LC9<~RmtRHB3|r0fX^3=Q zlafMJ;&q_&{a-e$iJA@K9nyp!bko9W(n;^VWRdUluLU*r6D5U%18o-+a|TO*u1x8^ z8$IWUXw^k(HG9qOd8ko!$;-<;L1&0mMfHkUn_M@Cu zH)!?*n`by1UF!9xjyo_;)&g-nO|6IQ)f)g3;SyAkgJv@l8)CbYqOm&~*g2QtBQpZv zx@aGDJ)d|dQlPbXL1Lf)!~)9;anhJ(Y&4jl7)xI`Dpr3Xtw?G{q7t6VclvO#Uu%Ty zb!l4oKl!~kwE;#>E!V&B9@u|Y{V@~dhZY6a3TdU1jVJnnnHcT>x&>F_;RItgaVic!W)+_=aTH(PZnJF~0-W^{& z#pT;+>@E3YeTk7T94wWE@}l$F378FwcGmrE;&3btSKJvOz+1zP2yL$j-haH-KD5fNx`ON*{1~S+=;CpXUn;Lz zQ+@Q77)qEKwt@uB`F6w$esYBkF_81=G*aCXVb*RH;(!s;4r|cLXXAv7B>_~jpk94< z=S=`+yE>IRg2d{zQ7Z%E7Q9JSYtW|8=5(A8u7)y`Vl8gMN*-*yeV<+ab2LZZ@hoUC z0pTHUk`nH;j&B%++7ck;H1^mZIK4$}n2s8HcaV0KMl)c23I z+Qd5ydMnNPdOk4x?Pz*ewv4bB)n3=IX8bCH-WHtG#z#MGdLaG9B^Lv069DSD6+s5# z*w`>2e|0nj0r>xV#yKL%k#j~pJu`CQz@eS^ilH)YdRt~lG>g60-|f(2h81?w-!|ur zw@BipZxV=*dG$_lmf_xGGFRDW#x++%7teabMQUP*e6p5)>4YFDhu*vftZLJ-lw@} z-eqn0n*MAO%&cnRd0V9qJ0`JSg`+S0bSWz)?&Mh`I0@~IJe^3<1ujI@jW0RWUgUp% zxIxs=tHHPTOasQh=ubtP;Ypea{9&}M73OtMd~+TzbM+WW)7_Xgb^_}OF>-_E18NE6 zAtSzA*mf2I0I!^^@6@>aXvRCAXkz-I$KA4@9Rfn@+_42|v?%D5-NNJ4Znhq|k8L05 z>PkMGyDc1inN6AT6EI~p#@|UN3=4I7rh^S#62sfw0$^@C94R-bV*{Fndr*gXPXjm! ziD31qgWl8P=V>z(?_(W44~iL00KYX8Z3Dh_&lZGjr<|losmj4*n<|U1l7MWWts)lg zHu6LhCcw(Yw}NS*{Y;@9e~KMvx(N~WJ}D*(8=qfaQoM1cT?$M1pmmz&m=Fd(*Bj6R z4z}bWDC%wd8?e%)IuZmi{VR%nNuD^udq%OipUSI*tE_teQD?GH`}IE`mWCTMFzLW< z?~huR1?D!9HXKaVTeK6X9F@67gNL3q_I#OvY&-+Bv~NXS(A^3YYm?*&;ZS6GZCUA($+S&$4$!O>;z|Q5Jr*XZGooQ_KmuCv`mi&@+s7@{Vwb!7|Mg5Ef5m}{5 zEUy*&^Oi)iR>iOlbg9&m8|!ps@j=~@<5)gO%mmLW;niC=9{cRKtd5_*Z#x!P!1mu5 z;N_(~1{B^#Q`2DvTY}xYe+&gMa_;9e8D9C&u?E{4ye&I{qg zXXRRg+{d$`%9z)gA~*e4`6+j{(4s;Sxsze(0EHq2E7!FbT3MRN)>%=;&N-@pjcm|q zzu(bz`ZS-| zgs4`E*hX{t@VyIYH#fJ=+c}R!X#6}0sIxPb?D7rYw|x@WcsU@4B05jQ9LQdnjz-Y4 zOb#Htj*wvs;ex`ab$SwW*lIn5k7or!^q$<4trrT5e5t+Wl$jq&XKJZ&c#bH{#EFWI z(xon*Rb8hnOd)+L#4W&5C`s8xBX??OTcFHJF7Z#%IJXFGyeV)lcd6%6Q|IdGe9SF}=0rQfxkW&L&d)a<6|fL`>>v4!G8)4j(`p!6%Kk0qcgvXf2gr-^A4Q z)WMKd1Q_Rpw=E zU$$!hdd4I?;WBL7a@A!7H9t5ivzJJ>_qEB_t4V2S1<^OSIRvgnGWeJsfv)K!2STA4 zOUztC#q?ZH;Qg95W{?m8Xp9n^hf~wmCcXbu)u3?Z{@5+Un%bLH3>81RK`Zw%lLF}6 zgJu?90$H*0kP`<3zJR?_y$8I7`2J5N?>#XFBOrfrZ{HR$#rpm#(3P@!*c^F}s!$ok z?P*X3DqSw8VZQaHASr7*qj}JsAwp`s?~Tw4Dm{7=A_-REqL9R`abK?rTNmMJen6=0 zXRw7_$(T`}WAj3_YXkB#Ky}eM@r=e*?ih30Q=wBZHQ?yGGW;~rTdf~!q`hGLd6Fi# zwVffDy&_z395MqBCl-Nv%!uQ|Ak(n+d4^cPX!J}m@)v}o+jb2<#~qnD^#y*orRvfk zh^$i-~JCHo%9GBxN#k{=KTwn#Uh%Ec`f0l2IMNnXY}_FD>66U zuJ+r66&#aLUY`+ZnOf47kc(=NuyWAa7rZEMF}IvNln-r=YBR-%LQcWd z#uh_U-lRqXZwj*XU%sGaltOO4(Mb_4xAQr?coOAODu7&l(@ANa3ffSgS-gk>*6^tG z9_@I&XGgQhSlX4>{OEr6CSE5XIc**2Uz78l~IxYdT;#(V*#9OqvjwtqS8t8i*c zz_6vg^w3#bS4Le&y5K5>EI}+TdSEj0i2b8swhnV2&)dfiFctv7fE-dm^CN|Q^n!jN zf_;DSo;NcLb^Z8^1i0)~;PiPtA0Uh8N&iVh&q)Xr%-$4T+%s$VI>1S299@E+0|K{c zst2kCmX^`3h9SaaMosY@Z|rfEMV7p11V4KEJix9c9p(TYe?xD}uhD0cXaQ8*deUcb z$fG*YY^lUd*Y>$6SnSL3(x1wr8r7|#bgg~>Qk&{L-&+UfSOg7(TfF0I=CDUe>TOpz z2}KAr)+07Ml-VPqo#zT(xkAQtQea4w@)7S>QiMR|!)f{%>HEGJIPjNrV4ts1+i#`M zI?sv!1#Vx1SYU-sbhpi`f}o!nsT0a!0S;(xJUEY64*)mq0iOUr81%y1Dt?qoEHitk z1K=GReMp3Z0P_%MKq#Xf1bGv(n&HR3WBoK=V0#%tawXi*rhwSta{0VuhZ;yt6iArN z9tEheWj1fU1KY8_5&wu?j?x@WP z0(O|~Oz1bRe0apwRLkl|s4hCTMQ;#KQDqLbO zId=@2O`ED{?BC5^k_m-<1LMm%`llH3e0VEIriu>TH>}FhHk3zO-?a@feQ|`dsyzVk zKJkRjA%yp>F3m)GuGnAxn_$tDc}dtWac4JLYWfyPb=%m?(xq}^ZG8Cdrodz%u>^%# zn+JftM5nWFu|CNJWN&^*Z_!||x{>9wQz~MOZlGRk!G&MsANdRHkT?^7aim`2zR2x2 zd`vzKrFr#&#)x0Tu+XE1-n$)ui2%sH1d!%}5xH+A78g@>?#R_@KcpXj`GK-b7c96> zSh``)*SGy-43X&=E;o9Zacjoe08{r~i6I6oTVZkctyI5o=Fw>lIv@s34MjjJPxo%o zn#Fzu60oFQ4ph~H_ohD0jY|w{IdLwpa`0fAd z>r{?JYg8S)8}XOQ(O`l3<}=BvQupxwBi`3+c`An8Kyul&My^VcBW;PfyPhUj6Gc02 zqE}xom7_BrxFrJ_yd1d2C;b$eUNO02Smmd2Dn~~~W5eHs@n%u3Fkm8Ib+0mBaE#5p5uIN9IYImavDHKmxtZMGR+0^)EZZxhy&;+_ddHRJ0OEeX@Di`$RhHlb{Tk8+; zaa%n{9J49h*(~GXre}TsNkf?%BfnAmF`vyN5hYLZ`8kmmPG7aS>Gy?u1V!rA^54*) z64myPBDefa0&NS}H8HicuA-tgYG*94GxR?TuO#_i7tSPn5$;T?%FSVGkz?^5bd+k= z@+JB?y2pW<%Hqe-`oe{N09{`c{rZ35Eznc9M$ecY#cOo?->YU9fF}W9g)u;Q+r^Zm z!A;$>jDclG*fbacXzgY&uZ8GqTU)UdK%@gqD>-L@?8TvHjlLJsNB>jC;~m$2Q26oM z5Z7EgV{pYR46`A8Tt@)o=QadHWwo@*pXIq4(JgC=<&Ru?z{fa6c$+Z980n|xUT!ps0{I7NVJ#I!Q)1T zRil26I(Kpg`8s^rMRSLH+Zt#$XA5Rk_MeIT!%x)$5IJ0C=3heu;H6vw-$@{Ndy55h ze>)hwa3{JXledk50nn(%(YuOsP`2reoSZ$;-Vj?vqkH?TD5kDva&{*{DiMS)4G;{v z4XuPMrFx)inQFPQ9P|K%*tW##-dmx}ZhBX_ogfJ-2LZ=SfyMAK?IULsuvo2oEX^af zjJ_2G|84hA?%31Z6+%Lv){vRBm;IEK0k~W$w3=w1-6Ic*y_@%+SVWJ-eY6@fTU2nM z4EAR>8Oq2L-huUgKwl$I0Wt@dG6D{!0RB|uBW`$JZj5AtH4RJ#XLQq!tNfy?m4Qir z6v1pkJ8#)tMc1+u8}4jeVC&euhS_Kid{)bjHwj~Lqe9QxmWj*mXc7VTD{jaC1!U$+ zpF*#2^SM5{@wG2&^gSk?Kw#&)set~DA0GV-yGfshTzG#K_cSBVfoF6w;EVpPYk2l| z*DczU_J*8!(7$pziI&{r`m6_YdCdm+=!WS#_9A~zpR_N-y^ZS}8QHYM__CAiJ>Chd zF@jXvXN9_D`Bmp8L`+^i>AX|}f#7d&i+0?M8tA11Ec9G7>*oxB%3UhD&HhFXwld;& zKl4zkw<+yS(l=1B1XXdPN7a#)fu7fw0HQQ(K1o>;kgRy~b0j8xAgow2HmPMUEF1HPYk=p%iEnZ?V7`yELA5B+5{67Z+=fEei)(enL4Oq%wldXJTcW^Zr% kkDAH>PDx!3yNRwVeM+lunL_m5^ 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%0ArbWQR1b zyY*whBm*msHCXMx9{_xag*I2IwqU6dREl1$vB-(Z0iqi?R58wQ?YM@RX#CgKF5=sf zF_J(0T8PwEk?B!SL=x%^Tp)LjAH-5U-su20-c4&y#p8vfONx8ZFYYy{0BTj+K2<#T z9#I^`U$&1vEjw`oEg&e$1|N>#59gh^t(LQCVSL6q#f|KR0a2dP)sA}LZEqnT-{wD? z`Bi)V?L7{)T!CvCLJ3okV)VD@tPPLL z97So~V4#KC*K> ze$+DUI+0@h7^8VPNvW%!==0|IQ}K>#DV>iMNesLZR5nj$Ps2nxot4t5bQ)zRc6813 z4ZW`aq=8Dx+;d5#l=;#d7P?1SAa(}W2UI+b{x)*ykGzU~Kvp>a zkeuB^7T7RqvBda_cPL(6YVx5S*GSdKPrCM6wVoE+3`m-=H2zG@eUy@e$7fxG4Uy(V z^gubP0%0qW4;Y4kQ7}Jx-SdIGwLJsLe!&mK=}i#WW*|*5-O++u{izvvm{0e#fubF3 zg34P+DMyrw>|9JzWnNrcY|8SP2cMF7pTh#l{~XrnRkXo)hcgOI^}$)#d|kDoglZ9F z9=PI!j3o!o)3scD%Iu;_-ehqTFYG3!l;DGbyDSV?(5kt{itb``=O^ihxBDDcJqEX6 z{g78h_w+zUg{11Co>ARm=NR1pu*83C=Uk_2$}U8+Wi_nrje}^T2j44$6iN=so zlPq)r-d|-^R*aNl73(k7Qx{;_$5X{Sd~B98+V~R>4Y)Q70apz8ky54&d6C*35W$ntEOInfCrktcX~Q;AG<8SIl#Inc$q8c06t|IpqAhy ehXJE + + + + + +``` +The screenshot below shows after successfully selecting a directory it uploads all the file inside it automatically. This demonstrates how the `SequentialUpload` property works in the Blazor File Manager component. + +![Blazor File Manager with SequentialUpload](images/blazor-filemanager-sequentialupload.png) + ## Chunk Upload The [ChunkSize](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.FileManager.FileManagerUploadSettings.html#Syncfusion_Blazor_FileManager_FileManagerUploadSettings_ChunkSize) property specifies the size of each chunk when uploading large files. It divides the file into smaller parts, which are uploaded sequentially to the server From e47d41e0cad5429b8e6a394da6e08a1e752387c5 Mon Sep 17 00:00:00 2001 From: JafarAli Date: Tue, 2 Dec 2025 15:34:01 +0530 Subject: [PATCH 157/266] 993788: Need to update the blazor file manager documentation for sequential upload sample --- blazor/file-manager/upload.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/blazor/file-manager/upload.md b/blazor/file-manager/upload.md index 261c7e9bcc..808e4bb047 100644 --- a/blazor/file-manager/upload.md +++ b/blazor/file-manager/upload.md @@ -61,7 +61,7 @@ When set to `true`, the selected files will process sequentially (one after th ``` -The screenshot below shows after successfully selecting a directory it uploads all the file inside it automatically. This demonstrates how the `SequentialUpload` property works in the Blazor File Manager component. +The screenshot below shows that each file begins uploading only after the previous one completes. This demonstrates how the `SequentialUpload` property works in the Blazor File Manager component. ![Blazor File Manager with SequentialUpload](images/blazor-filemanager-sequentialupload.png) From d62961525831f3147672ec84a8cf3c889575d44d Mon Sep 17 00:00:00 2001 From: Backiaraj Date: Tue, 2 Dec 2025 18:50:47 +0530 Subject: [PATCH 158/266] Updated Blazor components Getting Started UG documentation for Blazor Web App --- blazor/ribbon/getting-started-webapp.md | 129 +++++++++++------- .../ribbon/images/blazor-create-web-app.png | Bin 0 -> 81283 bytes .../getting-started-webapp.md | 32 ++--- blazor/sankey/getting-started-with-web-app.md | 121 ++++++++++------ .../sankey/images/blazor-create-web-app.png | Bin 0 -> 81283 bytes blazor/scheduler/getting-started-webapp.md | 38 +++--- blazor/sidebar/getting-started-webapp.md | 125 ++++++++++------- .../sidebar/images/blazor-create-web-app.png | Bin 0 -> 81283 bytes blazor/signature/getting-started-webapp.md | 125 ++++++++++------- .../images/blazor-create-web-app.png | Bin 0 -> 81283 bytes blazor/skeleton/getting-started-webapp.md | 125 ++++++++++------- .../skeleton/images/blazor-create-web-app.png | Bin 0 -> 81283 bytes blazor/smith-chart/getting-started-webapp.md | 124 ++++++++++------- .../images/blazor-create-web-app.png | Bin 0 -> 81283 bytes blazor/sparkline/getting-started-webapp.md | 124 ++++++++++------- .../images/blazor-create-web-app.png | Bin 0 -> 81283 bytes .../speech-to-text/getting-started-web-app.md | 117 ++++++++++------ .../images/blazor-create-web-app.png | Bin 0 -> 81283 bytes 18 files changed, 648 insertions(+), 412 deletions(-) create mode 100644 blazor/ribbon/images/blazor-create-web-app.png create mode 100644 blazor/sankey/images/blazor-create-web-app.png create mode 100644 blazor/sidebar/images/blazor-create-web-app.png create mode 100644 blazor/signature/images/blazor-create-web-app.png create mode 100644 blazor/skeleton/images/blazor-create-web-app.png create mode 100644 blazor/smith-chart/images/blazor-create-web-app.png create mode 100644 blazor/sparkline/images/blazor-create-web-app.png create mode 100644 blazor/speech-to-text/images/blazor-create-web-app.png diff --git a/blazor/ribbon/getting-started-webapp.md b/blazor/ribbon/getting-started-webapp.md index f558267f3a..1a793869dc 100644 --- a/blazor/ribbon/getting-started-webapp.md +++ b/blazor/ribbon/getting-started-webapp.md @@ -9,7 +9,7 @@ documentation: ug # Getting Started with Blazor Ribbon in a Blazor Web App -This section explains how to add the [Blazor Ribbon](https://www.syncfusion.com/blazor-components/blazor-ribbon) component to your Blazor Web App using [Visual Studio](https://visualstudio.microsoft.com/vs/) or Visual Studio Code. +This section explains how to add the [Blazor Ribbon](https://www.syncfusion.com/blazor-components/blazor-ribbon) component to your Blazor Web App using [Visual Studio](https://visualstudio.microsoft.com/vs/), [Visual Studio Code](https://code.visualstudio.com/), and the [.NET CLI](https://learn.microsoft.com/en-us/dotnet/core/tools/). To get started quickly with the Blazor Ribbon component, refer to the following video guide: @@ -26,19 +26,19 @@ To get started quickly with the Blazor Ribbon component, refer to the following ## 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&pivots=vs) or the [Syncfusion® Blazor Extension](https://blazor.syncfusion.com/documentation/visual-studio-integration/template-studio). +Create a **Blazor Web App** using Visual Studio 2022 via [Microsoft Templates](https://learn.microsoft.com/en-us/aspnet/core/blazor/tooling?view=aspnetcore-10.0&pivots=vs) or the [Syncfusion® Blazor Extension](https://blazor.syncfusion.com/documentation/visual-studio-integration/template-studio). -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=vs) while creating a Blazor Web Application. +Configure the appropriate [Interactive render mode](https://learn.microsoft.com/en-us/aspnet/core/blazor/components/render-modes?view=aspnetcore-10.0#render-modes) and [Interactivity location](https://learn.microsoft.com/en-us/aspnet/core/blazor/tooling?view=aspnetcore-10.0&pivots=vs) while creating a Blazor Web App. -## Install Syncfusion® Blazor Ribbon and Themes NuGet in the App +![Create Blazor Web App](images/blazor-create-web-app.png) -To add the Blazor Ribbon component, install the `Syncfusion.Blazor.Ribbon` and `Syncfusion.Blazor.Themes` NuGet packages. +## Install Syncfusion® Blazor Ribbon and Themes NuGet in the App -N> When using the `WebAssembly` or `Auto` render mode, it is required to install the necessary NuGet packages in the client project. +To add the **Blazor Rating** component in the app, open the NuGet package manager in Visual Studio (*Tools → NuGet Package Manager → Manage NuGet Packages for Solution*), then search and install [Syncfusion.Blazor.Ribbon](https://www.nuget.org/packages/Syncfusion.Blazor.Ribbon/) and [Syncfusion.Blazor.Themes](https://www.nuget.org/packages/Syncfusion.Blazor.Themes/). -Open the NuGet package manager in Visual Studio (*Tools → NuGet Package Manager → Manage NuGet Packages for Solution*), search for and install [Syncfusion.Blazor.Ribbon](https://www.nuget.org/packages/Syncfusion.Blazor.Ribbon/) and [Syncfusion.Blazor.Themes](https://www.nuget.org/packages/Syncfusion.Blazor.Themes/). +If using the `WebAssembly or Auto` render modes in the Blazor Web App, install Syncfusion® Blazor component NuGet packages in the client project. -Alternatively, you can use the Package Manager Console: +Alternatively, run the following commands in the Package Manager Console. {% tabs %} {% highlight C# tabtitle="Package Manager" %} @@ -49,7 +49,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 in [nuget.org](https://www.nuget.org/packages?q=syncfusion.blazor). Refer to the [NuGet packages](https://blazor.syncfusion.com/documentation/nuget-packages) topic for the available NuGet packages list with component details. {% endtabcontent %} @@ -61,11 +61,11 @@ N> Syncfusion® Blazor components are availa ## 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). +Create a **Blazor Web App** using Visual Studio Code via [Microsoft Templates](https://learn.microsoft.com/en-us/aspnet/core/blazor/tooling?view=aspnetcore-10.0&pivots=vsc) or the [Syncfusion® Blazor Extension](https://blazor.syncfusion.com/documentation/visual-studio-code-integration/create-project). -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=vsc) while creating a Blazor Web Application. +Configure the appropriate interactive render mode and interactivity location when setting up a Blazor Web App. For detailed information, 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, use the following commands. {% tabs %} {% highlight c# tabtitle="Blazor Web App" %} @@ -77,11 +77,9 @@ cd BlazorWebApp.Client {% endhighlight %} {% endtabs %} -N> For more information on creating a **Blazor Web App** with various interactive modes and locations, refer to this [link](https://blazor.syncfusion.com/documentation/getting-started/blazor-web-app?tabcontent=visual-studio-code#render-interactive-modes). - ## Install Syncfusion® Blazor Ribbon 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 using the `WebAssembly` or `Auto` render modes in the Blazor Web App need to be install Syncfusion® Blazor component 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. @@ -99,20 +97,69 @@ dotnet restore {% 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 in [nuget.org](https://www.nuget.org/packages?q=syncfusion.blazor). Refer to the [NuGet packages](https://blazor.syncfusion.com/documentation/nuget-packages) topic for the available NuGet packages list with component details. {% endtabcontent %} -{% endtabcontents %} +{% tabcontent .NET CLI %} -## Register Syncfusion® Blazor Service +## Prerequisites + +Latest version of the [.NET 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). + +{% tabs %} +{% highlight c# tabtitle=".NET CLI" %} + +dotnet --version + +{% endhighlight %} +{% endtabs %} + +## 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. + +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). + +For example, to create a Blazor Web App with the `Auto` interactive render mode, use the following commands: + +{% tabs %} +{% highlight c# tabtitle=".NET CLI" %} + +dotnet new blazor -o BlazorApp -int Auto +cd BlazorApp +cd BlazorApp.Client + +{% endhighlight %} +{% endtabs %} + +This command creates a new Blazor Web App and places it in a new directory called `BlazorApp` inside your current location. See the [Create a Blazor App](https://dotnet.microsoft.com/en-us/learn/aspnet/blazor-tutorial/create) and [dotnet new CLI command](https://learn.microsoft.com/en-us/aspnet/core/blazor/tooling?pivots=cli&view=aspnetcore-10.0) topics for more details. + +## Install Syncfusion® Blazor Ribbon and Themes NuGet in the App + +Here's an example of how to add **Blazor Ribbon** component in the application using the following command in the command prompt (Windows) or terminal (Linux and macOS) to install a [Syncfusion.Blazor.Ribbon](https://www.nuget.org/packages/Syncfusion.Blazor.Ribbon/) 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. + +If using the `WebAssembly or Auto` render modes in the Blazor Web App, install Syncfusion® Blazor component NuGet packages in the client project. + +{% tabs %} +{% highlight c# tabtitle=".NET CLI" %} -| Interactive Render Mode | Description | -| -- | -- | -| WebAssembly or Auto | Open **~/_Imports.razor** file from the client project.| -| Server | Open **~/_import.razor** file, which is located in the `Components` folder.| +dotnet add package Syncfusion.Blazor.Ribbon --version {{ site.releaseversion }} +dotnet add package Syncfusion.Blazor.Themes --version {{ site.releaseversion }} +dotnet restore + +{% endhighlight %} +{% endtabs %} -Import the `Syncfusion.Blazor` and `Syncfusion.Blazor.Ribbon` namespace. +N> Syncfusion® Blazor components are available in [nuget.org](https://www.nuget.org/packages?q=syncfusion.blazor). Refer to the [NuGet packages](https://blazor.syncfusion.com/documentation/nuget-packages) topic for the available NuGet packages list with component details. + +{% endtabcontent %} + +{% endtabcontents %} + +## Add Import Namespaces + +Open the **~/_Imports.razor** file from the client project and import the `Syncfusion.Blazor` and `Syncfusion.Blazor.Ribbon` namespace. {% tabs %} {% highlight C# tabtitle="~/_Imports.razor" %} @@ -123,10 +170,11 @@ Import the `Syncfusion.Blazor` and `Syncfusion.Blazor.Ribbon` namespace. {% endhighlight %} {% endtabs %} -Next, register the Syncfusion® Blazor service in **~/Program.cs**. +## Register Syncfusion® Blazor Service + +Register the Syncfusion® Blazor service in **~/Program.cs**. -* For `Server` render mode, register the service in the server project's `Program.cs`. -* For `WebAssembly` or `Auto` render modes, you must register the service in *both* the server and client (`.Client`) project `Program.cs` files. +If the **Interactive Render Mode** is set to `WebAssembly` or `Auto`, register the Syncfusion® Blazor service in the **~/Program.cs** files of the main `server` project and associated `.Client` project. {% tabs %} {% highlight c# tabtitle="Server(~/_Program.cs)" hl_lines="3 11" %} @@ -160,27 +208,6 @@ await builder.Build().RunAsync(); {% endhighlight %} {% endtabs %} -If the **Interactive Render Mode** is set to `Server`, your project will contain a single **~/Program.cs** file. So, you should register the Syncfusion® Blazor Service only in that **~/Program.cs** file. - -{% tabs %} -{% highlight c# tabtitle="~/_Program.cs" hl_lines="2 9" %} - -... -using Syncfusion.Blazor; - -var builder = WebApplication.CreateBuilder(args); - -// Add services to the container. -builder.Services.AddRazorComponents() - .AddInteractiveServerComponents(); -builder.Services.AddSyncfusionBlazor(); - -var app = builder.Build(); -.... - -{% 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 reference in the `` section and the script reference at the end of the `` in the **~/Components/App.razor** file as shown below: @@ -201,15 +228,15 @@ N> Check out the [Blazor Themes](https://blazor.syncfusion.com/documentation/app ## Add Syncfusion® Blazor Ribbon Component -Add the Syncfusion® Blazor Ribbon component in the **~Pages/.razor** file. 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: +Add the Syncfusion® Blazor Ribbon 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 top of the component, as follows: | Interactivity Location | RenderMode | Code | | --- | --- | --- | | Per page/component | Auto | `@rendermode InteractiveAuto` | | | WebAssembly | `@rendermode InteractiveWebAssembly` | -| | Server | `@rendermode InteractiveServer` | +| | None | --- | -N> If an **Interactivity Location** is set to `Global` and the **Render Mode** is set to `Auto` or `WebAssembly` or `Server`, the render mode is configured in the `App.razor` file by default. +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. {% tabs %} {% highlight razor %} @@ -313,4 +340,4 @@ Within a group, items are organized into collections. Use the [RibbonCollection] {% previewsample "https://blazorplayground.syncfusion.com/embed/LZrJCLsRVGKvCOVj?appbar=false&editor=false&result=true&errorlist=false&theme=bootstrap5" backgroundimage "[Blazor Ribbon Component](./images/getting-started.png)" %} -* Press Ctrl+F5 (Windows) or +F5 (macOS) to launch the application. This will render the Syncfusion® Blazor Ribbon component in your default web browser. +* Press Ctrl+F5 (Windows) or +F5 (macOS) to launch the application. This will render the Syncfusion® Blazor Ribbon component in the default web browser. diff --git a/blazor/ribbon/images/blazor-create-web-app.png b/blazor/ribbon/images/blazor-create-web-app.png new file mode 100644 index 0000000000000000000000000000000000000000..7dd6e612d26e6d27fcd14ee412f030c69f0fc0db GIT binary patch literal 81283 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 **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) @@ -23,9 +23,9 @@ This section explains how to add the [Blazor Rich Text Editor](https://www.syncf ## Create a new Blazor Web App in Visual Studio -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&pivots=vs) or the [Syncfusion® Blazor Extension](https://blazor.syncfusion.com/documentation/visual-studio-integration/template-studio). For detailed instructions, refer to the [Blazor Web App Getting Started](https://blazor.syncfusion.com/documentation/getting-started/blazor-web-app) documentation. +Create a **Blazor Web App** using Visual Studio 2022 via [Microsoft Templates](https://learn.microsoft.com/en-us/aspnet/core/blazor/tooling?view=aspnetcore-10.0&pivots=vs) or the [Syncfusion® Blazor Extension](https://blazor.syncfusion.com/documentation/visual-studio-integration/template-studio). For detailed instructions, refer to the [Blazor Web App Getting Started](https://blazor.syncfusion.com/documentation/getting-started/blazor-web-app) documentation. -Configure the appropriate [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=vs) when creating the Blazor Web App. +Configure the appropriate [Interactive render mode](https://learn.microsoft.com/en-us/aspnet/core/blazor/components/render-modes?view=aspnetcore-10.0#render-modes) and [Interactivity location](https://learn.microsoft.com/en-us/aspnet/core/blazor/tooling?view=aspnetcore-10.0&pivots=vs) while creating a Blazor Web App. ![Create Blazor Web App](images/blazor-create-web-app.png) @@ -33,9 +33,9 @@ Configure the appropriate [Interactive render mode](https://learn.microsoft.com/ To add the **Blazor Rich Text Editor** component in the app, open the NuGet package manager in Visual Studio (*Tools → NuGet Package Manager → Manage NuGet Packages for Solution*), then search and install [Syncfusion.Blazor.RichTextEditor](https://www.nuget.org/packages/Syncfusion.Blazor.RichTextEditor) and [Syncfusion.Blazor.Themes](https://www.nuget.org/packages/Syncfusion.Blazor.Themes/). -If the app uses the `WebAssembly` or `Auto` render mode, install the Syncfusion® Blazor NuGet packages in the Client project. +If using the `WebAssembly or Auto` render modes in the Blazor Web App, install Syncfusion® Blazor component NuGet packages in the client project. -Alternatively, use the following Package Manager commands: +Alternatively, run the following commands in the Package Manager Console. {% tabs %} {% highlight C# tabtitle="Package Manager" %} @@ -58,9 +58,9 @@ N> Syncfusion® Blazor components are availa ## Create a new Blazor Web App in Visual Studio Code -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 the [Blazor Web App Getting Started](https://blazor.syncfusion.com/documentation/getting-started/blazor-web-app?tabcontent=visual-studio-code) documentation. +Create a **Blazor Web App** using Visual Studio Code via [Microsoft Templates](https://learn.microsoft.com/en-us/aspnet/core/blazor/tooling?view=aspnetcore-10.0&pivots=vsc) or the [Syncfusion® Blazor Extension](https://blazor.syncfusion.com/documentation/visual-studio-code-integration/create-project). For detailed instructions, refer to the [Blazor Web App Getting Started](https://blazor.syncfusion.com/documentation/getting-started/blazor-web-app?tabcontent=visual-studio-code) documentation. -Configure the appropriate interactive render mode and interactivity location when setting up the Blazor Web App. For details, see the [interactive render mode](https://blazor.syncfusion.com/documentation/common/interactive-render-mode) documentation. +Configure the appropriate interactive render mode and interactivity location when setting up a Blazor Web App. For detailed information, refer to the [interactive render mode documentation](https://blazor.syncfusion.com/documentation/common/interactive-render-mode). For example, to create a Blazor Web App with the `Auto` interactive render mode, use the following commands. @@ -76,7 +76,7 @@ cd BlazorWebApp.Client ## Install Syncfusion® Blazor Rich Text Editor and Themes NuGet in the App -If the app uses `WebAssembly` or `Auto` render modes, install the Syncfusion® Blazor NuGet packages in the Client project. +If using the `WebAssembly` or `Auto` render modes in the Blazor Web App need to be install Syncfusion® Blazor component NuGet packages in the client project. * Press Ctrl+` to open the integrated terminal in Visual Studio Code. * Ensure the current directory contains your `.csproj` file. @@ -102,7 +102,7 @@ N> Syncfusion® Blazor components are availa ## Prerequisites -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 your terminal or command prompt: +Latest version of the [.NET 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). {% tabs %} {% highlight c# tabtitle=".NET CLI" %} @@ -116,9 +116,9 @@ dotnet --version Run the following command to create a new Blazor Web App. For detailed instructions, refer to [Blazor Web App Getting Started](https://blazor.syncfusion.com/documentation/getting-started/blazor-web-app?tabcontent=.net-cli) documentation. -Configure the appropriate interactive render mode and interactivity location when setting up the project. For details, see the [interactive render mode](https://blazor.syncfusion.com/documentation/common/interactive-render-mode) documentation. +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). -For example, to create a Blazor Web App with the `Auto` interactive render mode, run: +For example, to create a Blazor Web App with the `Auto` interactive render mode, use the following commands: {% tabs %} {% highlight c# tabtitle=".NET CLI" %} @@ -130,13 +130,13 @@ cd BlazorApp.Client {% endhighlight %} {% endtabs %} -This command creates a new Blazor Web App in a directory named `BlazorApp` at the current location. See [Create a Blazor app](https://dotnet.microsoft.com/en-us/learn/aspnet/blazor-tutorial/create) and the [dotnet new CLI command](https://learn.microsoft.com/en-us/aspnet/core/blazor/tooling?pivots=linux-macos&view=aspnetcore-8.0) for more details. +This command creates a new Blazor Web App and places it in a new directory called `BlazorApp` inside your current location. See the [Create a Blazor App](https://dotnet.microsoft.com/en-us/learn/aspnet/blazor-tutorial/create) and [dotnet new CLI command](https://learn.microsoft.com/en-us/aspnet/core/blazor/tooling?pivots=cli&view=aspnetcore-10.0) topics for more details. ## Install Syncfusion® Blazor Rich Text Editor and Themes NuGet in the App -Use the following commands to add the **Blazor Rich Text Editor** component to the application by installing [Syncfusion.Blazor.RichTextEditor](https://www.nuget.org/packages/Syncfusion.Blazor.RichTextEditor/) and [Syncfusion.Blazor.Themes](https://www.nuget.org/packages/Syncfusion.Blazor.Themes/) NuGet package. For details, see [Install and manage packages using the dotnet CLI](https://learn.microsoft.com/en-us/nuget/consume-packages/install-use-packages-dotnet-cli). +Here's an example of how to add **Blazor Rich Text Editor** component in the application using the following command in the command prompt (Windows) or terminal (Linux and macOS) to install a [Syncfusion.Blazor.RichTextEditor](https://www.nuget.org/packages/Syncfusion.Blazor.RichTextEditor/) 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. -If the app uses the `WebAssembly` or `Auto` render mode, install the Syncfusion® Blazor NuGet packages in the Client project. +If using the `WebAssembly or Auto` render modes in the Blazor Web App, install Syncfusion® Blazor component NuGet packages in the client project. {% tabs %} {% highlight c# tabtitle=".NET CLI" %} @@ -171,7 +171,7 @@ Open the **~/_Imports.razor** file in the client project and import the `Syncfus Register the Syncfusion® Blazor service in the **~/Program.cs** file of the Blazor Web App. -If the app uses `WebAssembly` or `Auto` interactive render modes, register the Syncfusion® Blazor service in the **~/Program.cs** files of the main `server` project and associated `.Client` project. +If the **Interactive Render Mode** is set to `WebAssembly` or `Auto`, register the Syncfusion® Blazor service in the **~/Program.cs** files of the main `server` project and associated `.Client` project. {% tabs %} {% highlight c# tabtitle="Server(~/_Program.cs)" hl_lines="3 11" %} @@ -259,7 +259,7 @@ N> If an **Interactivity Location** is set to `Global` and the **Render Mode** i {% endhighlight %} {% endtabs %} -* Press Ctrl+F5 (Windows) or +F5 (macOS) to launch the application. This will render the Syncfusion® Blazor Rich Text Editor component in your default web browser. +* Press Ctrl+F5 (Windows) or +F5 (macOS) to launch the application. This will render the Syncfusion® Blazor Rich Text Editor component in the default web browser. {% previewsample "https://blazorplayground.syncfusion.com/embed/rXhfZMqXAUqtaOyK?appbar=false&editor=false&result=true&errorlist=false&theme=bootstrap5" backgroundimage "[Blazor Rich Text Editor Component](./images/blazor-richtexteditor.png)" %} diff --git a/blazor/sankey/getting-started-with-web-app.md b/blazor/sankey/getting-started-with-web-app.md index febafc356e..7dd8441199 100644 --- a/blazor/sankey/getting-started-with-web-app.md +++ b/blazor/sankey/getting-started-with-web-app.md @@ -11,7 +11,7 @@ documentation: ug # Getting Started with Blazor Sankey Diagram in Blazor Web App -This section briefly explains about how to include [Blazor Sankey](https://www.syncfusion.com/blazor-components) diagram in your Blazor Web App using Visual Studio and Visual Studio Code. +This section briefly explains about how to include [Blazor Sankey](https://www.syncfusion.com/blazor-components) diagram in your Blazor Web App using [Visual Studio](https://visualstudio.microsoft.com/vs/), [Visual Studio Code](https://code.visualstudio.com/), and the [.NET CLI](https://learn.microsoft.com/en-us/dotnet/core/tools/). {% tabcontents %} @@ -23,11 +23,19 @@ This section briefly explains about how to include [Blazor Sankey](https://www.s ## Create a new Blazor Web App in Visual Studio -You can create a **Blazor Web App** using Visual Studio via [Microsoft Templates](https://learn.microsoft.com/en-us/aspnet/core/blazor/tooling?view=aspnetcore-7.0) or the [Syncfusion® Blazor Extension](https://blazor.syncfusion.com/documentation/visual-studio-integration/template-studio). +Create a **Blazor Web App** using Visual Studio 2022 via [Microsoft Templates](https://learn.microsoft.com/en-us/aspnet/core/blazor/tooling?view=aspnetcore-10.0&pivots=vs) or the [Syncfusion® Blazor Extension](https://blazor.syncfusion.com/documentation/visual-studio-integration/template-studio). + +Configure the appropriate [Interactive render mode](https://learn.microsoft.com/en-us/aspnet/core/blazor/components/render-modes?view=aspnetcore-10.0#render-modes) and [Interactivity location](https://learn.microsoft.com/en-us/aspnet/core/blazor/tooling?view=aspnetcore-10.0&pivots=vs) while creating a Blazor Web App. + +![Create Blazor Web App](images/blazor-create-web-app.png) ## Install Syncfusion® Blazor Sankey NuGet in the App -To add **Blazor Sankey Diagram** 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.Sankey](https://www.nuget.org/packages/Syncfusion.Blazor.Sankey). Alternatively, you can utilize the following package manager command to achieve the same. +To add the **Blazor Sankey Diagram** in the app, open the NuGet package manager in Visual Studio (*Tools → NuGet Package Manager → Manage NuGet Packages for Solution*), then search and install [Syncfusion.Blazor.Sankey](https://www.nuget.org/packages/Syncfusion.Blazor.Sankey). Alternatively, run the following commands in the Package Manager Console. + +If using the `WebAssembly or Auto` render modes in the Blazor Web App, install Syncfusion® Blazor components NuGet packages in the client project. + +Alternatively, you can utilize the following package manager command to achieve the same. {% tabs %} {% highlight C# tabtitle="Package Manager" %} @@ -37,7 +45,7 @@ Install-Package Syncfusion.Blazor.Sankey -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 in [nuget.org](https://www.nuget.org/packages?q=syncfusion.blazor). Refer to the [NuGet packages](https://blazor.syncfusion.com/documentation/nuget-packages) topic for the available NuGet packages list with component details. {% endtabcontent %} @@ -49,11 +57,11 @@ N> Syncfusion® Blazor components are availa ## 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). +Create a **Blazor Web App** using Visual Studio Code via [Microsoft Templates](https://learn.microsoft.com/en-us/aspnet/core/blazor/tooling?view=aspnetcore-10.0&pivots=vsc) or the [Syncfusion® Blazor Extension](https://blazor.syncfusion.com/documentation/visual-studio-code-integration/create-project). -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=vsc) while creating a Blazor Web Application. +Configure the appropriate interactive render mode and interactivity location when setting up a Blazor Web App. For detailed information, 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, use the following commands. {% tabs %} {% highlight c# tabtitle="Blazor Web App" %} @@ -65,11 +73,9 @@ cd BlazorWebApp.Client {% endhighlight %} {% endtabs %} -N> For more information on creating a **Blazor Web App** with various interactive modes and locations, refer to this [link](https://blazor.syncfusion.com/documentation/getting-started/blazor-web-app?tabcontent=visual-studio-code#render-interactive-modes). - ## Install Syncfusion® Blazor Sankey 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 using the `WebAssembly` or `Auto` render modes in the Blazor Web App, install Syncfusion® Blazor component 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. @@ -86,20 +92,68 @@ dotnet restore {% 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 in [nuget.org](https://www.nuget.org/packages?q=syncfusion.blazor). Refer to the [NuGet packages](https://blazor.syncfusion.com/documentation/nuget-packages) topic for the available NuGet packages list with component details. {% endtabcontent %} -{% endtabcontents %} +{% tabcontent .NET CLI %} -## Register Syncfusion® Blazor Service +## Prerequisites + +Latest version of the [.NET 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). + +{% tabs %} +{% highlight c# tabtitle=".NET CLI" %} + +dotnet --version + +{% endhighlight %} +{% endtabs %} + +## 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. + +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). + +For example, to create a Blazor Web App with the `Auto` interactive render mode, use the following commands: + +{% tabs %} +{% highlight c# tabtitle=".NET CLI" %} + +dotnet new blazor -o BlazorApp -int Auto +cd BlazorApp +cd BlazorApp.Client + +{% endhighlight %} +{% endtabs %} + +This command creates a new Blazor Web App and places it in a new directory called `BlazorApp` inside your current location. See the [Create a Blazor App](https://dotnet.microsoft.com/en-us/learn/aspnet/blazor-tutorial/create) and [dotnet new CLI command](https://learn.microsoft.com/en-us/aspnet/core/blazor/tooling?pivots=cli&view=aspnetcore-10.0) topics for more details. + +## Install Syncfusion® Blazor Sankey NuGet in the App + +Here's an example of how to add **Blazor Sankey** component in the application using the following command in the command prompt (Windows) or terminal (Linux and macOS) to install a [Syncfusion.Blazor.Sankey](https://www.nuget.org/packages/Syncfusion.Blazor.Sankey/) 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. + +If using the `WebAssembly or Auto` render modes in the Blazor Web App, install Syncfusion® Blazor component NuGet packages in the client project. + +{% tabs %} +{% highlight c# tabtitle=".NET CLI" %} + +dotnet add package Syncfusion.Blazor.Sankey --version {{ 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 the [NuGet packages](https://blazor.syncfusion.com/documentation/nuget-packages) topic for the available NuGet packages list with component details. + +{% endtabcontent %} + +{% endtabcontents %} -| Interactive Render Mode | Description | -| -- | -- | -| WebAssembly or Auto | Open **~/_Imports.razor** file from the client project.| -| Server | Open **~/_import.razor** file, which is located in the `Components` folder.| +## Add Import Namespaces -Import the `Syncfusion.Blazor` and `Syncfusion.Blazor.Sankey` namespace. +Open the **~/_Imports.razor** file from the client project and import the `Syncfusion.Blazor` and `Syncfusion.Blazor.Sankey` namespace. {% tabs %} {% highlight C# tabtitle="~/_Imports.razor" %} @@ -110,9 +164,11 @@ Import the `Syncfusion.Blazor` and `Syncfusion.Blazor.Sankey` namespace. {% endhighlight %} {% endtabs %} -Now, register the Syncfusion® Blazor Service in the **~/Program.cs** file of your Blazor Web App. +## Register Syncfusion® Blazor Service + +Register the Syncfusion® Blazor Service in the **~/Program.cs** file of your Blazor Web App. -If the **Interactive Render Mode** is set to `WebAssembly` or `Auto`, you need to register the Syncfusion® Blazor service in both **~/Program.cs** files of your Blazor Web App. +If the **Interactive Render Mode** is set to `WebAssembly` or `Auto`, register the Syncfusion® Blazor service in the **~/Program.cs** files of the main `server` project and associated `.Client` project. {% tabs %} {% highlight c# tabtitle="Server(~/_Program.cs)" hl_lines="3 11" %} @@ -146,27 +202,6 @@ await builder.Build().RunAsync(); {% endhighlight %} {% endtabs %} -If the **Interactive Render Mode** is set to `Server`, your project will contain a single **~/Program.cs** file. So, you should register the Syncfusion® Blazor Service only in that **~/Program.cs** file. - -{% tabs %} -{% highlight c# tabtitle="~/_Program.cs" hl_lines="2 9" %} - -... -using Syncfusion.Blazor; - -var builder = WebApplication.CreateBuilder(args); - -// Add services to the container. -builder.Services.AddRazorComponents() - .AddInteractiveServerComponents(); -builder.Services.AddSyncfusionBlazor(); - -var app = builder.Build(); -.... - -{% endhighlight %} -{% endtabs %} - ## Add script resources The script can be accessed from NuGet through [Static Web Assets](https://blazor.syncfusion.com/documentation/appearance/themes#static-web-assets). Include the script reference at the end of the `` in the **~/Components/App.razor** file as shown below: @@ -182,7 +217,7 @@ N> Check out the [Adding Script Reference](https://blazor.syncfusion.com/documen ## Add Blazor Sankey Diagram -Add the Syncfusion® Blazor Sankey Diagram in the **~/Pages/Index.razor** file. +Add the Syncfusion® Blazor Sankey Diagram 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 top of the component, as follows: {% tabs %} {% highlight razor %} @@ -236,7 +271,7 @@ Add the Syncfusion® Blazor Sankey Diagram i {% endhighlight %} {% endtabs %} -* Press Ctrl+F5 (Windows) or +F5 (macOS) to launch the application. This will render the Syncfusion® Blazor Sankey Diagram in your default web browser. +* Press Ctrl+F5 (Windows) or +F5 (macOS) to launch the application. This will render the Syncfusion® Blazor Sankey Diagram in the default web browser. ![Blazor Sankey Diagram](images/getting-started/blazor-sankey.png) diff --git a/blazor/sankey/images/blazor-create-web-app.png b/blazor/sankey/images/blazor-create-web-app.png new file mode 100644 index 0000000000000000000000000000000000000000..7dd6e612d26e6d27fcd14ee412f030c69f0fc0db GIT binary patch literal 81283 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 **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 projects with intelligent, context-aware code suggestions, streamlined setups, and real-time insights—all seamlessly integrated into 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) @@ -28,17 +28,17 @@ To get start quickly with Blazor Web App Scheduler, you can check on this video: ## 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. +Create a **Blazor Web App** using Visual Studio 2022 via [Microsoft Templates](https://learn.microsoft.com/en-us/aspnet/core/blazor/tooling?view=aspnetcore-10.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 Web App Getting Started](https://blazor.syncfusion.com/documentation/getting-started/blazor-web-app) documentation. -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. +Configure the appropriate [Interactive render mode](https://learn.microsoft.com/en-us/aspnet/core/blazor/components/render-modes?view=aspnetcore-10.0#render-modes) and [Interactivity location](https://learn.microsoft.com/en-us/aspnet/core/blazor/tooling?view=aspnetcore-10.0&pivots=vs) while creating a Blazor Web App. ![Create Blazor Web App](images/blazor-create-web-app.png) ## Install Syncfusion® Blazor Schedule and Themes NuGet in the App -To add **Blazor Scheduler** 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.Schedule](https://www.nuget.org/packages/Syncfusion.Blazor.Schedule) and [Syncfusion.Blazor.Themes](https://www.nuget.org/packages/Syncfusion.Blazor.Themes/). +To add the **Blazor Scheduler** component in the app, open the NuGet package manager in Visual Studio (*Tools → NuGet Package Manager → Manage NuGet Packages for Solution*), then search and install [Syncfusion.Blazor.Schedule](https://www.nuget.org/packages/Syncfusion.Blazor.Schedule) and [Syncfusion.Blazor.Themes](https://www.nuget.org/packages/Syncfusion.Blazor.Themes/). -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 using the `WebAssembly or Auto` render modes in the Blazor Web App, install Syncfusion® Blazor components NuGet packages in the client project. Alternatively, you can utilize the following package manager command to achieve the same. @@ -51,7 +51,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 in [nuget.org](https://www.nuget.org/packages?q=syncfusion.blazor). Refer to the [NuGet packages](https://blazor.syncfusion.com/documentation/nuget-packages) topic for the available NuGet packages list with component details. {% endtabcontent %} @@ -63,11 +63,11 @@ N> Syncfusion® Blazor components are availa ## 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. +Create a **Blazor Web App** using Visual Studio Code via [Microsoft Templates](https://learn.microsoft.com/en-us/aspnet/core/blazor/tooling?view=aspnetcore-10.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. -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). +Configure the appropriate interactive render mode and interactivity location when setting up a Blazor Web App. For detailed information, 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, use the following commands. {% tabs %} {% highlight c# tabtitle="Blazor Web App" %} @@ -81,7 +81,7 @@ cd BlazorWebApp.Client ## Install Syncfusion® Blazor Schedule 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 using the `WebAssembly` or `Auto` render modes in the Blazor Web App, install Syncfusion® Blazor component 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. @@ -99,7 +99,7 @@ dotnet restore {% 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 in [nuget.org](https://www.nuget.org/packages?q=syncfusion.blazor). Refer to the [NuGet packages](https://blazor.syncfusion.com/documentation/nuget-packages) topic for the available NuGet packages list with component details. {% endtabcontent %} @@ -123,7 +123,7 @@ Run the following command to create a new Blazor Web App in a command prompt (Wi 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). -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, use the following commands: {% tabs %} {% highlight c# tabtitle=".NET CLI" %} @@ -135,13 +135,13 @@ cd BlazorApp.Client {% endhighlight %} {% endtabs %} -This command creates new Blazor Web 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/aspnet/core/blazor/tooling?pivots=linux-macos&view=aspnetcore-8.0) topics for more details. +This command creates a new Blazor Web App and places it in a new directory called `BlazorApp` inside your current location. See the [Create a Blazor App](https://dotnet.microsoft.com/en-us/learn/aspnet/blazor-tutorial/create) and [dotnet new CLI command](https://learn.microsoft.com/en-us/aspnet/core/blazor/tooling?pivots=cli&view=aspnetcore-10.0) topics for more details. ## Install Syncfusion® Blazor Schedule and Themes NuGet in the App Here's an example of how to add **Blazor Scheduler** component in the application using the following command in the command prompt (Windows) or terminal (Linux and macOS) to install a [Syncfusion.Blazor.Schedule](https://www.nuget.org/packages/Syncfusion.Blazor.Schedule/) 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. -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 using the `WebAssembly or Auto` render modes in the Blazor Web App, install Syncfusion® Blazor component NuGet packages in the client project. {% tabs %} {% highlight c# tabtitle=".NET CLI" %} @@ -153,7 +153,7 @@ 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 in [nuget.org](https://www.nuget.org/packages?q=syncfusion.blazor). Refer to the [NuGet packages](https://blazor.syncfusion.com/documentation/nuget-packages) topic for the available NuGet packages list with component details. {% endtabcontent %} @@ -161,7 +161,7 @@ N> Syncfusion® Blazor components are availa ## Add Import Namespaces -Open **~/_Imports.razor** file from the client project and import the `Syncfusion.Blazor` and `Syncfusion.Blazor.Schedule` namespace. +Open the **~/_Imports.razor** file from the client project and import the `Syncfusion.Blazor` and `Syncfusion.Blazor.Sankey` namespace. {% tabs %} {% highlight C# tabtitle="~/_Imports.razor" %} @@ -174,9 +174,9 @@ Open **~/_Imports.razor** file from the client project and import the `Syncfusio ## Register Syncfusion® Blazor Service -Now, register the Syncfusion® Blazor Service in the **~/Program.cs** file of your Blazor Web App. +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. +If the **Interactive Render Mode** is set to `WebAssembly` or `Auto`, register the Syncfusion® Blazor service in the **~/Program.cs** files of the main `server` project and associated `.Client` project. {% tabs %} {% highlight c# tabtitle="Server(~/_Program.cs)" hl_lines="3 11" %} @@ -283,7 +283,7 @@ N> If an **Interactivity Location** is set to `Global` and the **Render Mode** i {% endhighlight %} {% endtabs %} -* Press Ctrl+F5 (Windows) or +F5 (macOS) to launch the application. This will render the Syncfusion® Blazor Scheduler component in your default web browser. +* Press Ctrl+F5 (Windows) or +F5 (macOS) to launch the application. This will render the Syncfusion® Blazor Scheduler component in the default web browser. {% previewsample "https://blazorplayground.syncfusion.com/embed/LNVpjWADUUybFgTL?appbar=false&editor=false&result=true&errorlist=false&theme=bootstrap5" backgroundimage "[Blazor Scheduler Component](images/blazor-scheduler.png)" %} diff --git a/blazor/sidebar/getting-started-webapp.md b/blazor/sidebar/getting-started-webapp.md index 7a31434f9d..af64cfd838 100644 --- a/blazor/sidebar/getting-started-webapp.md +++ b/blazor/sidebar/getting-started-webapp.md @@ -9,7 +9,7 @@ documentation: ug # Getting Started with Blazor Sidebar in Blazor Web App -This section briefly explains about how to include [Blazor Sidebar](https://www.syncfusion.com/blazor-components/blazor-sidebar) component in your Blazor Web App using [Visual Studio](https://visualstudio.microsoft.com/vs/) and Visual Studio Code. +This section briefly explains about how to include [Blazor Sidebar](https://www.syncfusion.com/blazor-components/blazor-sidebar) component in your Blazor Web App using [Visual Studio](https://visualstudio.microsoft.com/vs/), [Visual Studio Code](https://code.visualstudio.com/), and the [.NET CLI](https://learn.microsoft.com/en-us/dotnet/core/tools/). {% tabcontents %} @@ -21,17 +21,19 @@ This section briefly explains about how to include [Blazor Sidebar](https://www. ## 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&pivots=vs) or the [Syncfusion® Blazor Extension](https://blazor.syncfusion.com/documentation/visual-studio-integration/template-studio). +Create a **Blazor Web App** using Visual Studio 2022 via [Microsoft Templates](https://learn.microsoft.com/en-us/aspnet/core/blazor/tooling?view=aspnetcore-10.0&pivots=vs) or the [Syncfusion® Blazor Extension](https://blazor.syncfusion.com/documentation/visual-studio-integration/template-studio). -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=vs) while creating a Blazor Web Application. +Configure the appropriate [Interactive render mode](https://learn.microsoft.com/en-us/aspnet/core/blazor/components/render-modes?view=aspnetcore-10.0#render-modes) and [Interactivity location](https://learn.microsoft.com/en-us/aspnet/core/blazor/tooling?view=aspnetcore-10.0&pivots=vs) while creating a Blazor Web App. + +![Create Blazor Web App](images/blazor-create-web-app.png) ## Install Syncfusion® Blazor Navigations and Themes NuGet in the App -To add **Blazor Sidebar** 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.Navigations](https://www.nuget.org/packages/Syncfusion.Blazor.Navigations/) and [Syncfusion.Blazor.Themes](https://www.nuget.org/packages/Syncfusion.Blazor.Themes/). +To add the **Blazor Sidebar** component in the app, open the NuGet package manager in Visual Studio (*Tools → NuGet Package Manager → Manage NuGet Packages for Solution*), then search and install [Syncfusion.Blazor.Navigations](https://www.nuget.org/packages/Syncfusion.Blazor.Navigations/) and [Syncfusion.Blazor.Themes](https://www.nuget.org/packages/Syncfusion.Blazor.Themes/). -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 using the `WebAssembly or Auto` render modes in the Blazor Web App, install Syncfusion® Blazor component NuGet packages 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" %} @@ -42,7 +44,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 in [nuget.org](https://www.nuget.org/packages?q=syncfusion.blazor). Refer to the [NuGet packages](https://blazor.syncfusion.com/documentation/nuget-packages) topic for the available NuGet packages list with component details. {% endtabcontent %} @@ -54,11 +56,11 @@ N> Syncfusion® Blazor components are availa ## 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). +Create a **Blazor Web App** using Visual Studio Code via [Microsoft Templates](https://learn.microsoft.com/en-us/aspnet/core/blazor/tooling?view=aspnetcore-10.0&pivots=vsc) or the [Syncfusion® Blazor Extension](https://blazor.syncfusion.com/documentation/visual-studio-code-integration/create-project). -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=vsc) while creating a Blazor Web Application. +Configure the appropriate interactive render mode and interactivity location when setting up a Blazor Web App. For detailed information, 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, use the following commands. {% tabs %} {% highlight c# tabtitle="Blazor Web App" %} @@ -70,11 +72,9 @@ cd BlazorWebApp.Client {% endhighlight %} {% endtabs %} -N> For more information on creating a **Blazor Web App** with various interactive modes and locations, refer to this [link](https://blazor.syncfusion.com/documentation/getting-started/blazor-web-app?tabcontent=visual-studio-code#render-interactive-modes). - ## Install Syncfusion® Blazor Navigations 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 using the `WebAssembly` or `Auto` render modes in the Blazor Web App, install Syncfusion® Blazor component 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. @@ -92,20 +92,69 @@ dotnet restore {% 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 in [nuget.org](https://www.nuget.org/packages?q=syncfusion.blazor). Refer to the [NuGet packages](https://blazor.syncfusion.com/documentation/nuget-packages) topic for the available NuGet packages list with component details. {% endtabcontent %} -{% endtabcontents %} +{% tabcontent .NET CLI %} -## Register Syncfusion® Blazor Service +## Prerequisites + +Latest version of the [.NET 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). + +{% tabs %} +{% highlight c# tabtitle=".NET CLI" %} + +dotnet --version + +{% endhighlight %} +{% endtabs %} + +## 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. + +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). -| Interactive Render Mode | Description | -| -- | -- | -| WebAssembly or Auto | Open **~/_Imports.razor** file from the client project.| -| Server | Open **~/_import.razor** file, which is located in the `Components` folder.| +For example, to create a Blazor Web App with the `Auto` interactive render mode, use the following commands: -Import the `Syncfusion.Blazor` and `Syncfusion.Blazor.Navigations` namespace. +{% tabs %} +{% highlight c# tabtitle=".NET CLI" %} + +dotnet new blazor -o BlazorApp -int Auto +cd BlazorApp +cd BlazorApp.Client + +{% endhighlight %} +{% endtabs %} + +This command creates a new Blazor Web App and places it in a new directory called `BlazorApp` inside your current location. See the [Create a Blazor App](https://dotnet.microsoft.com/en-us/learn/aspnet/blazor-tutorial/create) and [dotnet new CLI command](https://learn.microsoft.com/en-us/aspnet/core/blazor/tooling?pivots=cli&view=aspnetcore-10.0) topics for more details. + +## Install Syncfusion® Blazor Navigations and Themes NuGet in the App + +Here's an example of how to add **Blazor Sidebar** component in the application using the following command in the command prompt (Windows) or terminal (Linux and macOS) to install a [Syncfusion.Blazor.Navigations](https://www.nuget.org/packages/Syncfusion.Blazor.Navigations/) 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. + +If using the `WebAssembly or Auto` render modes in the Blazor Web App, install Syncfusion® Blazor component NuGet packages in the client project. + +{% tabs %} +{% highlight c# tabtitle=".NET CLI" %} + +dotnet add package Syncfusion.Blazor.Navigations --version {{ site.releaseversion }} +dotnet add package Syncfusion.Blazor.Themes --version {{ 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 the [NuGet packages](https://blazor.syncfusion.com/documentation/nuget-packages) topic for the available NuGet packages list with component details. + +{% endtabcontent %} + +{% endtabcontents %} + +## Add Import Namespaces + +Open the **~/_Imports.razor** file from the client project and import the `Syncfusion.Blazor` and `Syncfusion.Blazor.Navigations` namespace. {% tabs %} {% highlight C# tabtitle="~/_Imports.razor" %} @@ -116,9 +165,11 @@ Import the `Syncfusion.Blazor` and `Syncfusion.Blazor.Navigations` namespace. {% endhighlight %} {% endtabs %} -Now, register the Syncfusion® Blazor Service in the **~/Program.cs** file of your Blazor Web App. +## Register Syncfusion® Blazor Service + +Register the Syncfusion® Blazor Service in the **~/Program.cs** file of your Blazor Web App. -If the **Interactive Render Mode** is set to `WebAssembly` or `Auto`, you need to register the Syncfusion® Blazor service in both **~/Program.cs** files of your Blazor Web App. +If the **Interactive Render Mode** is set to `WebAssembly` or `Auto`, register the Syncfusion® Blazor service in the **~/Program.cs** files of the main `server` project and associated `.Client` project. {% tabs %} {% highlight c# tabtitle="Server(~/_Program.cs)" hl_lines="3 11" %} @@ -152,27 +203,6 @@ await builder.Build().RunAsync(); {% endhighlight %} {% endtabs %} -If the **Interactive Render Mode** is set to `Server`, your project will contain a single **~/Program.cs** file. So, you should register the Syncfusion® Blazor Service only in that **~/Program.cs** file. - -{% tabs %} -{% highlight c# tabtitle="~/_Program.cs" hl_lines="2 9" %} - -... -using Syncfusion.Blazor; - -var builder = WebApplication.CreateBuilder(args); - -// Add services to the container. -builder.Services.AddRazorComponents() - .AddInteractiveServerComponents(); -builder.Services.AddSyncfusionBlazor(); - -var app = builder.Build(); -.... - -{% 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 reference in the `` section and the script reference at the end of the `` in the **~/Components/App.razor** file as shown below: @@ -193,16 +223,15 @@ N> Check out the [Blazor Themes](https://blazor.syncfusion.com/documentation/app ## Add Syncfusion® Blazor Sidebar component -Add the Syncfusion® Blazor Sidebar component in the **~Pages/.razor** file. 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: +Add the Syncfusion® Blazor Sidebar 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 top of the component, as follows: | Interactivity location | RenderMode | Code | | --- | --- | --- | | Per page/component | Auto | @rendermode InteractiveAuto | | | WebAssembly | @rendermode InteractiveWebAssembly | -| | Server | @rendermode InteractiveServer | | | None | --- | -N> If an **Interactivity Location** is set to `Global` and the **Render Mode** is set to `Auto` or `WebAssembly` or `Server`, the render mode is configured in the `App.razor` file by default. +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. {% tabs %} {% highlight razor %} @@ -245,7 +274,7 @@ N> If an **Interactivity Location** is set to `Global` and the **Render Mode** i {% endhighlight %} {% endtabs %} -* Press Ctrl+F5 (Windows) or +F5 (macOS) to launch the application. This will render the Syncfusion® Blazor Sidebar component in your default web browser. +* Press Ctrl+F5 (Windows) or +F5 (macOS) to launch the application. This will render the Syncfusion® Blazor Sidebar component in the default web browser. {% previewsample "https://blazorplayground.syncfusion.com/embed/rNhJjsKXKHvqsDGC?appbar=false&editor=false&result=true&errorlist=false&theme=bootstrap5" backgroundimage "[Blazor Sidebar Component](./images/blazor-sidebar.png)" %} diff --git a/blazor/sidebar/images/blazor-create-web-app.png b/blazor/sidebar/images/blazor-create-web-app.png new file mode 100644 index 0000000000000000000000000000000000000000..7dd6e612d26e6d27fcd14ee412f030c69f0fc0db GIT binary patch literal 81283 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® Blazor Extension](https://blazor.syncfusion.com/documentation/visual-studio-integration/template-studio). +Create a **Blazor Web App** using Visual Studio 2022 via [Microsoft Templates](https://learn.microsoft.com/en-us/aspnet/core/blazor/tooling?view=aspnetcore-10.0&pivots=vs) or the [Syncfusion® Blazor Extension](https://blazor.syncfusion.com/documentation/visual-studio-integration/template-studio). -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. +Configure the appropriate [Interactive render mode](https://learn.microsoft.com/en-us/aspnet/core/blazor/components/render-modes?view=aspnetcore-10.0#render-modes) and [Interactivity location](https://learn.microsoft.com/en-us/aspnet/core/blazor/tooling?view=aspnetcore-10.0&pivots=vs) while creating a Blazor Web App. + +![Create Blazor Web App](images/blazor-create-web-app.png) ## Install Syncfusion® Blazor Inputs and Themes NuGet in the App -To add **Blazor Signature** 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.Inputs](https://www.nuget.org/packages/Syncfusion.Blazor.Inputs/) and [Syncfusion.Blazor.Themes](https://www.nuget.org/packages/Syncfusion.Blazor.Themes/). +To add the **Blazor Signature** component in the app, open the NuGet package manager in Visual Studio (*Tools → NuGet Package Manager → Manage NuGet Packages for Solution*), then search and install [Syncfusion.Blazor.Inputs](https://www.nuget.org/packages/Syncfusion.Blazor.Inputs/) and [Syncfusion.Blazor.Themes](https://www.nuget.org/packages/Syncfusion.Blazor.Themes/). -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 using the `WebAssembly or Auto` render modes in the Blazor Web App, install Syncfusion® Blazor component NuGet packages 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" %} @@ -42,7 +44,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 in [nuget.org](https://www.nuget.org/packages?q=syncfusion.blazor). Refer to the [NuGet packages](https://blazor.syncfusion.com/documentation/nuget-packages) topic for the available NuGet packages list with component details. {% endtabcontent %} @@ -54,11 +56,11 @@ N> Syncfusion® Blazor components are availa ## 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). +Create a **Blazor Web App** using Visual Studio Code via [Microsoft Templates](https://learn.microsoft.com/en-us/aspnet/core/blazor/tooling?view=aspnetcore-10.0&pivots=vsc) or the [Syncfusion® Blazor Extension](https://blazor.syncfusion.com/documentation/visual-studio-code-integration/create-project). -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=vsc) while creating a Blazor Web Application. +Configure the appropriate interactive render mode and interactivity location when setting up a Blazor Web App. For detailed information, 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, use the following commands. {% tabs %} {% highlight c# tabtitle="Blazor Web App" %} @@ -70,11 +72,9 @@ cd BlazorWebApp.Client {% endhighlight %} {% endtabs %} -N> For more information on creating a **Blazor Web App** with various interactive modes and locations, refer to this [link](https://blazor.syncfusion.com/documentation/getting-started/blazor-web-app?tabcontent=visual-studio-code#render-interactive-modes). - ## Install Syncfusion® Blazor Inputs 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 using the `WebAssembly` or `Auto` render modes in the Blazor Web App, install Syncfusion® Blazor component 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. @@ -92,20 +92,69 @@ dotnet restore {% 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 in [nuget.org](https://www.nuget.org/packages?q=syncfusion.blazor). Refer to the [NuGet packages](https://blazor.syncfusion.com/documentation/nuget-packages) topic for the available NuGet packages list with component details. {% endtabcontent %} -{% endtabcontents %} +{% tabcontent .NET CLI %} -## Register Syncfusion® Blazor Service +## Prerequisites + +Latest version of the [.NET 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). + +{% tabs %} +{% highlight c# tabtitle=".NET CLI" %} + +dotnet --version + +{% endhighlight %} +{% endtabs %} + +## 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. + +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). -| Interactive Render Mode | Description | -| -- | -- | -| WebAssembly or Auto | Open **~/_Imports.razor** file from the client project.| -| Server | Open **~/_import.razor** file, which is located in the `Components` folder.| +For example, to create a Blazor Web App with the `Auto` interactive render mode, use the following commands: -Import the `Syncfusion.Blazor` and `Syncfusion.Blazor.Inputs` namespace. +{% tabs %} +{% highlight c# tabtitle=".NET CLI" %} + +dotnet new blazor -o BlazorApp -int Auto +cd BlazorApp +cd BlazorApp.Client + +{% endhighlight %} +{% endtabs %} + +This command creates a new Blazor Web App and places it in a new directory called `BlazorApp` inside your current location. See the [Create a Blazor App](https://dotnet.microsoft.com/en-us/learn/aspnet/blazor-tutorial/create) and [dotnet new CLI command](https://learn.microsoft.com/en-us/aspnet/core/blazor/tooling?pivots=cli&view=aspnetcore-10.0) topics for more details. + +## Install Syncfusion® Blazor Inputs and Themes NuGet in the App + +Here's an example of how to add **Blazor Signature** component in the application using the following command in the command prompt (Windows) or terminal (Linux and macOS) to install a [Syncfusion.Blazor.Inputs](https://www.nuget.org/packages/Syncfusion.Blazor.Inputs/) 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. + +If using the `WebAssembly or Auto` render modes in the Blazor Web App, install Syncfusion® Blazor component NuGet packages in the client project. + +{% tabs %} +{% highlight c# tabtitle=".NET CLI" %} + +dotnet add package Syncfusion.Blazor.Inputs --version {{ site.releaseversion }} +dotnet add package Syncfusion.Blazor.Themes --version {{ 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 the [NuGet packages](https://blazor.syncfusion.com/documentation/nuget-packages) topic for the available NuGet packages list with component details. + +{% endtabcontent %} + +{% endtabcontents %} + +## Add Import Namespaces + +Open the **~/_Imports.razor** file from the client project and import the `Syncfusion.Blazor` and `Syncfusion.Blazor.Inputs` namespace. {% tabs %} {% highlight C# tabtitle="~/_Imports.razor" %} @@ -116,9 +165,11 @@ Import the `Syncfusion.Blazor` and `Syncfusion.Blazor.Inputs` namespace. {% endhighlight %} {% endtabs %} -Now, register the Syncfusion® Blazor Service in the **~/Program.cs** file of your Blazor Web App. +## Register Syncfusion® Blazor Service + +Register the Syncfusion® Blazor Service in the **~/Program.cs** file of your Blazor Web App. -If the **Interactive Render Mode** is set to `WebAssembly` or `Auto`, you need to register the Syncfusion® Blazor service in both **~/Program.cs** files of your Blazor Web App. +If the **Interactive Render Mode** is set to `WebAssembly` or `Auto`, register the Syncfusion® Blazor service in the **~/Program.cs** files of the main `server` project and associated `.Client` project. {% tabs %} {% highlight c# tabtitle="Server(~/_Program.cs)" hl_lines="3 11" %} @@ -152,27 +203,6 @@ await builder.Build().RunAsync(); {% endhighlight %} {% endtabs %} -If the **Interactive Render Mode** is set to `Server`, your project will contain a single **~/Program.cs** file. So, you should register the Syncfusion® Blazor Service only in that **~/Program.cs** file. - -{% tabs %} -{% highlight c# tabtitle="~/_Program.cs" hl_lines="2 9" %} - -... -using Syncfusion.Blazor; - -var builder = WebApplication.CreateBuilder(args); - -// Add services to the container. -builder.Services.AddRazorComponents() - .AddInteractiveServerComponents(); -builder.Services.AddSyncfusionBlazor(); - -var app = builder.Build(); -.... - -{% 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 reference in the `` section and the script reference at the end of the `` in the **~/Components/App.razor** file as shown below: @@ -193,16 +223,15 @@ N> Check out the [Blazor Themes](https://blazor.syncfusion.com/documentation/app ## Add Syncfusion® Blazor Signature component -Add the Syncfusion® Blazor Signature component in the **~Pages/.razor** file. 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: +Add the Syncfusion® Blazor Signature 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 top of the component, as follows: | Interactivity location | RenderMode | Code | | --- | --- | --- | | Per page/component | Auto | @rendermode InteractiveAuto | | | WebAssembly | @rendermode InteractiveWebAssembly | -| | Server | @rendermode InteractiveServer | | | None | --- | -N> If an **Interactivity Location** is set to `Global` and the **Render Mode** is set to `Auto` or `WebAssembly` or `Server`, the render mode is configured in the `App.razor` file by default. +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. {% tabs %} {% highlight razor %} @@ -221,7 +250,7 @@ N> If an **Interactivity Location** is set to `Global` and the **Render Mode** i {% endhighlight %} {% endtabs %} -* Press Ctrl+F5 (Windows) or +F5 (macOS) to launch the application. This will render the Syncfusion® Blazor Signature component in your default web browser. +* Press Ctrl+F5 (Windows) or +F5 (macOS) to launch the application. This will render the Syncfusion® Blazor Signature component in the default web browser. {% previewsample "https://blazorplayground.syncfusion.com/embed/VNLJXigtqGYfziwd?appbar=false&editor=false&result=true&errorlist=false&theme=bootstrap5" backgroundimage "[Blazor Signature Component](./images/blazor-signature-component.png)" %} diff --git a/blazor/signature/images/blazor-create-web-app.png b/blazor/signature/images/blazor-create-web-app.png new file mode 100644 index 0000000000000000000000000000000000000000..7dd6e612d26e6d27fcd14ee412f030c69f0fc0db GIT binary patch literal 81283 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® Blazor Extension](https://blazor.syncfusion.com/documentation/visual-studio-integration/template-studio). +Create a **Blazor Web App** using Visual Studio 2022 via [Microsoft Templates](https://learn.microsoft.com/en-us/aspnet/core/blazor/tooling?view=aspnetcore-10.0&pivots=vs) or the [Syncfusion® Blazor Extension](https://blazor.syncfusion.com/documentation/visual-studio-integration/template-studio). -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=vs) while creating a Blazor Web Application. +Configure the appropriate [Interactive render mode](https://learn.microsoft.com/en-us/aspnet/core/blazor/components/render-modes?view=aspnetcore-10.0#render-modes) and [Interactivity location](https://learn.microsoft.com/en-us/aspnet/core/blazor/tooling?view=aspnetcore-10.0&pivots=vs) while creating a Blazor Web App. + +![Create Blazor Web App](images/blazor-create-web-app.png) ## Install Syncfusion® Blazor Notifications and Themes NuGet in the App -To add **Blazor Skeleton** 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.Notifications](https://www.nuget.org/packages/Syncfusion.Blazor.Notifications/) and [Syncfusion.Blazor.Themes](https://www.nuget.org/packages/Syncfusion.Blazor.Themes/). +To add the **Blazor Skeleton** component in the app, open the NuGet package manager in Visual Studio (*Tools → NuGet Package Manager → Manage NuGet Packages for Solution*), then search and install [Syncfusion.Blazor.Notifications](https://www.nuget.org/packages/Syncfusion.Blazor.Notifications/) and [Syncfusion.Blazor.Themes](https://www.nuget.org/packages/Syncfusion.Blazor.Themes/). -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 using the `WebAssembly or Auto` render modes in the Blazor Web App, install Syncfusion® Blazor component NuGet packages 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" %} @@ -42,7 +44,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 in [nuget.org](https://www.nuget.org/packages?q=syncfusion.blazor). Refer to the [NuGet packages](https://blazor.syncfusion.com/documentation/nuget-packages) topic for the available NuGet packages list with component details. {% endtabcontent %} @@ -54,11 +56,11 @@ N> Syncfusion® Blazor components are availa ## 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). +Create a **Blazor Web App** using Visual Studio Code via [Microsoft Templates](https://learn.microsoft.com/en-us/aspnet/core/blazor/tooling?view=aspnetcore-10.0&pivots=vsc) or the [Syncfusion® Blazor Extension](https://blazor.syncfusion.com/documentation/visual-studio-code-integration/create-project). -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=vsc) while creating a Blazor Web Application. +Configure the appropriate interactive render mode and interactivity location when setting up a Blazor Web App. For detailed information, 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, use the following commands. {% tabs %} {% highlight c# tabtitle="Blazor Web App" %} @@ -70,11 +72,9 @@ cd BlazorWebApp.Client {% endhighlight %} {% endtabs %} -N> For more information on creating a **Blazor Web App** with various interactive modes and locations, refer to this [link](https://blazor.syncfusion.com/documentation/getting-started/blazor-web-app?tabcontent=visual-studio-code#render-interactive-modes). - ## Install Syncfusion® Blazor Notifications 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 using the `WebAssembly` or `Auto` render modes in the Blazor Web App, install Syncfusion® Blazor component 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. @@ -92,20 +92,69 @@ dotnet restore {% 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 in [nuget.org](https://www.nuget.org/packages?q=syncfusion.blazor). Refer to the [NuGet packages](https://blazor.syncfusion.com/documentation/nuget-packages) topic for the available NuGet packages list with component details. {% endtabcontent %} -{% endtabcontents %} +{% tabcontent .NET CLI %} -## Register Syncfusion® Blazor Service +## Prerequisites + +Latest version of the [.NET 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). + +{% tabs %} +{% highlight c# tabtitle=".NET CLI" %} + +dotnet --version + +{% endhighlight %} +{% endtabs %} + +## 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. + +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). -| Interactive Render Mode | Description | -| -- | -- | -| WebAssembly or Auto | Open **~/_Imports.razor** file from the client project.| -| Server | Open **~/_import.razor** file, which is located in the `Components` folder.| +For example, to create a Blazor Web App with the `Auto` interactive render mode, use the following commands: -Import the `Syncfusion.Blazor` and `Syncfusion.Blazor.Notifications` namespace. +{% tabs %} +{% highlight c# tabtitle=".NET CLI" %} + +dotnet new blazor -o BlazorApp -int Auto +cd BlazorApp +cd BlazorApp.Client + +{% endhighlight %} +{% endtabs %} + +This command creates a new Blazor Web App and places it in a new directory called `BlazorApp` inside your current location. See the [Create a Blazor App](https://dotnet.microsoft.com/en-us/learn/aspnet/blazor-tutorial/create) and [dotnet new CLI command](https://learn.microsoft.com/en-us/aspnet/core/blazor/tooling?pivots=cli&view=aspnetcore-10.0) topics for more details. + +## Install Syncfusion® Blazor Notifications and Themes NuGet in the App + +Here's an example of how to add **Blazor Skeleton** component in the application using the following command in the command prompt (Windows) or terminal (Linux and macOS) to install a [Syncfusion.Blazor.Notifications](https://www.nuget.org/packages/Syncfusion.Blazor.Notifications/) 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. + +If using the `WebAssembly or Auto` render modes in the Blazor Web App, install Syncfusion® Blazor component NuGet packages in the client project. + +{% tabs %} +{% highlight c# tabtitle=".NET CLI" %} + +dotnet add package Syncfusion.Blazor.Notifications --version {{ site.releaseversion }} +dotnet add package Syncfusion.Blazor.Themes --version {{ 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 the [NuGet packages](https://blazor.syncfusion.com/documentation/nuget-packages) topic for the available NuGet packages list with component details. + +{% endtabcontent %} + +{% endtabcontents %} + +## Add Import Namespaces + +Open the **~/_Imports.razor** file from the client project and import the `Syncfusion.Blazor` and `Syncfusion.Blazor.Notifications` namespace. {% tabs %} {% highlight C# tabtitle="~/_Imports.razor" %} @@ -116,9 +165,11 @@ Import the `Syncfusion.Blazor` and `Syncfusion.Blazor.Notifications` namespace. {% endhighlight %} {% endtabs %} -Now, register the Syncfusion® Blazor Service in the **~/Program.cs** file of your Blazor Web App. +## Register Syncfusion® Blazor Service + +Register the Syncfusion® Blazor Service in the **~/Program.cs** file of your Blazor Web App. -If the **Interactive Render Mode** is set to `WebAssembly` or `Auto`, you need to register the Syncfusion® Blazor service in both **~/Program.cs** files of your Blazor Web App. +If the **Interactive Render Mode** is set to `WebAssembly` or `Auto`, register the Syncfusion® Blazor service in the **~/Program.cs** files of the main `server` project and associated `.Client` project. {% tabs %} {% highlight c# tabtitle="Server(~/_Program.cs)" hl_lines="3 11" %} @@ -152,27 +203,6 @@ await builder.Build().RunAsync(); {% endhighlight %} {% endtabs %} -If the **Interactive Render Mode** is set to `Server`, your project will contain a single **~/Program.cs** file. So, you should register the Syncfusion® Blazor Service only in that **~/Program.cs** file. - -{% tabs %} -{% highlight c# tabtitle="~/_Program.cs" hl_lines="2 9" %} - -... -using Syncfusion.Blazor; - -var builder = WebApplication.CreateBuilder(args); - -// Add services to the container. -builder.Services.AddRazorComponents() - .AddInteractiveServerComponents(); -builder.Services.AddSyncfusionBlazor(); - -var app = builder.Build(); -.... - -{% 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 reference in the `` section and the script reference at the end of the `` in the **~/Components/App.razor** file as shown below: @@ -193,16 +223,15 @@ N> Check out the [Blazor Themes](https://blazor.syncfusion.com/documentation/app ## Add Syncfusion® Blazor Skeleton component -Add the Syncfusion® Blazor Skeleton component in the **~Pages/.razor** file. 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: +Add the Syncfusion® Blazor Skeleton 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 top of the component, as follows: | Interactivity location | RenderMode | Code | | --- | --- | --- | | Per page/component | Auto | @rendermode InteractiveAuto | | | WebAssembly | @rendermode InteractiveWebAssembly | -| | Server | @rendermode InteractiveServer | | | None | --- | -N> If an **Interactivity Location** is set to `Global` and the **Render Mode** is set to `Auto` or `WebAssembly` or `Server`, the render mode is configured in the `App.razor` file by default. +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. {% tabs %} {% highlight razor %} @@ -222,7 +251,7 @@ N> If an **Interactivity Location** is set to `Global` and the **Render Mode** i {% endhighlight %} {% endtabs %} -* Press Ctrl+F5 (Windows) or +F5 (macOS) to launch the application. This will render the Syncfusion® Blazor Skeleton component in your default web browser. +* Press Ctrl+F5 (Windows) or +F5 (macOS) to launch the application. This will render the Syncfusion® Blazor Skeleton component in the default web browser. {% previewsample "https://blazorplayground.syncfusion.com/embed/hNhfNWgXUFWfbEvA?appbar=false&editor=false&result=true&errorlist=false&theme=bootstrap5" backgroundimage "[Blazor Skeleton Component](./images/blazor-skeleton-component.png)" %} diff --git a/blazor/skeleton/images/blazor-create-web-app.png b/blazor/skeleton/images/blazor-create-web-app.png new file mode 100644 index 0000000000000000000000000000000000000000..7dd6e612d26e6d27fcd14ee412f030c69f0fc0db GIT binary patch literal 81283 zcmd?Q^;cBg8#k<^NQ{7VN=k!Bm$V8Jf^B;K2jpH?Ni6KX`x*eDDCv z{Sn^%o2Tm?fcx7+&-bbd4=P6KckUl>?Bw6cKX_1;KzM6`d;d(}_S(?%!2>d{f3Alx zTPD8;5AF)yD9P*kne8v*o9Om+;<~{v%`7d|UryTtT{--BGHl~GdSL-aF%&J#KFUtT za{*m=db&6~k12W2?q65(^18L9x3n~_ERZR0WLvqLPM_W?myB5HXJhY5Nk(90RV3pTA0C4j{FwuceW z8bAfAn^{B=w@I4x-}Zs=Q#!ZFX?zbRsf}7D0N^8KqHO6A@hH%vf*-+NU~RdxrDM== zB$-EEolH~xl=9)OLOB-8zYX~7>{{JcBq;jLa3}C)?`>hMrn-KoSzX?mrPKU2w*pM$ zsY9*WHdXSIe<@8^y`oIt6kQ1TSkv!=8&0cB82`2xX9zngW=NM(u%6|A<1wr5FBRrA zVo>^MfK|d?VA}luKu~a!s%Cc9&#)?_P82{sxga;e1xHM&Z z!(nWBOF~D_2t$!cMXLMg0rv%iWVCt4WvBNM^HT~s_)J$WKd=1H*ZFh}Os{e*bXE_T z^f>kh$f#+U;K2 zvZ1(+_{Su`_h0Y^6?H^iO>e ziCwnry1;%rNBB5i#m_7Bk^hzfyMo!5*MB`|toC38|67G+F&bI2@4_D)Y{Mx{BYp-! zv{eQIR`BBMU)d{}gu}2e8*yabfMN#e>pkJxUQ90^n&QXx^)lf1oV8P(u>Fsb&8{cG zRb@+9CQXM4N!v^ATb&~L8cmH|=P?a0PW0WFF4NFD2|D9R)&%iUeF-DLl}xx~rxPcXi3)&Y2FZXGT zFEyyo{*~?G!9;n1=e&4)%|stm&T3h$7K%c4DPs3oRnLsP7-RO#zECipZJ>RF@BQCD|GBEf*lq=2pPc(iseI+l#y@os!8bO{Zo3tGYgz92~aDU^=7x2sfdX(>f z&9V{wQ9roN$H;x>#pX8r|NZ36i^hRO8UN_5tbQAA$&H->?N%w7VwKSwDW_(ect6imE^qjR!7nOYPtIIVAh_kuQK`Y|?Bhbr9Z^_PTQ^u(zJWemM!c2^@ zIfwZD>h$)BRr5N0OKk-`Doyk5#Wf_s;y@eXQJ4 zvxe<%y(hU3eG=z{#PB}FADpZHm&*y#h~GVJF}V?$2Z2OKa`c1^X0N^%D^0*@n-bqB zhv~!uR}b{fm1D#CJvwFZWgt-DW8|b}Zuq=x_h2q3K*i@dZ$Kb>XRq*;V>4@Y&#%tE z>#U%ZM+!Zb5?w+4pTZ?b4HnQ=Rj`n8_iWbpFD(HnP%D0bVi^zKOY~E3IT~DW3$Bb1 zApK$5JW^+3bbH+PkZXgxudl!Q@--hwr%IBn6on355NHkaSx>dtmX)HHUXOfQ7uZE> z4k`I|KxJt7RXl8+AEL}Z8o4J)-pZ?RH1w`;wZuu_@d=Gs||3mHx zJb04YHlQ{6=IZSc1^MF0(1&MSd{h!F=ZMREella7qV>uTOo5o5qqMp)dW-VN-Q`O^SI4P1YfM% ze;iyAoRDqQ8ge=v{#tWLLB%EU1oM7t!1eDM3yuUtCDU~;e|jS;>WORd-Sot}f6QNV zi|V~j%GJtUCVJ_2r`&omL+6L-aTW9~0+UG|hFHHYJ7W&ZZY9zl)`=yyv;O^!ryjy2 zp9uD{WxujSf33K(=~q~aN+R9da!+DSxweF!sf&2@)E^o}4!#my2@cI>OGtPdG=#iv z*|=F;O<;1WL~dUG?7=G99}Lo}+I&Hq4o+ZPi~8}cqpHP0twDLYusL&jg)wL(9; zEK^?QmlS;fx*BznY<>yK3aN5R7v&iOFM^#q(0DTPW+e_~Sq0~Om#8g_D}QN@z|b@? z_Ax8~l0UTTIOyn4lRx2U;1X~$x6E&!I-@)fx|;pSU_*nhA8eoDYB3EvXGcpmxC@-? z;_-Vb2tmetui7)$1J zGlOqIt*TGYtl6+%NMGc2&DLojHE@ahpVO;{1Q2LK=NYA>UnGMnkR;{B`Dt9+RMB?> zqm^t-YtM$#*&6^r)VQ9lj150<8A#159*s#kxZbrFPFO_r= zyr`uBy3*%0s;^k9qc==mOf(0#g=|PSnXjfE7aHr03hQZh-4OSD!t&^{5IN?QK37mI zYyHMu^!$b^=x$JQ&>6Ak)PZQjxvpCROGh-6=~Rr|&k8trKqHm<&x+|@4`6B#w6dYO zoRZ+rkBgilR-v>a6TmOA2;Hqt7Zs`2+wNFI{TXkywd(ZiBE1Tu;=vAz$amDs1roHF zV}>@zE2-vq!_e5OPi}@nPmX3=L=aqAvz;baKbB*ou_afwkJ|fuiGvkd{&=ozPyird zgj((D|@Zdj}YtoqG zp&W#a%QJd@)n~?s=K8MeE79u+r)6xpTAI&%hg|(N*rmIZ@`UA{KmQPeCERiJBETn z@qIB>y-~dCO`+T>zP~!Hs6ynk$x8GuruRK`Z=DqM<&brLq=7!n8wl3nah#zD&hCwa=m>vZ3xIZ+TNGf~)mNt(GlD>ZH>D2n2qwoPK zXvY4`mbeu&q-64zB5U3wOI_kb>)Tesv{lCHh@`+eR3KQPhO&IT*_-ess!$elqfbS& zJ5S35MN=9Hw9%X;YiBI^?We;CnV=_FFw}m)Ee31=`QUhqIc>N)$&?fHQ<4ibx}m8R zeFS`ABtClZSsHGbPMPXk?O;2~{7 z!|+}uHd%>2oB~aoKT7DjvS*%=r>s^5p$u8O(KPF-5eWXQF?spSh%L>MhTEp@NEi{F zAKSIXr**WcFXZ7{`6IWsicNqbQzeLfcagrvIn}~%(H!ZSFPH2iirzGC#oP+}oyW>m zE^)n=$|xAk~gR7z9%l208EsPj!=26=BI)(1(ijus(n=YTea zbvffan>{^yOdq89PJ^NKYGGE;kh?Quu2_Xlz~-0QZA;&o=k0cWju6a)Kz$J%fftWa zn(QqXv`81;kP;Z^p*5HOfIkwU-d7flJzlGARr|EBe%=+nRtL`R+skR_iXap^t`+MW zV;L8-=Y~u19Zymnt@eP;dS^|y*51BNJoFpDduUZQdUz0i6oAo=` z1Ro#z%2Xa06;_*A$Yc4uI|@q;xs8Cx1u&hPg)qVIF2LfNA-Qk1xy0E*t9d6X9FeM7 z4#jd#*p?nWRo`yDZ#Rkqz?Vj=V+nh!(+#p+n(s1W*OwmiW!`;pl?7r8KyN7*GMyD) z)%z)Ot!mBFw~~x@f~QM$+W8le2+8elS7y&A+T`Ne z@c-HR#V>#_p+RT4oJrI4_ZFFjO)#}2~s@uY`kg=FT036kmIiARLwfyCrTixn|gWFFc z8wz8R3paAM?J{4a(vP8^P|%h&(L4JysTquYDg#@{Ey96#?PpF9c-x?*-i4xj+%|SH z%+eTew?~A>5n;`KNc5J0w}f(f#nN8U;OB#64!_lMO=QpIJE6cfzQCkfzFF%CtG-$n zzr7vWt6C^-1zRi*Gg-9FjT)9LG22laR@yC1_u4Vt`a7L5cBaI~#gsPN@~bh%$43OJ87)-eW0h;T1c`$SDu zXkb5H7Hw<7w%IMM4gk;LE{z%Vg$Q_I+nx(kbzPr~7!k5qwNT>zePJ8zZ5VD252QMR zp5q!3nMVmfJK@l-g8z85FL)F;yVn*Dp?&!W(k`atIkjWkF5Fi6INf; zeU9h_gHjFeF0Ls1 zj?|H#CxlNchJHGAB%!U5pd9W`29KYQF)$rZ+EW%6=+ty={j4wN0=jM)<9VjV#U6ev zR|8|RO&Ruk7q#Rq*+5iKoRKeqN2R=vy^WhVw3Z1Lgpqi; z-~Mo-T9~JBNb8whQNV#>5yY%p4NlTq^}HaU3`c^7(PlaE;LFYdCYE-rJ-)sXe_4zHJAe*wv#M>!9g0C zkrm^})W~VK+y`U+$C3!yFL|~6;cpJ9(d$FS7;R&x#$w{A!PmALl6hnvZ@Vg6@zq)~ zvFJ09_}Rb{^0>u73JJ@Yzf1TuXB=Y6<@er}{S_rb3p(+Za<*|>t!x4s8nRUi+Nd{d#V1fU-ZDmv%)t_9Q@sO_Q?tRBhxQjI?sG|o@+-1K3HDdPPMIbG^aoVQ_^%6WE|n)zi%u=xR&M|<@G z`=@Q8vm(Ip@STjn=m3XO|6ml$EO-;eLEd`vp5Y~9n_58IhC9_KZgvrxH#-Y9$!fuy zASJG|cYh>fO(St2EuY0JCCy{%03AHc! z`t3}k(rl^t8(3%qYn-dCuMZSjF3o#0iEq}T0@o3{tLq=5b8>!1Q?>0xhy7U)9U6<$ zZQ~vYU9L^_yNCu0x%K#4M-BF?eT;7h{Hyz_{c+?q7e9@Gq@&x;%{xowh`;D0?;Fx4 zSBBYN!u7Q;V}0f}AqV9Sis5+RdW~)>ksO7+YrAB(_ZN(^P3ojSsLnbwyiX!9X8p*@51%0hOcD_``m|>*-Hu5S)iQ=Qtn!*= z1mNj>&rYW^{Hl!ExSQyZNY0KIP(Qo^ptE%wcnpi%)$MiXT5YbyLorm@?}E~ zFa3T}1~WQ@ee}27h$>Eln4k>lu`?^oSJG!`Kcc<}HVypMw)HR385QUQyS7H>w3LTS zWA(5ges|xf$|-QE$y*3{RG)s!PKo}y=VO28&JZ|WOr@dZu)RHGQ={-U3>M@0X0X2Q z66~;NAd49I?%qYo*A_@|gtq;%_ku4~isS7!zQK;IKX=L_4Rn?>iH{Cq^7?aUb5T0> z;(sWSd2I#TMiQ`|#wt5J*-{LSq=1`Bi8M(BT=?I3=J$udaq`7fw0nXxEAoPHY<*F* zaL)6BjK8^gwJerrG|M+^(O)Xg?we@0(F0EDUH4QG; z4UMBmI?E5k1^gpgX>XnSo!$GGe6t{7-0qK|^DAC`&Zg{yWv4)+LknKOOGJuwN3e?T zQ~-)~*lQe?X?wMy{DzMA_9ODN&+n$4uX0HB_YYCTI~1-abb@|ptk+>IDVRZfjO+u4 z6XzXE=%l%Ug`m0UGXXwIum)onM1ZE#6s(F&&E-rein0SYsCTqzPW9xbR1C65p(3Y~%QabM zE*(P~_JSUlPA&wjB zb=kf)lZfmsaq1}2W(I7hy4gl*9(!@O6vVKRmO%s@l;E0R{=5Acw7(G7B+O~01tz&F zU)A@!iJ#Tp4!6_38++(BgHBvO!h;@@6Cx*7MULUxKK)N`c<+u`*b&heKk5&^-rGj9 zd@+-05M#`mXE&Lg^fjBLfMop3s-+QT&h6BW*?aR+jA4`HlOFgt6?&HT`#85~310X( z>_Y-x@y(iN@%g^6UkQrb@8pf5=1<#lqhixj+`vU|%8DKSkgzD$NZU&#C~c0_;lyiF zA!}3O1_AH{u1r{w%b=*Kq1*#VD@G!s%w0g3wot2Dm$da#Ws|UNTmRA{S z3jrf>cu+Pc+VQ8Z(`f1%`nnwdp8%kU9E#?YzV0$8wIcrpZyX=0S13iwmtdEkOGTV{ z$btwOe{`yuY----eNy4{ocwI#rto!A*iZ}KI3gdcy_e#9Y*hn7%!g3-Y6$iv3!#rk zG6mL>IM5jPaYD~pGWnxVfif6okDkYys!=JqoC_X4%Dz(-ADB3J1X5v{Mzm*?+5A)+ z8%tz1n9Kh%)CmQT0l>WWsHs@T@vHo17C*1vrTE3lPhA{k#vzkHA!l?+IAY?MLi$Ee z$3Uuwd+*`Ac>Tu*u)tl4G^g{wAVkW}{*cX-xNIpM%um~E!CP}V+4*En6wBMpkIJ-& zDQr0YM7HGbd2&3}dM{|eZ~doPb9z{QDjGSXBVf_(WA41dOQmQ1np>m&s|CC*56G7P0{kfcK zp?e&+s0+fY;(;el?mnvaPIxcsT(OwZEWlYvEFkzm2RMHMCk9q+>*Y;w)*XKWPe*+_ z%JS$_A^@`Yh}&Zb9a^U!OadIn5_wU%v!7PE{w?F=aTi*KW&gDp>wOkm;Rn5lwHNAo z)BSZZ1xtL`F?KuK@8N+Rqf%bAi;(oC!Ad4ocDEh&46{N*^+hn3gnn`@UE1FZN8J#N zbM2%|oN_%E=Jsvi7uI?OpAuo+nReXm>JftqskZ^#WvOSxoNhIWTlqE||`T zQ8A2xD! z@O{!_lm;4IVpDV4zcz%3cBQBv*mZoc9@jbiO#VTtp^Py5_ceh^+2uE#WEQ5ctZK0H z1N$@B>D5X@n@yORt>D(>9jPYtm{qT(kjptW2mM@iXT!-#9`YO|jrS4=fCP>cElQ`5 zTe@8r`atuN)u@p{GE?Y!@{4OO`0Ka-)$~f5xnCj%F!>xP`Uue={JLFqR0_B@p%Q$P zv^wyOR|s66*ORHa9v;CVPMY_Aw=hOL_Gi4g>Iit(YN?m-^^4ar8N-53LPw=ve=WEM zMO`$L%ETLJXRSsyIm>qHj0JtgoF*`vd`|r%oOT5$ zM)@3p9EFji$W^6Ap8#C{>wYc9EqBN9BqnvU?^}`cGVRJE+wfO_A?!yJa=zwVwB7!U zUB?_bxifpjAHCnxaVM{wiG^l!cM@~N=P1W(wpcBGI7kvtVNrmcE5?qOVCag`OZbAn z_rWfM-qxGC$T`sh_H2kD-MhZBo^wPdlRUGUQMb+T0h-WZ7D&ahD3dJ5(hsl#KP<=# z%ib%2`L*>LBLr;(^1P4i46ChNKdyc&^egr84n#%%kpWh(`jb{N-qJbD+&V5~&I*p!1&gOnHXtw6qDxZ6ppwy%*JIZ$y&UuHX81``tGy92nHS~_d z|FCZb4tsTOXV#g(pz^WpoVLuYg)-I_q>!Y!m%CMJZc!XhxY0Mn#RO#zizM)wS-i7H>3!xIu;JZ4SW?z?3 zBN2Fy8(o*0m_Tm(qYOx}G}-o{5JF_uS4>~>gd01+WlDJ%ae|xe|2CM>(p9~|DEforjO9F*u$TQ6 zzrzfW?qK-h8L#RM?EAJE-qV&h@Ut<(r!Y`Mif~`Mdpm``LI@i}vw(aJ! zed13^;I|}C<#F=Uc67pzu_70;`wF9s3pX!fU`6jcId0~v+y!t(soCo5Ih#_?bFtgUgXfM}d{!yVKgIo0sFiW_9VC7>SP*Pmc#C z@8nMxaiFAl@|rW+tj%x&u^&P|Pc@76_qcB1cOUv7imA_DHI?x*@ec*$qe6(nvQ0Dt zI>@p4Kc2^}+MjH;_*HC87Mr2DTA3Hd^KxkFC2v?1=`$_StQc>34Lm645!spblVo|# zQ84)N7ROcBj0bh_^_lln8HUYaDiHV1*(TJqD9GL6oO$XSK&(pW)-RlpIu{43eJP#i zTaXD?W* zhDV8!YafTyL{oxjaGa6)wSau-XKIVkf&6X#^`-%V} zBe44%mM_qD%7+?}cn|_vM;CQTm|S0NJm}p@=7d;Sb{h$9dZOE$Ad?K{mJ!mfMXniZ^?toc@(PuZomPVs$C}(s zoSrqleouFXIc4%{)fo>^7`6Ks@c~@YU5Uy@yxji%gof<%p4qe4{o_#@wTYWV{c3EU z!aAh;>x6)IgI}9NpDeQxUW4DWGNPF8nEm|mI|RfjxlX>n(SAXuWPeKV$}Q04({r7E z#;WJn>7O2vOjT@?Q-^=$op-2$)UsUxQ7q!38-m{V@tK)pjC)VN9$ig=n*k4BvoAWNr4(BR%dZTWYIL2CJSDNdKPqdR~@5?f-eZuP}(C{}kQKF?lXA=o+g#9NQ{R_O-2bFy}C z(7*Z8UeBX7jVd=NA%gvxn#OGLlih7VPA>JYt(0YOU@YZ^%`@KTPqHnuJ|DCF+Djcs zIWjgkzfvt=ZCGlWI3W3rbboXV(1qQ>f`3K{UR4I7tG}Cw@$k`L*3gV(IbqVvwEet#01LJv?qc2IPN+G(&gWgx?dnu!{6cTTr zZ_^y^**A=q5+ zJtHk!Y;j!G!LqaLKj4WEW)yV)!ET}uKdt@)HL;Xf{tt>1RdNsE`KNGvkMD|*PxvRN z5>*`YKkU>0&$<;4YEj8rt6ca)Hkwr$u8WgP;pk#7=O(Jn1vfdyp$izkm2(?aLYKRc z-cf*!Q$R{YA_`Wj8Vnnpj*N<8WW@Ue6-m}o^v4Pb71kqFde$@)t zxcp(#UQHRaxDha8K$7#oQ`-N<=rSl)gfOgSXGdwB{kmm(!a%Mbz2=H3%j*Jw>- zjaW`#w}LA@8#S>?<~K(vX~}s;aK8C%`#LPSd)- zba=Hc(EmpWSYrK-}I+lRy4q6s|>jDn!#T}ZmP>RRRVEVBI5JE|y+(A%K^WvT)l z6R*ql3a=>dJ>40WJx*1b!x_UV-$SO$JXc7SC~XP%0W`-$fWcMb&V9JOdej#UG$wWF|!K+a?01( z5sz?uQP->jror^sm1Q+VO1=)6t@P*aj+teL(A#IVFEG5{y}^B%_kx00y-z}LhNSmi zx2z-nuvXT{MFsibSB}9RYEXqGa!rDYUj=`;+GKB2N5a0yIkbZ09bK5sTlrsBLkII- z>BKcY@ZFa{V6|Tb7If)Kn%}bUXqB!W0dYW7=x>FoeRFQ6%+HRcNhGsFL*7?;#J!yr zQHZE+Wz#1LY~jbyyFb`j^G;0MJWSbdEl~FVcqeaXLOepsz_LE{LG(miri4Z6dGGEo zPAP$e3ZF~!!M@%4V?eMjhuOq7Oe1^FL#shu~-t#MA@pa$w z;GI#xQQZpP zpc}F;n<2_vcgd3e5)Ni_Z@dCpXk}>|9}49$vU`{}W77u>l0gPu8KVPuy)?862PAo% z2fS6`zI$tEI3Fp88C7ijfKR{kZmfw}yJpoJ(lh>C_?|%iz%lymxG-;Z{3Vdf?u$Xa zI1&pOa`V_h)|_xGWR5f-Y--SF&`Hsk-nvM^^pF}}EoYi}ejsL|=TrX{e1m@|h1e`w z-B1xe+Yx(!#wY5$>WNIumFvi`{xM%g*!B}6zV1OQwszFEj6dBp2ypKejTC-8Jo)ZP zf#5NY?U>n@p%?D@TEA=m6e)$DW^Q-<3SlCm9|r`f@^#Oz5G|`4es}Xiz9ib2$Ckm% zv}iEa-MK_$4azyYY8we&IM+m|O^raqvzOy2L{+~Phjek8b>S_ViXYi0;OgzUv!cxa zmZW(u;#S)a$6kPS^_BdYgNKf@hxGlFbZ3nF}y}Eg^0z4C>7wB0!hh8xUQ&RK> zeB8beY0SuFLi0qxtELU0NTR=96wg6EJtxiqq~DybGT)??8~vf zr8C*^xW0}8#VPrDv>~1+Ge3Jl^f2*v|KKbJi_bZ8|7f$%(j5XoLN4*woXULg7f4&k z=rdtt=evPl#ms~77`C&NQq%O=Bq^&|!Tz7PU;*W#8Ahfv^@{opOSMW@H&LjYugsEl zT00$s+6qk|Q3UiW2P=KDRT2f=&)Ppy%#WibJe;c-f|d_oxlH<=z6v~s6{XpW(8RwW zM@}89yDZT@%M6sdBtMHe<+n7tJQPf?e+YJ2>WHV)cR%c~703Csh;?PPxfB*f;Pppi z@!hfB4hQ_Fbkt}HuLPB|;QOzizo{?dXutKCd_qGW$-5j-#qy6(hveT~jH$`9)sG+& zID)oU&I;c?>u*G^qFGx0c}5l++dn?u8R)% zw8O2YH~vt!FRRk=s{O69y9E?a`jNR<+v|gTYCHQAYurR6Nhgp5{S)oWhd*($4R9yZ z`b^;?3EWrc|{D~bO2Z#L)?<#f>rdQQ3gx{D_d zXgE@4VL{z68jc6F=+V(@Jb!;tbjEN}k$*%du)e*DpL=wg3IJ9oB~rK(t3`_T;k!;L zL&ePcPV3A%8%#OYb(KK%T_31HJwcgk)B0x0%RmSLWPPLou5`ee-Ayji-g#z~=)r|- z`Taz;Z#Fk%@-A;w&HH%4(Odgwb9N$d?!5_U;KOdgSq=H}_`$3gvV7jG(Iq=hvs7QP zPT-xJklyG^X^oQ)1pF1WalmQVm(6*$0@IV7IClRw>hnD+dr7y4!_CmxZR26(&+0%+ z&KEdl2IG{FSs-8tvPT|)*QP-?z6S;%V~TZ_sT@|9BZ8`Syy9LAayIY?Ebm{U9PMR* zfFD`TtG z(EB`TXaMucERPTcy%v>JuZ*mjd|ZoJwOYnFtVfzrigSV5mvZ)Xo~nrF4iueFIIX%j z9%VyS8kn>yMsn z5#jL>Ygtjlk26qM<(UP`3 zN-VN`kHvm~K5qNqUnzaksgo3b_{?l#yv?fHgW%_JG&z?fD-Kn~6{{lS%6E0YYrm)t zQ;fiILn=P$nMcw(DHF|So^ARn&oOtLk{D&Z7QCAgDYr9|;}O!`GB9Xi@Ta zmV>b`Ey*D;Sl|zHk^AbCt8$D%J=+AiqbmBdYldbw=+xaZm~^x}E1IB&gcZsL5DKmu zY#NLs(jVQPw!*LS+;+$59?EfA$a@0_t2rRqpKqrM@Ga{)Q!aW|l9yaO)K_Udyy$&a za57x z7%82dcb}xd^(1jrRZgf6`TjS~&f_m{^yXHd@`50ELNNZhHY?7327YEkmxkxqvttZ@ zF0xvxLhge1<#u8!UmlRK@-uevPhgh&DxT^1hSrc!=CB=0r|10o?<$UzCEx~`XNL!N+9aS6x(Fdp0JE`^ z7P$|jS|s}Okx|b12+xJ{ zJjkjdSPMSnqWn)-2K3_|h%yre8K3t=GS&ZSF3qc9;eHkZ1_OW|C4HD4#BzyLA%y(P z`jQ0wLeqnGs5Uv1k9p+lD)jd}`m2_f&ecj*5ThJHkWi%v&6cc!o3_7k(mrcQ^q)STqILKrd8jnj=1|r!U*)aP3ENF# zo0f_h=y7MeTyKop3Ap8ooi}w7Pv+i(Zl{FZ97|QT%cnINwX`416keUpJNT6&iLRn6 zS!TK7q+@K4rvH@YU_wDzc%2^W55;q&zwn*nt#lbpAIle|JR)`G;}SK41h|jM3yk3A z13}#&x=jJM6m}-e_P$WPDYh4bBw1MGnPP*ytwHU~L(+L)5>-H5(sFWD7CzQ_R+Y|IdajbliU*3nx0;rEvD4`VkawbwR{!*@Xn}Na~`q^`S0=$(>a5Fd-i=SJ2yOFG9gm?B1U;h z^BJA!@U?|k5p26GG6 zdPglQsn6|1eC{$9vh9DO{^JEXVWDgIwv03o`2`0W>gAL*M_rE6?DmR%gIIEZauLm> zQl0HXPStUtj&q{RCGKPu5p6s9QPlnc$Ki#Fi#!(Spt9H6a{|LSatxoLY@`JPj>v~5 ziUM5K$q$&shH-ReC1Tx7Ln~R;Cfcp+;?nD%%#>y&dV!NJUWJ-n$)D|s5@<}|F66*% zVnh)K&?oF|kztiHflu&=Xkw$cwx}&FBbN0y*h_;A{(hp==(YVcd$|PSuc>F%{?WMq zjXX`X7@z`5{~DfJh?sGH?gZLVnLE_l2()tk+cKM@%w?BqnHKIRw?)CSU?Y$UnGcPh zRP9{ge}qfZmL_NOvL5)0`MBGJXy1iSvMre3_~dwvY4sR!Xnlg6Q71isFw7uzx z(w~`0sTH}&@pjpcG0-my&&x01VQ@GQ%REi;`T0atD=XEAS}RskLN^BH^0i!y2+|aeXeH^0 ztuv2oO1gO9Xh}b@R#0^8v@AMD<>Dv$*3CnkuGIkT$?L18Gdc-pm`>`$WQUqfX`eC4 z0!AlL6Mr)c1ShB#DM1QHqV0L632lh!Qeh(>>L_PB#bi0-{KDkOX-iC1#@bthroQDJIBV0 z&Slcya(z7*Q~;U8=9|ekRz3-OmEzp04WB>u^-#-hfAzR?_HoEKfq~(fbiJB=Dt!;W zX4R^kj!v%pgt%l-rH*Asy$QfdKH7Pq%n&o3FJ+0QXi8DI%8?_Q)FU1bKEY~K0izGw zP5qx7gfCE?s%Z3%*2s%PXR+3Oah^?jlSc3^g+Bmr4%0|I;w0~hsOIk|nf1WA&&PX@ zJdI0lBt;IA1PTUqKBY%$$lqR{Q%}JkTQoDYI1Bg9g>P%+5%lhlVppAo9=6qE$r+@_ zh3ObjYq**c@4eGc%no6&#qPDh1d>X6zNi|TBC=BmbN8#@iWrkFWT4=k$lcc@Sl|4D zBjZh5ul^|lHmS$O>LZmZ@F$L4HBsw(NgU$9i$vwiqb!N^1xK-yP!daB0Y~@1T4(TO z5krk37JfT@axwHHEck&_1)IZS&Qbhzm%2NPEP%9c`={&O&M~y_s1Bd(tkoxPD2n2E z@P!Yv(ztM4=O48{$G&Fa*+Jz`%36|z5C{+TAN9CG%A^L1z7I!xZ5$WZYv_W?_Y-xJ zzv$?Z_ejWbbV7e5eHNMQ{W$+8_c0-`-#v2v2_e1vW#5-~wrTFnSka?3f>T@16_zhP zqJI5$YuUn^{A2Zzsu&u&zJD7mxa{}T%x=c2!!>{PM=l!sQ)`k49v}xdhxefPFzfOC zVZn*6Q~OZZ51-;w2&dL%mnL%FE+-$eowF7Okn7WL_vtkPKQBn)+jAe10XEC0`oRh3 z>McnkE)Jq8<7wBrn#WdmGUTi>AwJ3K1c1S6W%2e#DYM`$HG}M_2*&F@iOpf@*1Lrv z>NfpF0zP6ok4+~{BGfg-)NZq$KZ@M`lyg~`Nq<~9=ZP3D_B*Qh&XTQQQp_h1$@^2@{^#?{>aaaP%n z6*}f4hO_V@2vZ;==TD`;UAX1~@2juHitdBTM1eJum_;l0h`*?aV`Ndn*1=7l5CkU(TiujytGds4v;w!8Rd&_TJY|49A9MYe~ ztW*s=cHCd`0^6%t4PiO%`@}1GM6vQly3A$=RQ-UvI}*+RA_nG7%*g~jFLZ*soq7zk zB;%6?DkQl6skW)li{*Z+@!Y2(6O<*putE{&!c#ab0SaZI_O^_FpF_kHQG`QPjaO7q> zTj*An)qvH7+6@ueqx`1Q3J#}(T7eaaabHC z3N8mQS1x&QN)YwXMmj-X9f8&`2Z$=b(nyd>meYXI#kn8fh_T;u!boT*A!nkjLqG9ACyc|Gle|QWtP6cc(UgFo^HuQ);y%qOM5{R(|t> z(sbM>M=dOSzuR8H;$qg$uj2eYTmS5Dm$%~qb{mZSrPtP~+cQ4PY*I5w&cbylaO`J$ zkmM6jB0jm_;Uq&4d(}sYU%a7hs#yTlj`mkx3%0(m;*Fdu<&+lB32X0TjQcdgfh1(L zZq`f{+I+61|FsZ!Zl;(8HtzsH{||3x*%e04mqQ&o4>-uo)^E@^vuec|X`+$Z*}_-XFv z0VeS4XB?Mz0qwVF?TwBa4PHlVDrOvFilYN9zpe8Q&S@4rHr^cHoPCn zX`?KXr0jmcls;d6JloQgvpb(5GxX9> zUu(EKDYS;vO{?;ipbJ4FIJeqCI7{eXksGyw7m{#eKQG3EgVS4w@$f74JBez|5a!0) zY`i{a|IA`K0-BWzO}kd6BnIFj_uUp?U30T_UY?Ysgx`XPjeDN@7F^izGB5{#^|yj| zOfz4Sm=xF@SIu^huJfMLdEEKUwVAt{AiBnhQ35>d~Kx(gA#eYD8aPLl*HHz5K+ zF?=nB$~2cKL_3c4|8^!@0#jBXLsvixyg$5>GK*r=$7FG6E%}0z&~rIdD)#maOQ%_Ss_E~HZ+T0((h)LJ@YqV z^%8^mjK7uzuPAPuf;?N+uF{=km;G3=uaU&q4<^u+Tb_}qhe%DKQx`w(aRaaP@YdvN z+st8=5jPIDf|2(Q+mBP>n{Klxxx%lw8hUeUSF~`8Xg!Y(ei3dKLco$|CeQrf6z7Sr z%oO3H7m_h_Q*NgQyxGFR+p%;`$G`HPjzV1K#o}oX^AzWV-D(fcpDFo?VA(F*J`MW& zKAs-kjj6bnK_!+bwYlnVTzf`3Q z!{Bi;1AP{W!0nuo#+92=pGy%?*d09(+x9W5{%Ry04R71L>jut0akBgLbII2(eTniP zuR3f;$k_tx>k1$v^YB}db$$VsePzejRU9agz>WB$+MF-m@jac>0x#^=D$YOiIUmWr zKfSBXk(nG5)1tvB?>mhz*4f&Rze6}+&iFLT4V=hU^R8;nnt4wDw}0V-KzUbs#yI67 zJZSCwg@At?MdRn#)OKTg6(43$5P+8&`(+&-3Y zrUW!Sh)H19j&gdLp9vmlH^U>~TR_>{!v@x^zhM@D{3L#Eb%7S_>avGcuJ@<kORs@Orm%m4gBP)0|Z`R(hin-=&cj)xGfRwyl51PFIrAGT|}oSA>ly4wXSq|DJ;wc<v>rNojY{)Fo-vX#&A5qm@hfc}GVbk$D!z8x737=z z%Q>)GmbM7)b8~E8nKmcTXB_R$bdUUL#ryiX{ynW0TmLsi?8(MQ8Cxg(vmT#?KmWJY zyNXu2`|uL^15)YzTco!$=-RuPEsF5NXQ%V_^IKzuKcJs!KH_j@p|JJHg(}=SeBNGv z?UQ2j!)GHyn|b+|jo;qW%(Mhc6RX_IvT$0k36>7rPc3`_jrkEeEEt*wpwKUV6V5( zo=~b=f<{Zm=^mHk{(M|TWvOvQ=sVMgH87sj!?4fkn5dZ3mr-kBw0LA9c;C;ab@W}R z*ee2`{k%M2`$S`A$5gF87Nt7qKt-A|WdOq$;ZKdoNo@oUm7I{k7!B)9cA=|0sL zsCIePhNbJJ>J|`drIU>(#0{!S$I*W?CT{A8P@r08((^+i0I*mO<8w>e6Vpk4M~nB7 zWIwc)RCH8HG}0Ey6hDxF(!Z&ot>9h_B1CFi?U zN5=uYV*xj!`HD~~2IX6Vlw-%Ny46^_h8CwM=U+E9M#>y8Y@G(ePSYBI+@7>}9i22R z>i2s6`6SEL;=G54MS5s{Y`b6J+P36(Hu8v|v2!S@m#*~VQP|iFd(EukyksFCoU$5C9#5Zn$-Eune*6{6>R9`axX_kP@b*XX z9^<^kgdL=8Nu1idzzW!B>xs;se9I;+cm9G-tN0+{2pPGk&Z3z|P{%r{Pw)MjH-t-U zCM6f^JVhxR*DgVcWNgx(lU#rmkiY3vB+_%HL8>*WD$89VaEdFUWLs_0C^QZ`jG+l8 z$TjNyX1N|3Iwb0db+TaIf^N~~dP^`|@F{FrSzz~jZCa(zhPA2e!N7B`XOq$GUN*1y zFzQQ!6F4Q8#5L_Q&mWJW2#C9;+1p+p=b|oa{tcg1?=tk%jz$(uFm^b%Xv@cWo*`tv zG(IUONMiksUNa<+CDUW`dbiZ)h1B>zxmaNms>?bEE#qX`OHj~qqb0DjpSvxFSCGBD zpLpfQs)%Tgm9?5|$)9D~U83c>)BM0iR11?&xHu>qH4vJOcX!iwcsDU4VjPv$00THM zjZiuij4{6gBqSJuM@IqQip{9_gzy(HVa_6Fs=X%XJ!|G3(_05%5RDDI-O&=eSAn%N z_@(z6767DF^hSJ|i?S$J97rAs)rFvs)^4?iGbMnOx|oSc^+7}ct#0#vnZ|3x?!=ETZYqF2ZVX;+plF? zXmM05ZUn#nj7Z&69NsmAi%0`*aW-|J17{!T#gg0}UDiW2$b`c+i4?*s?bT|4OPJ+` zKflmf`v)o8Oi*x3GG}Ig*_g>ZpU+g<`V%{X$>{A*vwP%Db}9l9TDbfupqY{eleNTMNsN}U0fXDuy?}HjblKUX=LdAyuFzebdb=>U z*(6vu=rT%fj_SUj-&gen(N)`7@=9`Ta_Pa zTJNVk?(XNwE)JF}H=Zj6Kq;!pm-x;!*fd#vhGehAZsEtRjd>-+>?0A55={3QKEDr* zgH91MFJVS^!MV))_&n-|cWS|#znEQeEUWYkNef!RE(9}&Os(g$wVvCxWarD3BHOhd z27Pn^sJ(9kPSz{0uqFzYkta3^&sy?)CLGS4p2^O)Zw(8^uavgiDt)@b14#H-%^ zaTCH0;N14tcW&167z1TI?)o#alS6yBQUJ-?iM5`RllR7VY=+x2m6EGO{$Xi3KSJXI z$U6fBD6!~oH*df)?5JIi07X)9oTdbjxd(&_#rg7{{bJqSBxr;&k z%H6Zgf+y3gm1>kET7~|QMH?py4*bmucP%c94-#`9bvm`n(m$Zi^xl-n=LB6~_c~*{ z6|)3oOMji#R=)W*)Y~Vn3lz7tc?w}j?{F5ehX}jKH+jgPaxx*c%(HY~Zu<}7&LEv` zrX}jA)seH2l<2~kUMm$Riz?5R(+l89 z^Hg@K71_@iHTjDOn#{_+ulr~#M{{V_VTsw08~sryl82imopy;Ajx+5nw8VEdm%cwJ zS*Pr$;$_#c7c!`JLb~bOVd}1geq>}MhNC<2=$?K5?j0pgaZ7>HD!(P)0W22hbG6AA zxc;c;F&)r*hgF0!L5D37%n$N7FS^JXU8Npg$6U=C>!qpGLetSKdcHte(Q`3&z@{tO&14Dzqb<$12KDyVngn>_fp&;Mu2 zU=)N*ZA+WWo2HRl>ucUbJ5GwviD}U$fp0$kq%d-@sZ|`>d36D-GefK zTdlcaCF*a-`u_fc`<7$LOoo+>EtIRFZCGONqJ5cm(8Tz!&$V=Y{XtueaBaf)HDKQ- z0SrDR`}-YQE0t1k5nDo|s&*~kIQJec3&}{X?H4Gb_DUU@EjV(E-80ox?~>wqAs+V_ z+XmeBEO3+In*3=Y>u=D`AhhXu1~!cS=+x3Z3$M1*pzS~O6^XX1sCDNFDV-Ufy^l-}i)u!?Dzb7LhKNRCGrv{k)pO`zi-9220h`lVrc zoPw_d6Ra5ISVK8Nsaj|@{G^TPKR_FwB;HXPto3=~ty6?NIi$wZ5IlS~~j_GQhqm(q5x zX@%QN;zT5wn(F?$n?$236!s|WL;bMBfdb%x+o$^d`R8RqiY{2Nz5y#t(g4j$YiBT3 z)>izZFaltFdlWf?2mVhD>;?tZ<8CNg_f8^y3q= zky^}Zfzzh&4SetvO17G7ukYR973~{)2dA)&ggvlZT>_6ckhMDYF~n3Q@vui=vqj#t z1kcA)wzCdLc7ei!9TA5#5BE-f;bHeHb^k(CHELQ%-l_t3YM^w~x;yf^ytAQY>21KC zuL@ZFD8KHA$;d7;_KK4#uOG&V$w!Z|JZqT9IPx3fI-6CE%&F+jkY*U9a)OQT#sZ$+6{ejI@DC7xlqkxAPd7i-Tbl9Hv3HZ+eUvEtZ7l!;*Yk~jOQuny z(ibgSl1%B>z%(M=PBzVup3ijYab!W_o013uH8^c8v4Qn%LdUmuy_3RiMxY~#IfgGi z(e9Qr73k)RS%H~KIA|=Vaf=P@gW!um$qqaM+jiux18W>>`v(2g!WXAfZZiRQF9~v* zl8=aP&e!$__iwHjkBVX2OX~!8FUQ_o{J|fID;OZvG~+r4Wn=&QNq%@kN1DDCd#PKI zqwTnx)v4;$H>0brgo`xV3%mum{bg=!ZP(SMRRkFa7w4!5fy)}4PirQ^t&;w7PWr(O zLhn2IR9aTPOSbhM;etOKgn~{NFw?!Lu@*1rfMr$|TBNOE8yn<$Q0U4nUbZ7O5Q!=L zx+|z~N(QMd`nRg?)`T!OFL6BVYmyDS{VadTPH5*3xqveMv~RZRsR$Otm``Pxl#CFr z4*Z9VvoQaP?Vy)*pam7P6k6xq2f73ry2xFWW!9)*6z`-4-sQ{^#ll|loS>zA@13z_jVDy(bt3wS_Xb99zCOY)JuNyYT z!J{=!vZ7<=ODKaCLUrEoSbFOsbt4(~B^X$zEB7?(M&XOR174Fw;mM6Uk{xF3J=n!d z=RQKf+8Js6%={rYnoqhr-qV|+{iT_~JC-0eUpx%75%`wCt{V2#D)8~^CP8D@+kNyU zP(l$)19MI^YKy*6hd-KpWB5nxD&+FlEHJherG5kqrNgRRlxy$oO_HOqW{BL+wRGBd z)~SiIQJbx$Z2o@xEVB;v2o%nVTGCC@lYz{v`9pWNAuL)uTP3i9UI)dk(n_&QLY#gc zR+CX9pEsrC`E!7cp+g`Kv(5r5FlZk|?ce&I1e~WpLEN{S ztmyH*8#&mO4ZAf!A+rcoA1UcMbVO3AC<_@{2~8IO5i~r2;ks`MmvhBI_^ebp4b(m- zJ>VM`M`(O7DYXsM-i1n7Q&Z3%i~MLZXrzh)S%NVas3g}FXp&#v4bK~qAwr(P;_ zK~A3KMqMjC(2Yu`dz!*PyBK(bBh^R}$-<)&pF%o4=-me7OO#AXp`+wWmE{AI zzpXHAEW?)Du(qq+BmPojdKmHLjj#fLL$p;KDb;+pcv)sDAd+PUzRUHVW^fU$mfvLS z>s51JN!MnEKD%Ey{+2zUYa^9}z2_8Z`tpOBFrKJzwW@ze?{HMt@NQ-gnt?Lw>ZpcQ z)kYcF(iv|!xK7Y4#39atI;W>VEhG7Tq+Y;>R>_Y{ z3=AR5bGusBE<~S<+Y(!4Yz=A%wZIV}2!-e~fx$waOLC5VddOTaecr?-koD_G3lOo*W&QW%| z`mq?n`_kolydoRc#)r*pHN7^Iy=vx6%aa+4k-ejH!{yHoq)1jjsOyn!`&DAWrsaeg z0JG)D$B2vHt?DSuOt?oU_}T9(i*UX0ySQK1x~G5stALs_kx;#LmK-(xo3k{$$-ds{ z_;VZB+Y58JAf-&qGT~I#kEH4vR#;#Z+uKXqiow3_84(Z&(WDNzcN(tVvM*YC(VwtW z$CmJ>m_<(QlHvw$7ix^$nl#-*`Kz0MzmxqBsMtr)bl->2d>q}QsEJ9(Kf`gn3%2q) z82aUTk0fYv*~g8H>Dos~Jns-V_QOr9+8DLrxC6F>JOHp_9&GlL8+3Kkwoqe*ow{7s zSB%{*gS`pVR4+TGQ+jfon2-&*8h6vG@g=d(Yk{GShWh49BJGd z-1P+Ox!I88xT$`h{pEd%kkvYq+|aKl5?23HGs3&P`)kiBcnsqYJ`-_R7sv7)v9oC> z7`<;O$^b0?8(dZL^U*J1Kq44O=8<(7DV<|a+(apFK`Yhcbjzr>(-3ODH0PN*>sw58J@Mo&|G&SSgCA(q%Nbdb8Z#>KW6!_1p{EX}hPvK=unN!}S zgo^Orm6>A`^v)WVv3I21Cd>jgo$SNIde$S?>JN~9^yDz)3DRJoxF%0&8a%k>Xb1b;qJzMN|FNY-lJSl;@a%Rb$)}XUdm{u6gZTfGVLC&qbUYN z&MQoMtVN|bV!MF^nj60&&{Z>Nx896O?He#*QZKU}l0W=G5V8wiE0^B#4AK(|7QcF* zUps^+F-V?&G|QCF#DghNqST8tZ(FU0vgc+Ov3caXBP*+1WI@3$7uqVrBTq1iUO3l6 z!7gBk$V_N#U@8F+D@;sCra9E0@A*W*(R-QE6bg=umG-oy<>>R@VFP+Gd}mY&O^5J? z&=pg?Y@uC$1>#!-{T`;*^1eTbFv(?UNXkhm0Y}J)`FekG{%)?J!`MxUjhPuAihb0d z4@LA8i7EwH75It_)_535Uu*kG-pa;WM*QKN#>B&nt4en@9R|{Ie`Pq#&MA~K)q=wnPE3-dVmBzG`hIJ~N{q{3y?RD8Z_HqnFCq#q@oDmC~b)Us1?91V1n@7em`j7HGu4#Ls8aeVyr~?>?7PxFK`+4d$)`v;Ni`Mt>6OL;g@FXEeXK~F zl+yHJWMl<%lh=Av@YvCs3AB@@PlhfG?zcXfROi3D5V?OZ&6f-9l7G|;6JASz`Kx}h zncE9Rf1nC0c#TvY#2}`R<;J@4sgy(1J4pdCqNTi;ddZxrA zL^?PXnDpp(4=ITX)=rErFI>vM-C0E#{aryPeWs>O$P4UXYJWUr@?HLg8dm8pYM?=h z#+n(}P`+HK&~gLe_NRJR!$m)+)aicZpU&k0Hwy0|HX~II92tipELgKvX9Q@(il(8B zO*QWm$di5`7?UsGz+*Tpiws{)bXq#8KM5qo=BD^;uapv)&G}%|J=#PtX^X?HFY{5X z_5B{Y%@^)${(||y?*x1Wbl#P&>a0v3P?&~g(qv;;@a(4ih8T8NhNjBPv_#6dj^gHw zpA}h}K{uoUJK%=31p#!`u>p_-x~hD&b6Cr=xje@H=;$oYsxFt9bW+BG-wI-_^i5x` zNPTZ!#v=yBc+-+mGCSQfQE}rl%yy$Em8uUyis4+JG5P@BSnt!WMLc<|RRk@bZpmoB zO3O#gNR#TN0=8ln9hj&op~*5y-RrCxR0^*xz1@A2*F;eQ9tWDTVieJz+;&qxa%ot5 zBOI96Zwt?kI zBGX89X>e=YkOQe}9n? zS(Bn2SECbPq&Gc(X-O5HOpc7)KOGkvKk?J`T11i4E~OqH1YW?rh+VDWEqFiit4L^J zMHTWc;$P8554b+QDUFhgC&5MI;qjnXRwqFm*%SgAM^*A_eAikkfBW@DA0?m~{WX|# zssYNe#mDQOSi@RvjtzHFd&_l*bDS}S=un>n{^>+RFAom-xvWlal6B}fioZK`;qV(V@NDL7p@yMUg_g(TFS5@aCze@Aj34v) zF*9jzCH6o0^d+!{EMFo*K6t`am=B@_A(cqP+kY^scQ&Z7<&ex2@dgdVFz?{tief_o z{ew$-)&vv?{Zi7pi+?#tpB?yM(46&{{#9^IuSJ!@c<j`CCjqkxZ2O8+r8l;M>fEd!58!GN4;yqOPuVL&s zcHKuo?Q|;hg9jov;707nLYgz#l3j2PYwJ#l(XBCdo$V5FG1MD+86s>s?~8yIZY6ye z4c8{q$U?yGNF5uRk|#mMR?YlHXOypc5J&E$GSbh6tuk3@g?SL6Pxxnq<^6u8CHoQm z)~-}daJA92#3(<(4_Int)Z}lWMl;>tfh0m$Bsy-L@wjPy+)35mraq$rU-Poi)n~1u zZ8=G$3k$2}eHqQm9D@N4iOVuAt#JBMUpH;RW%&q6R$U90Rc)I;SNd)etA@Xk?D1O; z(AJtLfqa)4c=5`WgE9eq0u8=EZ=KwB=u*XIH3x#Xb1ol6_@sJB<4rKF(d7;U0gpZJ z($gHqT-s$y9#5|=w%G1@4t*CI@}x<(o+s_FCJ~?!5QE4Gz@RhSgN@t}fJO%4m@TmvL{rhAPsh z-6>;fal8C#8NzgIr9CUk+UO}_34pG6XmF-X1B$U9i~F(%qWwoUQVTR#1?I>Epgdx& zFe>lM7rXoT4}>?uKMl#)+V3dwSPa6x&6Z8e-4b4dOBsKvi7FX5GYCw;6^WiP_D)z~ zeqAwI%11V5UWbVy#I8E@El#(5B5i9iX#So=x0Ifi5`r8~ViYioNEc_@56&5J)DL;* zg<={n$l<`;{FRSfvNd_;T~?Zrp)$YP@q2WxyKu~W9zhfh zJo2z@zL?i@vBzLDx|w8P5=A#Ce9zob@i+Z`^T*?z>;4N!+vo+f}y?*L^w9 z-ibgYRd{Td{i|{o@7Wgu%rI65(zpv3cS;FZA+PaZiAiGfYJ{9mTX4=!mgA=KwXW0f z^;~45L_C--aUrRw-i*~s?4kf!<;YDZTTGp&4@4!{Do(Czrt*fKSi>J}KLNO-Gotw@ zA!erGpv_);Ef?i7W_La6*z=42t-ZHEXti1mMQl-@y-jOWI$mobn;X$&NV6TzU46KR&bZZ5)D!bGqgQ-U z6Ss^v$+AM2r?5q;KEk)z6e*>l2)7bt6E#ZABotP4eHbB!q_jyZv4|D;8V#)m88pbq z)+jz0^8_F~Ft@x(k%~FbL+CaCv3XL3^~|r-Lvufg%12c12ndrGj`k$Pb6rlz?=l(C zLecZah~PlkF{h&Dmcv&u{nS@uA7HdY1m!MD8LbUM{iX7sgm`OhvG{Knqq%m~De=$_ zBEO8VrNFn*&?P#+w{eSu&ah!x4uYplE?G~&>GZ-aW0QFU)Sk3^U2eNLuBR=y2g6yO z%mgcN;&f6Kv4{2eG%*Qp5|Ap6LbIA zYI*c$Mp3qNp!ZEfpm_2P?8vP};t`Q+uE(1TZJJisBrpV%k?fkgm9Sp-FgBqIIA6pT(1GZx3Mqx^eU{& zv-WacvZj-w*JSOm^Jd=4aK>xjKBe=!A0c8@*QV~l0`_7QUd+!DwmGmUN14kvg0mMrhS0-RFPcnlUS!_WfU0{fQg ztF+tSm|xve8I<`tod8j?Yu)sG;K%KTz492bu|xqp8kHf zy-J&2Bk+dL8Z-GZAdFV1Kgz`#W+X#=vZe)ZUQdCY~}GHH5?C#nW(E;x1U z(c~!9^rAfpeNj6cbi&^=>&-G(p$$K?DPDaSSgAsnh6}?!>dO>lHi?ZLndD%k@^}N` zcVj^Fp^n=4*~RBnW^vLK>8k9}6W2vfSrBQ)3}Kkr9XLYRE#ZXL8tNKWQrBu*C3bf) z$h;elBo_s>0LKG@EFtVQUcly#{jjo-w{z!o&mIpK`CH=YqL zY2zMIrT)$h3ft!3+}v_~GrsoSc(Eqi;hxW1oA83S!HUp)B0IcE!~I;A<%`r)yyiY_ z&+a*U)`hGJYsaV@Lhq@1tr52a&5ePAGV3$vO6n8F*;BU~AVUCg+ZIN`kv^oPkOXfc zC$1?K8EA8ZmxVkO#tS>V3y$bIU8wUUO$FRY+AE^5k}d`waF$mM&%w=C==VF_@?w&@ zIQ_myU=7=$RGJgw0}PyGJ5m*YMD$P41XLTZp`^1dhbGzcI4+$qib*_2scHXmv=n0Q zz0p|C(QMfFWNCNxNfWzF#-v+(d3uu1TC@sYtlbB7v1)q$YU#f49xbO**;?4&!`%uS z0Rfr;-}T_BL`&&{3s$OP+XJluY-Uei`-BGY>3ab@qWpR1{1omUo zqm7+Nkv8@ZgE%WTWpJ-%7q_%>oxAQkUF`(=UUpEgo9>5r+uVfq#`FWduJAjZhd_50 z5qUIgFrk!MUIM2*f}BjYs{wEA@hi6y9T+*VgR6QAc=jClzUa@nfb8qh!dvU8QoZ=R z7TWUYXe*pLyVNzR(pzwdCnOoq#J!YC1&f_X2dZVV*t`Vi1mGy;VmELS{)x7HQ0D=x^D~3`c2e8WG#5^H?LF0Hwg1nY~Gh8nL6VbX#U9O1yPi zWrn+4W31NG$hpZUzI;n_S>K9MR|n=NTuyCOVxpVFPNMs2bYk@^nZhHNV6Piy7cV*2 zwLv2htDJL}!Lmf_p-Uf>RMX+huHQP>pzC9MEoq8umh)6~TDEMjlx2CZV_R9bw!2hm zsNpZ14O+h5dEnSdZ7{@-myOagY)~FmIi#M**VFKS3MtEdiiQ>o$ybbnJ`8{Uq>x!C zH|t9-HV+lx+0B!R+v#3QLQ#0RxCf!yR63y0AHpbY)FfstM`em zcsZf}9lIdh#ki*V0>g$qq(2R__%c1zIh5TS9xQ67UfPr-D zSkZQmf7c+bmnOIl>^A;*)hHcQcZ82alzBUW3--3^y&>z}jj%@jOpRvyCBZ8W`Mw{l zs0o?{d9<2X#aXL17Vf#~3i8>}<>0-({OZS)e%gAon*}`n_q0N?amSl?eGhx+iXLq@1>1w48!UUQYGTSK4hKg>Js?E|KX``-Hncqcc(cQ2`p&(w?+vh1HQ)cP%kighhFjih}uL5m8Y91r0888-o zV&4VHx@3;dqnR$Rso|1Qrkt8}#-rAYe|gMKba z@;0tQVJq**;3%qn?Lk?xM};~#JH152UslNXHt!1j8-b%VP^wU0alPM|YB{lp%lAOB z6*P6$6JM68YV3hCW;Leh; zR-_=C6#FMdfz^DWo7#+GRnM7XXpjl~j2<4VM*ZBar0hiDt3(?13_|}F8K|t56(jc^ zZ5wPuZJ(tRW-vyyk=ake-oJ5oW@i*KbY?* zOgiud+zd%}*FP_KO~YJz(QpKq!Sk9_EE1%n5XVx~@@!h$CUCq<#n~w?&&_5T4MXqZ zI)XvKKEjDGp^eK1pvt2PM$ynJoM$ZfH-6_{Xz;;z9A1kneR$&m7`u5?^i2(G;h*mYoI8f8ImW++|+ZV_RvfV%_eDJZWF`iB;k*)(uSwuLG z$D+4WHW+!c6i_1?df&UpkJX=v=9D=4T35eN;?SC`ofi|d%qX#bOLqB5mlrpr5n_Jd zQ=mW`t?h)PS)t$8H`4&e%?^zff|xi7LI=Z0C32rKRnm9){Z_x&3@ z)T~q`$yYP`;Vh`aeI0faR33MU8fIU(UUH6CW82%d-YB|!fBf1jdKaS~NRv$s;I zGEqUluIByLCZS@OsFZ(3rckx;0q$*h*<^7oLzb@zhOZO0&hN*!w3!az&`2lu3*I`S z26+FWjKOHy;3K}h;uo3BuOy^XztdL+!J{$fgs_e^gQiDQw3-&+iP7%FSmu=eh{RZ}W)?o9 z=-$ElfabTf9dQ`SwMOMG1!1G0qFWAycmh)Fh;*J!BP(R72?l;_IT+gfzTJ}zM20ds z>VK==!a{A0E$gb|^TA}8W0U_g5V?7BF%O1=dZR-hPYJb73BCzN)cgV}*-pUfw|GdD zxVKexu3>9if5_5^kz7X0p7gmkK3@3s&fI34T!GavKB#TxeSzc|`+^e-al-hBQPUOI z^p22QUnqi`P87v+bG}LV4TR60Vm$17$~Nhl6UGRBd2fuXc88cJKnpeM{sxS(`BMh} zdUoqb%#Gtl3q``E`nepx-XxdZA}wEEnp1BwW_p)S`v0)@mr-qYU-T&Ywz#{y6?cjU zTHM{;y|@M|9^BonK=C5Q-HHcyE$;4c(pP@}bH+IL!yWe~`I0*{Z8bgIl^sgjE7O}yG}~$0=DfI= z>h&D%!Bve}?@FJf&O%efc>BhHuc4^J-h0b7{Qp z%y%K;SJU*YbE?ZySW&p1v-#+}yaiFE_Uqh%2*|hp=F+x&;ewpM@q}vr@}R?`*h%)% znB?WG>rAv|Yc6a8Fu#_ypU(3uKACN2DPHcVD8KDd-Uu9ncg;LPemIurV-=={j->VI zm*F{CDC_Wj+@=w(Q|yeMGF9^v=D%F{#S>~Mg3EvG3OTxPYqsINeE3&Rb_dby2m9`l zNVM(&W+`orHz)Kz!MxbD)sSDuevhWwWMckj*hm3I&G&IE@X7iHPdbLe<~jDhFM=oY zfmyVT`Rn6fQrSJ3J2e6o4+K}8ALomgIkgNFR8wXd>X@4={PcsoicjcNe`Ze08m|9X zlXq@GwkdmOY5cJn>GjYu#-)347%nSvQD#z?w*ye2{~JzW|IY1*JL!=q-7?C@<@ayA zO);bQySW$rzqjYvrx%fyt3v2=OK2m7R{rRgV1Nr%H$TUc5gzWSUe`kstUKghSQ^_F+VzK+%JpWO}B8NAO(mNSK zOox+>`O8LCamBYG&w1*-p4eLvurI!?Gy)P>i;kR_bn6{`6k zKH~pJTH*iW0)yh@2+k!W84Y7RmEqC1y@9xKS&`(j_-o}qpNB$0K}@%h^K8q3 zh=C9k6$S)_?)keEI|x9N0Is*InzRLM|K~YaQA+_zbtc;HfiE$89u?W7IE}n< zNii*6pJ$N`qWDlIjAOM2@u8tnahY$3^uNmBuhBkh>9IKX2@>3@nTTqaNuS@K;oN{E zzr%+xghE6n3K$A~CKG*O7pvK+g@suqJ>1a$*=J$cFMi}V{k|x5ym=0IHP!l zIr{aKnEA(a$3-@%>{fS?JC^JV$<%Hw$1b8~lgwJpJLBQF*EIfVOi}*E9>bH+o^fF! zaT5cLdb|`xlCQUbmVED#@wB#0jx8iv-XD?>=pq9$y|gb#6(+!KMQyeWesuFUxmn9$f0p6}{&| zLXc?>6ig-qW38fOISNHqcf1n19nJ)d4L3-Q45^Fc>HSd&`Tj$O;M(2$mkwwrc1%2T zZg-)@iyf$YDk5P*mvVa)nNQ?Et~ff8_$JEGm=@L5;~N0q(n6#vsnB=e$)}GpA8oPE zZU$(pK9+3#;A`Y|PduK(hbBpjr`L2E3&M`R7guT|{bPnb8T?~&+5}ZY+o8f@Ojkph zr6yDu{WoSOAW}UA-zySe0S~6yYH~QyV_5RwAN>yZF5?D8vrXXx|!-Krn+?$?9gmq{k(I3f;^%(U8@1g=~(#IJM2z#aYB)ui2uk?<{4#!pYQxdjpufwu>>CKG>~XK|b-=Z^oeQQ8oT zaTx^W#4>f<3`BayjEG}3u#6-d4S{KH^4o=W=X;|3Sfcfy2XJ#nzqQkWDG!mY9X@?u z;POu1m_4Bo%IS5*JlGtxBSux=Q?=D+P1d)ESE!}db$6_w#i}1bGgofp&j+h*VtSb> z^6*a)_S`?8xkIcEgb2a)nN>hjNwhh|ppr!-#fSNu<&L$mtRn8iBsQPEA9s%NuZeku z37qMjM}~_agAUv`x|3h(jjB-`<>3TA@Q~nJdA9pMi}S|~z5NB5c3}CxN$hGge~wqK z{;|YjV(Rbzz5rR5`iM;m_&{KB#NoY#zd>(0La)MC-)nZWi_2ID#ixLwtVi;C?#vPW zO=2_D0UBak!BE==c<{`%2La+E`Z^)WmLRjS3~G>- zPLuc-_><|s#B_)xkO9)fe?BW+CVv0lsm!EX4;M+jz-yWN?5`yCw_@hEN^~e04ump<_QgUPMmh=P<@Q8|ibH21m zE$sX1UoM}A6N(uEz10X&9|n5H1qf3qRWX>?kS^uFV^B;kwEXEAF}3c`6FhW;a3rfq z;P#d0gk=?+A^VO->ew;{@9L=$Ej@88M>>ZR4Q5=0(4<3Zt2AhW=*~qPj zK(P32LyP5$8CPAd8otoz(|kJY5u9*SV>_b1i}ZG6*4ZKwv=*?vG{RbU6%jS83Pr#d zQlnP`|3?S|VXux3lW~yRZ0+OzuLF~5rAV=aL|wYZ5@iw7?sZfNN~;JIT##!r)z4xU z344Ql_`-gP6yGMZp#-;w!6&@IA*}_Kzzo5vL(1CN_r>i$ULGE{v?6?WOZ%FY!~J(& z`}tJxup_IH>IbzdD|7v{3Fba-MN`MNE@WX2UH<;j471d-e)}Ar+~==b9kQ*Bac+?5 z0OvxhczhAn=XXZO#CH}(rb#;3S#sL7@sgU%|7%1b`b#8a_<{EQwTlsfKei2+aP>N! z7;R?1hvfRd;=Jp|7{2sC0h;JwaDhDP2Ky+o!Huexu2x_uRZU(B4d|4DPK;Yb*@*bf zZICq7a{f_`d=uemz>cY0%`hJ_gEAz=@{u4i2b1*=OedoYaxUxJx8ruWPwLt^d+T)q z0{NC6?(QD$udSS|0sw*5ME7qcE_AJoI_3&_d4Wb^=yIU1h!Kbpe0#*`V()0^rO|)! z$&B-L-g$=O-M{+pb=;j>gJ;!ev6rsTl5)4!yf2$I&t4qu9S5W9Kg6;6?mQl#CE>82 z3ppc%oWMp+wNS^I`6;q`ZOYl8!7}FbIK22U>9k>A?T!x!5(z9Ydjt-KORXRoAPGE~ zYqeRCT8!xi7e{`nF&aTIRa>qaLfU2=Mc+XVZ z(9M+kiMk_6x~|2cQ4ylf$?|-#rsU&E|1N#ZH!faE=(|;K_Y9)z$j8zXl7W={_dX+c z+_yBTy>yS~5`4(LY=2%?t>e0QfRU376YZH7N=~%5YsEJ-;rnhhYrb4Fq$#F#ya>|D z$WgZgO`|s?BI58Naa~2$7F)!)xU}FldrVZDuU0{B=z)13O8Ih;2r4&=<^E5JXjzPq9S_=ZFB6VW6yNwKH?OX)f3 z9Mgp;uoIP^Ls)r`XwlEypNW$CkaWED-E#D+lmpjC83?s82*_$A)EJ`HQ>t26-3gbi z-n?*pF2t=jCTeI%#{ZOzpO*^|JKi++^!H`^t^)+mvW7*tEA8iaEjV6;BsB^?;@j;p ziA&9rUsj#V^+g-i{PiUhz{Ne*ToSpoq!kL z=zv=I`9?lYJ0s(ENdH-1;k^NNXI~;wNsZ;1v>^RSs@Z}0r8d*cz3Qk=3(Q`E4f&aU zf8@1g=>gWm5bI2kREsaVpEug(=m~b)khHi>a@N*kJVtWV4^-xx==tk-f}d$)iBHflo0$BQ;#$^BzWm5)5B*e&G*lFk@5DjzPeX z4SO=hz=Bk^muDBMKo3JP2QkUo`rS93s5*TC?W=9>ZA|_WbNF*hEo<9w@b+0jFj~ z*^M2jIm!Q3LI?LKn*#;YmjB`eaOcQdsWSXz;q|}qKB|iapzsoPW%s||N3dHy4H`f7 zBNlYUetT8yh`y;J#ZRy;O6N~R_Y2qu|DbE7d4R?pTMr<{sZ@HHyXa9o%+>2-XjMP& zbVW#ICGAEGOXkI>rAXmN_Cbo+n9s@g#Xb2JpQ!`ha3 zQ;D049RSD{CZ3T`TOBt2T;Dw|yEvJo(z@rgMUS@NJY!sA(?spqQ8IWff* zj)l3!FdBE+;=Kzy+~rMy^#{~%{`{gq7R9zvQK_|5oc5Nu_Oy;`?BF1Rep#{6iz!a4 z?})@Yjfj$4I*^k?hbFNm50{))MLzU3>DFR3bI{{WDS8_p42yb#S0V!f+=Gv`kR@}8tn!73`t9-_=Egc!lsqe1B2a4! z=p`o;l6i9$==;N!aNOWWNG1x?8GL^D^J(0#iT~sqf1HyyUlipX%?yp*V-6}Tq(Y#q zogpRjWkcyelPkDQ7LRq8x%bm;%8rrzB9B6vd(o$|%`_V%j?WbgA0Gemu&$pv;x3H>|sQQNv9s){~XT$tN-($zX(twCuxq-%TVK*un^Vc zG(nWE5H(6i{~Aeg3VWp|kifu`{}Ya?ptxz?4!!%reS*(B`mpRx4`w{)B~)LOK+TFz zU#S7k!Jbb&Zzi~0_1sM1IY=hId>>UsNLyle>7cg#BY|b=s06}XY5TFhsFm<(A-}7!{HI}N~Sj#4Lhfkui z0_j&O&vtG}b$8`8i#3^+a3O8a^dZahTH_IKu6oeBVg*b9d!42C9p5VxxvShYzZoHR zJ?hq-$6Ehx+I#wHH|_tKsc~H#K)`~5hH_+j-7film+^r{zj4FC4wIqGwN!90*R`fZ zmvJbdDn-=E7-cBH|b8Zf87`w;CyQGW=YVc97w!dWEelpeM0Lk4*zi-iR6O>x5x*@W%8CD9Q z!Mk~7R%EsHU{%}fnggBinGZ+jGI~O+z|bjlru142_7r*n#P(veTCjyMqO~0+8gI{= zgpk?H+eCQIb(8_RbJ2lpB6S2JCF;`K?oWG(G>6q9@Z0wYupuu{-0x&G%(t~ad;Yf8soOh95?(7GSnie9CBKoMiLk| zPZO)ABwgmN?xTvB@+j)snO;2aG^79=&1L)H2tRE=c?x4s>^E%JOjCO5jhEaG$K%(- z3g4I9NEQ2~tgXh3`DrTA@@>FJ^xk$`3=oRVAd5(5Gfw=H^s_F%et=FqPB$xKf8fwq zB#{gm`gS^y?&h*tPlYUBAbdy~e4-yFFKO@zn~1~+ZJm*CJJR4)o@udd&&6RCd9@XO zS(KsZ#R0RO|5!_a#NbZ;(t=*Jey2ZVHm&1k#kRnM)d-_aM4nY5K8CC(@1%RWkGcr& z4*Z(ue%m2dvn}YECD$7_WI4<2^i;gY#(=Q$vvIv|yo83@jc{lNsKYW~IiCO)%l`l(yxj(KGaSAPI?m1So;;FK#6-etqTniR72Pk5I%TLMZip{513> zD_u+ON8{ui!8@KQFzu9w#>Qm~PFi~(s%*+a*UpCT3=$UMN6Lfi55#SmtiJ~LrI;1G znzpUvup}gLKnwnVh1uhMea7njSO&jx6ymx0wMd>dvAWlMtwhUc@2|VBiRWuu&}WY9 zP}~tIKb{;j`QWbh97N8+K?`lS(9XZs7z$CzH|P)ur4!=6^TZ6rc}_ubM_OPZ8ExZ& zelrwv8GP$d{#kmO5~XD4(HUx^gZm`4s1boA6qDBOiIB3e*mZI)%JoYe?plg>Ghk!V zWO|vqQe5#m|C)mPxVW+YaImA0R*dy=21x9wM&+BTaEzqykA?ccPf6FPEn^Ak2%57h z9^%_o2{MS#y7f)HC~2-+RJ+E|31kyE9bI`-3t>g>j5Of`CyLJ=X*O`&i%^kXDa5MV5-89ijt={)Hqc zE^(u526#9~H)B?Zc;#^~mcC`W58F=a3z(^jF>pouo`>nnHK?nk8iI&PEh|(eY(v98 z`a)rX;%bCgJEcJm4l1bLX zqTt^S3_tWiFp&YcGt2CG%@vs<$0==y%N{v1UEQ+^V#NgnfUxT1C}YtPkAAX8?A`Xc zQy9-Ji<4B(mAz3LQdTAn+Gv9!6lGGl(Wp zSqzBzQg$W{erK`$jIqr01$VuCI)-!Eylk02*D5n{kgJ95ME3?>DOh-{Cls0o1sQ^qMT zCN=fn{>5(*Dmn6NG0Pzamw!3#`!#}g&UVVzW7;8zW-{%>DEN-2H#dW3=fvQ*?JvE0 z8=TABwVnqgP0&b_moVDPj3iaRw#8~%bu2IJ;Cm9msZ9B?O^8g*e*qT@r*#3XMO)wWmja+jdvT=(M+ecxyQ*U9y=tqU>%|Mx}}85i(xml>zg!$y++ zZ&8IEBp&-;%`GCj3kLtSILMs+Mqtx_0u}twbd#F@^V4$dTGweFh?Vx({QR%iz)zAO zQ)N3MR_6bHbGx@-unh}7o#^9Vup+X9>v=M0>BHpGxeFigS;_vpDK|_!*6RrV7Z#ks zQ68b>6vM^UmEw7}D8{|8WFgx&5HY5tQ!LddI7Uv0<$v{OJ18i@!BJw{m&_-nef?7S zF=GktkR(J_^mN!*BvJ({u>ZHJ^IMgsox{T7q{jYsK zd{Dpct5B4jV)v<8KtTBTjgK6lUdod}Xk4b-ca1x^J+w-UJpDu2!3OQ2PYa#(2z|Le zY2nkdIBC40fC7r!bxI5p>T6-meo_Z0}Z}!S<%bXE0 znzYWoXk!BEjHSZo2jzMd}M%7jJ>s+a%kgH&97gFEm4guRckFb0)lqlQgZ73H{ec=6zNC z;P)U+sn(O!Xz%XLmlf#X@5L(f1)}Z5XG*^u)To2uRaH4>HdYqi9OtK)l zi4aOkO)1Q4!p$!56-i_AEv~m|fPI02+CMn$9w`92qDC$Syfy-VtG<|j)K{ANKw&BR z@`8^)SJ2*wC|-OsW0644pfpsZTq5q`#)rsgJE@X@Xeg|xH;$h)j7f9bFq=MH-oW6H zXGoYB`a@@?aX7Ew3*<>A(@YHDfZ@+1EUK+I!=*y4SJTX|Nn7GGi|f-J%BAbbm!O)nso+Dfs?E@*numEHh;1Jnj*ZsH?zI4SPyFHb%OIxqT; zH{~^Gsf%16PZ!`JiDL+n@LkS_Mopu z_xLXig)6+?D?QlYQ#A?FuO)*r6&|sP)F*h}aEy&zRUuvB_;B}<3g40}g z00WK5ku_H7R2o&zJ!L~GE4R6^XRk+!7u{P8ypQ!Ts|R?sUT4Z`+-O?~xloOv8p;Y? zc~<@AhLZOy7iUX4rRV!Nz5zQhZ{U&igBnO%YX+C0xXFBxOWJ>eOY=b(1UakcLE8y@ zT3c-dy88O(2QBhV*|N7X-rw6d*c&rPT#7DZ`ob?I;vLOCuCxo*&RGz}tc~=dyBSEH zV46-Q_`tHTjBM^4M1E|XW?#3a8V?ntw8|vH_2Wgl)nzSIkSkQ-`;xx7&}4#Pms*|2 ze_U%fk1~U@|A{5KF@g46n-9u8CPwS0y?{ogejv^shq%N(ERhrE5Xmj0{C1t6A@uiT zApTlYrD||cS@J#A8+sAXb%E@+cxuJ-q86-h>RyrSz83WM`|qgF7pLA$3h(Ix|F>A` zZQH7hSaVc|KK8$+x)=W_dlUL3U|eiS9K7u+$QRzmSk+ZhQu?+X7coGD>F>Nepfj)&2=yIzKM1dkTu1t4Hppy z@ivUV^CnICEDjT^Bpk9&-{QO}@C2}H)_`Wm;GQxJ+?ZwIP5hF9JDn72I;)~+ra~bd zaC>ibYwu%XJe%kMMIw3FjYr;Ma$>8;!aL*WKEf03n)~o7s@8D}5CHqox z;78eP#}B6HI_fm23(SLSLpo*1R+)}7vlyAa6 zDy`yxW<)D!fDo0wd^kx>0V97`6s{z#sMulv<-HK|fd7&Q*#k4wJ~e>>@4=jONURbIfO=7X0*Bp5$O#qxkc zhs*~`K4QrWpIb7C?HXW&)~^>_A`U9neQDNLt&{ZXFuDv=1nf{83Fy(bk+jz zECip3@e^fuc)P~-h`&O=0hvtBqp!Bl!qqanzvsbk2v0}~CEh-=NW31Baw?NdL`F_# zF~b$pUf?c2i%DD=H{^t$zIN z7S4te1L?wJ3hO7|b=@Jm<3zJ@Y9Pb&OYPwOMKkY#y8;EUy_X79WjEM)(-A(MKC4oE zHXP~vZ}7FNzYUp!2_WHB>2|A@12*7Sa`@DiP*jby}KLY6av5-~gEe6g0`=jHGH@TEw@(VKo#7q3M% z19e$4HCTWNR9RalOq?asCKvLAdk)Gi(5zr!aGG2ulEliG zM6V^w<;x0bl2(aIg~y3i?43R#9FC-{aUDk$#7az@VY?7Xow3#3bj?TKmkzo@_CAJ} zB_hh*N=4bnpNfr+g~1Ss%)B^rUybibrnNZhyYdvdemw(A-fu20)b8CrN?!-&ByZpO zI8f!!ahclc|1W5(_B<-s+dd6fJ801d?Y%dJypmPz|zRW-bUnB2*Qc(>BDPsw1_w4&=lo0&n zLVbKSUCcRtAXUA_D2z&bIIUcPWy%CzD%9pdJ-+O`zDS4TXHmxS3f({y$(-(E2-Hu< zMn3(ikmqKa5*To#NnSCP^sRN{U6!!RC#wc&M=^XWvLeX-GX?uqYsQPrHL=Eql^#k& zVT|#GisA3HQ-=Oek1%qXKcVkrxRg4g0+@57LWT3Me^qw zD52G0VZ#@8HUYUz$#d_o6jrwn4+6oa-i;fHXm%LqS}VxkC6^Yz)TIAJ*L{K7IBSRO zxRr_zTM!#IK-Xz_Z)s@o@F&I?7w;+j&Lq1cs)7%jW_@KnW=$3m-K8`To6^UO9=j3> zPK*_Pe|z6G`$T-1VV1A}T1KD&+bRUDBNDC9^CX*2md85-8D~4;mv5oF<~;=7kGJRH zLdCw|bss$=L2yNr`M{8K?*-&uM*$WfbGHec$FZQ}`=_7P-FLecU2Yd_WYRj9Wn(qz z4p6KvUf!%`BJ$qn@np#!@qJFjU|Y~4oMknDF5%lb7ig^&VcA_$ma{}DiK43)s~=69&$mYRo*kD|I&q61sbGVB zkBawffhsyS^Na@jC;h;{;A0v(#g8@;{|yg3VZJ+P>4w#*V|_VufgBAFnOt2ElSA*F zqQrJ5bnp~6KR#Wi8^M3e*0%AYh&7NO_T@OR$O2C~mq_WhA&;#Znxwvh%KE6P`jdnL zGb~;9THa@I6<(GV*-z%F){T|yXY5sm?Exe6_M6t$vDcN29p9XPr*a#8VjRvJFNKSH z;6k=!UGJTaVo;mcC@hj@>F;I>EGRbm zU2SJ2dfo>gVAvv;@r0Ij7D@;0>icR3uj(K z0kZgxz7nYAqjM5YazVY@0+&J2?#=|2)8^Diy=JWN9);R5*X43>skn3xRM{I3)-YI2 zGkj%9sH}Pm|Iq6J*`vxZb*u2l5e1o-K0h<)HvC1tpss}LIHNhAb}9}w=GDzQ2v%)wYx3J&5{ z9gGbo44C_fe7J6$YIssA@KPc#YP+96TBgtaXe{LxfgZ!jMixdb)J=F)o(yS=hDwD5 zcQhnp>Gcuvr7b4&aIS(}6}F%0uRbgw9t9b5zwpbo;8&^cDPdV13Pp!Gz?_FHn?vd_ zkZOENPWE|kKr+el*ApziGA>Ts>QpR_F~NOqH^%))9^AbHwZ}Ri_Pba~uhKXn(ES)` z=D&lDQ$5WUY?^ivhbmS#=V&JXHPBsag|qzu$5?7noD2TmFl0lj9NlsTlRvcrW$e#xgCO ziW0#i+-ZB@a}mxwjrF2A8{uH5A0%#k_+maKHX*f>0+F#hb|MU&<-bO={^!p>M14+& zMclb}+Rj%xh*MVz*$49(_mWPWX48-Lb3v$e4>bzy5{~00{JxaFGlSBit zL}&p0EbJ5>a&G!e2=J6fKUfrLVCDns3i~OaLAH(2om;niX%&DKG% zCr%pUf8Zz!nXW$|)fM8uh}Jjgzgw!>(^A|)3#ycBz-hY!LCkl{&(~TTfS8X?7@a8IwW+U>&NQ{l|@5z2Z@=F=}%YkMK89i znnz7egM$%&GeOLl!e;j(OIzIjzHhYp~#5ZrRdcokNOz#al z9<<0WxSP|-ejuj(kQ`Wxw&yec-(N~)1>sVu(7-~}7Ie~$68n~hND2>?y=$fXWe!|+ z_!aW~8eufN$&;|mUkX=4cP;TYe{kZ%oWL%z7FH+Ai-tY^jywlAW9$HuayYaHk^1B^ zG$7)XRkAhCn%KYtUM2a0V`BvULdeid2RqJC`is0so6Uu)p7JDhRG8^9eVLB- zp=R8)Xq-Vz5Fu)Tg?bEALTamspFY=ZJ=5gYbndp?ilE3nT$_Fv>EticW1Ywl-CnSC zdEvF;OC96=hVUB!v0_O<*eymf==XM&)}A*>gG}u!!@jkk82fDOZSSJDuuPeqEV_u5 zbr|~C>6ETkha>6ks7_?*H;kx^5alSild0M~98-x99kk*Mg(YVh#@hy(sOWcYDqPbH zh=fZP0E2qje2wpp(+)yyBDQ0?@}KDk!Z}K^+y^qKl=nH&mWDuH#Prp4-fHDyJ(Yk3 zH-0n|{ElH(OvtQG`(^3_#_G(g+f^t20}iXEd&pf&98l^b>1`{fu!&eb!tVzUMcvjSTXqYcqC;*_^`5)kjX=1h7hp0G2i1*-@jyTyx{B6=fN1O?=@&zXq)>QX_I-db>jMA}Gkw@me%= zzrr3JZ34z<7mm#2AqR^Nr#Ihr;8*48d5ezRFkDifLGZl0;r)H~XPrVF!tJFrqoy-J zc;CGg^y8D!@~iHU_1q`PFT@%uPtwtpFM73mQ&d?u>tC5^>pq_{0Ol=cP^kcinA{FG z134SZLuVKmB=DWi_(VJpTjx8TGxQS0XDr;7A*OfZBn!K4=ontvlS(_H%*i0d@c!)@ zbZDSMcSj`HD!we<=L)*f{(A7?NqowWm_UQ_cNgMudtyw{a#+o;X*9{xUE{B}mFPP& zS4SIuEC|{1vrR;PWH6OfQytUS(-(wA<`e~$eHZ*Q%rF|%%9X}&TG@%o=k`1%qY_KuOCH=lvELgS@ za7yIg5~Sc&70w2RQH)FNnETw;&C|HoNoc85m8UJcMg~i2O~R1^PeaLr#jG285%0sW zrME1+6y&6%Rd82>Bq#aI8bAT~;a-lrVQ*B+}`J- zQArJR8#k;|)hp-VzlEfA#tjR#GFV6R=){8e zMh`$r@=tyTsMSMB%UXqM@ zE)nEvX}rz)_U?*@xc9`Hrxv_RRl%2n%r~oz<4>v}OX7IGB)`(`Oj>T|7f$BT9AY0L zevPc8ydGALwXwS!ni(?l*$XS?zIkIm`N(m(1}oMkda|*o$NWS_?^k?2#U>`V-E!;^ z21XO!G14H)o^lbaPNJge=JlEB>?tEWN^A62lo+j=2PT8t_g?Oz;ju8s@Fl0)KJ%iW3-&eLCPGP;u0)5e=wE z7kL?|P4V_CLVIEQ7_NCro+nM_5F@mPz*ImhrXW90svNt$+0;XT8l#}KS&xb8%ItVJ z3RCZXEzPQH3W)+N7_Jn;b5d*^Kms8suO&+2Z}%d)kwLB8+j1(gNu6A$#Elh#0VZ|( zfKFoMpUlQnE{6Jw<6ZWa*h3U-{CW}Xk(!&HB4JW=Axrm(S{=XXWaz8so-+lVN(|ga z5sm?VIIQL~4wy{Q8ezLVPYXr@WYc>K#_NSZ>4?X2(q8ix5>x<-sHzL6v+0D%A`?;Y zw41+k4VA|I%I8*mLFA1eVMM5*nu(dHn;EgRx2sHIn%C2(@1we5$<1`%E3H?*(k@rgN zt{o&n)7}^fXDuE1dk!aZWx818zODWzrHc1ISgV7Uf6;Oo=m;V%#gNdd6dAs!&bb{N z0K`&!Ae6k}=+hT~c}rxaPRFIR=d*|G5T5SAhF}9+U_a_z^PJbD)J~3Z{y`5(@BU4`L4IB%WeFr<{~D^tm?3= zVc$B=?}lyV=USLj_Tx}*&7#B)v5~_SqO_+)_rBZxyuyys1G3AU0SExU5q_`nNm7LN zbQ%u}6p}CLbbjs2rIJpF(jW>V|ER&kBx(;L>v#*NV)@XJ&-{wsaTgR@>)MVqS7Cre zTY}?w!xvm(K!u4~)fF?ch@U3}zgh-=5is3N$JHqp^mET5I6?om?_|)U^X=hzG3o8# zo#b&_M$qTsw?lCniPCyl*N>^226<@28hob3SD0;gU_@eBo3H{Nq9?s9$2S^vsr-vY zaoz=3@{(HkS6M+PnxC@3P=)Ja_MCx%vv0GNnFY_vnB*iXimj$WXCM1k0O7@cu|<}X zDhf?Kcg|crL3drghKN9$)9vZpj@V`e+Zu~8e%@-mkcQJ7Pdy|q03Y%^U{Dz>>02^R zBpq4R+O&240*oSjbn15F7Sh{_mNoHTYyGO8`}$rMYHLz)@ROlDKWfDzKGOVYcV!bp z*=fd%_j&yj%`uN*-!!F4#i<&v|1E`|b=`a0`O4m5b=&aSrVPH|(=9DepcnZ!iKwp_ z4`>QqBPSf+gBPuV819~MdgD7PtkF$BCrDeVh}dPeDeRx@{0U$jGD)Op=|_{rSYbtk zTN4zGW@D!5D$2UcvTYqV!Y2h2CY3)idc^p<}z~b_nXXJXT zf>M_j6rDB1RIt;Q0b+vxhDQ?DeX`1C4HFy9*QQJt3$b18PaB;c!p}Slo4q@&@ryix z8GTm^EtgyjV#bq{H>38var@!27mpy(nnlu3dkj?!)TaqOr%pdH;IHtw>Z*jWg&HHC zoaxy%PwVhfRgjYY3Wn#Ya1{4z=0k`NHA1+E$~RcNVo%fxxbr^=L;!P zp$V>4CzZS2=qFYjx=Th~%v!Hmg)CmDzjS|QNqj`mQ=R!dS_cT0aS@Wu1Am?of;(=@ z3Ktp{{s6SW;QOj%h&QSYM4TKLK2-TDY(5Z& zH(`n*ykcL%>mGIVsyS+o!WPW=Ne!IrM=)MhwXlB((nmWgdRfl~<}4k?G}t#Typ$qQ z&ED0T4d4o5ptWhk#A^r^T6VgTMObh2^Q-Ng8@A!nPPMSBr9#KjTWd8a&WNl+IG1*eX>ILGWHgVgxQMkJA?Aef;ubmf zG`YDUM|cjt|4>AYZ8i^Tw$QtYkFIT#X$SoaCXy9&U_68jO9?sbr|R7LTi@_SFp167iH9p(O^Ps?T!XL z;T4(D!*g;|@;Z{&Jd)kx1=r}3r(wp4Exhp8iQ}MnDpgU=mDmv?JmZ4_M!I-%j;mlggN?VS>ys=!YK0bjtm?r& zap_==cy8B=C#B8~V*QLJ<*70$tTYwrNo~;lqHE&5wKVPxgP7e5^x1^F$YigE%;(oh zmEdfolHP4G%q6i`epx?~0(aJd+bdQBJOBmBqk`V@57Nw-4+WCNV*Q2W&--t_p`zg= z)WGy}kH+3?4tA+6EX0x;<R^Ff}Ru7F_P5*!(2cAxXa&i<+z{vjM^!Oj{S7hJMWuU~P~HGi7cUa_~`R>_*PH!k@^WNS_1mrdfoSZn(vz~56=s_aQ$LbJrKsM-D|<26P=~R znR-zXupRYLk}O{l*jt8L7N%)>8kMd^crB7(jB}&9J|D~&=IeM*u*eb}Z;t%8O$oaY zQv|kt)Sm|#Zs|DS{TngUiYfXW>rox`Cuff@xC^NQVP$|v)cT%B`<=mwM74IB_>c86 z)cWg@{bZy44D-IcJ{y0zllcU)IBl+K1b+%6xSym!5B~@(g(GrunXnmc)PKL+&+RCH z86HZpO|<@*3c%*RnR3Q`jD*3@5izq2XLPrz$E0l^22l((neKp}nUoe85|K0(^wIDM z7?IA<*pW{Zf}yPF6~_$8>w+zBW7ChM5jeN8wkaU1=AN^R*FqrkET&%9iH4AMK0rF6c#25n06dErLClOhy*fkf-wM1v^pK|57|&sV88x z+uI5<*TqO->@EEcXZf@G>)Gu4gA}=G&M#_nrG&9)t)}`)@KdD3RDAl#nKY4`ZuBIG z;;fX4_O!n;V#P-^w;aWqskaaFNmrK4W4#(1YZ}tg_5gQE)odcS90*VEJ*a9Gq5?4b zYc*^A=K(WHWKoBHf-R2tt*1#c4iwRy8v$djP@CIr_%3D0%h?oG$zUgGCkX1%qxcv@ zN>Z+tTk%YqGHwuZR4jvE%EZpOl;BM!0I14~x{Y^@JX^r$_yd9tX`!%^ zQl>-)mN$<8hFWD>m1iv(J=kZ#T*Up1S~B(usoNja{N*4bSi*ytu19~9Z}|CyM!Bvi z`BHl-!u$v1068_MGK2WK`95KulS-@#;G5GU@$N-(WMh={w|k4cX8GMOCW6T_4O}^^ zzKF<5S@pSn_tOg_I}C@Z$N-LZE~pQOM9=C^iGHXkN2QP{dWN?x$aF%+PQ*~s11x?i zPv|J4?bE!LtR#(Z^iY0zL2PfXEQof93b2axdKq)V@q&dNy$OG@i8qj;Ev&8cxvDw2 z@MAh}idx!KKH%vB%r5f!IO0_a9R>Qenf~GZdC~q0t+i4CgA-VeldH#?((&h_WH`;I zIHV(G+UkRgK1q*MPZ3E6$}KbZQ2w4sa({M~$1m2-nkrguO3|WkFO~%j-#;+9rEL!! zVtnx`^Z_d@y=MIONq)w)YNd(w^wbj>mV~gW@D3{G3~#af@w#!Nw(H|ndWKR zr3}ao>f5IXXrqm~k&NLeQ==8YK2SIVqQySpm#Of>cfGd11H#%%wI zpx-M?#cn{%d4s`O{3C~(8qgLXV2v`xLo!PpWFql@@%EKLb!^?X!GgO6*Wec1CAhmw zkl-5JgF6Iw-MAB6HUuZQLvVLzcA&m{Z zJj4+b_*p=8ag6zg&^FRbwn`}9!D$DEbgi@VBP4n$&1!#R20N*0ljYWj-KF%XjzSOb zL`nW4Fv<}c#pd`FT1P!jmU8>CA;4SyIhGvHdwEbj@5S6lC|*xfi-Ubh>%BLB9Uy3G ziuL8@0?l%1zt~2LUcWfX?Qc9fJX?5KC6DX(;{-->3Gm=9DpuX+8Nq*cj{g6oOs?TM zw(nnm?fUdkO3^!TF(5nq7vRk@0)}OYuNu$?;G>GR#H%=SKNg9v)u7;?lu-HvTwMOm z>AV{4&L8k*>>bI96JzRhK|57$xoZQ&UaZ}OZdId-Z%$kPweDMr!(bsjD3=U`H%ah~HQM7>PRv7k*^xJx_Qxh{< zzN`KTckPwfzo)0c_%bL2{ksly-;`}6D<`NSG}0YA*1x%S+#Yy8uc|a#`03YwXrigo zW-8)}=5O8}eRn*0p_l>T=e-8#J~DJ)M-QW2t3x0B`e3E#XUjWwDipK*7DmG2dGtX% zJtT^S5V<4xLkl{u6Q8*6k#i?PTqo@wIFX&-JS%`OIO_@4zO4HZxxWEdy71Hv$y5&8pH$Y2 z9s$`D>}llNTFg+g&rqX#rqg|UA&1otR<|JdmPd6>2)0J{UvbOMYn6qmlnH(@Vq`bf zsvM2BAeo6HofM8!zHxQUt@;SxR|6Sng+U#SAwNF$=`<620rQejJ^IAL$`bsXC=UTB zj%;l0#GR@obZ|{bAL6`hq4Z*f#F(!|qJEZWgj{xeTWNBB7+TCFJ;G>elxZ@+mz+@2 z4q`u4G|+~6C^5)Vh;E(2Xh%DUOlOhGHzQR)V(@%}>%~{WL+C%XD^ilAgEW|=q|*M4 zAH5ZSxbUTTFEQWfN4@;VljD;^(X(7a^?RN{h7w7V6Sypk9)d@uAi#L}c`-zuyV7C+ zaWKv(6rGw2y#r4%ieee>1ZPR|{mvgd0biSznVqm`yY@+l$9o&cB#zw8} zvx8{7gE1MF;TuV9AapB#JCWssn_=S@;rFmHP;(^^j4LlOsB`7uutdjQp&#AA8CiRA z#|BdNz(#+pbzJ#Uq1%A?(p9^ENZX%AROR6OCFFUt&*2;x^FWqB(+F&iji$Hxv?uqu z!lnP`;D=?zny%Z9S10fG8Dwfq-N__ZoYS^IW$Aop$2}GI<jtDkGPK4Z*rl z!*r%z!e5XCu#y$p2T?q(^tF3-oZIAfYQX_sq3bov#3=NHHD7vg_^Y61)X^6jeTn8O zzVtt}xGwlofu%~=n~K%l^*K*i)4SZC%%#XYWwtheE7-Bt;wJzL86cDsw}llyzfj%#;~Z|xe13DuOEm76oR=(IlltH4u^w->cJ)buD$lS&p~rVO zeNza*l8 zBr8jPtJaWVryrD$mXVd|z*0-VE6;PolnS5oO@h|Sxfw=%rG6qOax~+HEMJ1&)?S)F z=9&*unSv{q<(PENYeiDXmW0kPsB*Z8%n6UCvju`lvU`HQjBupCDEbjin_2^_xo!!u zZER1bNmN53^GAO)7$X&rO%FZ*OGQN$h8yA}YdtOBOpVrAm!%kKagIYxM)&MjBlM&n z$T}8EE&q@yyyXC7XDVwL`s1h7!}nkErP_C5vm)pByJjvlK!ql>7I158v-3B#l7_Ta zBw!nLR#Kq!HAy+LxNaUxP&bo|`{M_4@7&2UfZ7?aU05RfeP2*ak@k&h(t|Pc>AH_I z#?J$%YvV^6z@SK4Tl*ZuK_7!Pv6*y}ZA9~`5u+V8`}$hKesCOg1a7nU*0|nZYd5&+ z>naZJEzZ=~V&8LRkcUdCK?b|ge#0LW(a=ZiAFT-&^gW7Gush!JY=flxs#gvJM=fGow626s-hV1tmtzIxDd>4=G;6?UCe@xy%%5_Bal1#9`Pnu>JE)V zj31Y}0MWK|VSP9B8@O9=!~3kDr7<5G>L&cEsD9VmQK@56OT@L{owhA9=bH5pKE2pr zfTnZF*1KiBXNT$q$`lvn(DjZZBz#ykIHB+8y48u&&y8?nsry+G{syy=PF2>mCpvjE zcECFlPlr(#dZs=c@|SwtUN$v{A)X<=6pQJz@Ztj3Z6m%J=1R>0*6&M$X!lLwZfL8iKRiyZWQ&slvX&C^cbqT=@OX>2f?`$YI@h&;ec_urcb+_w4Ma66cxRc z5rC}Hh0Tpv-P&628b^U{D@(CTXmdG`!az6oatL6IzUIO;ZQFqN;tMWlvvtW#FKST2 zbV7sSA~L~@136K%-TiGrM^jUqaqYA(rJ7paO`k1y)n#9x)dhkghQQhhH`+8QMojps z>W94>Sg-Sg@6%`q+%nI&dE^gBja9%fd<K-*&rm2-T6U`I@|mhHxeWe%E2Juc?B zfYx(67LVI@ersyT_my#Y&*bOB5e)`vrSf1~2gDI${(N@W>~On7wZwOJ1O%~@FI{EW z!$y0)s6_SRBQx6lKPWxzwEQ;FX8=}|L{6d6CM;62Xt`?i)zcYRa)GA;YLMh5Lt9(>?B^hY=IwNfV6Ot@ICrlR3e9wz~o6pTg>9~ z3!k4F3ZJ3fpV4|Hjv+jX_?ITosO|}_%u-$%!ylW(JE#!0iackE6WAQgQ76{o z`E_7g2AZ;b5g%O-;Fffl7sM%x` z#voS_Yqdio6Wen#VNrm~nO|B6uYS^_l6gnEHaudnj0kR5kZQv|96fdN4QljrSag)= z{s6;n%HeMfUu=6d|B&^%41(+$8HKu=~;J8iR!jJ#ytsHsh%9VN(sV% zO7ZjHA*<9{Q5|uh=6ze?(-dLecPQFgWw;hMlGv$o7O@o$6^R1^|1v>SYW^Q9-{5)+ zHF9G&kuEt4`X$#jz#Xcr7M0Z30_GsHW(GD^%?bp4!z4XUl#p%!mpiic2^=!d#Y!1D zQrG;#3ji@Ssc{LF$9gMvwZz;i$wZM8HBdffCnRH_Cohgc!%BcVW^p!L(T%s)t-w=t zAgYlYGf{_PMC}KD#5EzJNTF31-086aK!qw3k&%6J*MFs;0|gP;!t_P;G-0TIx`J3$ z#h*F)lp9p=&@CD1v5+VQ4$)buZ#~g=CP`?+`16qtmYg(1#3HpzFE)Fd4*wAOIKywk zxf=?J)Iv(eTeFN^j~bpR=w?z1x0+Mf_!X#(zF~CSTsX1W?>0q+Q^AE}EQv32Z8>k* zV0H;#hw+2V8KR=A3;D}glL9{LjhN62qA*ux@KFwV*PY<>N-l~QCAJbTBy2yAZqPi9 z=E22xz&+jB5XJ~ri;c6WOIhB@{}+|71)T88tM?MHCS`Fnw=O}TJoZd*TVNDlOetXZ zvbk-h36S|bBV>UDz^Vxi48GbG;i#0qMUbiXI5@!YUVhB?0pD^Qr{!3KX2Q3`L7F3P zB639EG;A$j{`~urZT}&n{UzA@zpEv|Aj)4q|DD$Ne->r_eheOV)3b-n|9sCwa^jM? z`CUj_02r?*Z2*8vnV*D<`bqzSKA=B*GHY+Xz#|RW#xG$Hajez_f5|uFFVbIhC6L>V z0>O9$;xOtP^3h-8 zevcHa0vql6)O;}!g%_u*7x}-V{E=_55M zyLvx#p&_RD)KjMP?(dx!E(*`HYz;(*x}(dAXbb!)v0?lVe&7E@ncQSSGZG~dC3ea} zc||)L7gNA#C6fAY3Y=R5Y`>w8EBU{8f)U^i6FotCvtCt7|1LdRk$)SfWN+E5LXq8>Zb8x^y1;a40JEooy8$cfHL zm0#o*73LE&fLuGNoG-bD{Q+pqEj-mO6IRk{7Hz^(#Z+2D8rCEC^+gbM(8|SnWvU=Y z=y3&`f!(idC7R)^>&J+@*NQKuD2o&ss$=}6ilX=A_CO9WiWtGBjFm0`1WI*bjV3v%~RFy|W}6>3et9SpGsRA4ab`cVUnogJSe zTOovum4&@6v9YnJSshw0V=3W?2PJ-lvUx6&jaRDz2RUd`Ho^2VdB`}30Waw~4I?geeh@q~z^?ToYf z<{=qLbH!Q!usC0-yx>wQpVE=ALTr6*6fVXlaeIViIW(32alO@ujo;ZJ>B-`WY6C*U$#YALozNWfCrX-Jz4 z^GuHzq^GX!bD>uV-OI~RaMlr}KI`9-g-}~HyMxvf7rf69sg|5f@N!R#5B^5+vao&{ zJ2B!KFUk?m+`Q3q>+2tzTp>xC#3uH=yq?$pcbYU}dReqj%i(MXaLV7o%{12Lf3*)c z|BE#f6K(+6-qb?+JsCsQLPj7Kxk}LeoEyh?>Dhsn^WD!4-1W`<$Ztcw_1M9mRvy=S z4uQAlr0+=>5d@wAc0utk=$h9JTR*;^t;05EH{Y-jqn>4cU3n_xPG3NxaQVJ@Ax_wV z9=V+;MhJ4~{SMsN2XKOt#kzdb7@wF|CDojm=PVqDN5bzSQyZdYHNhYy9@^ z8mJd`Eh{8TGkf#p{#lE~3%+U>c?w=3W`Nq&$Yh;^UtXsF1h`c5W#D7|WH|GXIg{^; ztXHP*9o9V5oKbQXu1b1C$!PQ2y*^j1mOVNQ867gs@U_H_4nuHN5YOy;O;~nngX(m{ zK+hl^!*}f{7(|>&MO_9hsl7>);>oF1`o2Hx=Om9}G5hr$HXFCJSRc0!-(DC{1cz;E zu9oEqS2}RUbeYHtO9($xr7f5UAros}DrJyBXtrU)c}WMWDrHc8!~m}1K)3h=U8f-S z+Xc(Dtp|TDAJ3Cn_ATYguWoziAzmoeu^ot-LL#vf2KjTq^;5!`&o>3>Jl0b*LB~rm zg%n~JMa54)&5s;*w8`k`hR)9y-ZJQXN4MM@6MrV{j@ zyF9PBw!jIS_h@Uwx)V1|+|nUyE1>RPK!rC+LMa4_(+;ju1+X5&#ecgZ0o;yXX+CJc z(T$-b7rJEey-Rqf)#5?HskEl2H)pi;f=ENiLdrA&@xm3!LR0Xi842PBW#Kjq$)TB8 zWT}yYrPTo6@J|%5YkRp{nX#!c+93kd=xH|)0K-W`Tiq4r=zPp0@Oz7*4`+${*D2KB z_A3SeZ)M~}>S3Pm7aBjopa>l$G-`+TAqNvE!&34B(>M6pYYU75t9g@O9O zbQTi0M8uAQYrMsbYvLvrjRhF(L?KAQbpN#yHcU)kd#Z(Rs)96;;ep*q;2pQb&=aX@ zP_slBBI1-uwci&`euJmiPA;`%k@cW?b;q*Hh$LKvMt7JYf%LTzoE~M?y!0ZLddH#k zza?}5{W$1l0?kr(Ejcj~YfQKz1S=QUxQxC_gg2Q6QEa9%&t-lX-48x(=xdGSnZkol zk00+@J*63HL)-xVK<^5-RpBKPFY}t(;21}&)u)Kxw_S09;xKNtuScA3s_fb|ksgfX z3GKU)R1(jq?4g+ngVT!9pTC@74pKD;SfTWMBx#EOHESf4#gE#X08;)drdoZ!1&sO} zG}dsE1!ZA%64x;~%xnUF6x@Qrq0>q=(60%L~7YYevl`)&{ZjX%fk}^zv zea0}KZ(-kE-=%-AHoCGxrL6Zc0I5Ogb8my(-2H4>zTme_>fu1lr$yFswIa5zs@bHU z1<>)!{dS<&@ z8=LVv7>lo@pF8O|>F4#SJjhfQ__HfKI5cHlXOn@wz_JEP5>-&cC)M0hiu zvZW$H#B1rLp@pVVDHN1x0A-3jxlrGQemfk*32~1a+r4tZEd%!F`sjYH!A&fm0?p(- z5PEkJ&=5v@AfoB@9`YEs>)M&AeuDJk?k&Uj3ke%}uGUt*^Zf;hik0g(`s^hiv&X;?f7F<#ai*vqinm)i zw(QdG4A$yo!|R~OHM-d>bP!5-?}H;;JWEb(N|L<5)EkiW((L_$)%bShqh%-h13J~F z!lUu8C!W;3!`KAL+aEujP_t*@f%xLKmoClVUfH4&PCZlTohn2Culu7Az^`qcHc$tdSlYG$A2c$R(e`f6Rz- zrMcFxOr+SELSZnlQuNUanuXv}UaSNp;3*NhAcc+zNC4u8*g<5MgT%+3@l>NKH_7k2 z?ME3#3~f+#Lpit~N+5Uv5I=EU*PTsy-a02rDo58Xxvd);mt$#SdAz0H9q(RrD#cTa z7X5skp#okILek{=F@ekhzr{+WBYYH|7?kibmCco#*C(5gUp8G4`_AD)uqae`59ScB zOK5@WI{pXmfD)PK22m!oP*Vc&AA2YhjEfX0rlQgfs^#EAdoy^038jw`HAi%!gO%I4 zJE7>GnRBhe`o#+Xt~BbNr9>a7!pYRa7I)q>nJ7+3+A2r;a4*x09)~}es_0zcu+%kA z-53=r(0x?!L35GyaRM9^ zzBdT3Q}Oog)+=(qt}h+6uXoc@w5+^pKTNRzaHq+5lo+rQlLHIoexI`k!QXNx41t5| zr(SNyc+fX@DY%~rjh!zWs)+IXE*$HFb1mGdpFA5Cx4jrEztK5)sAL7DsvrBN#Uyww zZ`6(wWFM{6nw^k|so#7oZ>o><)mapQESUWHjUXZFI0Ax3V%4V2Wl^)+Ouq@OMAO4U zyS|Su%O#`lJDB}wFqjRq;9V|;FPlU&K$k^zrbRU8SpQ^}Ry}9wQK4_FS23M>)!Cvj zoKybC!DkinKU$#yG5Y|tsXV2;o6kH}t@RppHil6u*1f`#P}zNwFcED(h~duyNBHLi zM}p8Wl15nUlf1*ija%?*=BLVymZ`=R(4L(@r7r*bNkMf%)9eP*o z{W~bWObfe$`g8d)#|y%<6@((jR*m#pa{SqvR2^?z7gKhT91r{1_&r`Qczf=4*gCz! zVwWOJ)JZ!gONgkE!QNL4n2x@m{$$&mU>F2*!_pJmw|1LUS{FmXK=ElRvo#HA?IS9y z`KTpcbW!BP#o;Gku8HtKjS-aT+FUNbZP&!)zSg)#LUV~o8 z4+g$qSRpx_Tj=-YL}I%D<2ijr8r^LB9rZRWc>R4eMaML1nwk_86j1W=@>8BB*323< zZ8zoOv5nf@^BytdYDbz0P#g{72s1#p`(GlmY<^4jwpgJd0dH4Ml$l-@UYTAF*FSo@ z^FVOAO`QXr9Pg?jjDE{sn^h-h;PYb4Z}4^r%*n_8%paHsahACsuB4+A(fKso*-P@W zK|;>Ssj+w?o?kqxDw&92S|mocvy%(r&vkjKHW4!yb5UT(R=+Xcmfgj6IW*03zu`v~ zuS~Dj+cPD5nAS)S2zuhBsn4(8D)yS6R253pfm+VLJonRhT$5Vu z=>!;6yK7y_mS$8CY)iEojmaP}9}3iEbxQS&y-PnNF>fM+rYXs*8{sRC;va+w3U5^K zYwa0a+J_WPgyF>&Yad1(jd`xm8Aet;hy?KIB8TR5uGfTL2^2$o)jd@B8;q83Fzk~V zSL+|F2rGst`WrI_X5#loZ!BnYxLH0TWSldu=`P?W#M*&9VmkrjhMRt{0>Ub`DeOy{ zvw$CuxR~ccC=$8NCQ|9Y>X;&pQo}$0GfnpDAciJO9au6q(Mua!+dMV8QQgjq z6dSqiAE-=wJe}@6k&w$sRS&4b-xYGYH8tdQG!Q)}(K@W`M*(P`RS3lGw|(^0m}Y-* zLLrBkhhN{%(9G4dZO&CbjVFVh~E9X>zI!MS!xpAB6UTP}7 z+NiUW6EUYEfs}grHhnetbPqf;D+)XH`L@E$h1l)fwy)bkE;!SQbYcEQrkHuG2^*-c_WUG zZ3+qsq?Y326IPf- znnxe?!)j@q<+<*iR?P@*>6b%Ad8|3+^x$!tH7}ubRoy>X)osjSZePu~6DV*Mdyizi<58~XMeqgx5DvR8^Hha&3i#*#wU=}lw@! zP8B(MzK`AgG{3@M3Y?%le=6eI^`+^bL!sBK=sk8JaHO}_8k*OCf+I-wHO9}mJ#kHuI9ufEa`OMGI zlj&>~=%vzr&6s7V4hqY~1Y@lM_iXbN(v*cvVN2rvD4EV$0kg1dg^s5THCun8M-&vhX5y%;@U7) zmNZD7!hwbAF>cPQKTTu z0mt>v2X}Cku$lT#l%Sh6NkB~8Uu!aOPVIL|eFt276gWs8{rdGyE6coWosZ~cNA~{p zM!^;HI_58?9ikJ3fGaO+GRoH3b z)p#9soajCcOKK(o+PT#ln=k zX_w;Zs?#?F`$$8T4{W;Vwbm6CjXOzt3Sb9&&2xVUI9et7abJdqs=CkE61^j&AMHN9 z6=vb#DsosneEI7xBd3+TqX9K7#Z{HWu4kET(ekH*7BEOm3+C4q)ZM`AgJNpu5W67# zvH7~B&@(jpHB|E{KLH7&PI#(>Dkq@XcGl`Og0<{aS!#UmM2040gdf0FGGnA@Oxw|L z@)pCYb%M%|%2SAkAeID^uF^kdPxCXF@mnj`d+-0dx{?~cR~eoyzAnb?v>Qd~(fPE) zoTpM+V2ktfu{Gb#bBDQBs7UuPwur1XWCxUj73^X8NTK4<#S-_#a3*s#kG2U)F4`mlYrp8DYAlOKWVn<<+FAb zTseoR>N8#ylPubMV!i?;Jl8izHYg&krLz;UUXNgF2LC;kWnfm$r=FFRsqgzL_Uhbo z3Qix>@oCWV-OkZ-EqcdVNVWjc=4hC>frDWKVbXGvj?>>j6}fj4&CW;f!&gs;NP4ym zX0<#7l5R`ew@MH)1S_Q6xXAHM2%>44@ zHco1!HCvRtSYqj$3S1DLb4sbEP!?#eXa{Aj`g^v)Slp(j(t zL*F$=7vLFV$_~6P{!-}fqYfu{-}Z|;Za$!ULf_r*;r+JCGx;Ff*jDjbXDp(J6-}hQ z(HttyhHoUT0`&C{7PVwuv|ush;mL9|)FI^zeB*VN6M;;5ABY@7rruMFY5r8sM@ru( zHm{&rWfEzS-rVA*K`@qhK5h_4B#LPIy4OdLoy~)w@22l0Wii$Vl#1Ti-5fDCWZ~0y ztbp4$6f;e28MfeLph5Gyj0l<6H6#}J9RMWOYwnJh&?t)2Kito5dA8DS;TU)DzwgEA|u39)j7E13a-y+NPLN zT#e;6aGwmHjYzRtEVFX_je806o+>~j47TFJnHGFrYl{M-^_*txa%_@zg%tg%Kp zZYZuFt{|#hliguD1Zg&R)SHjkqO#{+pU2g+2Nf|@J z7DS=f3!7s>cPvdyCG2XOLSW}1dz9kd?a*`*Wrd|b5^T2Nd=K6oqtk;LxQx!d{Gl$ObR$?f8H zTCl58AJ&1zg3e=AA_LLMvR?!IQaODp+DV=*AeahKrzWRj=yjTgf8?p2yESzQwKw6-UveZWhIlRQ8ZE+dvRA>@OfO;bS+=VSgfHy0z~}~| zn9L_*FMNM3I(R2go>B`JRUe!2Hu3JXRO_j4l|}Do<-k{!(Dr1A%<(F50%<^V)--*U z(nHK@#JQX_ii-cYGB!hCisEGhv}S73ZH zt-)MWF=}>hvp$87jPT?+;a*@MTFvd7DgnCQTt}>iU$Jp|s}xC!g%o?IFvlxic&PDL zadFA9n-Xat+Q5xnay<%V_ysq}TNRma36GHXqgDqQPIz$?_hUvwxM4t81=1=NkrS>a zRjE)%=%ms(xJ8n%uTaHtO4OhTt0S83SxnecfxWo%e7Nxsi09wu;pF`=Ra7u6(k@kY zvSx#&BIrfA7>}Is+ehRj^+c${(;)I7*lJHrq4USWd||e_>)w~zT;yHMZHo2o&52fV ztc1{(dxg}&inj_wuX#pDw9sZ*GFYxfMUhf|daI`(PJUS5(ylhmp0QtC1bmYcGl_Q$ z{8|u2PO0ie&)YDyP_`uNc(kuf$mkE!5ivr)3NXa_mD6bArVT5^-t;_6*~zP47MV(gMOwJwKZ)7v>OocjJ%UV3&8YJJ#^khIY?`kB0yT4>Lde0j+KCP^fq~zv<0(>FG+Q)CL!+HhZA?76en$mu4P!Y^7N!PuC7aUuVJE0HJ=otUr_uXtX-sgKDAJ1eD&K>53Xm-prr&ZP`K=P&V;8b(-vp%fdsvliL zw0LZqRS7&mM2l#Gvp~d5l_Z~j>7t?o7A!xZ;Q(=kz0m#k)L(u7uib;CUL}^|GYN8* z+J!{VQx@04)cVI@@(eQuxJz1=Nm%_>fk_9UF+a8UQ^%**XC?}>ix4&5OmF3AlAM^n z&R-s|ot;~pFDF%ecW1D~KX~{tcl5tJWKi6|$C6x~vixgWae;$(NC!8v!9(YT%9j3( zOuwqp1*CR#);8ZmE6c^pt=ihpyge+jlbJE6^=fafj$NSkbbLJFcFfruz8zONb$3h{ zNU^WxFn(|UjdJ|L_kBmhGp}Gr=2w#gW^|3ID0&YUhv>mBzXi;QPQ)1D<6#uu{Ju5+ zi(%u`pJxA{HmYD}W$_N>akIWy1MOlY0A{@+-Y(a_peEIipb~zh+jZlwm>O9M;^yYmi%Uz&nV!ff zue?yixGF4S9w1{Ju>v0oZvzy$z)PK6WRq(kx+P_xawH0Vo8yi!sX`&L)RK$FXBpdq zPr0075BsrLV)$hFb4Fq|0M0P-fdKVq4D!xeMBKmthuz>(!MHQco7e{-13X2keN=Y+ zS?(GS;+Vpr0_S{zY8Tx>QuqkC&Bl+VC|9jgcP*fL@(0yhcjinWl=7S;eLj*?7WwmD zdX;_8uV<0wR9maS1?K8#co^Bv^z7_`^q$fp-k)*<X2Eo7*4o#a))Zy z>7D0(S*RD8ji$aG+xXGd1IJ4eQK2zC`?LVV9iHkc7Cv;0wXLbPbx{a_6MPrZJ%)ZT zC%l2(n*C)N=#0_T6^ic71|hF9iN7td5DAl`FmT-9+k9D1*kc+*p|%RAzdrm(5J#L6 zy}O}o>FQWhh#;*fJIT0MWg&VOUAI8u4ta|)#PSIzHe|$skk=VHRB=_@D8(Qil8j7e zsCpKOf|>u#RcQy$(UT)b9--BwxeN8?X*S38S+~!2Lk5ECaHvvhivQ3dZ|@pUFtBS6 zJ#Cik=WNDzNx$5Ksy=0VzDxx!0o?bZE0K?20xBWTy8x9h!*MSfy#mn#!*;+K>K+G@ zDGZEn+UEF2wV>kDyyk(KnEvKKtusG7?B{yX=h~BkH6fmpx) z1xnK4W>>X-!qI|#UpeCzsU^ups@Vkx7S*sP(i8jIFgnwVkM#C?Yn8FHZI^>;er^tU=->F4V@DiP%na(GDj~8h^-YwenW?8C?J(8GI?fcOVl)HB$Iy_M2Y9iI0 z7zI%=*Q_4#LPU4t7&|KA@n&WlNunJ1AklxFmj(p*Gh$xLBIH7r-1Xc|<0;f~P zwgz8pQ`-h%ZX+JS(BT(GOA`2AhYk#Z>0>q9DGsYx)EH&2vHMn&oiVr>j*hPbWndqY z8OFkQ46U$S1GCMBg%VB=jI=MjQ#d60#7$!W)>`>`GnMK>m^ zuO+L^ffWeh5!Y3d#zD|X0OgnwWK&Rw;HC&ex<12`$+I09>`EL)LnP*A2^p}wyJ228 zzwu**x`YHzTz$yJ-R2@`(QD2eDzj-#glKjigGB1X4KaUU^_KU#*}}*pv@9o4->+d@ z^!42^#gtPqv*J75T;an}(q@mdo-`-i5^r2^8>j)aXoaA88*g@NY!t)RAOSG;R3*z2 z;VA{8xHW!>`lZ#*gXfkrpGS9!u{>wfe~MY`uxu~XP2fDG6-(3<1jkk_)B|qHBlTfk zv>v5QStg)~r}d3nWcmcvd~V#f;s_{fysEDg6;9mKB!}I1Yjp6#i0Qwgol-{6M3ntr z4ozIba2iSVetj^3tmlf17Cx9WQ>T;IR}(QepTm)$5KREsL13vp35;AJHcefQ5@n02aO_(BMrQ#6!s+oLkC_`tv1#P1vvwWT zdS4OM<6q-hSbwzD$F#Cqn*1nQdQh1lb|zO8!h4C~FMC`=Uw{`lll>9`=AQ^5Y7XB;N%HXna}`SB)v!-_mMiR@Mpm4*h6z zQo~n)^g(7#6Krzhk+WgULxfB#$qH^B$j>GJb~A5W&U@DZVv1g&o@$|S44Hb`i)98Q z7P&6Vk+z(Ojt;5Ho)iEkyDn|_#8CB z$=$493=j=cUQ7Xlpc=e(@aTfA@nIx6(Fv4_6SUK$fKt@8MPE#&IG%6i*YW$;@RP%3 zeI$>e>yDo@D5DuXN0$B_w&;Kg%-5V7D7l%qubbaoNH&_(x={x0y`x;3B)d)|@qPkG z!CGdd(o)b*M>}s0;pk?{aSA*Zok?{SiJyis(R7tI9M#-w)Kc2>mPYw5uhu|x-Ad0$ zNXdBvYi{GD7YodHeS`NK_&eb>L+eU{A$YiMx-2)S7ryXgyR1;KsD-Xi=g9Spd{%I9 zbqxswP!ML$lNJb50P)0In{lD&szqyVU5{gJ^RSVLAMJl^W=*1T>83w$1r+q~)f@?v zx9$jVH<-L*+Aa|f!YbPwH(oldbGJP1d)CjWS+;|>v27xwY(h-mz#*ib?WSC_>*vpR!^w-r4d!TlM|b zf!V9v@e_2$6WR~Ze8)vyt5@vVyDm}zwv1*tle*w6*Uw`e!paNV;vIWa` z`TENev}Q=-)t5geEgY>a*kVpeFCr|l(5u4@G+nUTZC%NFo(6TjhQt{ReIY*=sqgc$ zZJ66b@x@-zFuA`O_@#?xpDgNV4S=f#7OG$XQ@HoHqI2(DbtV(Oe%rV8`V@~-YD>qD za^5v&GR~TN*kx2r#hq-GHbyAETIr*8;0Y6*&mhBm6A4|ZW4FSeAz$g|fy>F(NZz## zG&zYY!=wAbG*86su|wWI?@ksS!IiumG%BY^nf`vWe=1T*XpGHs^ImHDbSjVKfx*U? zpTKL2pyZwd?((L81DbV>Ga{f3BK2aJQOW`%qEOWR+^pGPFyRZrr0(~}TFS7pCu=Qs zYXX%K6I*>heGo+RDNjs_ilK$~jqSiGh4j=*Xa$m2)BU=f72+W=jM3?(DvQ7cEypaO zntOAo7;^#ARQrkp+0$|ImQsK;2$JTtwt$niuym1FEc3kU*pPSAwQs_@$qqp*|F_~w z@`ViCZVJlL%Pi%y#Q5X;ImsQFeCqA$B1!+89KQfR0qjWPJ~#Yj3B zlSlo1KU@}^n=k+Xz(hiDgV|ah;tLF1t1eTxnC6%Ow+}x_@pQUTF8lY^;&X$82>S6y zN=tM$hWC?4Kfrd`+?NGQl%9-=HNK5(qGgFRerQrtTLA;t2zaGY$sk0nt>akAiy{;s zD3rFacb(+Zhyo)gm@cRd1)qAB`?%v)B~Ole3$dLp>O82GxYWX<0`Lzwg*^`Bo2$P_ z8tYS6wT^X_trVq60A1m899%BFAkMnbb3RqN7_wV3R&={{kQGIO?z?h%|`H1p-Xoov&s?Vy=I z6N_jyT{^2%NWwG}cOqVMD+`w7B`Vol?|(e6~RNshO%?dY0At!wkQ{ zX9gxPuXLW5JQ)KP=!I95bbY;eA(bkF`~Ksc_e}H*1_u^ZO!{N_ERJuqkDqA zrfF_0xV*@&>fBJsy5-JxAN{DdzcfM2vu3%ZealkG5WG1eAJ&_v1YQWN@Tvd7RT{ea zO16qc3)}rHRD9%UP^*Rs6?=Ba1H?=&1B~ve-T+!9PGJ>-X8=RxqNWW7t ztonAJFI@#!W7F~%tNwjR?q8}g@j{!I-I-*T9eHCf^D>@D1Co@+_r;(#j#{By%-&iH zUxFzRR5?lvpHf}?qkAJNpu)>^siIa?tvym^tD&?#Y!*=*O1%fL^ou#CR~@PG@36jG z)*UqB?rdLs*2&HqgKYb7FH6BHlJG^z9k32M_--@XWKqP;BRR10vQt^;e(CL-MxCjJ zNwbW>z!pEB+pbS!TCQD#7i#W376|>+MGSf^HHA0W>rKvlWqroUC}d7y`7z~s2tb9- z{pl7b(_IjN{}T%Hij<7*bx%g29^D(^anVydRE*4Qh~SM3$UC#geN_H~xUV=JA=#2k z%iu|C-+S$4^cS4>Zif0irkmNv8YuOhM)v|&nyBt&uXyz%ea|3p;flb7Tj9NAVXKc{ zq&E%y+Ywjv0b>pjxQ*GuC>v?>v1H1Pjq%|r$16T1tKYdE{sZMHA=OaO>~mc!iXOfO z1E$haG{3n&aJF}|?3ME~^6>dcS}jFaiM-Y%Y~CY_Ad}B`H1nU~SeTiWM0*!AcR~gI1G@GEpVF~V1%qCUXswpCEBKsYZ_|djQd@Je6B%vl;f2zj+yUn zo`6#9&RH>Hhw;5J5&A4ax&dr)J63VxrSf;Swx6oFb&#T*dj+eL3eC#oG6&`rMzu5Z z6LRi%+~7YW*{`U$mNb1V zpuOc*$tce@*`d&|@r@aqM(_x#W^t{tasFN?75R+_lxU!S@yx-qdMoyXAGvwJDpmnd zk*W{}1H(>)lFD5=SPNTvzV)9t3zf#K5fpBgmC7f3ruVAd2byv30niSQSonN$XiH(% z&IN?1_-_IA{&_V}R41xM}C2#+*-O5K+=qc9YZB@UEIgV{DK49_>p< zy~t=|rWDSU1NERn+!}s)_^%s0?{2#Y?Jnc>lM6Pgltz2aAAfcP@fN=+9b^i9g_vxA zjuUJ0X(Oa>27`rk?Ffz_m)_*mKBTCriw(VfjrD++KoT(>Ti{_Qp2Zb6{wXA5es>j{ zHt?`dGq7T?P|7^bc8=H#;*WJejsr`n*Bo5HLgz=3cF#UI*7h4QPnofwT&DCY?iAtq z^V{w3wwmYI$M6-g9hU#q5$b~J{xnEUbG$;%-U|(N;aaj;By_1Re7orOO(d$Hri-cv z2k46nX}lg0Pi~A)NDfxGweNZFgDC}mM(-yC&t&-5$+3)#V|u{be=OBsFrS#CZBwWY zgyl=hcAolmJ^!%hi~kACl(%cYT(1v(+AEAK`q?%SY2z5lw9c138g^D}K<-gO?DWpta@0xiM!MwKlPiG`IXr7ka{v7P=?yBT*#Q+@>F|BaZMTco1 zcTfc}DR2vPdX>{?;%S1U9|-{nwYpDe-$-BugSq>`%I+-1?s${td~qE*-MLDPDhcV4?H0xGta}N7UIGVZi7YV{$#8c4XbXz@}%8xhvK^5-D*T5oIA=rc5 zNBE=#34o=LyTs!hnS317?MG-hxb14+Hi@1$kSR^6=!jz=m%4ZiFK znJ~S$E16e%CNp(#hXHA!X;rzbhz1&+&H9TG#`U=^%C!st(=k74h+igxZ3CBIXzn-r zzC_l8+v<&lL7CbKS)Zd#!!^I#XrHQsHgTyQ`HIRRQ?((Jl82i49$MOpXbimk$yzO@ z7+9cgsVz5uP2;JW5-;mh7f*$<*5rHfQmYLEhZYw@t8J!hkFS5)GKpE#a9ZA-`N)-E zf!3v~))3P~i8@=p@Rs>hb%|6;{+s&h5_-EWOioRAykgr+)@|^i%|Eb|I&5P`<$%vg z5ks=gzqv{|)K79HRMdAr&mu17SXR!zOzX`*lr5<8Fa|suoNR-~CYcVYQu%T7os!cn(Ir~VUWYpK z?KTrF_S&YY#jYHcS(SF=vnQI)6U#abFK#4iIBZ-zJ{^7};#$i!_}F}<+c>RR$H#(} zZ@@Sy;nT^f#X!PI8ySuVB+K%%#y@7YsW8+et=@Xlg@5K@)UP7CCt5;JKMss*_{gla ze@h92d z|NIXv$3G^>kpEnezKR_RtW~&j?Pc%SXCAWTBexj5A96`#* zAHLTqWL)p2Nw|5(S*VLt+`hYym$RwpTC7QUWOVS`(Mabf!?M*N z3f_tw-Lf|yP6;%&nJPaKnCDCz2e;#t@fL!Q5={Z`_V5x<`d!|>pZ5$_!L#s=Z6>GM z1X01QLIeFT(@|IyI!&W0R3fu-=BJQ=_sR7XzIX|4Nltp*$!nZO-Zyth z+@najnxZE2K&TuNQh4va!VUNy>pgm9or9?q$AYgwJrA+`Qm(WU%b3X{-xZSp6^Buy zT<={~mJU^W6Mt~k#Y=S)$ZWuENwkZ_XVgh51N%E?Xr z5>$FIbIBIKFi0Jco%#0kkYiCv=klX6P#(rZ0~kVU(Gz6g%u#yMn&7l;8)68_rOyv!_zTztkWlbzL9DH6v@2b1 z{T>hlQQL^-v7agDahb$R141VNW94CG#q_b(kFeD&GWyCisb-OcOOh*BaL6fEUVyqb2p7tcTI8<#3rkmoZ|pft)9Lfmd~2eU;2P2k+v>M8CaMh z+;Fpp|I-`Og_uhzEVb>X0*bUUlQvx?bjLRmBf&tumjw`ln?YuF%u&6Tui-pon^D5w zZ47M?W=2=(>pHPGdast=t~3-mDJPHJdz1j2r-F`MH+jzXImvreDD9U+uXtgq@6#&d z{5oiCH-Oq)MeJn~<>-?_s1z2E!W^%m|HxpXGQ#kQ;N0{FS=m$xdoOuE@<_cQwU0Dl zbG}E0hKVK@&RowGCN?yohCx~=&sxdfSNA7vqQtHFF)9p_+F_$-l*|1;UM zx3h;}^t;~n>TVQS%cZvC(Bexp?-z$6Jri(Y>vf@@BNf1@)jzNy*sN_roR|C0kYc(d zle>4Cp5+?;I2Jwda}7Un&w=$xL5=;Np^sXd=s=+dno-2Q(@)s?JRgG@Ife545!&dE zI*?TJ_+` zDr0HIYk-nm{!`7CaV=R%4+vzmBr0h_2va2KSE@f(4v~g_z8g^VbNu1sl8U4KffCoL zbhS^c(U8D~ly&}w{66KE!x>D7M#{>F{M!yQv9oS&l!HqW&=h~SUJtJjRki*N0Z-PB zv-V0!Q)SVHdXqXzN^H6CC^==;uMKk(CWopBpp!|e9$(=D=?;KQAh|#Zc64@c_3ecj zrrDtgIX74@BuUD)IRVfv{am{#xxMCDrk~;8mLZ8lG0RCi^7W?v2*JXCXWfT4DU=XTd@VxC)-4TqY<3X}<^+&zRE3Tg;l#vS2y zeNG>b8$i3Gd9e++R_&WvIDzm1*O&x^3hmA;sfQ&+q@?_^&$l{1{ z3-azpnSrxAsC%mbc$CXJ$ADrdPSU4JcQ()ebDlX*&tIURfp_zVz4WF_$5< zO01s4GPastj0_nR5AVKlg0k6^p3K~}d9Ir{zIVChc8-Ay=yQ}%J@VYjxi|-IP^U|b zfE>QAC7wyIx77uT;1{4@nsHq%+f2C|#5y&Wrcbe1W0V^Q6|(1bPH_Sa&5GVPcJ^A{ z4%7XId=PKIRu3_&*SM+|k*~i!xGpSQ(#)ePV{+w7EfX%fPNa=4W#&m~|CrZDpv!4R z0D7!liouCba634W#p9GRnzJEgRRG$CSlZ>dA>RbUD(MCxSWRucKYO!^@;i$jb-Y$= zMTSQ(fp~?#)W5Z;rxAXpYn&Qxqh`>!m&xU@CW6$lK4q6b{n%8sin}0=M!Oexh*T?vak*Ni$i?@SUYgvnN`ZlP44c>fXpH0gB!Ll41Ba&YYMk9{DzkGr zpd}o&crq$TnzqAV9o?IuV^q*AZGhqH23IVrv59r{e6Oire1y9V_vx|%gLj^QzSDS_ zgOR8kX7wNqapETVnAO<9w01yF8C7gCVs<+xS`_fnawKl1_4d^EI;tRT168nY;mcpB zmsvnL7t6Bc4p^AuS)G(9=`}W$E>ReTa$0&idK>GmW<=@#G_>_gyYGJfqsqeiXNhr# z{8!4xoQU_gSEphHoDmeFBW0CE%B4)=CT5n^E#psmc-PdFMIV>t54kfm>Aw-fgab{h z$TNnW{HjJ~tzs)=+S{LIjEiF>oIA=_Gx`~Gem!%hB2UgrD6$9=nhuo=W0limz`%h| zAf0ix2XWV6qk}$>Lp&|coJyYQZJH3?KSyL#5gn@Y&Q{K>^>p6vQYI%0oSKa6-bpY6 zXcJwqUUSj>d!X@I%UzHrkjC>aNGZDV>)L|qEI3o><~khPPU}QE%`%E?#Au@5n1cUK?dvMhQ?omDYh+l#>6?B zs0R@jFvvPmp>i)q6`EXM*5vgxTmA}m18b;ckw5MMbgYa-`di0ISgdqAO}V@YRuA9U z9q^0{#ulfpO(o}6b$3eX&NZ@9bTETtrc`SA$Cri@_UPzS(2p3Jb8j(4rEy3jybyh3 z1TB*Lvq2=++y~*$nQc02yDM2hK?$iP1d4um-{qkd*IF__Oz;?vLk<@(`yW$0p6JcpMcB~3y9jU!HLKo5Emi!`qH=$euLCpkeZs0~O zH#|gCR~+#$)N91?NsJcmGu7U{Q>S@7uH>G)Hm|if%0mz`V@o}!ssZh>kDE6w=B#+C z88;p+Ct33lT6>dnPLFbKYE=6`p8tOfhh+gpegj zQ1J6{zhBtht8hNJu8$$mH=}rq1vx0LxEDD;Q6wXKi`h58keg)qDDBQoB_3kP=Wk=~ zj2@lkf1yZ922Qu$1$7O`aTISA-O!E0KalT%1;Al>xyDNB@1y30@2g)P5Oo0<1r?VG zZF>)p)`fTDMk&R0pPI{XtW%Q%hm&)S*3MIF)&NjLP(12$&u5S7HZK|c)s!Fwp!q>T zIb?n0YpkE~0|f;QHl-%iOX6&0*j0-SAF!MG!L88Njm zUHR@)&y=>bpwChYV3t@p>catggtD&uR@d)(=k@xw`}sD9)X8SufrC}myu}p(elO#s zVM_nVdZt>FCfEW5yp~{wOUBkcY?I`aF~=LW5iT5Q?dblU_8(onEy!Ns(s}z z>!^9ORVn2-nBM6pVJjWpw#0^>{hhakbnU=sPzk0FgX>N_x*(# z<*(Na#XKe7{7`c20l~u1xu}i=$N+&#awfIBim&7cL4ddTc8QM+e%>Q)1ZwKmP4yMF zkg6Xe#Nq5|Y@pV9pD$t(U;_CJI;_)jaAYWV>zr1ctmyV(TppHZ#4Ab8?%JE)68(rO z8JI{)F&!^4MZov6RN2l2kjii>-;nWET(BoJK;5Gj{$5zpT9`4N(r2P{;nsH2am#ioH;A)A9cEXD zZILKg$C-&r;6b@pK{cf|7YDe%&db;1f@m@9n1;N-0rhXRq{Y zG2L}gJ0&HhU}3SfkCaIFf<#AV?%2%Q6Sc;N1|6_S@BQa%ArnvX2iTPAX z&O0SZW7Rn6>Vdf7C2S5s;O&mq z;mpf7?*XqtX7LlBqa)9<-;{-u7|>NIFIPE10sAQemJ;E3=hUv*_kkFN+7DT%uu zBqS8Y1)&cNM!0GxuTEz?hcu1_>c$YtYf81b8#{i5livzxDCvFg)H%%tv~K?%!bD** zrQkx#V5qO1?Op4g;((yMIZtr6Sy$f2mIyv~41vx^6iLpGRXm0JuDDTe5lSHjbZ6@46QmSbHya=Uy9FW=^xO%j;OJT;-x}4dt z?B>(w)Zw=M`ntv2X%p%4zE1EtTD~uv7RQl0MIDm11{2-s`zVfAQmWIN@!gonf6E>x zIMxyJ>jN=X#t4BskM&1;d<&8P?iks-e}#-JQX%vM>d|2*0(U`iTEG^~R(Sp~8v4^a zQQQLM;L)hR-NBt^E7I|}iQ^m7QR5L7w17heRL$+7;JA;Qhg}{)4y>%6UI%bm5#NQ? zwCy0`!fGavtfCbevVw$rAjta$h!w9+TWZ@7#1p@YSBKVMeKd<8;+0e4)) zFpo-0h1wne4$0F7{~*D^mV=P}-RLI@go2;oEyXqu5k(?uVIGb=6m3CMH{~>>9aJGd z9w02`6)Z2;PpUb1Z&c%BnWfC0g9wz0{kewk-}hK+7h&Vc$KG$ovBuYu)zGYF_9T6 zaS-H$UpU=!J?WMFRVCi=15It^G4>{ejErn7z(mDs02tF!=MCdVTf=|HTtyyc?J5%l z%qNH3&BO)KOp)n}M9-=mpq1T^rQm|qcf*YTVedT`#+!ayZ1rZXrq2wMiT7XyQc+qt zj0OKq*JnzFnrxBd&w@ged0n3DJHztvC9=1(s+db;Rd@cF3*GmXsmWgT{9)ss6fKDC zt>E8cQ1fZ@3YnGI9~}~@`+=QoF>3dWq)yzq@ML7qWB%+!UeZIZk$rple@GfFLn1i) zbAJ668QCk3KhG~QJ8io}Mph+E;){mCEmxY1?0dt3K7~AKoXEa&P?Ii`j^GFqf21Rq zlhmJd-HG&aq~ka9e>eXbhyNay|6jyGjL%t_lF*r4vtg$o2 z4?s6HyP!U9h8keem-9MiXsqbk2qJM9V=a zT4-i>{1V&9jz)5}5bI>9f|>gT`*`P)^tvL;-;<~Nu5?uSWvv0BeXee6U?j$SIT%Dr zk$S=?eI14_Jiw&A_5gnPY2Et?Q(LoXR?yD#XXbr1`DXAE5};6N1_|fY9TB=Wpv=hn znx7oS42xCXsl>C(2ezo$MkmB>$1BFLBH||LL8M-@vJ3a{QcRElk7gy3CL(*G{W@$E zVf6vkuzHoGRmk27_uNwU@}ULIq_UEf4;fkGZ4wj1Y8Y!vPny3882%Rm+@{K2u0U_J z`U~ro8widfDYNa|m%TtIc!nS>RHDZl(;Vo{zp{on54!(t*E@8GMBoqq&~LPq5NXNQ z674H60YL#{Z`VeVqP4OLu$EGEN9oQT4o~YVNNWmT;P~v&l4Lw=_9l$iJj%IEF%K`1 zxsxmeUA;P~$S_?$jP5-=rds3LrH|=tAwK;Vo8JhKrV{fYdEn_($a!@~vl7A|H+BUP zQo-RFq|W4KwIv)_BgIhfY+2*UmgW_m#h?@FRm~o{nmm7>Nmwe?%O)VVoR^>sUqdt^ zQZw_eAUvmrTLU(U$V0bv59*DiaZX(eEB)$`^;JOYlRmd)+#cLC)bq8p{AktWmTN=& zNcD}rhQX?Z(EWc6HTQjGIJV+!f^YT3y)-1>BSq0ZO5WYf%lOnYA)soV91dnowoMXw8|g z(r77-Fh2q3FQXq!7PE%aGL3d(utT367w%SPT%?HmO%T3SoGlE$el?Q6Kx8XZD9zkH zPWg;*lJFYTzna$8=Y^AXtQueb^`Bx8Yjy(`C7L@?c@6I3E%U?>jjZzU%9{F0uH;;( zx1)IaHN<~V_@ouVK8bkk_vPlC*zD#}Kfw@oJV}LovtQZbcDStNYz-iJ+wl7{aOdyS zQ|521PCWykX;8FCG6UPNPK1|&_|)6LFMx&ULrhMwUMXVDF2vJ--aj)azL53ZR?^90 z*UUk=1~q1kPtnNeK_T(8ILI5GebOJ>v;kp?EAtj|AFIz>tAIDG$F&|z>p(onsQ*6{50IlNAUkPPP=qd0a3ewTBOT~8d*gE?M`HuT$?4_6d&}5*l&C@2d=~OC zBErJ&C@p>?@z8KeQMx+n1HJ5XvAkcuMA%RrDoq{1dMXq2SRHv1O!7FH%4xdX%iFY4 zGuIiNXMeD?~HngcZIj-pR&IJl84zM&@#O3 z&HCsI1RH2IsY})yADM$VmTq~yu9O0d8VXbi$x=932>>0`c$^To^(XJv=1ONxAcN2V zb@+Qm6_{-Oy6HI*r@x6rhZJ#ZgcNIdorum8_5%I%HBc(YmFF>B|9(YPjCo#4tG2X_ zd0>2wu@9E~{P)_q085UkHTJdq>lr=yy`^#x4$9|yu1~P4V}#TY~S3C zUIxEA2^X#%>~lvswjT6zH*Jb~p^C#ghz&rQqZX?66E|?8X*sIqK3mZ4TYvP$*PPH* z6Si5OkDjxqmJLIq&h01l+rf*HP+xN)suWC(Wk|*54!Zie2ir9dwrbdM&Qf%cZ-1j4 zte<0O>7SGKU}r3|La`F3D4VzN%apBU2Z#&iA4X`zGPt1$@+S|AEpM%d7G!!gI#?yo zf|VQD1NY%LanD_m>=> zJmHuw#8ptj_;Nr-Q10zU1F+wV>c$<#ar#Xedpoio0Tq;{UELV_?o^seb<04JCC zaqRlW`(`UfV(ac4tx@`$&3%n-r!cwt^=6d;&s#1EcTMM-1MuIg*yfM-4;eTDEOtT? zi?=t(DG&3!734~?sTE4&$6MT~QjM7p8`f)Lrf*C@i$*4>_rtWPwrZ$>*{5Uo}+ows`)qho~#&&qk`YKjop$F+W zu^szW?d-$>`K^sO{4aYaHvPIhNA%PvLf~IaDPcTBly~O6!~U3v-&0A`tEu@q%x&;r zU+4pBjSF8T{4a^60cA#ywl@B638=qzs1tEab?N8gv9FG%wf4-?7c~vk9V7)D94(p% zeGP%MowHdrn{NvA=>E2{1Qtq4JSOCFb4;zgb4GYL=a&rk4yKEXjgh0xwis~wM6se` zLUoX$*Qj;w6!(DtY#XuFY0tOHb;WX@1jj1+OHxdG-Z;Y+39Vj0}M%?d0f4Ok}+c=|1TI)(=Dx09Sh*?w**=r~ z>Bj10xH+jP0ok;Wy?TJrwkfUi>TI(4ck5W z0o&;Z!*lj${^!$Nq41DbJDfXZLu>vsUTIfE9~E9)(|4m3M1VD&|J® Blazor Extension](https://blazor.syncfusion.com/documentation/visual-studio-integration/template-studio). +Create a **Blazor Web App** using Visual Studio 2022 via [Microsoft Templates](https://learn.microsoft.com/en-us/aspnet/core/blazor/tooling?view=aspnetcore-10.0&pivots=vs) or the [Syncfusion® Blazor Extension](https://blazor.syncfusion.com/documentation/visual-studio-integration/template-studio). -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=vs) while creating a Blazor Web Application. +Configure the appropriate [Interactive render mode](https://learn.microsoft.com/en-us/aspnet/core/blazor/components/render-modes?view=aspnetcore-10.0#render-modes) and [Interactivity location](https://learn.microsoft.com/en-us/aspnet/core/blazor/tooling?view=aspnetcore-10.0&pivots=vs) while creating a Blazor Web App. + +![Create Blazor Web App](images/blazor-create-web-app.png) ## Install Syncfusion® Blazor SmithChart NuGet in the App -To add **Blazor Smith Chart** 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.SmithChart](https://www.nuget.org/packages/Syncfusion.Blazor.SmithChart). +To add the **Blazor Smith Chart** component in the app, open the NuGet package manager in Visual Studio (*Tools → NuGet Package Manager → Manage NuGet Packages for Solution*), then search and install [Syncfusion.Blazor.SmithChart](https://www.nuget.org/packages/Syncfusion.Blazor.SmithChart). -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 using the `WebAssembly or Auto` render modes in the Blazor Web App, install Syncfusion® Blazor component NuGet packages 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" %} @@ -41,7 +43,7 @@ Install-Package Syncfusion.Blazor.SmithChart -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 in [nuget.org](https://www.nuget.org/packages?q=syncfusion.blazor). Refer to the [NuGet packages](https://blazor.syncfusion.com/documentation/nuget-packages) topic for the available NuGet packages list with component details. {% endtabcontent %} @@ -53,11 +55,11 @@ N> Syncfusion® Blazor components are availa ## 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). +Create a **Blazor Web App** using Visual Studio Code via [Microsoft Templates](https://learn.microsoft.com/en-us/aspnet/core/blazor/tooling?view=aspnetcore-10.0&pivots=vsc) or the [Syncfusion® Blazor Extension](https://blazor.syncfusion.com/documentation/visual-studio-code-integration/create-project). -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=vsc) while creating a Blazor Web Application. +Configure the appropriate interactive render mode and interactivity location when setting up a Blazor Web App. For detailed information, 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, use the following commands. {% tabs %} {% highlight c# tabtitle="Blazor Web App" %} @@ -69,11 +71,9 @@ cd BlazorWebApp.Client {% endhighlight %} {% endtabs %} -N> For more information on creating a **Blazor Web App** with various interactive modes and locations, refer to this [link](https://blazor.syncfusion.com/documentation/getting-started/blazor-web-app?tabcontent=visual-studio-code#render-interactive-modes). - ## Install Syncfusion® Blazor SmithChart 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 using the `WebAssembly` or `Auto` render modes in the Blazor Web App, install Syncfusion® Blazor component 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. @@ -90,20 +90,68 @@ dotnet restore {% 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 in [nuget.org](https://www.nuget.org/packages?q=syncfusion.blazor). Refer to the [NuGet packages](https://blazor.syncfusion.com/documentation/nuget-packages) topic for the available NuGet packages list with component details. {% endtabcontent %} -{% endtabcontents %} +{% tabcontent .NET CLI %} -## Register Syncfusion® Blazor Service +## Prerequisites + +Latest version of the [.NET 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). + +{% tabs %} +{% highlight c# tabtitle=".NET CLI" %} + +dotnet --version + +{% endhighlight %} +{% endtabs %} + +## 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. + +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). -| Interactive Render Mode | Description | -| -- | -- | -| WebAssembly or Auto | Open **~/_Imports.razor** file from the client project.| -| Server | Open **~/_import.razor** file, which is located in the `Components` folder.| +For example, to create a Blazor Web App with the `Auto` interactive render mode, use the following commands: -Import the `Syncfusion.Blazor` and `Syncfusion.Blazor.Charts` namespace. +{% tabs %} +{% highlight c# tabtitle=".NET CLI" %} + +dotnet new blazor -o BlazorApp -int Auto +cd BlazorApp +cd BlazorApp.Client + +{% endhighlight %} +{% endtabs %} + +This command creates a new Blazor Web App and places it in a new directory called `BlazorApp` inside your current location. See the [Create a Blazor App](https://dotnet.microsoft.com/en-us/learn/aspnet/blazor-tutorial/create) and [dotnet new CLI command](https://learn.microsoft.com/en-us/aspnet/core/blazor/tooling?pivots=cli&view=aspnetcore-10.0) topics for more details. + +## Install Syncfusion® Blazor SmithChart NuGet in the App + +Here's an example of how to add **Blazor Smith Chart** component in the application using the following command in the command prompt (Windows) or terminal (Linux and macOS) to install a [Syncfusion.Blazor.SmithChart](https://www.nuget.org/packages/Syncfusion.Blazor.SmithChart/) 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. + +If using the `WebAssembly or Auto` render modes in the Blazor Web App, install Syncfusion® Blazor component NuGet packages in the client project. + +{% tabs %} +{% highlight c# tabtitle=".NET CLI" %} + +dotnet add package Syncfusion.Blazor.SmithChart --version {{ 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 the [NuGet packages](https://blazor.syncfusion.com/documentation/nuget-packages) topic for the available NuGet packages list with component details. + +{% endtabcontent %} + +{% endtabcontents %} + +## Add Import Namespaces + +Open the **~/_Imports.razor** file from the client project and import the `Syncfusion.Blazor` and `Syncfusion.Blazor.Charts` namespace. {% tabs %} {% highlight C# tabtitle="~/_Imports.razor" %} @@ -114,9 +162,11 @@ Import the `Syncfusion.Blazor` and `Syncfusion.Blazor.Charts` namespace. {% endhighlight %} {% endtabs %} -Now, register the Syncfusion® Blazor Service in the **~/Program.cs** file of your Blazor Web App. +## Register Syncfusion® Blazor Service + +Register the Syncfusion® Blazor Service in the **~/Program.cs** file of your Blazor Web App. -If the **Interactive Render Mode** is set to `WebAssembly` or `Auto`, you need to register the Syncfusion® Blazor service in both **~/Program.cs** files of your Blazor Web App. +If the **Interactive Render Mode** is set to `WebAssembly` or `Auto`, register the Syncfusion® Blazor service in the **~/Program.cs** files of the main `server` project and associated `.Client` project. {% tabs %} {% highlight c# tabtitle="Server(~/_Program.cs)" hl_lines="3 11" %} @@ -150,27 +200,6 @@ await builder.Build().RunAsync(); {% endhighlight %} {% endtabs %} -If the **Interactive Render Mode** is set to `Server`, your project will contain a single **~/Program.cs** file. So, you should register the Syncfusion® Blazor Service only in that **~/Program.cs** file. - -{% tabs %} -{% highlight c# tabtitle="~/_Program.cs" hl_lines="2 9" %} - -... -using Syncfusion.Blazor; - -var builder = WebApplication.CreateBuilder(args); - -// Add services to the container. -builder.Services.AddRazorComponents() - .AddInteractiveServerComponents(); -builder.Services.AddSyncfusionBlazor(); - -var app = builder.Build(); -.... - -{% endhighlight %} -{% endtabs %} - ## Add script resources The script can be accessed from NuGet through [Static Web Assets](https://blazor.syncfusion.com/documentation/appearance/themes#static-web-assets). Include the script reference at the end of the `` in the ~/Components/App.razor file as shown below: @@ -186,16 +215,15 @@ N> Check out the [Adding Script Reference](https://blazor.syncfusion.com/documen ## Add Syncfusion® Blazor Smith Chart component -Add the Syncfusion® Blazor Smith Chart component in the **~Pages/.razor** file. 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: +Add the Syncfusion® Blazor Smith Chart 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 top of the component, as follows: | Interactivity location | RenderMode | Code | | --- | --- | --- | | Per page/component | Auto | @rendermode InteractiveAuto | | | WebAssembly | @rendermode InteractiveWebAssembly | -| | Server | @rendermode InteractiveServer | | | None | --- | -N> If an **Interactivity Location** is set to `Global` and the **Render Mode** is set to `Auto` or `WebAssembly` or `Server`, the render mode is configured in the `App.razor` file by default. +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. {% tabs %} {% highlight razor %} @@ -286,7 +314,7 @@ The following sample demonstrates adding two series to Smith Chart in both ways. {% endhighlight %} {% endtabs %} -Press Ctrl+F5 (Windows) or +F5 (macOS) to launch the application. This will render the Syncfusion® Blazor Smith Chart component in your default web browser. +Press Ctrl+F5 (Windows) or +F5 (macOS) to launch the application. This will render the Syncfusion® Blazor Smith Chart component in the default web browser. {% previewsample "https://blazorplayground.syncfusion.com/embed/BjLzXCAtAueCOnlF?appbar=false&editor=false&result=true&errorlist=false&theme=bootstrap5" backgroundimage "[Blazor Smith Chart with Transmission Series](./images/blazor-smith-chart-series.png)" %} diff --git a/blazor/smith-chart/images/blazor-create-web-app.png b/blazor/smith-chart/images/blazor-create-web-app.png new file mode 100644 index 0000000000000000000000000000000000000000..7dd6e612d26e6d27fcd14ee412f030c69f0fc0db GIT binary patch literal 81283 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® Blazor Extension](https://blazor.syncfusion.com/documentation/visual-studio-integration/template-studio). +Create a **Blazor Web App** using Visual Studio 2022 via [Microsoft Templates](https://learn.microsoft.com/en-us/aspnet/core/blazor/tooling?view=aspnetcore-10.0&pivots=vs) or the [Syncfusion® Blazor Extension](https://blazor.syncfusion.com/documentation/visual-studio-integration/template-studio). -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. +Configure the appropriate [Interactive render mode](https://learn.microsoft.com/en-us/aspnet/core/blazor/components/render-modes?view=aspnetcore-10.0#render-modes) and [Interactivity location](https://learn.microsoft.com/en-us/aspnet/core/blazor/tooling?view=aspnetcore-10.0&pivots=vs) while creating a Blazor Web App. + +![Create Blazor Web App](images/blazor-create-web-app.png) ## Install Syncfusion® Blazor Sparkline NuGet in the App -To add **Blazor Sparkline** 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.Sparkline](https://www.nuget.org/packages/Syncfusion.Blazor.Sparkline). +To add the **Blazor Sparkline** component in the app, open the NuGet package manager in Visual Studio (*Tools → NuGet Package Manager → Manage NuGet Packages for Solution*), then search and install [Syncfusion.Blazor.Sparkline](https://www.nuget.org/packages/Syncfusion.Blazor.Sparkline). -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 using the `WebAssembly or Auto` render modes in the Blazor Web App, install Syncfusion® Blazor component NuGet packages 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" %} @@ -41,7 +43,7 @@ Install-Package Syncfusion.Blazor.Sparkline -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 in [nuget.org](https://www.nuget.org/packages?q=syncfusion.blazor). Refer to the [NuGet packages](https://blazor.syncfusion.com/documentation/nuget-packages) topic for the available NuGet packages list with component details. {% endtabcontent %} @@ -53,11 +55,11 @@ N> Syncfusion® Blazor components are availa ## 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). +Create a **Blazor Web App** using Visual Studio Code via [Microsoft Templates](https://learn.microsoft.com/en-us/aspnet/core/blazor/tooling?view=aspnetcore-10.0&pivots=vsc) or the [Syncfusion® Blazor Extension](https://blazor.syncfusion.com/documentation/visual-studio-code-integration/create-project). -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=vsc) while creating a Blazor Web Application. +Configure the appropriate interactive render mode and interactivity location when setting up a Blazor Web App. For detailed information, 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, use the following commands. {% tabs %} {% highlight c# tabtitle="Blazor Web App" %} @@ -69,11 +71,9 @@ cd BlazorWebApp.Client {% endhighlight %} {% endtabs %} -N> For more information on creating a **Blazor Web App** with various interactive modes and locations, refer to this [link](https://blazor.syncfusion.com/documentation/getting-started/blazor-web-app?tabcontent=visual-studio-code#render-interactive-modes). - ## Install Syncfusion® Blazor Sparkline 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 using the `WebAssembly` or `Auto` render modes in the Blazor Web App, install Syncfusion® Blazor component 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. @@ -90,20 +90,68 @@ dotnet restore {% 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 in [nuget.org](https://www.nuget.org/packages?q=syncfusion.blazor). Refer to the [NuGet packages](https://blazor.syncfusion.com/documentation/nuget-packages) topic for the available NuGet packages list with component details. {% endtabcontent %} -{% endtabcontents %} +{% tabcontent .NET CLI %} -## Register Syncfusion® Blazor Service +## Prerequisites + +Latest version of the [.NET 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). + +{% tabs %} +{% highlight c# tabtitle=".NET CLI" %} + +dotnet --version + +{% endhighlight %} +{% endtabs %} + +## 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. + +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). -| Interactive Render Mode | Description | -| -- | -- | -| WebAssembly or Auto | Open **~/_Imports.razor** file from the client project.| -| Server | Open **~/_import.razor** file, which is located in the `Components` folder.| +For example, to create a Blazor Web App with the `Auto` interactive render mode, use the following commands: -Import the `Syncfusion.Blazor` and `Syncfusion.Blazor.Charts` namespace. +{% tabs %} +{% highlight c# tabtitle=".NET CLI" %} + +dotnet new blazor -o BlazorApp -int Auto +cd BlazorApp +cd BlazorApp.Client + +{% endhighlight %} +{% endtabs %} + +This command creates a new Blazor Web App and places it in a new directory called `BlazorApp` inside your current location. See the [Create a Blazor App](https://dotnet.microsoft.com/en-us/learn/aspnet/blazor-tutorial/create) and [dotnet new CLI command](https://learn.microsoft.com/en-us/aspnet/core/blazor/tooling?pivots=cli&view=aspnetcore-10.0) topics for more details. + +## Install Syncfusion® Blazor Sparkline NuGet in the App + +Here's an example of how to add **Blazor Sparkline** component in the application using the following command in the command prompt (Windows) or terminal (Linux and macOS) to install a [Syncfusion.Blazor.Sparkline](https://www.nuget.org/packages/Syncfusion.Blazor.Sparkline/) 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. + +If using the `WebAssembly or Auto` render modes in the Blazor Web App, install Syncfusion® Blazor component NuGet packages in the client project. + +{% tabs %} +{% highlight c# tabtitle=".NET CLI" %} + +dotnet add package Syncfusion.Blazor.Sparkline --version {{ 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 the [NuGet packages](https://blazor.syncfusion.com/documentation/nuget-packages) topic for the available NuGet packages list with component details. + +{% endtabcontent %} + +{% endtabcontents %} + +## Add Import Namespaces + +Open the **~/_Imports.razor** file from the client project and import the `Syncfusion.Blazor` and `Syncfusion.Blazor.Charts` namespace. {% tabs %} {% highlight C# tabtitle="~/_Imports.razor" %} @@ -114,9 +162,11 @@ Import the `Syncfusion.Blazor` and `Syncfusion.Blazor.Charts` namespace. {% endhighlight %} {% endtabs %} -Now, register the Syncfusion® Blazor Service in the **~/Program.cs** file of your Blazor Web App. +## Register Syncfusion® Blazor Service + +Register the Syncfusion® Blazor Service in the **~/Program.cs** file of your Blazor Web App. -If the **Interactive Render Mode** is set to `WebAssembly` or `Auto`, you need to register the Syncfusion® Blazor service in both **~/Program.cs** files of your Blazor Web App. +If the **Interactive Render Mode** is set to `WebAssembly` or `Auto`, register the Syncfusion® Blazor service in the **~/Program.cs** files of the main `server` project and associated `.Client` project. {% tabs %} {% highlight c# tabtitle="Server(~/_Program.cs)" hl_lines="3 11" %} @@ -150,27 +200,6 @@ await builder.Build().RunAsync(); {% endhighlight %} {% endtabs %} -If the **Interactive Render Mode** is set to `Server`, your project will contain a single **~/Program.cs** file. So, you should register the Syncfusion® Blazor Service only in that **~/Program.cs** file. - -{% tabs %} -{% highlight c# tabtitle="~/_Program.cs" hl_lines="2 9" %} - -... -using Syncfusion.Blazor; - -var builder = WebApplication.CreateBuilder(args); - -// Add services to the container. -builder.Services.AddRazorComponents() - .AddInteractiveServerComponents(); -builder.Services.AddSyncfusionBlazor(); - -var app = builder.Build(); -.... - -{% endhighlight %} -{% endtabs %} - ## Add script resources The script can be accessed from NuGet through [Static Web Assets](https://blazor.syncfusion.com/documentation/appearance/themes#static-web-assets). Include the script reference at the end of the `` in the ~/Components/App.razor file as shown below: @@ -186,16 +215,15 @@ N> Check out the [Adding Script Reference](https://blazor.syncfusion.com/documen ## Add Syncfusion® Blazor Sparkline component -Add the Syncfusion® Blazor Sparkline component in the **~Pages/.razor** file. 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: +Add the Syncfusion® Blazor Sparkline 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 top of the component, as follows: | Interactivity location | RenderMode | Code | | --- | --- | --- | | Per page/component | Auto | @rendermode InteractiveAuto | | | WebAssembly | @rendermode InteractiveWebAssembly | -| | Server | @rendermode InteractiveServer | | | None | --- | -N> If an **Interactivity Location** is set to `Global` and the **Render Mode** is set to `Auto` or `WebAssembly` or `Server`, the render mode is configured in the `App.razor` file by default. +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. {% tabs %} {% highlight razor %} @@ -265,7 +293,7 @@ Now map the `Month` and the `Celsius` fields from the datasource to [XName](http {% endhighlight %} {% endtabs %} -Press Ctrl+F5 (Windows) or +F5 (macOS) to launch the application. This will render the Syncfusion® Blazor Sparkline component in your default web browser. +Press Ctrl+F5 (Windows) or +F5 (macOS) to launch the application. This will render the Syncfusion® Blazor Sparkline component in the default web browser. {% previewsample "https://blazorplayground.syncfusion.com/embed/rjrJXWqjfqKBvkdq?appbar=false&editor=false&result=true&errorlist=false&theme=bootstrap5" backgroundimage "[Blazor Sparkline Chart](./images/blazor-sparkline.png)" %} diff --git a/blazor/sparkline/images/blazor-create-web-app.png b/blazor/sparkline/images/blazor-create-web-app.png new file mode 100644 index 0000000000000000000000000000000000000000..7dd6e612d26e6d27fcd14ee412f030c69f0fc0db GIT binary patch literal 81283 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® Blazor Extension](https://blazor.syncfusion.com/documentation/visual-studio-integration/template-studio). +Create a **Blazor Web App** using Visual Studio 2022 via [Microsoft Templates](https://learn.microsoft.com/en-us/aspnet/core/blazor/tooling?view=aspnetcore-10.0&pivots=vs) or the [Syncfusion® Blazor Extension](https://blazor.syncfusion.com/documentation/visual-studio-integration/template-studio). + +Configure the appropriate [Interactive render mode](https://learn.microsoft.com/en-us/aspnet/core/blazor/components/render-modes?view=aspnetcore-10.0#render-modes) and [Interactivity location](https://learn.microsoft.com/en-us/aspnet/core/blazor/tooling?view=aspnetcore-10.0&pivots=vs) while creating a Blazor Web App. + +![Create Blazor Web App](images/blazor-create-web-app.png) ## Install Syncfusion® Blazor Inputs NuGet in the App -To add **Blazor SpeechToText** 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.Inputs](https://www.nuget.org/packages/Syncfusion.Blazor.Inputs). Alternatively, you can utilize the following package manager command to achieve the same. +To add the **Blazor SpeechToText** in the app, open the NuGet package manager in Visual Studio (*Tools → NuGet Package Manager → Manage NuGet Packages for Solution*), then search and install [Syncfusion.Blazor.Inputs](https://www.nuget.org/packages/Syncfusion.Blazor.Inputs). Alternatively, run the following commands in the Package Manager Console. {% tabs %} {% highlight C# tabtitle="Package Manager" %} @@ -37,7 +41,7 @@ Install-Package Syncfusion.Blazor.Inputs -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 in [nuget.org](https://www.nuget.org/packages?q=syncfusion.blazor). Refer to the [NuGet packages](https://blazor.syncfusion.com/documentation/nuget-packages) topic for the available NuGet packages list with component details. {% endtabcontent %} @@ -49,11 +53,11 @@ N> Syncfusion® Blazor components are availa ## 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). +Create a **Blazor Web App** using Visual Studio Code via [Microsoft Templates](https://learn.microsoft.com/en-us/aspnet/core/blazor/tooling?view=aspnetcore-10.0&pivots=vsc) or the [Syncfusion® Blazor Extension](https://blazor.syncfusion.com/documentation/visual-studio-code-integration/create-project). -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=vsc) while creating a Blazor Web Application. +Configure the appropriate interactive render mode and interactivity location when setting up a Blazor Web App. For detailed information, 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, use the following commands. {% tabs %} {% highlight c# tabtitle="Blazor Web App" %} @@ -65,11 +69,9 @@ cd BlazorWebApp.Client {% endhighlight %} {% endtabs %} -N> For more information on creating a **Blazor Web App** with various interactive modes and locations, refer to this [link](https://blazor.syncfusion.com/documentation/getting-started/blazor-web-app?tabcontent=visual-studio-code#render-interactive-modes). - ## Install Syncfusion® Blazor Inputs 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 using the `WebAssembly` or `Auto` render modes in the Blazor Web App, install Syncfusion® Blazor component 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. @@ -86,20 +88,68 @@ dotnet restore {% 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 in [nuget.org](https://www.nuget.org/packages?q=syncfusion.blazor). Refer to the [NuGet packages](https://blazor.syncfusion.com/documentation/nuget-packages) topic for the available NuGet packages list with component details. {% endtabcontent %} -{% endtabcontents %} +{% tabcontent .NET CLI %} -## Register Syncfusion® Blazor Service +## Prerequisites + +Latest version of the [.NET 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). + +{% tabs %} +{% highlight c# tabtitle=".NET CLI" %} + +dotnet --version + +{% endhighlight %} +{% endtabs %} + +## 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. + +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). + +For example, to create a Blazor Web App with the `Auto` interactive render mode, use the following commands: + +{% tabs %} +{% highlight c# tabtitle=".NET CLI" %} + +dotnet new blazor -o BlazorApp -int Auto +cd BlazorApp +cd BlazorApp.Client + +{% endhighlight %} +{% endtabs %} + +This command creates a new Blazor Web App and places it in a new directory called `BlazorApp` inside your current location. See the [Create a Blazor App](https://dotnet.microsoft.com/en-us/learn/aspnet/blazor-tutorial/create) and [dotnet new CLI command](https://learn.microsoft.com/en-us/aspnet/core/blazor/tooling?pivots=cli&view=aspnetcore-10.0) topics for more details. + +## Install Syncfusion® Blazor Inputs NuGet in the App + +Here's an example of how to add **Blazor SpeechToText** component in the application using the following command in the command prompt (Windows) or terminal (Linux and macOS) to install a [Syncfusion.Blazor.Inputs](https://www.nuget.org/packages/Syncfusion.Blazor.Inputs/) 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. + +If using the `WebAssembly or Auto` render modes in the Blazor Web App, install Syncfusion® Blazor component NuGet packages in the client project. + +{% tabs %} +{% highlight c# tabtitle=".NET CLI" %} -| Interactive Render Mode | Description | -| -- | -- | -| WebAssembly or Auto | Open **~/_Imports.razor** file from the client project.| -| Server | Open **~/_import.razor** file, which is located in the `Components` folder.| +dotnet add package Syncfusion.Blazor.Inputs --version {{ site.releaseversion }} +dotnet restore + +{% endhighlight %} +{% endtabs %} -Import the `Syncfusion.Blazor` and `Syncfusion.Blazor.Inputs` namespace. +N> Syncfusion® Blazor components are available in [nuget.org](https://www.nuget.org/packages?q=syncfusion.blazor). Refer to the [NuGet packages](https://blazor.syncfusion.com/documentation/nuget-packages) topic for the available NuGet packages list with component details. + +{% endtabcontent %} + +{% endtabcontents %} + +## Add Import Namespaces + +Open the **~/_Imports.razor** file from the client project and import the `Syncfusion.Blazor` and `Syncfusion.Blazor.Inputs` namespace. {% tabs %} {% highlight C# tabtitle="~/_Imports.razor" %} @@ -110,9 +160,11 @@ Import the `Syncfusion.Blazor` and `Syncfusion.Blazor.Inputs` namespace. {% endhighlight %} {% endtabs %} -Now, register the Syncfusion® Blazor Service in the **~/Program.cs** file of your Blazor Web App. +## Register Syncfusion® Blazor Service + +Register the Syncfusion® Blazor Service in the **~/Program.cs** file of your Blazor Web App. -If the **Interactive Render Mode** is set to `WebAssembly` or `Auto`, you need to register the Syncfusion® Blazor service in both **~/Program.cs** files of your Blazor Web App. +If the **Interactive Render Mode** is set to `WebAssembly` or `Auto`, register the Syncfusion® Blazor service in the **~/Program.cs** files of the main `server` project and associated `.Client` project. {% tabs %} {% highlight c# tabtitle="Server(~/_Program.cs)" hl_lines="3 11" %} @@ -146,27 +198,6 @@ await builder.Build().RunAsync(); {% endhighlight %} {% endtabs %} -If the **Interactive Render Mode** is set to `Server`, your project will contain a single **~/Program.cs** file. So, you should register the Syncfusion® Blazor Service only in that **~/Program.cs** file. - -{% tabs %} -{% highlight c# tabtitle="~/_Program.cs" hl_lines="2 9" %} - -... -using Syncfusion.Blazor; - -var builder = WebApplication.CreateBuilder(args); - -// Add services to the container. -builder.Services.AddRazorComponents() - .AddInteractiveServerComponents(); -builder.Services.AddSyncfusionBlazor(); - -var app = builder.Build(); -.... - -{% endhighlight %} -{% endtabs %} - ## Add script resources The script can be accessed from NuGet through [Static Web Assets](https://blazor.syncfusion.com/documentation/appearance/themes#static-web-assets). Include the script reference at the end of the `` in the **~/Components/App.razor** file as shown below: @@ -182,7 +213,7 @@ N> Check out the [Adding Script Reference](https://blazor.syncfusion.com/documen ## Adding Blazor SpeechToText component -Add the Syncfusion® Blazor SpeechToText component in the **~/Pages/Index.razor** file. +Add the Syncfusion® Blazor SpeechToText 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 top of the component, as follows: {% tabs %} {% highlight razor %} @@ -211,7 +242,7 @@ Add the Syncfusion® Blazor SpeechToText com {% endhighlight %} {% endtabs %} -* Press Ctrl+F5 (Windows) or +F5 (macOS) to launch the application. This will render the Syncfusion® Blazor SpeechToText component in your default web browser. +* Press Ctrl+F5 (Windows) or +F5 (macOS) to launch the application. This will render the Syncfusion® Blazor SpeechToText component in the default web browser. ![Blazor SpeechToText Component](images/getting-started.png) diff --git a/blazor/speech-to-text/images/blazor-create-web-app.png b/blazor/speech-to-text/images/blazor-create-web-app.png new file mode 100644 index 0000000000000000000000000000000000000000..7dd6e612d26e6d27fcd14ee412f030c69f0fc0db GIT binary patch literal 81283 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 Date: Wed, 3 Dec 2025 02:24:25 +0530 Subject: [PATCH 159/266] 996953: Updated the UG content and samples for Getting Started section in Blazor DataGrid --- .../datagrid/getting-started-with-maui-app.md | 246 ++++++++------ .../getting-started-with-server-app.md | 297 ++++++++++------- .../datagrid/getting-started-with-web-app.md | 315 +++++++++++------- blazor/datagrid/getting-started.md | 242 ++++++++------ 4 files changed, 647 insertions(+), 453 deletions(-) diff --git a/blazor/datagrid/getting-started-with-maui-app.md b/blazor/datagrid/getting-started-with-maui-app.md index d6d2e99cef..fe1f6c71eb 100644 --- a/blazor/datagrid/getting-started-with-maui-app.md +++ b/blazor/datagrid/getting-started-with-maui-app.md @@ -9,9 +9,11 @@ documentation: ug # Getting Started with Blazor DataGrid -This section explains you through the step-by-step process of integrating the Syncfusion® Blazor DataGrid component into your Blazor MAUI application using both Visual Studio and Visual Studio Code. +The [Syncfusion® Blazor DataGrid](https://www.syncfusion.com/blazor-components/blazor-datagrid) component provides a comprehensive solution for displaying and managing tabular data in **Blazor MAUI** applications. It supports essential features such as **data binding**, **sorting**, **filtering**, **paging**, and **grouping**, enabling efficient handling of large data collections. The component is designed for high performance and seamless integration with **.NET MAUI**, offering a consistent experience across platforms. -> **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) +This guide provides detailed instructions for integrating the DataGrid into a **Blazor MAUI App** using [Visual Studio](https://visualstudio.microsoft.com/vs/) or [Visual Studio Code](https://code.visualstudio.com/). It includes setup steps, configuration details, and usage examples to assist in building robust applications. + +> For advanced integration assistance, refer to [AI Coding Assistant Overview](https://blazor.syncfusion.com/documentation/ai-coding-assistant/overview). {% tabcontents %} @@ -19,15 +21,36 @@ This section explains you through the step-by-step process of integrating the Sy ## Prerequisites -To use the MAUI project templates, install the Mobile development with the .NET extension for Visual Studio. For more details, refer to [here](https://learn.microsoft.com/en-us/dotnet/MAUI/get-started/installation?tabs=vswin) or the [Syncfusion® Blazor Extension](https://blazor.syncfusion.com/documentation/visual-studio-integration/template-studio). +To use .NET MAUI project templates, install the **Mobile development with .NET** workload in Visual Studio. +For detailed instructions, refer to the [.NET MAUI installation](https://learn.microsoft.com/en-us/dotnet/maui/get-started/installation?view=net-maui-9.0&tabs=visual-studio) guide or the [Syncfusion® Blazor Extension](https://blazor.syncfusion.com/documentation/visual-studio-integration/template-studio). ## Create a new Blazor MAUI App in Visual Studio -You can create a Blazor MAUI App using Visual Studio via [Microsoft Templates](https://learn.microsoft.com/en-us/dotnet/maui/get-started/first-app?pivots=devices-windows&view=net-maui-9.0&tabs=vswin). For detailed instructions, refer to [this Blazor MAUI App Getting Started](https://blazor.syncfusion.com/documentation/getting-started/maui-blazor-app) documentation. +A Blazor MAUI application can be created using the **.NET MAUI Blazor App** template in Visual Studio with the built-in [Microsoft templates](https://learn.microsoft.com/en-us/aspnet/core/blazor/tooling?view=aspnetcore-10.0&pivots=vsc). + +1. Open **Visual Studio** with the Mobile development with .NET workload installed. +2. Select **Create a new project**. +3. Choose **.NET MAUI Blazor App** from the list of templates and click **Next**. +4. Specify the **project name**, **location**, and **solution settings**, then click **Next**. +5. Select the latest available **.NET target framework**. +6. Click **Create** to generate the project. + +> For detailed instructions, refer to the official [.NET MAUI getting started](https://blazor.syncfusion.com/documentation/getting-started/maui-blazor-app) guide. + +## Install Syncfusion® Blazor DataGrid and Themes in Visual Studio + +To integrate the DataGrid component into a Blazor MAUI application, install the following NuGet packages: + +1. Open **NuGet Package Manager** in Visual Studio: -## Install Syncfusion® Blazor DataGrid and Themes NuGet in the app + *Tools → NuGet Package Manager → Manage NuGet Packages for Solution*. -To add **Blazor DataGrid** 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.Grid](https://www.nuget.org/packages/Syncfusion.Blazor.Grid) and [Syncfusion.Blazor.Themes](https://www.nuget.org/packages/Syncfusion.Blazor.Themes/). +2. Search and install the following packages: + + - [Syncfusion.Blazor.Grid](https://www.nuget.org/packages/Syncfusion.Blazor.Grid/) + - [Syncfusion.Blazor.Themes](https://www.nuget.org/packages/Syncfusion.Blazor.Themes/) + +3. Alternatively, use the **Package Manager Console**: {% tabs %} {% highlight C# tabtitle="Package Manager" %} @@ -38,7 +61,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). For a complete list of packages, refer to [NuGet packages](https://blazor.syncfusion.com/documentation/nuget-packages). {% endtabcontent %} @@ -46,29 +69,52 @@ N> Syncfusion® Blazor components are availa ## Prerequisites -To use the MAUI project templates, install the Mobile development with the .NET extension for Visual Studio Code. For more details, refer to [here](https://learn.microsoft.com/en-us/dotnet/maui/get-started/installation?view=net-maui-9.0&tabs=visual-studio-code) or the [Syncfusion® Blazor Extension](https://blazor.syncfusion.com/documentation/visual-studio-code-integration/create-project). +To use .NET MAUI project templates, install the **Mobile development with .NET** workload in Visual Studio. +For detailed instructions, refer to the [.NET MAUI installation](https://learn.microsoft.com/en-us/dotnet/maui/get-started/installation?view=net-maui-9.0&tabs=visual-studio-code) guide or the [Syncfusion® Blazor Extension](https://blazor.syncfusion.com/documentation/visual-studio-code-integration/create-project). ## Create a new Blazor MAUI App in Visual Studio Code -You can create a Blazor MAUI App using Visual Studio Code via [Microsoft Templates](https://learn.microsoft.com/en-us/dotnet/maui/get-started/first-app?pivots=devices-windows&view=net-maui-9.0&tabs=visual-studio-code) or the [Syncfusion® Blazor Extension](https://blazor.syncfusion.com/documentation/visual-studio-code-integration/create-project). For detailed instructions, refer to [this Blazor MAUI App Getting Started](https://blazor.syncfusion.com/documentation/getting-started/maui-blazor-app) documentation. +A Blazor MAUI application can be created using the **.NET CLI** commands in **Visual Studio Code**. + +1. Install the latest **.NET SDK** that supports .NET MAUI. +2. Open **Visual Studio Code**. +3. Press **Ctrl + `** to open the integrated terminal. +4. Run the following command to create a new Blazor MAUI App: + +{% tabs %} +{% highlight c# tabtitle="Blazor MAUI App" %} + +dotnet new maui-blazor -o MauiBlazorApp +cd MauiBlazorApp + +{% endhighlight %} +{% endtabs %} + +> For detailed instructions, refer to the [.NET MAUI getting started](https://blazor.syncfusion.com/documentation/getting-started/maui-blazor-app) guide. ## Install Blazor DataGrid and Themes NuGet in the App -To add **Blazor DataGrid** 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.Grid](https://www.nuget.org/packages/Syncfusion.Blazor.Grid) and [Syncfusion.Blazor.Themes](https://www.nuget.org/packages/Syncfusion.Blazor.Themes/). +To integrate the Blazor DataGrid component, install the required Syncfusion® NuGet packages using the **integrated terminal**: + +1. Press **Ctrl + `** to open the integrated terminal in Visual Studio Code. +2. Navigate to the directory containing the **.csproj** file. +3. Run the following commands to install the packages: + + * [Syncfusion.Blazor.Grid](https://www.nuget.org/packages/Syncfusion.Blazor.Grid) + * [Syncfusion.Blazor.Themes](https://www.nuget.org/packages/Syncfusion.Blazor.Themes/) {% tabs %} {% highlight c# tabtitle="Package Manager" %} -dotnet add package Syncfusion.Blazor.Grid -v {{ site.releaseversion }} -dotnet add package Syncfusion.Blazor.Themes -v {{ site.releaseversion }} -dotnet restore +Install-Package Syncfusion.Blazor.Grid -Version {{site.releaseversion}} +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). For a complete list of packages, refer to [NuGet packages](https://blazor.syncfusion.com/documentation/nuget-packages). {% endtabcontent %} @@ -76,7 +122,7 @@ N> Syncfusion® Blazor components are availa ## Add Import Namespaces -Open the **~/_Imports.razor** file and import the `Syncfusion.Blazor` and `Syncfusion.Blazor.Grids` namespace. +Open the **~/_Imports.razor** file and include the required namespaces for Syncfusion® Blazor components: {% tabs %} {% highlight razor tabtitle="~/_Imports.razor" %} @@ -89,37 +135,35 @@ Open the **~/_Imports.razor** file and import the `Syncfusion.Blazor` and `Syncf ## Register Syncfusion® Blazor Service -Register the Syncfusion® Blazor Service in the **~/MauiProgram.cs** file. +The Syncfusion® Blazor service must be registered in the **~/MauiProgram.cs** file to enable component rendering. {% tabs %} {% highlight c# tabtitle="~/MauiProgram.cs" hl_lines="2 19" %} using Microsoft.Extensions.Logging; using Syncfusion.Blazor; - -namespace MauiBlazorWindow; - +namespace MauiBlazorApp; public static class MauiProgram { public static MauiApp CreateMauiApp() { var builder = MauiApp.CreateBuilder(); builder - .UseMauiApp() - .ConfigureFonts(fonts => - { - fonts.AddFont("OpenSans-Regular.ttf", "OpenSansRegular"); - }); - + .UseMauiApp() + .ConfigureFonts(fonts => + { + fonts.AddFont("OpenSans-Regular.ttf", "OpenSansRegular"); + }); builder.Services.AddMauiBlazorWebView(); builder.Services.AddSyncfusionBlazor(); + #if DEBUG builder.Services.AddBlazorWebViewDeveloperTools(); - builder.Logging.AddDebug(); + builder.Logging.AddDebug(); #endif - return builder.Build(); } + } {% endhighlight %} @@ -127,20 +171,23 @@ namespace MauiBlazorWindow; ## 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 references in the `` section of the **~/index.html** file. +Syncfusion® Blazor themes and scripts are available through [Static Web Assets](https://blazor.syncfusion.com/documentation/appearance/themes#static-web-assets). Add the required references in the **~/wwwroot/index.html** file of the MAUI Blazor project. ```html - .... - - //Blazor DataGrid Component script reference. - ``` -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> +* Refer to [Blazor Themes](https://blazor.syncfusion.com/documentation/appearance/themes) for various methods to reference themes in a Blazor application: + + >* [Static Web Assets](https://blazor.syncfusion.com/documentation/appearance/themes#static-web-assets) + >* [CDN](https://blazor.syncfusion.com/documentation/appearance/themes#cdn-reference) + >* [Custom Resource Generator (CRG)](https://blazor.syncfusion.com/documentation/common/custom-resource-generator) + +>* For script reference options, see [Adding Script References](https://blazor.syncfusion.com/documentation/common/adding-script-references). ## Add Blazor DataGrid component @@ -149,57 +196,44 @@ Add the Syncfusion® Blazor DataGrid compone {% tabs %} {% highlight razor %} - - -@code{ - public List Orders { get; set; } - - protected override void OnInitialized() - { - Orders = Enumerable.Range(1, 5).Select(x => new Order() - { - OrderID = 0 + x, - CustomerID = (new string[] { "ALFKI", "ANANTR", "ANTON", "BLONP", "BOLID" })[new Random().Next(5)], - }).ToList(); - } - - public class Order - { - public int? OrderID { get; set; } - public string CustomerID { get; set; } - - } -} + {% endhighlight %} {% endtabs %} +* The component will render as an empty grid until data is bound. + ### How to Run the Sample on Windows -Run the sample in Windows Machine mode, and it will run Blazor MAUI in Windows. +Run the application in Windows Machine mode to launch the Blazor MAUI app on Windows. ![Blazor DataGrid Component](images/blazor-datagrid-maui-page.png) ### How to Run the Sample on Android -To run the Blazor DataGrid in a Blazor Android MAUI application using the Android emulator, follow these steps: +To run the Blazor MAUI app on an Android emulator: -Refer [here](https://learn.microsoft.com/en-us/dotnet/maui/android/emulator/device-manager#android-device-manager-on-windows) to install and launch Android emulator. +1. Install and configure the Android emulator using the [Android Device Manager guide](https://learn.microsoft.com/en-us/dotnet/maui/android/emulator/device-manager#android-device-manager-on-windows). +2. Launch the emulator and start the application. -N> If you encounter any errors while using the Android Emulator, refer to the following link for troubleshooting guidance[Troubleshooting Android Emulator](https://learn.microsoft.com/en-us/dotnet/maui/android/emulator/troubleshooting). +N> For troubleshooting emulator issues, refer to [Troubleshooting Android Emulator](https://learn.microsoft.com/en-us/dotnet/maui/android/emulator/troubleshooting). ![Blazor DataGrid Component](images/blazor-datagrid-component.png) ## Defining row data -To bind data for the Grid, you can assign a IEnumerable object to the [DataSource](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_DataSource) property. The list data source can also be provided as an instance of the **DataManager**. You can assign the data source through the `OnInitialized` life cycle of the page. +The DataGrid requires a data source to display records. A collection implementing **IEnumerable** can be assigned to the [DataSource](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_DataSource) property. Alternatively, data can be provided through a [DataManager](https://blazor.syncfusion.com/documentation/data/getting-started-with-web-app) instance for **remote binding**. + +Data binding is typically performed in the [OnInitialized](https://learn.microsoft.com/en-us/dotnet/api/microsoft.aspnetcore.components.componentbase.oninitialized?view=aspnetcore-10.0) lifecycle method of the component. {% tabs %} {% highlight razor %} - -@code{ + + + +@code { public List Orders { get; set; } protected override void OnInitialized() @@ -207,13 +241,14 @@ To bind data for the Grid, you can assign a IEnumerable object to the [DataSourc Orders = Enumerable.Range(1, 75).Select(x => new Order() { OrderID = 1000 + x, - CustomerID = (new string[] { "ALFKI", "ANANTR", "ANTON", "BLONP", "BOLID" })[new Random().Next(5)], + CustomerID = (new[] { "ALFKI", "ANANTR", "ANTON", "BLONP", "BOLID" })[new Random().Next(5)], Freight = 2.1 * x, - OrderDate = DateTime.Now.AddDays(-x), + OrderDate = DateTime.Now.AddDays(-x) }).ToList(); } - public class Order { + public class Order + { public int? OrderID { get; set; } public string CustomerID { get; set; } public DateTime? OrderDate { get; set; } @@ -224,27 +259,32 @@ To bind data for the Grid, you can assign a IEnumerable object to the [DataSourc {% endhighlight %} {% endtabs %} +* Press Ctrl+F5 (Windows) or +F5 (macOS) to run the application. The DataGrid will render and display the collection. + +{% previewsample "https://blazorplayground.syncfusion.com/embed/rtLSMLthxegYrbQD?appbar=false&editor=false&result=true&errorlist=false&theme=bootstrap5" %} ## Defining columns -The columns are automatically generated when columns declaration is empty or undefined while initializing the Grid. +The DataGrid automatically generates columns when no explicit column definitions are provided. For greater control over column behavior and appearance, use the [GridColumns](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridColumns.html) component along with individual [GridColumn](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridColumn.html) elements to define columns explicitly. -The Grid has an option to define columns using [GridColumns](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridColumns.html). To customize column properties, use [GridColumns](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridColumns.html). +**Common Column Properties** -Let’s check the properties used here: -* [Field](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridColumn.html#Syncfusion_Blazor_Grids_GridColumn_Field) is added to map with a property name in IEnumerable object. -* [HeaderText](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridColumn.html#Syncfusion_Blazor_Grids_GridColumn_HeaderText) is added to change the title of columns. -* [TextAlign](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridColumn.html#Syncfusion_Blazor_Grids_GridColumn_TextAlign) is used to change the alignment of columns. By default, columns will be left aligned. To change columns to right align, define [TextAlign](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridColumn.html#Syncfusion_Blazor_Grids_GridColumn_TextAlign) as **Right**. -* Also, you have used another useful property, [Format](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridColumn.html#Syncfusion_Blazor_Grids_GridColumn_Format). Using this, you can format number and date values to standard or custom formats. +* [Field](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridColumn.html#Syncfusion_Blazor_Grids_GridColumn_Field): Maps the column to a property in the bound collection. +* [HeaderText](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridColumn.html#Syncfusion_Blazor_Grids_GridColumn_HeaderText): Specifies the column header title. +* [TextAlign](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridColumn.html#Syncfusion_Blazor_Grids_GridColumn_TextAlign): Aligns text within the column. Default alignment is Left; set to Right for numeric values. +* [Format](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridColumn.html#Syncfusion_Blazor_Grids_GridColumn_Format): Applies standard or custom formatting for numeric and date values. +* [Type](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridColumn.html#Syncfusion_Blazor_Grids_GridColumn_Type): Defines the column type, such as ColumnType.Date for date fields. +* [Width](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridColumn.html#Syncfusion_Blazor_Grids_GridColumn_Width): Sets the column width in pixels or percentage to control layout consistency. {% tabs %} {% highlight razor %} + - + @@ -254,19 +294,19 @@ Let’s check the properties used here: ## Enable paging -The paging feature enables users to view the Syncfusion® Blazor DataGrid record in a paged view. It can be enabled by setting the [AllowPaging](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_AllowPaging) property to true. Pager can be customized using the [GridPageSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_PageSettings). +[Paging](https://blazor.syncfusion.com/documentation/datagrid/paging) allows the DataGrid to display records in a paged view, improving performance and readability for large datasets. Enable paging by setting the [AllowPaging](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_AllowPaging) property to **true**. Paging behavior can be customized using the [GridPageSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridPageSettings.html) component. {% tabs %} {% highlight razor %} - - - - - - - + + + + + + + {% endhighlight %} @@ -274,7 +314,7 @@ The paging feature enables users to view the Syncfusion® Blazor DataGrid record in a grouped view. It can be enabled by setting the [AllowGrouping](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_AllowGrouping) property as true. Grouping feature can be customized using the [GridGroupSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_GroupSettings). +[Grouping](https://blazor.syncfusion.com/documentation/datagrid/grouping) organizes records into logical groups based on column values. Enable grouping by setting the [AllowGrouping](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_AllowGrouping) property to **true**. Grouping behavior can be customized using the [GridGroupSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridGroupSettings.html) component. {% tabs %} {% highlight razor %} - - - - - - - + + + + + + + {% endhighlight %} @@ -336,16 +376,14 @@ The grouping feature enables you to view the Syncfusion® Blazor DataGrid 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.Grids.GridEvents-1.html#Syncfusion_Blazor_Grids_GridEvents_1_OnActionFailure) event. +Exceptions that occur during DataGrid operations can be captured without interrupting the application flow. Use the [OnActionFailure](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridEvents-1.html#Syncfusion_Blazor_Grids_GridEvents_1_OnActionFailure) event to retrieve error details and handle them gracefully. -* **TValue** - Specifies the row data type of the grid (for example, Order). It enables strong typing for templates and event args and ensures proper binding/formatting. -* **GridEvents** - When you use GridEvents, set the same TValue on both SfGrid and GridEvents so the event argument types (like FailureEventArgs, RowSelectEventArgs) are correctly bound. +**Key Points**: -The argument passed to the `OnActionFailure` event contains the error details returned from the server. +* **TValue**: Specifies the row data type for the grid (for example, Order). This ensures strong typing for templates and event arguments. +* **GridEvents**: When using [GridEvents](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridEvents-1.html#), set the same `TValue` on both [SfGrid](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#) and `GridEvents` for proper event argument binding. -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. - -The following sample code demonstrates notifying user when server-side exception has occurred during data operation: +N> Binding the `OnActionFailure` event during development helps identify issues early. Exception details can be logged or displayed for troubleshooting. {% tabs %} {% highlight razor %} @@ -353,6 +391,7 @@ The following sample code demonstrates notifying user when server-side exception @using Syncfusion.Blazor.Data @ErrorDetails + @@ -360,7 +399,7 @@ The following sample code demonstrates notifying user when server-side exception - + @@ -371,19 +410,18 @@ The following sample code demonstrates notifying user when server-side exception } -@code{ +@code { public string ErrorDetails = ""; - public class Order - { + + public class Order { public int? OrderID { get; set; } public string CustomerID { get; set; } public DateTime? OrderDate { get; set; } public double? Freight { get; set; } } - public void ActionFailure(FailureEventArgs args) - { - this.ErrorDetails = "Server exception: 404 Not found"; + public void ActionFailure(FailureEventArgs args) { + ErrorDetails = "Server exception: 404 Not Found"; StateHasChanged(); } } diff --git a/blazor/datagrid/getting-started-with-server-app.md b/blazor/datagrid/getting-started-with-server-app.md index ac906cf986..79578ee979 100644 --- a/blazor/datagrid/getting-started-with-server-app.md +++ b/blazor/datagrid/getting-started-with-server-app.md @@ -9,9 +9,11 @@ documentation: ug # Getting Started with Blazor DataGrid in Server App -This section briefly explains about how to include [Syncfusion® Blazor DataGrid](https://www.syncfusion.com/blazor-components/blazor-datagrid) in your Blazor Server App using Visual Studio, Visual Studio code and .NET CLI. +The [Syncfusion® Blazor DataGrid](https://www.syncfusion.com/blazor-components/blazor-datagrid) is a feature-rich component designed for displaying and managing data in Blazor applications. It supports essential functionalities such as **data binding**, **sorting**, **filtering**, **paging**, and **grouping**, enabling the **creation of interactive** and **responsive data-driven interfaces**. -> **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) +This guide provides detailed instructions for integrating the DataGrid into a **Blazor Server application** using [Visual Studio](https://visualstudio.microsoft.com/vs/), [Visual Studio Code](https://code.visualstudio.com/), or the [.NET CLI](https://learn.microsoft.com/en-us/dotnet/core/tools/). It includes setup steps, configuration details, and usage examples to assist in building robust applications. + +> For advanced integration assistance, refer to [AI Coding Assistant Overview](https://blazor.syncfusion.com/documentation/ai-coding-assistant/overview). {% tabcontents %} @@ -23,11 +25,32 @@ This section briefly explains about how to include [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. +A **Blazor Web App** can be created using **Visual Studio** with the built-in [Microsoft templates](https://learn.microsoft.com/en-us/aspnet/core/blazor/tooling?view=aspnetcore-9.0&pivots=vsAz) or the [Syncfusion® Blazor Extension](https://blazor.syncfusion.com/documentation/visual-studio-integration/template-studio). + +1. Open **Visual Studio 2022** (version 17.8 or later). +2. Select **Create a new project**. +3. Choose **Blazor Web App** from the list of templates and click **Next**. +4. Specify the **project name**, **location**, and **solution settings**, then click **Next**. +5. Select the target framework as **.NET 8.0 or later** (choose the latest installed version available on the system). +6. Choose the [Interactive render mode](https://learn.microsoft.com/en-us/aspnet/core/blazor/components/render-modes?view=aspnetcore-9.0#render-modes) (**Server**) and configure the [Interactivity location](https://learn.microsoft.com/en-us/aspnet/core/blazor/tooling?view=aspnetcore-9.0&pivots=vs). +7. Review the remaining options and click **Create** to generate the project. + +## Install Syncfusion® Blazor DataGrid and Themes in Visual Studio + +To integrate the Blazor DataGrid component, install the required Syncfusion® NuGet packages in the solution: + +1. Open **NuGet Package Manager** in Visual Studio: + + *Tools → NuGet Package Manager → Manage NuGet Packages for Solution*. + +2. Search and install the following packages: -## Install Blazor DataGrid and Themes NuGet in the app + - [Syncfusion.Blazor.Grid](https://www.nuget.org/packages/Syncfusion.Blazor.Grid/) + - [Syncfusion.Blazor.Themes](https://www.nuget.org/packages/Syncfusion.Blazor.Themes/) -To add **Syncfusion® Blazor DataGrid** 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.Grid](https://www.nuget.org/packages/Syncfusion.Blazor.Grid/) 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. +3. For projects using **WebAssembly** or **Auto** interactive render modes, ensure these packages are installed in the **Client** project. + +4. Alternatively, use the **Package Manager Console**: {% tabs %} {% highlight C# tabtitle="Package Manager" %} @@ -38,7 +61,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). For a complete list of packages, refer to [NuGet packages](https://blazor.syncfusion.com/documentation/nuget-packages). {% endtabcontent %} @@ -48,42 +71,50 @@ N> Syncfusion® Blazor components are availa * [System requirements for Blazor components](https://blazor.syncfusion.com/documentation/system-requirements) -## Create a new Blazor app in Visual Studio code +## Create a Blazor server app in Visual Studio code -You can create a **Blazor Server app** using **Blazor Web App** template in Visual Studio code via [Microsoft Templates](https://learn.microsoft.com/en-us/aspnet/core/blazor/tooling?view=aspnetcore-9.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. +A Blazor Server App can be created using [Microsoft templates](https://learn.microsoft.com/en-us/aspnet/core/blazor/tooling?view=aspnetcore-9.0&pivots=vsc) or the [Syncfusion® Blazor Extension](https://blazor.syncfusion.com/documentation/visual-studio-code-integration/create-project). -Alternatively, you can create a server application using the following command in the terminal(Ctrl+`). +1. Install the latest **.NET SDK** that supports **.NET 8.0 or later**. +2. Open **Visual Studio Code**. +3. Press **Ctrl + `** to open the integrated terminal. +4. Navigate to the desired directory for the project. +5. Run the following command to create a Blazor Server application: {% tabs %} - {% highlight c# tabtitle="Blazor Server App" %} dotnet new blazor -o BlazorApp -int Server cd BlazorApp {% endhighlight %} - {% endtabs %} -## Install Blazor DataGrid and Themes NuGet in the app +6. Configure the [Interactive render mode](https://learn.microsoft.com/en-us/aspnet/core/blazor/components/render-modes?view=aspnetcore-9.0#render-modes) as **Server** and set the [Interactivity location](https://learn.microsoft.com/en-us/aspnet/core/blazor/tooling?view=aspnetcore-9.0&pivots=vs) appropriately. -* 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.Grid](https://www.nuget.org/packages/Syncfusion.Blazor.Grid) and [Syncfusion.Blazor.Themes](https://www.nuget.org/packages/Syncfusion.Blazor.Themes/) NuGet package and ensure all dependencies are installed. +N> For other **interactive render modes** and **interactivity locations**, refer to Render Modes [documentation](https://blazor.syncfusion.com/documentation/getting-started/blazor-web-app?tabcontent=visual-studio-code#render-interactive-modes). -{% tabs %} +## ## Install Syncfusion® Blazor DataGrid and Themes in Visual Studio Code + +To integrate the Blazor DataGrid component, install the required Syncfusion® NuGet packages using the **integrated terminal**: + +1. Press **Ctrl + `** to open the integrated terminal in Visual Studio Code. +2. Navigate to the directory containing the **.csproj** file. +3. Run the following commands to install the packages: +* [Syncfusion.Blazor.Grid](https://www.nuget.org/packages/Syncfusion.Blazor.Grid) +* [Syncfusion.Blazor.Themes](https://www.nuget.org/packages/Syncfusion.Blazor.Themes/) + +{% tabs %} {% highlight c# tabtitle="Package Manager" %} -dotnet add package Syncfusion.Blazor.Grid -v {{ site.releaseversion }} -dotnet add package Syncfusion.Blazor.Themes -v {{ site.releaseversion }} -dotnet restore +Install-Package Syncfusion.Blazor.Grid -Version {{site.releaseversion}} +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). For a complete list of packages, refer to [NuGet packages](https://blazor.syncfusion.com/documentation/nuget-packages). {% endtabcontent %} @@ -91,7 +122,8 @@ 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). +1. Install the latest [.NET SDK](https://dotnet.microsoft.com/en-us/download) that supports .NET 8.0 or later. +2. Verify the installed version by running the following command in a command prompt (Windows), terminal (macOS), or shell (Linux): {% tabs %} {% highlight c# tabtitle=".NET CLI" %} @@ -103,8 +135,9 @@ 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). - +1. Open a **command prompt**, **terminal**, or **shell**. +2. Navigate to the directory where the project should be created. +3. Run the following command to create a new **Blazor Server App** with **Server** interactive render mode: {% tabs %} {% highlight c# tabtitle=".NET CLI" %} @@ -114,11 +147,24 @@ 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. +4. Configure the appropriate [interactive render mode](https://learn.microsoft.com/en-us/aspnet/core/blazor/components/render-modes?view=aspnetcore-9.0#render-modes) and [interactivity location](https://learn.microsoft.com/en-us/aspnet/core/blazor/tooling?view=aspnetcore-9.0&pivots=vs) when setting up the application. For more details, see [Render Mode documentation](https://blazor.syncfusion.com/documentation/common/interactive-render-mode). +5. This command creates a new **Blazor Server App** in a directory named **BlazorApp** inside the current location. + +> For additional details, refer to: +>* [Blazor Server App Getting Started (.NET CLI)](https://blazor.syncfusion.com/documentation/getting-started/blazor-server-side-visual-studio?tabcontent=.net-cli) +>* [dotnet new CLI command](https://learn.microsoft.com/en-us/dotnet/core/tools/dotnet-new) +>* [Create Blazor App Tutorial](https://dotnet.microsoft.com/en-us/learn/aspnet/blazor-tutorial/create) -## Install Syncfusion® Blazor DataGrid and Themes NuGet in the App +## ## Install Syncfusion® Blazor DataGrid and Themes using .NET CLI -Here's an example of how to add **Blazor DataGrid** component in the application using the following command in the command prompt (Windows) or terminal (Linux and macOS) to install a [Syncfusion.Blazor.Grid](https://www.nuget.org/packages/Syncfusion.Blazor.Grid/) 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. +To integrate the Blazor DataGrid component in a **Blazor Server App** using the **.NET CLI**: + +1. Open a **command prompt**, **terminal**, or **shell**. +2. Navigate to the directory containing the **.csproj** file. +3. Run the following commands to install the required NuGet packages: + + - [Syncfusion.Blazor.Grid](https://www.nuget.org/packages/Syncfusion.Blazor.Grid/) + - [Syncfusion.Blazor.Themes](https://www.nuget.org/packages/Syncfusion.Blazor.Themes/) {% tabs %} {% highlight c# tabtitle=".NET CLI" %} @@ -130,7 +176,10 @@ 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> For more details, refer to: + +> * [Install and manage packages using the dotnet CLI](https://learn.microsoft.com/en-us/nuget/consume-packages/install-use-packages-dotnet-cli) +> * Syncfusion® Blazor components are available on [nuget.org](https://www.nuget.org/packages?q=syncfusion.blazor). For a complete list of packages, refer to [NuGet packages](https://blazor.syncfusion.com/documentation/nuget-packages). {% endtabcontent %} @@ -138,7 +187,8 @@ N> Syncfusion® Blazor components are availa ## Add Import Namespaces -Open the **~/_Imports.razor** file and import the `Syncfusion.Blazor` and `Syncfusion.Blazor.Grids` namespace. +1. Open the **~/_Imports.razor** file in the project. +2. Add the following namespaces to enable Syncfusion® Blazor components: {% tabs %} {% highlight razor tabtitle="~/_Imports.razor" %} @@ -149,103 +199,102 @@ Open the **~/_Imports.razor** file and import the `Syncfusion.Blazor` and `Syncf {% endhighlight %} {% endtabs %} +N> For **Server** render mode, update this file in the **Components** folder. + ## Register Syncfusion® Blazor service -Register the Syncfusion® Blazor Service in the **~/Program.cs** file of your Blazor Server App. +Open the **~/Program.cs** file and register the Syncfusion® Blazor service along with interactive server components: {% tabs %} -{% highlight C# tabtitle="~/Program.cs" hl_lines="3 10" %} +{% highlight c# tabtitle="~/Program.cs" hl_lines="3 10" %} -.... -.... using Syncfusion.Blazor; - var builder = WebApplication.CreateBuilder(args); - // Add services to the container. -.... -.... +builder.Services.AddRazorComponents() + .AddInteractiveServerComponents(); builder.Services.AddSyncfusionBlazor(); - -.... - +var app = builder.Build(); +// Remaining configuration... {% endhighlight %} {% endtabs %} +N> For **Server** render mode, ensure `AddInteractiveServerComponents()` is included to enable interactivity. + ## 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: +Syncfusion® Blazor themes and scripts are available through [Static Web Assets](https://blazor.syncfusion.com/documentation/appearance/themes#static-web-assets). Add the following references in the **~/Components/App.razor** file: + +**In the <head> section:** ```html - .... +``` + +**At the end of the <body> section:** +```html - .... - - //Blazor DataGrid Component script reference. - ``` -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> +* Refer to [Blazor Themes](https://blazor.syncfusion.com/documentation/appearance/themes) for various methods to reference themes in a Blazor application: -## Add Blazor DataGrid component +>* [Static Web Assets](https://blazor.syncfusion.com/documentation/appearance/themes#static-web-assets) +>* [CDN](https://blazor.syncfusion.com/documentation/appearance/themes#cdn-reference) +>* [Custom Resource Generator (CRG)](https://blazor.syncfusion.com/documentation/common/custom-resource-generator) -Add the Syncfusion® Blazor DataGrid 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. +>* For script reference options, see [Adding Script References](https://blazor.syncfusion.com/documentation/common/adding-script-references). -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. +## Add Syncfusion® Blazor DataGrid component -``` -@* desired render mode define here *@ -@rendermode InteractiveServer -``` +The Syncfusion® Blazor DataGrid can be added to a **Razor** page in the **Pages** folder (for example, Pages/Home.razor). + +1. **Define Render Mode** + +Set the render mode at the top of the **Razor** file to enable server interactivity: {% tabs %} -{% highlight razor %} +{% highlight razor tabtitle="Home.razor" %} +@rendermode InteractiveServer +{% endhighlight %} +{% endtabs %} - +**Interactivity Location** -@code{ - public List Orders { get; set; } +* **Global**: Render mode is configured in **App.razor** and applies to the entire application by default. +* **Per page/component**: Render mode is set at the top of the specific **Razor** file (for example, **Pages/Index.razor**). - protected override void OnInitialized() - { - Orders = Enumerable.Range(1, 5).Select(x => new Order() - { - OrderID = 0 + x, - CustomerID = (new string[] { "ALFKI", "ANANTR", "ANTON", "BLONP", "BOLID" })[new Random().Next(5)], - }).ToList(); - } +2. **Add DataGrid component** - public class Order - { - public int? OrderID { get; set; } - public string CustomerID { get; set; } +Add the **DataGrid** tag to the **Razor** page: - } -} +{% tabs %} +{% highlight razor %} + + {% endhighlight %} {% endtabs %} -* Press Ctrl+F5 (Windows) or +F5 (macOS) to launch the application. This will render the Syncfusion® Blazor DataGrid in your default web browser. - -{% previewsample "https://blazorplayground.syncfusion.com/embed/BNVztWraLacsGbYO?appbar=false&editor=false&result=true&errorlist=false&theme=bootstrap5" backgroundimage "[Blazor DataGrid](images/blazor-datagrid-component.png)" %} - ## Defining row data -To bind data for the Grid, you can assign a IEnumerable object to the [DataSource](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_DataSource) property. The list data source can also be provided as an instance of the **DataManager**. You can assign the data source through the `OnInitialized` life cycle of the page. +The DataGrid requires a data source to display records. A collection implementing **IEnumerable** can be assigned to the [DataSource](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_DataSource) property. Alternatively, data can be provided through a [DataManager](https://blazor.syncfusion.com/documentation/data/getting-started-with-web-app) instance for **remote binding**. + +Data binding is typically performed in the [OnInitialized](https://learn.microsoft.com/en-us/dotnet/api/microsoft.aspnetcore.components.componentbase.oninitialized?view=aspnetcore-10.0) lifecycle method of the component. {% tabs %} {% highlight razor %} - -@code{ + + + +@code { public List Orders { get; set; } protected override void OnInitialized() @@ -253,13 +302,14 @@ To bind data for the Grid, you can assign a IEnumerable object to the [DataSourc Orders = Enumerable.Range(1, 75).Select(x => new Order() { OrderID = 1000 + x, - CustomerID = (new string[] { "ALFKI", "ANANTR", "ANTON", "BLONP", "BOLID" })[new Random().Next(5)], + CustomerID = (new[] { "ALFKI", "ANANTR", "ANTON", "BLONP", "BOLID" })[new Random().Next(5)], Freight = 2.1 * x, - OrderDate = DateTime.Now.AddDays(-x), + OrderDate = DateTime.Now.AddDays(-x) }).ToList(); } - public class Order { + public class Order + { public int? OrderID { get; set; } public string CustomerID { get; set; } public DateTime? OrderDate { get; set; } @@ -270,27 +320,32 @@ To bind data for the Grid, you can assign a IEnumerable object to the [DataSourc {% endhighlight %} {% endtabs %} +* Press Ctrl+F5 (Windows) or +F5 (macOS) to run the application. The DataGrid will render and display the collection. + +{% previewsample "https://blazorplayground.syncfusion.com/embed/rtLSMLthxegYrbQD?appbar=false&editor=false&result=true&errorlist=false&theme=bootstrap5" %} ## Defining columns -The columns are automatically generated when columns declaration is empty or undefined while initializing the Grid. +The DataGrid automatically generates columns when no explicit column definitions are provided. For greater control over column behavior and appearance, use the [GridColumns](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridColumns.html) component along with individual [GridColumn](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridColumn.html) elements to define columns explicitly. -The Grid has an option to define columns using [GridColumns](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridColumns.html). To customize column properties, use [GridColumns](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridColumns.html). +**Common Column Properties** -Let’s check the properties used here: -* [Field](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridColumn.html#Syncfusion_Blazor_Grids_GridColumn_Field) is added to map with a property name in IEnumerable object. -* [HeaderText](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridColumn.html#Syncfusion_Blazor_Grids_GridColumn_HeaderText) is added to change the title of columns. -* [TextAlign](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridColumn.html#Syncfusion_Blazor_Grids_GridColumn_TextAlign) is used to change the alignment of columns. By default, columns will be left aligned. To change columns to right align, define [TextAlign](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridColumn.html#Syncfusion_Blazor_Grids_GridColumn_TextAlign) as **Right**. -* Also, you have used another useful property, [Format](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridColumn.html#Syncfusion_Blazor_Grids_GridColumn_Format). Using this, you can format number and date values to standard or custom formats. +* [Field](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridColumn.html#Syncfusion_Blazor_Grids_GridColumn_Field): Maps the column to a property in the bound collection. +* [HeaderText](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridColumn.html#Syncfusion_Blazor_Grids_GridColumn_HeaderText): Specifies the column header title. +* [TextAlign](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridColumn.html#Syncfusion_Blazor_Grids_GridColumn_TextAlign): Aligns text within the column. Default alignment is Left; set to Right for numeric values. +* [Format](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridColumn.html#Syncfusion_Blazor_Grids_GridColumn_Format): Applies standard or custom formatting for numeric and date values. +* [Type](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridColumn.html#Syncfusion_Blazor_Grids_GridColumn_Type): Defines the column type, such as ColumnType.Date for date fields. +* [Width](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridColumn.html#Syncfusion_Blazor_Grids_GridColumn_Width): Sets the column width in pixels or percentage to control layout consistency. {% tabs %} {% highlight razor %} + - + @@ -300,19 +355,19 @@ Let’s check the properties used here: ## Enable paging -The paging feature enables users to view the Syncfusion® Blazor DataGrid record in a paged view. It can be enabled by setting the [AllowPaging](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_AllowPaging) property to true. Pager can be customized using the [GridPageSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_PageSettings). +[Paging](https://blazor.syncfusion.com/documentation/datagrid/paging) allows the DataGrid to display records in a paged view, improving performance and readability for large datasets. Enable paging by setting the [AllowPaging](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_AllowPaging) property to **true**. Paging behavior can be customized using the [GridPageSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridPageSettings.html) component. {% tabs %} {% highlight razor %} - - - - - - - + + + + + + + {% endhighlight %} @@ -320,7 +375,7 @@ The paging feature enables users to view the Syncfusion® Blazor DataGrid record in a grouped view. It can be enabled by setting the [AllowGrouping](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_AllowGrouping) property as true. Grouping feature can be customized using the [GridGroupSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_GroupSettings). +[Grouping](https://blazor.syncfusion.com/documentation/datagrid/grouping) organizes records into logical groups based on column values. Enable grouping by setting the [AllowGrouping](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_AllowGrouping) property to **true**. Grouping behavior can be customized using the [GridGroupSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridGroupSettings.html) component. {% tabs %} {% highlight razor %} - - - - - - - + + + + + + + {% endhighlight %} @@ -382,16 +437,14 @@ The grouping feature enables you to view the Syncfusion® Blazor DataGrid 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.Grids.GridEvents-1.html#Syncfusion_Blazor_Grids_GridEvents_1_OnActionFailure) event. - -* **TValue** - Specifies the row data type of the grid (for example, Order). It enables strong typing for templates and event args and ensures proper binding/formatting. -* **GridEvents** - When you use GridEvents, set the same TValue on both SfGrid and GridEvents so the event argument types (like FailureEventArgs, RowSelectEventArgs) are correctly bound. +Exceptions that occur during DataGrid operations can be captured without interrupting the application flow. Use the [OnActionFailure](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridEvents-1.html#Syncfusion_Blazor_Grids_GridEvents_1_OnActionFailure) event to retrieve error details and handle them gracefully. -The argument passed to the `OnActionFailure` event contains the error details returned from the server. +**Key Points**: -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. +* **TValue**: Specifies the row data type for the grid (for example, Order). This ensures strong typing for templates and event arguments. +* **GridEvents**: When using [GridEvents](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridEvents-1.html#), set the same `TValue` on both [SfGrid](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#) and `GridEvents` for proper event argument binding. -The following sample code demonstrates notifying user when server-side exception has occurred during data operation: +N> Binding the `OnActionFailure` event during development helps identify issues early. Exception details can be logged or displayed for troubleshooting. {% tabs %} {% highlight razor %} @@ -399,6 +452,7 @@ The following sample code demonstrates notifying user when server-side exception @using Syncfusion.Blazor.Data @ErrorDetails + @@ -406,7 +460,7 @@ The following sample code demonstrates notifying user when server-side exception - + @@ -417,19 +471,18 @@ The following sample code demonstrates notifying user when server-side exception } -@code{ +@code { public string ErrorDetails = ""; - public class Order - { + + public class Order { public int? OrderID { get; set; } public string CustomerID { get; set; } public DateTime? OrderDate { get; set; } public double? Freight { get; set; } } - public void ActionFailure(FailureEventArgs args) - { - this.ErrorDetails = "Server exception: 404 Not found"; + public void ActionFailure(FailureEventArgs args) { + ErrorDetails = "Server exception: 404 Not Found"; StateHasChanged(); } } diff --git a/blazor/datagrid/getting-started-with-web-app.md b/blazor/datagrid/getting-started-with-web-app.md index 46d866c8ca..a6bce65ae7 100644 --- a/blazor/datagrid/getting-started-with-web-app.md +++ b/blazor/datagrid/getting-started-with-web-app.md @@ -9,9 +9,11 @@ documentation: ug # Getting Started with Blazor DataGrid in Web App -This section briefly explains about how to include [Syncfusion® Blazor DataGrid](https://www.syncfusion.com/blazor-components/blazor-datagrid) in your Blazor Web App using [Visual Studio](https://visualstudio.microsoft.com/vs/), [Visual Studio Code](https://code.visualstudio.com/), and the [.NET CLI](https://learn.microsoft.com/en-us/dotnet/core/tools/). +The [Syncfusion® Blazor DataGrid](https://www.syncfusion.com/blazor-components/blazor-datagrid) is a feature-rich component designed for displaying and managing data in Blazor applications. It supports essential functionalities such as **data binding**, **sorting**, **filtering**, **paging**, and **grouping**, enabling the **creation of interactive** and **responsive data-driven interfaces**. -> **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) +This guide provides detailed instructions for integrating the DataGrid into a **Blazor Web App** using [Visual Studio](https://visualstudio.microsoft.com/vs/), [Visual Studio Code](https://code.visualstudio.com/), or the [.NET CLI](https://learn.microsoft.com/en-us/dotnet/core/tools/). It includes setup steps, configuration details, and usage examples to assist in building robust applications. + +> For advanced integration assistance, refer to [AI Coding Assistant Overview](https://blazor.syncfusion.com/documentation/ai-coding-assistant/overview). {% tabcontents %} @@ -21,21 +23,36 @@ This section briefly explains about how to include [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. +A **Blazor Web App** can be created using **Visual Studio** with the built-in [Microsoft templates](https://learn.microsoft.com/en-us/aspnet/core/blazor/tooling?view=aspnetcore-10.0&pivots=vs) or the [Syncfusion® Blazor Extension](https://blazor.syncfusion.com/documentation/visual-studio-integration/template-studio). -Configure the appropriate [Interactive render mode](https://learn.microsoft.com/en-us/aspnet/core/blazor/components/render-modes?view=aspnetcore-10.0#render-modes) and [Interactivity location](https://learn.microsoft.com/en-us/aspnet/core/blazor/tooling?view=aspnetcore-10.0&pivots=vs) while creating a Blazor Web App. +1. Open **Visual Studio 2022** (version 17.8 or later). +2. Select **Create a new project**. +3. Choose **Blazor Web App** from the list of templates and click **Next**. +4. Specify the **project name**, **location**, and **solution settings**, then click **Next**. +5. Select the **target framework** as **.NET 8.0 or later** (choose the latest installed version available on the system). +6. Choose the [Interactive render mode](https://learn.microsoft.com/en-us/aspnet/core/blazor/components/render-modes?view=aspnetcore-9.0#render-modes)(Server, WebAssembly, or Auto) and [Interactivity location](https://learn.microsoft.com/en-us/aspnet/core/blazor/tooling?view=aspnetcore-9.0&pivots=vs). +7. Review the remaining options and click **Create** to generate the project. ![Create Blazor Web App](images/blazor-create-web-app.png) -## Install Blazor DataGrid and Themes NuGet in the Blazor Web App +## Install Syncfusion® Blazor NuGet Packages + +To integrate the Blazor DataGrid component, install the required Syncfusion® NuGet packages in the solution: + +1. Open **NuGet Package Manager** in Visual Studio: + + *Tools → NuGet Package Manager → Manage NuGet Packages for Solution*. -To add the **Syncfusion® Blazor DataGrid** in the app, open the NuGet package manager in Visual Studio (*Tools → NuGet Package Manager → Manage NuGet Packages for Solution*), then search and install [Syncfusion.Blazor.Grid](https://www.nuget.org/packages/Syncfusion.Blazor.Grid/) and [Syncfusion.Blazor.Themes](https://www.nuget.org/packages/Syncfusion.Blazor.Themes/). +2. Search and install the following packages: -If using the `WebAssembly or Auto` render modes in the Blazor Web App, install Syncfusion® Blazor component NuGet packages in the client project. + - [Syncfusion.Blazor.Grid](https://www.nuget.org/packages/Syncfusion.Blazor.Grid/) + - [Syncfusion.Blazor.Themes](https://www.nuget.org/packages/Syncfusion.Blazor.Themes/) -Alternatively, you can utilize the following package manager command to achieve the same. +3. For projects using **WebAssembly** or **Auto** interactive render modes, ensure these packages are installed in the **Client** project. + +4. Alternatively, use the **Package Manager Console**: {% tabs %} {% highlight C# tabtitle="Package Manager" %} @@ -46,7 +63,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 the [NuGet packages](https://blazor.syncfusion.com/documentation/nuget-packages) topic for the 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 packages, refer to [NuGet packages](https://blazor.syncfusion.com/documentation/nuget-packages). {% endtabcontent %} @@ -58,11 +75,10 @@ N> Syncfusion® Blazor components are availa ## 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-10.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. - -Configure the appropriate interactive render mode and interactivity location when setting up a Blazor Web App. For detailed information, 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. +1. Install the latest **.NET SDK** that supports **.NET 8.0 or later**. +2. Open **Visual Studio Code**. +3. Press **Ctrl + `** to open the integrated terminal. +4. Execute the following command to create a **Blazor Web App** with **Auto** [Interactive render mode](https://learn.microsoft.com/en-us/aspnet/core/blazor/components/render-modes?view=aspnetcore-10.0#render-modes): {% tabs %} {% highlight c# tabtitle="Blazor Web App" %} @@ -74,27 +90,33 @@ cd BlazorWebApp.Client {% endhighlight %} {% endtabs %} -## Install Blazor DataGrid and Themes NuGet in the app +N> For other **interactive render modes** and **interactivity locations**, refer to Render Modes [documentation](https://blazor.syncfusion.com/documentation/getting-started/blazor-web-app?tabcontent=visual-studio-code#render-interactive-modes). -If using the `WebAssembly` or `Auto` render modes in the Blazor Web App, install Syncfusion® Blazor component NuGet packages in the client project. +## Install Syncfusion® Blazor NuGet Packages in Visual Studio Code -* 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.Grid](https://www.nuget.org/packages/Syncfusion.Blazor.Grid) and [Syncfusion.Blazor.Themes](https://www.nuget.org/packages/Syncfusion.Blazor.Themes/) NuGet package and ensure all dependencies are installed. +To integrate the Blazor DataGrid component, install the required Syncfusion® NuGet packages using the **integrated terminal**: + +1. Press **Ctrl + `** to open the integrated terminal in Visual Studio Code. +2. Navigate to the directory containing the **.csproj** file. +3. Run the following commands to install the packages: + +* [Syncfusion.Blazor.Grid](https://www.nuget.org/packages/Syncfusion.Blazor.Grid) +* [Syncfusion.Blazor.Themes](https://www.nuget.org/packages/Syncfusion.Blazor.Themes/) {% tabs %} {% highlight c# tabtitle="Package Manager" %} -dotnet add package Syncfusion.Blazor.Grid -v {{ site.releaseversion }} -dotnet add package Syncfusion.Blazor.Themes -v {{ site.releaseversion }} -dotnet restore +Install-Package Syncfusion.Blazor.Grid -Version {{site.releaseversion}} +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 the [NuGet packages](https://blazor.syncfusion.com/documentation/nuget-packages) topic for the available NuGet packages list with component details. +4. For projects using **WebAssembly** or **Auto** interactive render modes, ensure these packages are installed in the **Client** project. + +N> Syncfusion® Blazor components are available on [nuget.org](https://www.nuget.org/packages?q=syncfusion.blazor). For a complete list of packages, refer to [NuGet packages](https://blazor.syncfusion.com/documentation/nuget-packages). {% endtabcontent %} @@ -102,7 +124,8 @@ N> Syncfusion® Blazor components are availa ## Prerequisites -Latest version of the [.NET 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). +1. Install the latest [.NET SDK](https://dotnet.microsoft.com/en-us/download) that supports .NET 8.0 or later. +2. Verify the installed version by running the following command in a command prompt (Windows), terminal (macOS), or shell (Linux): {% tabs %} {% highlight c# tabtitle=".NET CLI" %} @@ -114,11 +137,9 @@ 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. - -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). - -For example, in a Blazor Web App with `Auto` interactive render mode, use the following commands: +1. Open a **command prompt**, **terminal**, or **shell**. +2. Navigate to the directory where the project should be created. +3. Run the following command to create a new **Blazor Web App** with **Auto** interactive render mode: {% tabs %} {% highlight c# tabtitle=".NET CLI" %} @@ -130,13 +151,24 @@ cd BlazorApp.Client {% endhighlight %} {% endtabs %} -This command creates a new Blazor Web App and places it in a new directory called `BlazorApp` inside your current location. See the [Create a Blazor App](https://dotnet.microsoft.com/en-us/learn/aspnet/blazor-tutorial/create) and [dotnet new CLI command](https://learn.microsoft.com/en-us/aspnet/core/blazor/tooling?pivots=cli&view=aspnetcore-10.0) topics for more details. +4. Configure the appropriate [interactive render mode](https://learn.microsoft.com/en-us/aspnet/core/blazor/components/render-modes?view=aspnetcore-9.0#render-modes) and [interactivity location](https://learn.microsoft.com/en-us/aspnet/core/blazor/tooling?view=aspnetcore-9.0&pivots=vs) when setting up the application. For more details, see [Render Mode documentation](https://blazor.syncfusion.com/documentation/common/interactive-render-mode). +5. This command creates a new **Blazor Web App** in a directory named **BlazorApp** inside the current location. + +> For additional details, refer to: +>* [Blazor Web App Getting Started (.NET CLI)](https://blazor.syncfusion.com/documentation/getting-started/blazor-web-app?tabcontent=.net-cli) +>* [dotnet new CLI command](https://learn.microsoft.com/en-us/dotnet/core/tools/dotnet-new) +>* [Create Blazor App Tutorial](https://dotnet.microsoft.com/en-us/learn/aspnet/blazor-tutorial/create) -## Install Syncfusion® Blazor Grid and Themes NuGet in the App +## Install Syncfusion® Blazor NuGet Packages using .NET CLI -Here's an example of how to add **Blazor DataGrid** component in the application using the following command in the command prompt (Windows) or terminal (Linux and macOS) to install a [Syncfusion.Blazor.Grid](https://www.nuget.org/packages/Syncfusion.Blazor.Grid/) 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. +To integrate the Blazor DataGrid component in a **Blazor Web App** using the **.NET CLI**: -If using the `WebAssembly or Auto` render modes in the Blazor Web App, install Syncfusion® Blazor component NuGet packages in the client project. +1. Open a **command prompt**, **terminal**, or **shell**. +2. Navigate to the directory containing the **.csproj** file. +3. Run the following commands to install the required NuGet packages: + + - [Syncfusion.Blazor.Grid](https://www.nuget.org/packages/Syncfusion.Blazor.Grid/) + - [Syncfusion.Blazor.Themes](https://www.nuget.org/packages/Syncfusion.Blazor.Themes/) {% tabs %} {% highlight c# tabtitle=".NET CLI" %} @@ -148,7 +180,12 @@ dotnet restore {% endhighlight %} {% endtabs %} -N> Syncfusion® Blazor components are available in [nuget.org](https://www.nuget.org/packages?q=syncfusion.blazor). Refer to the [NuGet packages](https://blazor.syncfusion.com/documentation/nuget-packages) topic for the available NuGet packages list with component details. +4. For projects using **WebAssembly** or **Auto** interactive render modes, ensure these packages are installed in the **Client** project. + +N> For more details, refer to: + +> * [Install and manage packages using the dotnet CLI](https://learn.microsoft.com/en-us/nuget/consume-packages/install-use-packages-dotnet-cli) +> * Syncfusion® Blazor components are available on [nuget.org](https://www.nuget.org/packages?q=syncfusion.blazor). For a complete list of packages, refer to [NuGet packages](https://blazor.syncfusion.com/documentation/nuget-packages). {% endtabcontent %} @@ -156,7 +193,8 @@ N> Syncfusion® Blazor components are availa ## Add Import Namespaces -Open the **~/_Imports.razor** file in the client project and import the `Syncfusion.Blazor` and `Syncfusion.Blazor.Grids` namespaces. +1. Open the **~/_Imports.razor** file in the **Client** project. +2. Add the following namespaces: {% tabs %} {% highlight C# tabtitle="~/_Imports.razor" %} @@ -167,21 +205,44 @@ Open the **~/_Imports.razor** file in the client project and import the `Syncfus {% endhighlight %} {% endtabs %} +- For **WebAssembly** or **Auto** interactive render modes, update this file in the **Client** project. +- For **Server** interactive render mode, update this file in the **Components** folder. + ## Register Syncfusion® Blazor service -Register the Syncfusion® Blazor service in the **~/Program.cs** file of your Blazor Web App. +The Syncfusion® Blazor service must be registered in the **Program.cs** file. -If the **Interactive Render Mode** is set to `WebAssembly` or `Auto`, register the Syncfusion® Blazor service in the **~/Program.cs** files of the main `server` project and associated `.Client` project. +**Server Render Mode** + +For **Server** interactive render mode, register the service in the **Program.cs** file of the **Server** project: {% tabs %} {% highlight c# tabtitle="Server(~/_Program.cs)" hl_lines="3 11" %} -... -... using Syncfusion.Blazor; var builder = WebApplication.CreateBuilder(args); +// Add services to the container. +builder.Services.AddRazorComponents() + .AddInteractiveServerComponents(); +builder.Services.AddSyncfusionBlazor(); +var app = builder.Build() +.... + +{% endhighlight %} +{% endtabs %} + +**Auto or WebAssembly Render Mode** + +For **Auto** or **WebAssembly** interactive render modes, register the service in both **Server** and **Client** projects: +{% tabs %} +{% highlight c# tabtitle="Server(~/_Program.cs)" hl_lines="3 11" %} + +... +using Syncfusion.Blazor; + +var builder = WebApplication.CreateBuilder(args); // Add services to the container. builder.Services.AddRazorComponents() .AddInteractiveServerComponents() @@ -207,88 +268,88 @@ 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: +Syncfusion® Blazor themes and scripts are available through [Static Web Assets](https://blazor.syncfusion.com/documentation/appearance/themes#static-web-assets). Add the following references in the **~/Components/App.razor** file: + +**In the <head> section:** ```html - .... -.... +``` + +**At the end of the <body> section:** + +```html - .... - - //Blazor DataGrid Component script reference. - ``` -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> +* Refer to [Blazor Themes](https://blazor.syncfusion.com/documentation/appearance/themes) for various methods to reference themes in a Blazor application: + +>* [Static Web Assets](https://blazor.syncfusion.com/documentation/appearance/themes#static-web-assets) +>* [CDN](https://blazor.syncfusion.com/documentation/appearance/themes#cdn-reference) +>* [Custom Resource Generator (CRG)](https://blazor.syncfusion.com/documentation/common/custom-resource-generator) + +>* For script reference options, see [Adding Script References](https://blazor.syncfusion.com/documentation/common/adding-script-references). ## Add Blazor DataGrid -Add the Syncfusion® Blazor Grid 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 top of the component, as follows: +The Syncfusion® Blazor DataGrid can be added to a Razor page in the **Pages** folder (for example, **Pages/Home.razor**) in either the **Server** or **Client** project. -| Interactivity location | RenderMode | Code | -| --- | --- | --- | -| Per page/component | Auto | @rendermode InteractiveAuto | -| | WebAssembly | @rendermode InteractiveWebAssembly | -| | None | --- | +**1. Define Render Mode** -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. +To use the **DataGrid** component in a **Blazor Web App**, set the **render mode** at the top of the **.razor** file. {% tabs %} {% highlight razor %} -@* desired render mode define here *@ @rendermode InteractiveAuto {% endhighlight %} {% endtabs %} -{% tabs %} -{% highlight razor %} +**Available Render Modes** - +| Mode | Syntax | Description | +|---------------------------|----------------------------------------|--------------------------------------------------------------| +| **InteractiveAuto** | `@rendermode InteractiveAuto` | Automatically selects the appropriate mode based on the hosting environment. | +| **InteractiveWebAssembly**| `@rendermode InteractiveWebAssembly` | Executes component logic on the client using WebAssembly. | +| **InteractiveServer** | `@rendermode InteractiveServer` | Executes component logic on the server using SignalR. | -@code{ - public List Orders { get; set; } +**Interactivity Location** - protected override void OnInitialized() - { - Orders = Enumerable.Range(1, 5).Select(x => new Order() - { - OrderID = 0 + x, - CustomerID = (new string[] { "ALFKI", "ANANTR", "ANTON", "BLONP", "BOLID" })[new Random().Next(5)], - }).ToList(); - } +* **Global**: Render mode is configured in **App.razor** and applies to the entire application by default. +* **Per page/component**: Render mode is set at the top of the specific **Razor** file (for example, **Pages/Index.razor**). - public class Order - { - public int? OrderID { get; set; } - public string CustomerID { get; set; } +2. **Add DataGrid component** - } -} +Add the **DataGrid** tag to the **Razor** page: -{% endhighlight %} -{% endtabs %} +{% tabs %} +{% highlight razor %} -{% previewsample "https://blazorplayground.syncfusion.com/embed/BNVztWraLacsGbYO?appbar=false&editor=false&result=true&errorlist=false&theme=bootstrap5" backgroundimage "[Blazor DataGrid](images/blazor-datagrid-component.png)" %} + -* Press Ctrl+F5 (Windows) or +F5 (macOS) to launch the application. This will render the Syncfusion® Blazor Grid component in the default web browser. +{% endhighlight %} +{% endtabs %} ## Defining row data -To bind data for the Grid, you can assign a IEnumerable object to the [DataSource](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_DataSource) property. The list data source can also be provided as an instance of the **DataManager**. You can assign the data source through the `OnInitialized` life cycle of the page. +The DataGrid requires a data source to display records. A collection implementing **IEnumerable** can be assigned to the [DataSource](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_DataSource) property. Alternatively, data can be provided through a [DataManager](https://blazor.syncfusion.com/documentation/data/getting-started-with-web-app) instance for **remote binding**. + +Data binding is typically performed in the [OnInitialized](https://learn.microsoft.com/en-us/dotnet/api/microsoft.aspnetcore.components.componentbase.oninitialized?view=aspnetcore-10.0) lifecycle method of the component. {% tabs %} {% highlight razor %} - -@code{ + + + +@code { public List Orders { get; set; } protected override void OnInitialized() @@ -296,13 +357,14 @@ To bind data for the Grid, you can assign a IEnumerable object to the [DataSourc Orders = Enumerable.Range(1, 75).Select(x => new Order() { OrderID = 1000 + x, - CustomerID = (new string[] { "ALFKI", "ANANTR", "ANTON", "BLONP", "BOLID" })[new Random().Next(5)], + CustomerID = (new[] { "ALFKI", "ANANTR", "ANTON", "BLONP", "BOLID" })[new Random().Next(5)], Freight = 2.1 * x, - OrderDate = DateTime.Now.AddDays(-x), + OrderDate = DateTime.Now.AddDays(-x) }).ToList(); } - public class Order { + public class Order + { public int? OrderID { get; set; } public string CustomerID { get; set; } public DateTime? OrderDate { get; set; } @@ -313,27 +375,32 @@ To bind data for the Grid, you can assign a IEnumerable object to the [DataSourc {% endhighlight %} {% endtabs %} +* Press Ctrl+F5 (Windows) or +F5 (macOS) to run the application. The DataGrid will render and display the collection. + +{% previewsample "https://blazorplayground.syncfusion.com/embed/rtLSMLthxegYrbQD?appbar=false&editor=false&result=true&errorlist=false&theme=bootstrap5" %} ## Defining columns -The columns are automatically generated when columns declaration is empty or undefined while initializing the Grid. +The DataGrid automatically generates columns when no explicit column definitions are provided. For greater control over column behavior and appearance, use the [GridColumns](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridColumns.html) component along with individual [GridColumn](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridColumn.html) elements to define columns explicitly. -The Grid has an option to define columns using [GridColumns](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridColumns.html) component. To customize column properties, use [GridColumns](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridColumns.html). +**Common Column Properties** -Let’s check the properties used here: -* [Field](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridColumn.html#Syncfusion_Blazor_Grids_GridColumn_Field) is added to map with a property name in IEnumerable object. -* [HeaderText](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridColumn.html#Syncfusion_Blazor_Grids_GridColumn_HeaderText) is added to change the title of columns. -* [TextAlign](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridColumn.html#Syncfusion_Blazor_Grids_GridColumn_TextAlign) is used to change the alignment of columns. By default, columns will be left aligned. To change columns to right align, define [TextAlign](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridColumn.html#Syncfusion_Blazor_Grids_GridColumn_TextAlign) as **Right**. -* Also, you have used another useful property, [Format](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridColumn.html#Syncfusion_Blazor_Grids_GridColumn_Format). Using this, you can format number and date values to standard or custom formats. +* [Field](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridColumn.html#Syncfusion_Blazor_Grids_GridColumn_Field): Maps the column to a property in the bound collection. +* [HeaderText](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridColumn.html#Syncfusion_Blazor_Grids_GridColumn_HeaderText): Specifies the column header title. +* [TextAlign](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridColumn.html#Syncfusion_Blazor_Grids_GridColumn_TextAlign): Aligns text within the column. Default alignment is Left; set to Right for numeric values. +* [Format](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridColumn.html#Syncfusion_Blazor_Grids_GridColumn_Format): Applies standard or custom formatting for numeric and date values. +* [Type](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridColumn.html#Syncfusion_Blazor_Grids_GridColumn_Type): Defines the column type, such as ColumnType.Date for date fields. +* [Width](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridColumn.html#Syncfusion_Blazor_Grids_GridColumn_Width): Sets the column width in pixels or percentage to control layout consistency. {% tabs %} {% highlight razor %} + - + @@ -343,19 +410,19 @@ Let’s check the properties used here: ## Enable paging -The paging feature enables users to view the Syncfusion® Blazor DataGrid record in a paged view. It can be enabled by setting the [AllowPaging](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_AllowPaging) property to true. Pager can be customized using the [GridPageSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_PageSettings). +[Paging](https://blazor.syncfusion.com/documentation/datagrid/paging) allows the DataGrid to display records in a paged view, improving performance and readability for large datasets. Enable paging by setting the [AllowPaging](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_AllowPaging) property to **true**. Paging behavior can be customized using the [GridPageSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridPageSettings.html) component. {% tabs %} {% highlight razor %} - - - - - - - + + + + + + + {% endhighlight %} @@ -363,7 +430,7 @@ The paging feature enables users to view the Syncfusion® Blazor DataGrid record in a grouped view. It can be enabled by setting the [AllowGrouping](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_AllowGrouping) property as true. Grouping feature can be customized using the [GridGroupSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_GroupSettings). +[Grouping](https://blazor.syncfusion.com/documentation/datagrid/grouping) organizes records into logical groups based on column values. Enable grouping by setting the [AllowGrouping](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_AllowGrouping) property to **true**. Grouping behavior can be customized using the [GridGroupSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridGroupSettings.html) component. {% tabs %} {% highlight razor %} - - - - - - - + + + + + + + {% endhighlight %} @@ -425,16 +492,14 @@ The grouping feature enables you to view the Syncfusion® Blazor DataGrid 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.Grids.GridEvents-1.html#Syncfusion_Blazor_Grids_GridEvents_1_OnActionFailure) event. - -* **TValue** - Specifies the row data type of the grid (for example, Order). It enables strong typing for templates and event args and ensures proper binding/formatting. -* **GridEvents** - When you use GridEvents, set the same TValue on both SfGrid and GridEvents so the event argument types (like FailureEventArgs, RowSelectEventArgs) are correctly bound. +Exceptions that occur during DataGrid operations can be captured without interrupting the application flow. Use the [OnActionFailure](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridEvents-1.html#Syncfusion_Blazor_Grids_GridEvents_1_OnActionFailure) event to retrieve error details and handle them gracefully. -The argument passed to the [OnActionFailure](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridEvents-1.html#Syncfusion_Blazor_Grids_GridEvents_1_OnActionFailure) event contains the error details returned from the server. +**Key Points**: -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. +* **TValue**: Specifies the row data type for the grid (for example, Order). This ensures strong typing for templates and event arguments. +* **GridEvents**: When using [GridEvents](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridEvents-1.html#), set the same `TValue` on both [SfGrid](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#) and `GridEvents` for proper event argument binding. -The following sample code demonstrates notifying user when server-side exception has occurred during data operation, +N> Binding the `OnActionFailure` event during development helps identify issues early. Exception details can be logged or displayed for troubleshooting. {% tabs %} {% highlight razor %} @@ -442,6 +507,7 @@ The following sample code demonstrates notifying user when server-side exception @using Syncfusion.Blazor.Data @ErrorDetails + @@ -449,7 +515,7 @@ The following sample code demonstrates notifying user when server-side exception - + @@ -460,19 +526,18 @@ The following sample code demonstrates notifying user when server-side exception } -@code{ +@code { public string ErrorDetails = ""; - public class Order - { + + public class Order { public int? OrderID { get; set; } public string CustomerID { get; set; } public DateTime? OrderDate { get; set; } public double? Freight { get; set; } } - public void ActionFailure(FailureEventArgs args) - { - this.ErrorDetails = "Server exception: 404 Not found"; + public void ActionFailure(FailureEventArgs args) { + ErrorDetails = "Server exception: 404 Not Found"; StateHasChanged(); } } diff --git a/blazor/datagrid/getting-started.md b/blazor/datagrid/getting-started.md index 0ed5379ccf..13b2f7a605 100644 --- a/blazor/datagrid/getting-started.md +++ b/blazor/datagrid/getting-started.md @@ -11,7 +11,7 @@ documentation: ug This section briefly explains about how to include [Syncfusion® Blazor DataGrid](https://www.syncfusion.com/blazor-components/blazor-datagrid) in your Blazor webAssembly app using Visual Studio, Visual Studio code and .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) +> For advanced integration assistance, refer to [AI Coding Assistant Overview](https://blazor.syncfusion.com/documentation/ai-coding-assistant/overview). {% tabcontents %} @@ -21,13 +21,33 @@ This section briefly explains about how to include [Syncfusion® Blazor Extension](https://blazor.syncfusion.com/documentation/visual-studio-integration/template-studio). For detailed instructions, refer to [this Blazor WASM Getting Started](https://blazor.syncfusion.com/documentation/getting-started/blazor-webassembly-app) documentation. +A **Blazor WebAssembly App** can be created using **Visual Studio 2022** with the built-in [Microsoft templates](https://learn.microsoft.com/en-us/aspnet/core/blazor/tooling?view=aspnetcore-10.0&pivots=vsc) or the [Syncfusion® Blazor Extension](https://blazor.syncfusion.com/documentation/visual-studio-integration/template-studio). -## Install Blazor DataGrid and Themes NuGet in the app +1. Open **Visual Studio 2022** (v17.8 or later). +2. Select **Create a new project**. +3. Choose **Blazor WebAssembly Standalone App** from the list of templates and click **Next**. +4. Configure the **project name**, **location**, and **solution settings**, then click **Next**. +5. Select the **target framework** as **.NET 8.0 or later** (choose the latest installed version available on the system). +6. Click **Create** to generate the project. -To add **Syncfusion® Blazor DataGrid** 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.Grid](https://www.nuget.org/packages/Syncfusion.Blazor.Grid/) 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. +N> For detailed steps, refer to [Microsoft Blazor tooling documentation](https://learn.microsoft.com/en-us/aspnet/core/blazor/tooling?view=aspnetcore-9.0&pivots=vs). + +## Install Syncfusion® Blazor DataGrid and Themes in Visual Studio + +To integrate the Blazor DataGrid component, install the required NuGet packages in the **Blazor WebAssembly** project: + +1. Open **NuGet Package Manager** in Visual Studio: + + *Tools → NuGet Package Manager → Manage NuGet Packages for Solution*. + +2. Search and install the following packages: + + - [Syncfusion.Blazor.Grid](https://www.nuget.org/packages/Syncfusion.Blazor.Grid/) + - [Syncfusion.Blazor.Themes](https://www.nuget.org/packages/Syncfusion.Blazor.Themes/) + +3. Alternatively, use the **Package Manager Console**: {% tabs %} {% highlight C# tabtitle="Package Manager" %} @@ -38,7 +58,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). For a complete list of packages, refer to [NuGet packages](https://blazor.syncfusion.com/documentation/nuget-packages). {% endtabcontent %} @@ -48,11 +68,14 @@ N> Syncfusion® Blazor components are availa * [System requirements for Blazor components](https://blazor.syncfusion.com/documentation/system-requirements) -## Create a new Blazor app in Visual Studio code +## Create a Blazor WebAssembly application in Visual Studio Code -You can create a **Blazor webAssembly 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 WASM App Getting Started](https://blazor.syncfusion.com/documentation/getting-started/blazor-webassembly-app?tabcontent=visual-studio-code) documentation. +A **Blazor WebAssembly App** can be created using **Visual Studio Code** with the built-in [Microsoft templates](https://learn.microsoft.com/en-us/aspnet/core/blazor/tooling?view=aspnetcore-10.0&pivots=vsc) or the [Syncfusion® Blazor Extension](https://blazor.syncfusion.com/documentation/visual-studio-code-integration/create-project). -Alternatively, you can create a WebAssembly application using the following command in the terminal(Ctrl+`). +1. Open **Visual Studio Code**. +2. Press **Ctrl + `** to open the integrated terminal. +3. Navigate to the desired directory where the project should be created. +4. Run the following command to create a new Blazor WebAssembly project {% tabs %} @@ -65,11 +88,16 @@ cd BlazorApp {% endtabs %} -## Install Blazor DataGrid and Themes NuGet in the app +## ## Install Syncfusion® Blazor DataGrid and Themes in Visual Studio Code + +To integrate the Blazor DataGrid component, install the required Syncfusion® NuGet packages using the **integrated terminal**: -* 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.Grid](https://www.nuget.org/packages/Syncfusion.Blazor.Grid) and [Syncfusion.Blazor.Themes](https://www.nuget.org/packages/Syncfusion.Blazor.Themes/) NuGet package and ensure all dependencies are installed. +1. Press **Ctrl + `** to open the integrated terminal in Visual Studio Code. +2. Navigate to the directory containing the **.csproj** file. +3. Run the following commands to install the packages: + +* [Syncfusion.Blazor.Grid](https://www.nuget.org/packages/Syncfusion.Blazor.Grid) +* [Syncfusion.Blazor.Themes](https://www.nuget.org/packages/Syncfusion.Blazor.Themes/) {% tabs %} @@ -83,7 +111,7 @@ dotnet restore {% 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 packages, refer to [NuGet packages](https://blazor.syncfusion.com/documentation/nuget-packages). {% endtabcontent %} @@ -103,7 +131,9 @@ dotnet --version ## Create a Blazor WebAssembly App using .NET CLI -Run the `dotnet new blazorwasm` command to create a new Blazor WebAssembly App in a command prompt (Windows) or terminal (macOS) or command shell (Linux). +1. Open a command prompt, terminal, or shell. +2. Navigate to the directory where the project should be created. +3. Run the following command to create a new Blazor WebAssembly App: {% tabs %} {% highlight c# tabtitle=".NET CLI" %} @@ -114,11 +144,23 @@ cd BlazorApp {% endhighlight %} {% endtabs %} -This command creates new Blazor WebAssembly 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. +4. This command creates a new **Blazor WebAssembly App** in a directory named **BlazorApp** inside the current location. + +> For additional details, refer to: +>* [Blazor Web App Getting Started (.NET CLI)](https://blazor.syncfusion.com/documentation/getting-started/blazor-webassembly-app?tabcontent=.net-cli) +>* [dotnet new CLI command](https://learn.microsoft.com/en-us/dotnet/core/tools/dotnet-new) +>* [Create Blazor App Tutorial](https://dotnet.microsoft.com/en-us/learn/aspnet/blazor-tutorial/create) -## Install Syncfusion® Blazor DataGrid and Themes NuGet in the App +## ## Install Syncfusion® Blazor DataGrid and Themes using .NET CLI -Here's an example of how to add **Blazor DataGrid** component in the application using the following command in the command prompt (Windows) or terminal (Linux and macOS) to install a [Syncfusion.Blazor.Grid](https://www.nuget.org/packages/Syncfusion.Blazor.Grid) 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. +To integrate the Blazor DataGrid component in a **Blazor WebAssembly App** using the **.NET CLI**: + +1. Open a **command prompt**, **terminal**, or **shell**. +2. Navigate to the directory containing the **.csproj** file. +3. Run the following commands to install the required NuGet packages: + + - [Syncfusion.Blazor.Grid](https://www.nuget.org/packages/Syncfusion.Blazor.Grid/) + - [Syncfusion.Blazor.Themes](https://www.nuget.org/packages/Syncfusion.Blazor.Themes/) {% tabs %} {% highlight c# tabtitle=".NET CLI" %} @@ -130,7 +172,10 @@ 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> For more details, refer to: + +> * [Install and manage packages using the dotnet CLI](https://learn.microsoft.com/en-us/nuget/consume-packages/install-use-packages-dotnet-cli) +> * Syncfusion® Blazor components are available on [nuget.org](https://www.nuget.org/packages?q=syncfusion.blazor). For a complete list of packages, refer to [NuGet packages](https://blazor.syncfusion.com/documentation/nuget-packages). {% endtabcontent %} @@ -138,7 +183,8 @@ N> Syncfusion® Blazor components are availa ## Add Import Namespaces -Open the **~/_Imports.razor** file and import the `Syncfusion.Blazor` and `Syncfusion.Blazor.Grids` namespace. +1. Open the **_Imports.razor** file in the project root. +2. Add the following namespace directives: {% tabs %} {% highlight razor tabtitle="~/_Imports.razor" %} @@ -151,7 +197,7 @@ Open the **~/_Imports.razor** file and import the `Syncfusion.Blazor` and `Syncf ## Register Syncfusion® Blazor service -Register the Syncfusion® Blazor service in the **~/Program.cs** file of your Blazor webAssembly app. +Open the **~/Program.cs** file and register the Syncfusion® Blazor service by adding the following code: {% tabs %} {% highlight C# tabtitle="~/Program.cs" hl_lines="3 11" %} @@ -161,80 +207,69 @@ using Microsoft.AspNetCore.Components.WebAssembly.Hosting; using Syncfusion.Blazor; var builder = WebAssemblyHostBuilder.CreateDefault(args); -builder.RootComponents.Add("#app"); -builder.RootComponents.Add("head::after"); +builder.RootComponents.Add("#app"); +builder.RootComponents.Add("head::after"); -builder.Services.AddScoped(sp => new HttpClient { BaseAddress = new Uri(builder.HostEnvironment.BaseAddress) }); +builder.Services.AddScoped(sp => new HttpClient +{ + BaseAddress = new Uri(builder.HostEnvironment.BaseAddress) +}); builder.Services.AddSyncfusionBlazor(); await builder.Build().RunAsync(); -.... {% 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 references in the `` section of the **~/index.html** file. +The theme stylesheet and script files are provided through [Static Web Assets](https://blazor.syncfusion.com/documentation/appearance/themes#static-web-asset) in the NuGet packages. Include these references in the **** section of the **~/wwwroot/index.html** file: ```html .... - - //Blazor DataGrid Component script reference. - ``` -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. -## Add Blazor DataGrid component +N> +* Refer to [Blazor Themes](https://blazor.syncfusion.com/documentation/appearance/themes) for various methods to reference themes in a Blazor application: -Add the Syncfusion® Blazor DataGrid component in the **~/Pages/Index.razor** file. + >* [Static Web Assets](https://blazor.syncfusion.com/documentation/appearance/themes#static-web-assets) + >* [CDN](https://blazor.syncfusion.com/documentation/appearance/themes#cdn-reference) + >* [Custom Resource Generator (CRG)](https://blazor.syncfusion.com/documentation/common/custom-resource-generator) -{% tabs %} -{% highlight razor %} +>* For script reference options, see [Adding Script References](https://blazor.syncfusion.com/documentation/common/adding-script-references). - - -@code{ - public List Orders { get; set; } +## Add Blazor DataGrid component - protected override void OnInitialized() - { - Orders = Enumerable.Range(1, 5).Select(x => new Order() - { - OrderID = 0 + x, - CustomerID = (new string[] { "ALFKI", "ANANTR", "ANTON", "BLONP", "BOLID" })[new Random().Next(5)], - }).ToList(); - } +Add the Syncfusion® Blazor DataGrid component in the **~/Pages/Home.razor** file. - public class Order - { - public int? OrderID { get; set; } - public string CustomerID { get; set; } +{% tabs %} +{% highlight razor %} - } -} + {% endhighlight %} {% endtabs %} -* Press Ctrl+F5 (Windows) or +F5 (macOS) to launch the application. This will render the Syncfusion® Blazor DataGrid in your default web browser. - -{% previewsample "https://blazorplayground.syncfusion.com/embed/BNVztWraLacsGbYO?appbar=false&editor=false&result=true&errorlist=false&theme=bootstrap5" backgroundimage "[Blazor DataGrid](images/blazor-datagrid-component.png)" %} +* The component will render as an empty grid until data is bound. ## Defining row data -To bind data for the Grid, you can assign a IEnumerable object to the [DataSource](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_DataSource) property. The list data source can also be provided as an instance of the **DataManager**. You can assign the data source through the `OnInitialized` life cycle of the page. +The DataGrid requires a data source to display records. A collection implementing **IEnumerable** can be assigned to the [DataSource](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_DataSource) property. Alternatively, data can be provided through a [DataManager](https://blazor.syncfusion.com/documentation/data/getting-started-with-web-app) instance for **remote binding**. + +Data binding is typically performed in the [OnInitialized](https://learn.microsoft.com/en-us/dotnet/api/microsoft.aspnetcore.components.componentbase.oninitialized?view=aspnetcore-10.0) lifecycle method of the component. {% tabs %} {% highlight razor %} - -@code{ + + + +@code { public List Orders { get; set; } protected override void OnInitialized() @@ -242,13 +277,14 @@ To bind data for the Grid, you can assign a IEnumerable object to the [DataSourc Orders = Enumerable.Range(1, 75).Select(x => new Order() { OrderID = 1000 + x, - CustomerID = (new string[] { "ALFKI", "ANANTR", "ANTON", "BLONP", "BOLID" })[new Random().Next(5)], + CustomerID = (new[] { "ALFKI", "ANANTR", "ANTON", "BLONP", "BOLID" })[new Random().Next(5)], Freight = 2.1 * x, - OrderDate = DateTime.Now.AddDays(-x), + OrderDate = DateTime.Now.AddDays(-x) }).ToList(); } - public class Order { + public class Order + { public int? OrderID { get; set; } public string CustomerID { get; set; } public DateTime? OrderDate { get; set; } @@ -259,27 +295,32 @@ To bind data for the Grid, you can assign a IEnumerable object to the [DataSourc {% endhighlight %} {% endtabs %} +* Press Ctrl+F5 (Windows) or +F5 (macOS) to run the application. The DataGrid will render and display the collection. + +{% previewsample "https://blazorplayground.syncfusion.com/embed/rtLSMLthxegYrbQD?appbar=false&editor=false&result=true&errorlist=false&theme=bootstrap5" %} ## Defining columns -The columns are automatically generated when columns declaration is empty or undefined while initializing the Grid. +The DataGrid automatically generates columns when no explicit column definitions are provided. For greater control over column behavior and appearance, use the [GridColumns](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridColumns.html) component along with individual [GridColumn](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridColumn.html) elements to define columns explicitly. -The Grid has an option to define columns using [GridColumns](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridColumns.html). To customize column properties, use [GridColumns](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridColumns.html). +**Common Column Properties** -Let’s check the properties used here: -* [Field](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridColumn.html#Syncfusion_Blazor_Grids_GridColumn_Field) is added to map with a property name in IEnumerable object. -* [HeaderText](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridColumn.html#Syncfusion_Blazor_Grids_GridColumn_HeaderText) is added to change the title of columns. -* [TextAlign](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridColumn.html#Syncfusion_Blazor_Grids_GridColumn_TextAlign) is used to change the alignment of columns. By default, columns will be left aligned. To change columns to right align, define [TextAlign](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridColumn.html#Syncfusion_Blazor_Grids_GridColumn_TextAlign) as **Right**. -* Also, you have used another useful property, [Format](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridColumn.html#Syncfusion_Blazor_Grids_GridColumn_Format). Using this, you can format number and date values to standard or custom formats. +* [Field](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridColumn.html#Syncfusion_Blazor_Grids_GridColumn_Field): Maps the column to a property in the bound collection. +* [HeaderText](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridColumn.html#Syncfusion_Blazor_Grids_GridColumn_HeaderText): Specifies the column header title. +* [TextAlign](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridColumn.html#Syncfusion_Blazor_Grids_GridColumn_TextAlign): Aligns text within the column. Default alignment is Left; set to Right for numeric values. +* [Format](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridColumn.html#Syncfusion_Blazor_Grids_GridColumn_Format): Applies standard or custom formatting for numeric and date values. +* [Type](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridColumn.html#Syncfusion_Blazor_Grids_GridColumn_Type): Defines the column type, such as ColumnType.Date for date fields. +* [Width](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridColumn.html#Syncfusion_Blazor_Grids_GridColumn_Width): Sets the column width in pixels or percentage to control layout consistency. {% tabs %} {% highlight razor %} + - + @@ -289,19 +330,19 @@ Let’s check the properties used here: ## Enable paging -The paging feature enables users to view the Syncfusion® Blazor DataGrid record in a paged view. It can be enabled by setting the [AllowPaging](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_AllowPaging) property to true. Pager can be customized using the [GridPageSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_PageSettings). +[Paging](https://blazor.syncfusion.com/documentation/datagrid/paging) allows the DataGrid to display records in a paged view, improving performance and readability for large datasets. Enable paging by setting the [AllowPaging](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_AllowPaging) property to **true**. Paging behavior can be customized using the [GridPageSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridPageSettings.html) component. {% tabs %} {% highlight razor %} - - - - - - - + + + + + + + {% endhighlight %} @@ -309,7 +350,7 @@ The paging feature enables users to view the Syncfusion® Blazor DataGrid record in a grouped view. It can be enabled by setting the [AllowGrouping](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_AllowGrouping) property as true. Grouping feature can be customized using the [GridGroupSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_GroupSettings). +[Grouping](https://blazor.syncfusion.com/documentation/datagrid/grouping) organizes records into logical groups based on column values. Enable grouping by setting the [AllowGrouping](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_AllowGrouping) property to **true**. Grouping behavior can be customized using the [GridGroupSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridGroupSettings.html) component. {% tabs %} {% highlight razor %} - - - - - - - + + + + + + + {% endhighlight %} @@ -371,16 +412,14 @@ The grouping feature enables you to view the Syncfusion® Blazor DataGrid 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.Grids.GridEvents-1.html#Syncfusion_Blazor_Grids_GridEvents_1_OnActionFailure) event. - -* **TValue** - Specifies the row data type of the grid (for example, Order). It enables strong typing for templates and event args and ensures proper binding/formatting. -* **GridEvents** - When you use GridEvents, set the same TValue on both SfGrid and GridEvents so the event argument types (like FailureEventArgs, RowSelectEventArgs) are correctly bound. +Exceptions that occur during DataGrid operations can be captured without interrupting the application flow. Use the [OnActionFailure](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridEvents-1.html#Syncfusion_Blazor_Grids_GridEvents_1_OnActionFailure) event to retrieve error details and handle them gracefully. -The argument passed to the `OnActionFailure` event contains the error details returned from the server. +**Key Points**: -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. +* **TValue**: Specifies the row data type for the grid (for example, Order). This ensures strong typing for templates and event arguments. +* **GridEvents**: When using [GridEvents](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridEvents-1.html#), set the same `TValue` on both [SfGrid](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#) and `GridEvents` for proper event argument binding. -The following sample code demonstrates notifying user when server-side exception has occurred during data operation: +N> Binding the `OnActionFailure` event during development helps identify issues early. Exception details can be logged or displayed for troubleshooting. {% tabs %} {% highlight razor %} @@ -388,6 +427,7 @@ The following sample code demonstrates notifying user when server-side exception @using Syncfusion.Blazor.Data @ErrorDetails + @@ -395,7 +435,7 @@ The following sample code demonstrates notifying user when server-side exception - + @@ -406,26 +446,24 @@ The following sample code demonstrates notifying user when server-side exception } -@code{ +@code { public string ErrorDetails = ""; - public class Order - { + + public class Order { public int? OrderID { get; set; } public string CustomerID { get; set; } public DateTime? OrderDate { get; set; } public double? Freight { get; set; } } - public void ActionFailure(FailureEventArgs args) - { - this.ErrorDetails = "Server exception: 404 Not found"; + public void ActionFailure(FailureEventArgs args) { + ErrorDetails = "Server exception: 404 Not Found"; StateHasChanged(); } } {% endhighlight %} {% endtabs %} - ## See Also * [Getting started with Syncfusion® Blazor DataGrid in Server Side App using .NET Core CLI](https://blazor.syncfusion.com/documentation/getting-started/blazor-web-app) From 871f599f83577c13d58cd85293036f87bd2dc082 Mon Sep 17 00:00:00 2001 From: SadhanaBaskaran Date: Wed, 3 Dec 2025 02:31:18 +0530 Subject: [PATCH 160/266] 984421: Updated the UG content and samples for Paging in DataGrid --- blazor/datagrid/paging.md | 217 +++++++++----------------------------- 1 file changed, 48 insertions(+), 169 deletions(-) diff --git a/blazor/datagrid/paging.md b/blazor/datagrid/paging.md index 1ebe43104e..ae436ffea1 100644 --- a/blazor/datagrid/paging.md +++ b/blazor/datagrid/paging.md @@ -1,7 +1,7 @@ --- layout: post title: Paging in Blazor DataGrid Component | Syncfusion -description: Checkout and learn here all about Paging in Syncfusion Blazor DataGrid component and much more details. +description: Learn how to configure paging in the Syncfusion Blazor DataGrid, including page size, page count, current page, pager templates, events, and top pager layout. platform: Blazor control: DataGrid documentation: ug @@ -9,23 +9,21 @@ documentation: ug # Paging in Blazor DataGrid -[Paging](https://www.syncfusion.com/blazor-components/blazor-datagrid/paging) provides an option to display Syncfusion Blazor DataGrid data in segmented pages, making it easier to navigate through large datasets. This feature is particularly useful when dealing with extensive data sets. +Paging provides an option to display Syncfusion Blazor DataGrid data in segmented pages, making it easier to navigate large datasets. This feature is particularly useful when dealing with extensive data sets. -To enable paging, you need to set the [AllowPaging](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_AllowPaging) property to **true**. This property determines whether paging is enabled or disabled for the Grid. When paging is enabled, a pager rendered at the bottom of the Grid, allowing you to navigate through different pages of data. +To enable paging, set the [AllowPaging](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_AllowPaging) property to **true**. When paging is enabled, a pager is rendered at the bottom of the Grid, allowing navigation through different pages of data. -Paging options can be configured through the [GridPageSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_PageSettings) component. The `GridPageSettings` allows you to control various aspects of paging, such as the page size, current page, and total number of records. +Paging options can be configured through the [GridPageSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_PageSettings) component. GridPageSettings allows control of page size, current page, and total record count. -> You can achieve better performance by using Grid paging to fetch only a pre-defined number of records from the data source. +> For large data sources, paging improves performance by fetching and rendering only a subset of records per page. For remote data, combine paging with server-side data retrieval to avoid loading all records at once. ## Customize the pager options -Customizing the pager options in the Syncfusion® Blazor DataGrid allows you to tailor the pagination according to your specific requirements. You can customize the pager to display the number of pages using the `PageCount` property, change the current page using `CurrentPage` property, display the number of records in the Grid using the `PageSize` property, and even adjust the page sizes in a dropdown using the `PageSizes` property. +Customizing pager options in Syncfusion® Blazor DataGri helps adjust pagination to specific needs. The **PageCount** property sets the number of numeric buttons. The **CurrentPage** property defines the active page. The **PageSize** property specifies the number of records displayed per page. The **PageSizes** property provides a dropdown for selecting different page sizes. ### Change the page size -The Syncfusion® Blazor DataGrid allows you to control the number of records displayed per page, providing you with flexibility in managing your data. This feature is particularly useful when you want to adjust the amount of data visible to you at any given time. To achieve this, you can utilize the [PageSize](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridPageSettings.html#Syncfusion_Blazor_Grids_GridPageSettings_PageSize) property in [GridPageSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_PageSettings) component. This property is used to specify the initial number of records to display on each page. The default value of pageSize property is 12. - -The following example demonstrates how to change the page size of a Grid using an external button click based on **NumericTextBox** input. +The Syncfusion® Blazor DataGrid allows control over the number of records displayed per page. Use the [PageSize](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridPageSettings.html#Syncfusion_Blazor_Grids_GridPageSettings_PageSize) property in [GridPageSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_PageSettings) to specify the initial page size. By default, **PageSize is 12**. {% tabs %} {% highlight razor tabtitle="Index.razor" %} @@ -129,11 +127,9 @@ The following example demonstrates how to change the page size of a Grid using a ### Change the page count -The Syncfusion® Blazor DataGrid allows you to adjust the number of pages displayed in the pager container. This is useful when you want to manage the number of pages you see while navigating through extensive datasets. The default value of **PageCount** property is 8. - -To change the page count in the Syncfusion® Blazor DataGrid, you can utilize the [PageCount](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridPageSettings.html#Syncfusion_Blazor_Grids_GridPageSettings_PageCount) property in [GridPageSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_PageSettings) component, which defines the number of pages displayed in the pager container. +The Syncfusion® Blazor DataGrid allows adjusting the number of numeric buttons displayed in the pager. By default, **PageCount is 8**. -The following example demonstrates how to change the page count of a Grid using an external button click based on **NumericTextBox** input. +To change the page count, use the [PageCount](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridPageSettings.html#Syncfusion_Blazor_Grids_GridPageSettings_PageCount) property in [GridPageSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_PageSettings), which defines how many pages are shown in the pager container. {% tabs %} {% highlight razor tabtitle="Index.razor" %} @@ -236,11 +232,9 @@ public class OrderData ### Change the current page -The Syncfusion® Blazor DataGrid allows you to change the currently displayed page, which can be particularly useful when you need to navigate through different pages of data either upon the initial rendering of the Grid or update the displayed page based on interactions or specific conditions. The default value of **CurrentPage** property is 1. - -To change the current page in the Grid, you can utilize the [CurrentPage](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridPageSettings.html#Syncfusion_Blazor_Grids_GridPageSettings_CurrentPage) property in [GridPageSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_PageSettings) component, which defines the current page number of the pager. +The Syncfusion® Blazor DataGrid allows changing the currently displayed page, either on initial render or based on interactions or conditions. By default, **CurrentPage is 1**. -The following example demonstrates how to dynamically change the current page using an external button click based on **NumericTextBox** input. +To change the current page, use the [CurrentPage](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridPageSettings.html#Syncfusion_Blazor_Grids_GridPageSettings_CurrentPage) property in [GridPageSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_PageSettings), which sets the current page number. {% tabs %} {% highlight razor tabtitle="Index.razor" %} @@ -341,110 +335,11 @@ public class OrderData {% previewsample "https://blazorplayground.syncfusion.com/embed/BtLJjCLJKHyfBBpf?appbar=false&editor=false&result=true&errorlist=false&theme=bootstrap5" %} - - ## Pager template -The pager template in Syncfusion® Blazor DataGrid allows you to customize the appearance and behavior of the pager element, which is used for navigation through different pages of Grid data. This feature is particularly useful when you want to use custom elements inside the pager instead of the default elements. +The pager template in Syncfusion® Blazor DataGrid allows customizing the appearance and behavior of the pager by using custom elements instead of default items. -To use the pager template, you need to specify the [Template](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridPageSettings.html#Syncfusion_Blazor_Grids_GridPageSettings_Template) property of the [GridPageSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridPageSettings.html) component in your Grid configuration. The pagerTemplate property allows you to define a custom template for the pager. Within the Template, you can access the [CurrentPage](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridPageSettings.html#Syncfusion_Blazor_Grids_GridPageSettings_CurrentPage), [PageSize](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridPageSettings.html#Syncfusion_Blazor_Grids_GridPageSettings_PageSize), [PageCount](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridPageSettings.html#Syncfusion_Blazor_Grids_GridPageSettings_PageCount), **TotalPage** and **TotalRecordCount** values. - -The following example demonstrates how to render a **NumericTextBox** in the pager using the `Template` property +To use the pager template, specify the [Template](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridPageSettings.html#Syncfusion_Blazor_Grids_GridPageSettings_Template) property of the [GridPageSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridPageSettings.html) component. Within the template, the context provides access to values such as [CurrentPage](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridPageSettings.html#Syncfusion_Blazor_Grids_GridPageSettings_CurrentPage), [PageSize](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridPageSettings.html#Syncfusion_Blazor_Grids_GridPageSettings_PageSize), [PageCount](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridPageSettings.html#Syncfusion_Blazor_Grids_GridPageSettings_PageCount), TotalPages, and TotalRecordsCount. {% tabs %} {% highlight razor tabtitle="Index.razor" %} @@ -453,25 +348,19 @@ The following example demonstrates how to render a **NumericTextBox** in the pag @using Syncfusion.Blazor.Navigations - + @@ -483,19 +372,19 @@ The following example demonstrates how to render a **NumericTextBox** in the pag @code { - public List GridData { get; set; } SfGrid Grid; public int pageSize { get; set; } = 5; public int totalPages => (int)Math.Ceiling((double)GridData.Count / pageSize); + protected override void OnInitialized() { GridData = OrderData.GetAllRecords(); } - private async Task CalculatePageSize(Syncfusion.Blazor.Inputs.ChangeEventArgs args) + private async Task OnPageSizeChange(Syncfusion.Blazor.Inputs.ChangeEventArgs args) { - await Grid.GoToPageAsync(args.Value); + pageSize = args.Value; await Grid.Refresh(); } } @@ -548,18 +437,16 @@ public class OrderData {% endhighlight %} {% endtabs %} -{% previewsample "https://blazorplayground.syncfusion.com/embed/hjhStfVqKnNpLgxv?appbar=false&editor=false&result=true&errorlist=false&theme=bootstrap5" %} +{% previewsample "https://blazorplayground.syncfusion.com/embed/BNheXEKNqEnQEOmc?appbar=false&editor=false&result=true&errorlist=false&theme=bootstrap5" %} -> * Inside the **Template** RenderFragment, you can access the parameters passed to the pager templates using implicit parameter named context matching with the [PagerTemplateContent](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.PagerModel.html#Syncfusion_Blazor_Grids_PagerModel__ctor) class name. -> * You can refer to our [Blazor Grid Pager Template](https://blazor.syncfusion.com/demos/datagrid/pager-template) online demo of Pager Template feature in Grid. +> * Inside the `Template` RenderFragment, access parameters using the implicit parameter named context, which is of type PagerTemplateContext. For details, see [PagerTemplateContent](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.PagerModel.html#Syncfusion_Blazor_Grids_PagerModel__ctor) API. +> * Refer to the [Blazor Grid Pager Template](https://blazor.syncfusion.com/demos/datagrid/pager-template) online demo showcasing the Pager Template feature in the Syncfusion Blazor DataGrid. ## Pager with page size dropdown -The pager with a page size dropdown in Syncfusion® Blazor DataGrid allows you to dynamically change the number of records displayed in the Grid. This feature is useful when you want to easily customize the number of records to be shown per page. +The pager with a page size dropdown in Syncfusion® Blazor DataGrid allows dynamically changing the number of records displayed in the Grid. -To enable the page size Dropdown feature in the Grid, you need to set the [PageSizes](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridPageSettings.html#Syncfusion_Blazor_Grids_GridPageSettings_PageSizes) property to true in [GridPageSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_PageSettings) component. This property configuration triggers the rendering of a dropdown list within the pager, allowing you to select the desired page size. The selected page size determines the number of records displayed on each page of the Grid. - -The following example that demonstrates how to integrate the page size Dropdown feature by configuring the `PageSizes` property: +To enable the page size dropdown, set the [PageSizes](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridPageSettings.html#Syncfusion_Blazor_Grids_GridPageSettings_PageSizes) property to true in [GridPageSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_PageSettings). This renders a dropdown list within the pager to select the desired page size. The selected value determines the number of records displayed on each page. {% tabs %} {% highlight razor tabtitle="Index.razor" %} @@ -635,15 +522,13 @@ public class OrderData {% previewsample "https://blazorplayground.syncfusion.com/embed/rXVfjCjETzzrPfLW?appbar=false&editor=false&result=true&errorlist=false&theme=bootstrap5" %} -> * If the pageSizes property is set to a boolean value like ‘true’ or ‘false,’ the page size dropdown defaults to an array of strings containing options such as [‘All’, ‘5’, ‘10’, ‘15’, ‘20’]. -> * You can refer to our [Blazor Grid Paging](https://www.syncfusion.com/blazor-components/blazor-datagrid/paging) Feature tour page to know about paging and its feature representations. -> * You can refer to our [Blazor DataGrid](https://www.syncfusion.com/blazor-components/blazor-datagrid) feature tour page for its groundbreaking feature representations. You can also explore our [Blazor DataGrid example](https://blazor.syncfusion.com/demos/datagrid/overview?theme=bootstrap5) to understand how to present and manipulate data. +> * If the PageSizes property is set to a boolean value (true or false), the page size dropdown defaults to options such as [‘All’, ‘5’, ‘10’, ‘15’, ‘20’]. +> * Refer to the [Blazor Grid Paging](https://www.syncfusion.com/blazor-components/blazor-datagrid/paging) feature tour for an overview of paging. +> * Refer to the [Blazor DataGrid](https://www.syncfusion.com/blazor-components/blazor-datagrid) feature tour and the [Blazor DataGrid example](https://blazor.syncfusion.com/demos/datagrid/overview?theme=bootstrap5) to understand data presentation and manipulation. ### Customize page size dropdown -The Syncfusion® Blazor DataGrid allows you to customize the default values of the page size dropdown in the pager, allowing you to change the number of records displayed per page. To achieve this, you can define the [PageSizes](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridPageSettings.html#Syncfusion_Blazor_Grids_GridPageSettings_PageSizes) property as an array of string instead of boolean value. - -The following example demonstrate how to customize the default values of the pager dropdown using the `PageSizes` property: +The Syncfusion® Blazor DataGrid allows customizing the default values in the page size dropdown. To do this, define the [PageSizes](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridPageSettings.html#Syncfusion_Blazor_Grids_GridPageSettings_PageSizes) property as an array of strings instead of a boolean. {% tabs %} {% highlight razor tabtitle="Index.razor" %} @@ -714,15 +599,13 @@ The following example demonstrate how to customize the default values of the pag {% previewsample "https://blazorplayground.syncfusion.com/embed/BZBfDWZOTOXcRZBT?appbar=false&editor=false&result=true&errorlist=false&theme=bootstrap5" %} -> The pageSizes property can be configured with either an array of strings or a boolean value. +> The PageSizes property can be configured with either an array of strings or a boolean value. ## How to navigate to particular page -Navigating to a particular page in the Syncfusion® Blazor DataGrid is particularly useful when dealing with large datasets. It provides a quick and efficient way to jump to a specific page within the Grid. - -To achieve page navigation, you can use the [GotoPageAsync](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_GoToPageAsync_System_Int32_) method provided by Grid. This method allows you to programmatically navigate to a specific page within the Grid. +Navigating to a particular page in the Syncfusion® Blazor DataGrid is useful when dealing with large datasets, enabling quick jumps to specific pages. -The following example demonstrates how to dynamically navigate to a particular page using the `GotoPageAsync` method triggered by an external button click based on **NumericTextBox** input: +To navigate programmatically, use the [GoToPageAsync](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_GoToPageAsync_System_Int32_) method. {% tabs %} {% highlight razor tabtitle="Index.razor" %} @@ -825,9 +708,7 @@ public class OrderData ## Dynamically calculate page size based on element height -You have an option to dynamically calculate the page size of a Grid by considering the height of its parent element. This functionality proves invaluable in ensuring that the Grid’s content remains within the available space, preventing the need for excessive scrolling. It primarily serves the purpose of automatically adjusting the `PageSize` when the height of the Grid’s parent element changes dynamically. Upon each alteration in the parent element’s height, invoking this method will compute the grid’s `PageSize` and present the current page records accordingly. This feature effectively addresses situations where a static `PageSize` value does not cater to the varying heights of different parent elements, preventing any unwanted empty spaces within the Grid. - -The following example demonstrates how to calculate the page size based on the element height using the change event based on the **NumericTextBox** input: +It is possible to dynamically calculate the page size of a Grid by considering the height of its parent element. This helps ensure the Grid’s content fits the available space and avoids unnecessary scrolling. When the parent element’s height changes, computing the PageSize accordingly adjusts the number of visible records and prevents empty space or overflow. {% tabs %} {% highlight razor tabtitle="Index.razor" %} @@ -924,9 +805,9 @@ The following example demonstrates how to calculate the page size based on the e ## Render pager at the top of the Grid -By default, the Pager will be rendered at the bottom of the Grid when the [AllowPaging](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_AllowPaging) property is enabled. Using the `SfPager`, it is possible to render the Pager at the top of the Grid. This can be achieved by disabling the default pager of the Grid using the `AllowPaging` property and rendering the `SfPager` externally. Now, syncing the paging action with the Grid can be performed by following the step below: +By default, the pager is rendered at the bottom of the Grid when [AllowPaging](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_AllowPaging) is enabled. Using [Pager](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Navigations.SfPager.html) component, it is possible to render a pager at the top of the Grid. This is achieved by keeping the Grid’s internal pager disabled (`AllowPaging` set to **false**) and rendering `Pager` externally. Paging actions are synchronized with the Grid by manually applying Skip and Take based on the pager events. -In the following sample, the SfPager is rendered on top of the Grid. Initially, using the [PageSize](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Navigations.SfPager.html#Syncfusion_Blazor_Navigations_SfPager_PageSize) property of the Pager, the data for the Grid is bound to the current page. In the following code snippet, the `PageSize` is defined as "10" so that the first ten records from the data source of the Grid will be displayed on the current page using the Skip and Take values. The SfPager also includes a [PageSizes](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Navigations.SfPager.html#Syncfusion_Blazor_Navigations_SfPager_PageSizes) property, denoting a list of available page sizes such as { 5, 10, 12, 20 }. The `PageSizes` property provides a dropdown list dynamically, allowing users to select from these predefined page sizes and customize the number of records displayed on each page. Through the navigation of the pager items, you can view the records on the Grid page by page. This can be achieved by using the [ItemClick](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Navigations.SfPager.html#Syncfusion_Blazor_Navigations_SfPager_ItemClick) event of the Pager. In the `ItemClick` event of the Pager, the SkipValue and TakeValue are calculated using the `PageSize` property and arguments of the `ItemClick` event (CurrentPage, PreviousPage). Based on these details, you can view the records on the Grid page by page. +In the following sample, `Pager` component is rendered above the Grid. Initially, the Pager’s [PageSize](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Navigations.SfPager.html#Syncfusion_Blazor_Navigations_SfPager_PageSize) determines the number of records shown. The SfPager also includes a [PageSizes](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Navigations.SfPager.html#Syncfusion_Blazor_Navigations_SfPager_PageSizes) property to offer a dropdown of sizes such as { 5, 10, 12, 20 }. Navigation is handled in the [ItemClick](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Navigations.SfPager.html#Syncfusion_Blazor_Navigations_SfPager_ItemClick) event by computing SkipValue and TakeValue using PageSize and the current page. {% tabs %} {% highlight razor tabtitle="Index.razor" %} @@ -1037,21 +918,19 @@ In the following sample, the SfPager is rendered on top of the Grid. Initially, {% previewsample "https://blazorplayground.syncfusion.com/embed/BthpChMvrRAWDWAS?appbar=false&editor=false&result=true&errorlist=false&theme=bootstrap5" %} -> * Here, default pager action of the Grid is disabled. -> * During the paging action, the pager triggers the below three events. -> * The [Created](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Navigations.SfPager.html#Syncfusion_Blazor_Navigations_SfPager_Created) event triggers when Pager is created. -> * The [ItemClick](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Navigations.SfPager.html#Syncfusion_Blazor_Navigations_SfPager_ItemClick) event triggers when the numeric items in the pager is clicked. -> * The [PageSizeChanged](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Navigations.SfPager.html#Syncfusion_Blazor_Navigations_SfPager_PageSizeChanged) event triggers when pageSize DropDownList value is selected. +> * In this approach, the Grid’s default pager is not used. +> * During paging, the pager triggers the following events: +> * [Created](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Navigations.SfPager.html#Syncfusion_Blazor_Navigations_SfPager_Created) — triggered when the Pager is created. +> * [ItemClick](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Navigations.SfPager.html#Syncfusion_Blazor_Navigations_SfPager_ItemClick) — triggered when a numeric item in the pager is clicked. +> * [PageSizeChanged](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Navigations.SfPager.html#Syncfusion_Blazor_Navigations_SfPager_PageSizeChanged) — triggered when a page size is selected from the dropdown. ## Pager events The Syncfusion® Blazor DataGrid triggers two pager events during paging actions: -[PageChanging](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridEvents-1.html#Syncfusion_Blazor_Grids_GridEvents_1_PageChanging)- This event triggered before any paging action (such as changing the page, changing the page size and etc) is initiated. You can use this event to customize or control the behavior of paging actions. - -[PageChanged](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridEvents-1.html#Syncfusion_Blazor_Grids_GridEvents_1_PageChanged)- This event triggered after a pager action is completed. It provides information about the action, such as the CurrentPage, CurrentPageSize, PreviousPage and TotalPages. You can use this event to perform actions or update the UI after the operation has been executed. +[PageChanging](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridEvents-1.html#Syncfusion_Blazor_Grids_GridEvents_1_PageChanging) - Triggered before any paging action (such as changing the page or page size). Use this event to customize or control paging behavior. -The following example that example demonstrates how to use these events to display notification messages to indicate the current and next page during paging actions in the Grid: +[PageChanged](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridEvents-1.html#Syncfusion_Blazor_Grids_GridEvents_1_PageChanged) - Triggered after a paging action completes. It provides information such as CurrentPage, CurrentPageSize, PreviousPage, and TotalPages. Use this event to perform follow-up actions or update the UI. {% tabs %} {% highlight razor tabtitle="Index.razor" %} From 40bb525b02a35af618daaf1660c00311ca14b56a Mon Sep 17 00:00:00 2001 From: SadhanaBaskaran Date: Wed, 3 Dec 2025 02:32:40 +0530 Subject: [PATCH 161/266] 984421: Updated the UG content and samples for Searching in DataGrid --- blazor/datagrid/searching.md | 127 +++++++++++++---------------------- 1 file changed, 46 insertions(+), 81 deletions(-) diff --git a/blazor/datagrid/searching.md b/blazor/datagrid/searching.md index 7d3644cc85..f862d6bd72 100644 --- a/blazor/datagrid/searching.md +++ b/blazor/datagrid/searching.md @@ -1,7 +1,7 @@ --- layout: post title: Searching in Blazor DataGrid | Syncfusion -description: Explore and understand the Searching in Syncfusion Blazor DataGrid. Learn about its features, usage, customization, and more. +description: Learn search options in Syncfusion Blazor DataGrid including toolbar, initial, external search, operators, multi-keyword, and accent-insensitive support. platform: Blazor control: DataGrid documentation: ug @@ -9,11 +9,9 @@ documentation: ug # Searching in Blazor DataGrid -The Syncfusion® Blazor DataGrid includes a powerful built-in searching feature that allows users to search for specific data within the Grid. This feature enables efficient filtering of Grid records based on user-defined search criteria, making it easier to locate and display relevant information. Whether you have a large dataset or simply need to find specific records quickly, the search feature provides a convenient solution. +The Syncfusion® Blazor DataGrid includes a built-in search feature that helps locate records quickly across grid data. Users can filter displayed records by entering a search key, which is especially useful for large datasets. -Set the [AllowSearching](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridColumn.html#Syncfusion_Blazor_Grids_GridColumn_AllowSearching) property to **true** to enable the searching feature in the Grid. - -To further enhance the search functionality, you can integrate a search text box directly into the Grid's toolbar. This allows users to enter search criteria conveniently within the Grid interface. To add the search item to the Grid's toolbar, use the [Toolbar](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_Toolbar) property and add **Search** item. +To provide a search box in the UI, add the Search item to the toolbar using the [Toolbar](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_Toolbar) property. Searching can also be performed programmatically using [SearchAsync](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_SearchAsync_System_String_) method. The [AllowSearching](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridColumn.html#Syncfusion_Blazor_Grids_GridColumn_AllowSearching) property is column-level and is used to include or exclude specific columns from search; it is not required to enable global search. {% tabs %} {% highlight razor tabtitle="Index.razor" %} @@ -88,33 +86,19 @@ To further enhance the search functionality, you can integrate a search text box {% previewsample "https://blazorplayground.syncfusion.com/embed/hNrqMDUXsngnslOp?appbar=false&editor=false&result=true&errorlist=false&theme=bootstrap5" %} -> The clear icon is shown in the Grid search text box when it is focused on search text or after typing the single character in the search text box. A single click of the clear icon clears the text in the search box as well as the search results in the Grid. +> The clear icon appears in the grid search box when focused or after typing a character. Selecting the clear icon removes the text and resets the search results. ## Initial search -By default, the search operation can be performed on the Syncfusion® Blazor DataGrid data after the Grid renders. However, there might be scenarios where need to perform a search operation on the Grid data during the initial rendering of the Grid. In such cases, you can make use of the initial search feature provided by the Grid. - -To apply search at initial rendering, need to set the following properties in the [GridSearchSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridSearchSettings.html). - -Property|Description ------|----- -Fields |Specifies the [Fields](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridSearchSettings.html#Syncfusion_Blazor_Grids_GridSearchSettings_Fields) in which the search operation needs to be performed. -Operator |Specifies the [Operator](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridSearchSettings.html#Syncfusion_Blazor_Grids_GridSearchSettings_Operator) to be used for the search operation. -Key|Specifies the key value to be searched. -IgnoreCase |[IgnoreCase](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Data.WhereFilter.html#Syncfusion_Blazor_Data_WhereFilter_IgnoreCase) specifies whether the search operation needs to be case-sensitive or case-insensitive -IgnoreAccent |[IgnoreAccent](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Data.WhereFilter.html#Syncfusion_Blazor_Data_WhereFilter_IgnoreAccent) property will ignore the diacritic characters or accents in the text during a search operation. - -The following example demonstrates how to set an initial search in the Grid using the `GridSearchSettings` property. The `GridSearchSettings` property is set with the following values: - -1.`Field`: **CustomerID** specifies that the search should be performed only in the ‘CustomerID’ field. - -2.`Operator`: **contains** indicates that the search should find records that contain the specified search key. - -3.`Key`: **Ha** is the initial search key that will be applied when the Grid is rendered. +By default, search is performed after the grid renders and a search action is triggered. To apply a search on initial render, configure the [GridSearchSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridSearchSettings.html) with the following properties: -4.`IgnoreCase`: **true** makes the search case-insensitive. - -5.`IgnoreAccent`: **true** will ignores diacritic characters or accents during the search operation. +| Property | Description | +|--------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| Fields | Specifies the [Fields](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridSearchSettings.html#Syncfusion_Blazor_Grids_GridSearchSettings_Fields) that participate in the search. | +| Operator | Specifies the [Operator](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridSearchSettings.html#Syncfusion_Blazor_Grids_GridSearchSettings_Operator) used for comparison. | +| Key | Specifies the initial search text. | +| IgnoreCase | [IgnoreCase](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridSearchSettings.html#Syncfusion_Blazor_Grids_GridSearchSettings_IgnoreCase) sets case-insensitive search when true. | +| IgnoreAccent | [IgnoreAccent](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridSearchSettings.html#Syncfusion_Blazor_Grids_GridSearchSettings_IgnoreAccent) ignores diacritic characters during search when true. | {% tabs %} {% highlight razor tabtitle="Index.razor" %} @@ -190,30 +174,21 @@ The following example demonstrates how to set an initial search in the Grid usin {% previewsample "https://blazorplayground.syncfusion.com/embed/rNVKWZUXimSvcekD?appbar=false&editor=false&result=true&errorlist=false&theme=bootstrap5" %} -> By default, Grid searches all the bound column values. To customize this behavior, define the `Fields` property of **GridSearchSettings**. +> By default, the grid searches all visible columns. To limit search to specific fields, set the `Fields` property of `GridSearchSettings`. ## Search operators -Search operators are symbols or keywords used to define the type of comparison or condition applied during a search operation. They help specify how the search key should match the data being searched. The [GridSearchSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridSearchSettings.html).[Operator](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridSearchSettings.html#Syncfusion_Blazor_Grids_GridSearchSettings_Operator) property can be used to define the search operator in the Grid. - -By default, the `GridSearchSettings.Operator` is set to **contains**, which returns the values contains the search key. The following operators are supported in searching: - -The following operators are supported in searching: +Search operators define how the search key is compared to data values. Configure the operator using [GridSearchSettings.Operator](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridSearchSettings.html#Syncfusion_Blazor_Grids_GridSearchSettings_Operator). The default is **contains**, which returns values that contain the search key. -Operator |Description ------|----- -StartsWith |Checks whether a value begins with the specified value. -EndsWith |Checks whether a value ends with the specified value. -Contains |Checks whether a value contains the specified value. -Equal |Checks whether a value is equal to the specified value. - -These operators provide flexibility in defining the search behavior and allow you to perform different types of comparisons based on your requirements. - -The following example demonstrates how to set the `SearchSettings.Operator` property based on changing the dropdown value using the [ValueChange](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Buttons.SfSwitch-1.html#Syncfusion_Blazor_Buttons_SfSwitch_1_ValueChange) event of the [DropDownList](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.DropDowns.SfDropDownList-2.html#Syncfusion_Blazor_DropDowns_SfDropDownList_2__ctor). +| Operator | Description | +|------------|---------------------------------------------------------| +| StartsWith | Checks whether a value begins with the specified value. | +| EndsWith | Checks whether a value ends with the specified value. | +| Contains | Checks whether a value contains the specified value. | +| Equal | Checks whether a value is equal to the specified value. | {% tabs %} {% highlight razor tabtitle="Index.razor" %} -@using Syncfusion.Blazor @using Syncfusion.Blazor.Grids @using Syncfusion.Blazor.DropDowns @@ -224,7 +199,6 @@ The following example demonstrates how to set the `SearchSettings.Operator` prop - @@ -248,6 +222,14 @@ The following example demonstrates how to set the `SearchSettings.Operator` prop public Operator Value { get; set; } } + public enum Operator + { + StartsWith, + EndsWith, + Contains, + Equal + } + List DropDownData = new List { new DropDownOrder(){Text="StartsWith",Value= Operator.StartsWith }, @@ -310,21 +292,18 @@ The following example demonstrates how to set the `SearchSettings.Operator` prop {% endhighlight %} {% endtabs %} -{% previewsample "https://blazorplayground.syncfusion.com/embed/rtheMWibUKtkPFVK?appbar=true&editor=true&result=true&errorlist=true&theme=bootstrap5" %} +{% previewsample "https://blazorplayground.syncfusion.com/embed/hZBgCXKXMPQpCngI?appbar=false&editor=false&result=true&errorlist=false&theme=bootstrap5" %} ## Search by external button -The Syncfusion® Blazor DataGrid allows you to perform searches programmatically, enabling you to search for records using an external button instead of relying solely on the built-in search bar. This feature provides flexibility and allows for custom search implementations within your application. To search for records using an external button, you can utilize the [SearchAsync](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_SearchAsync_System_String_) method provided by the Grid. - -The `SearchAsync` method allows you to perform a search operation based on a search key or criteria. The following example demonstrates how to implement `SearchAsync` by an external button using the following steps: - -1. Add a [Button](https://blazor.syncfusion.com/documentation/button/getting-started-with-web-app) element outside of the Grid. +The Syncfusion® Blazor DataGrid supports programmatic search, enabling custom search triggers such as external buttons. Use the grid’s [SearchAsync](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_SearchAsync_System_String_) method and pass the search text. -2. Attach a [OnClick](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Buttons.SfButton.html#Syncfusion_Blazor_Buttons_SfButton_OnClick) event handler to the button. +Steps: -3. Inside the event handler, get the reference of the Grid. - -4. Invoke the `SearchAsync` method of the Grid by passing the search key as a parameter. +1. Render a [Button](https://blazor.syncfusion.com/documentation/button/getting-started-with-web-app) outside the grid UI. +2. Handle the button’s [OnClick](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Buttons.SfButton.html#Syncfusion_Blazor_Buttons_SfButton_OnClick) event. +3. Access the grid reference. +4. Call `SearchAsync` with the search key. {% tabs %} {% highlight razor tabtitle="Index.razor" %} @@ -411,9 +390,7 @@ The `SearchAsync` method allows you to perform a search operation based on a sea ## Search specific columns -By default, the search functionality searches all visible columns. However, if you want to search only specific columns, you can define the specific column’s field names in the [GridSearchSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridSearchSettings.html).[Fields](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridSearchSettings.html#Syncfusion_Blazor_Grids_GridSearchSettings_Fields) property. This allows you to narrow down the search to a targeted set of columns, which is particularly useful when dealing with large datasets or Grids with numerous columns. - -The following example demonstrates how to search specific columns such as **CustomerID** and **ShipCity** by using the `SearchSettings.Fields` property. +By default, the search scans all visible columns. To restrict the search to specific columns, set the field names in [GridSearchSettings.Fields](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridSearchSettings.html#Syncfusion_Blazor_Grids_GridSearchSettings_Fields). {% tabs %} {% highlight razor tabtitle="Index.razor" %} @@ -491,9 +468,7 @@ The following example demonstrates how to search specific columns such as **Cust ## Disable search for particular column -By default, Syncfusion® Blazor DataGrid searches all visible columns. You can disable searching for a particular column by setting the [AllowSearching](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridColumn.html#Syncfusion_Blazor_Grids_GridColumn_AllowSearching) property of **GridColumn** as false. - -In the below code example, the **Order ID** column search functionality is disabled. +By default, the Syncfusion® Blazor DataGrid searches across all visible columns. To exclude a column, set the column’s [AllowSearching](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridColumn.html#Syncfusion_Blazor_Grids_GridColumn_AllowSearching) property to false. {% tabs %} {% highlight razor tabtitle="Index.razor" %} @@ -565,13 +540,11 @@ In the below code example, the **Order ID** column search functionality is disab {% endhighlight %} {% endtabs %} -N> You can refer to our [Blazor DataGrid](https://www.syncfusion.com/blazor-components/blazor-datagrid) feature tour page for its groundbreaking feature representations. You can also explore our [Blazor DataGrid example](https://blazor.syncfusion.com/demos/datagrid/overview?theme=bootstrap5) to understand how to present and manipulate data. +N> For a broader overview, see the [Blazor DataGrid](https://www.syncfusion.com/blazor-components/blazor-datagrid) feature tour and the [Blazor DataGrid example](https://blazor.syncfusion.com/demos/datagrid/overview?theme=bootstrap5). ## Ignore accents in search -By default, the Syncfusion® Blazor DataGrid's search functionality does not account for diacritic characters or accents. However, in scenarios where ignoring these characters is essential, this feature significantly improves the search experience. It allows for more comprehensive and accurate data searches by disregarding accents. This can be achieved by setting the [GridSearchSettings.IgnoreAccent](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridSearchSettings.html#Syncfusion_Blazor_Grids_GridSearchSettings_IgnoreAccent) property of the DataGrid to **true**. - -The following example demonstrates how to configure the `IgnoreAccent` property within the `GridSearchSettings` of the Grid. +By default, the DataGrid’s search does not treat accented and unaccented characters as equivalent. To support accent-insensitive search, set [GridSearchSettings.IgnoreAccent](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridSearchSettings.html#Syncfusion_Blazor_Grids_GridSearchSettings_IgnoreAccent) to **true**. This improves usability when data contains diacritic characters. {% tabs %} {% highlight razor tabtitle="Index.razor" %} @@ -648,14 +621,12 @@ public class InventorDetails {% previewsample "https://blazorplayground.syncfusion.com/embed/LNrItRCfhblhPJaR?appbar=false&editor=false&result=true&errorlist=false&theme=bootstrap5" %} -> * This feature ignores accents for both searching and filtering operations in the Syncfusion® Blazor DataGrid when using an `IEnumerable` data source. -> * This features works only for characters outside the ASCII range. +> * Accent-insensitive comparison applies to searching and filtering when using an IEnumerable data source. +> * This feature affects characters outside the ASCII range. ## Search on each key stroke -The search on each keystroke feature in Syncfusion® Blazor DataGrid enables you to perform real-time searching of Grid data as they type in the search text box. This functionality provides a seamless and interactive searching experience, allowing you to see the search results dynamically updating in real time as they enter each keystroke in the search box. - -By default, the Grid will initiate searching operation after the Enter key is pressed. If you want to initiate the searching operation while typing the values in the search box, then you can invoke the [SearchAsync](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_SearchAsync_System_String_) method of the Grid in the [Input](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Inputs.SfTextBox.html#Syncfusion_Blazor_Inputs_SfTextBox_Input) event by rendering the [SfTextBox](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Inputs.SfTextBox.html#Syncfusion_Blazor_Inputs_SfTextBox__ctor) as toolbar template. +The search-on-keystroke approach enables real-time results while typing in the search box. By default, search is executed on Enter. To trigger search as the user types, render an [SfTextBox](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Inputs.SfTextBox.html#Syncfusion_Blazor_Inputs_SfTextBox__ctor) in the toolbar template and call [SearchAsync](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_SearchAsync_System_String_) in the TextBox [Input](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Inputs.SfTextBox.html#Syncfusion_Blazor_Inputs_SfTextBox_Input) event. {% tabs %} {% highlight razor tabtitle="Index.razor" %} @@ -692,7 +663,7 @@ By default, the Grid will initiate searching operation after the Enter key is pr { Orders = OrderData.GetAllRecords(); } - + public void OnInput(InputEventArgs args) { this.DefaultGrid.SearchAsync(args.Value); @@ -755,9 +726,7 @@ By default, the Grid will initiate searching operation after the Enter key is pr ## Perform search operation in Grid using multiple keywords -In addition to searching with a single keyword, the Syncfusion® Blazor DataGrid offers the capability to perform a search operation using multiple keywords. This feature enables you to narrow down your search results by simultaneously matching multiple keywords. It can be particularly useful when you need to find records that meet multiple search conditions simultaneously. - -The following example demonstrates, how to perform a search with multiple keywords in the Grid by using the [Query](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_Query) property. +The DataGrid can also be searched using multiple criteria. Build compound predicates with the grid’s [Query](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_Query) property and Syncfusion Data query helpers (**WhereFilter**, **And/Or**) to combine conditions. This approach is particularly useful for remote data scenarios where the server executes filtering. {% tabs %} {% highlight razor tabtitle="Index.razor" %} @@ -871,11 +840,7 @@ The following example demonstrates, how to perform a search with multiple keywor ## Clear search by external button -The Syncfusion® Blazor DataGrid provides a capability to clear searched data in the Grid. This functionality offers the ability to reset or clear any active search filters that have been applied to the Grid's data. - -To clear the searched Grid records from an external button, you can set the [SearchSettings.Key](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_SearchSettings) property to an empty string to clear the search text. This property represents the current search text in the search box. - -The following example demonstrates how to clear the searched records using an external button. +The Syncfusion® Blazor DataGrid provides the ability to clear the current search programmatically. To reset search results from an external button, call [SearchAsync](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_SearchAsync_System_String_) with an empty string. This clears the search text and removes the applied search. {% tabs %} {% highlight razor tabtitle="Index.razor" %} @@ -956,4 +921,4 @@ The following example demonstrates how to clear the searched records using an ex {% previewsample "https://blazorplayground.syncfusion.com/embed/BZVzjpXoqkaJnBKx?appbar=false&editor=false&result=true&errorlist=false&theme=bootstrap5" %} -> You can also clear the searched records by using the clear icon within the search input field. \ No newline at end of file +> Also clear the searched records using the clear icon in the search input field. \ No newline at end of file From 9efe35a8057c6304b12c7efdcc5b2727f30fca50 Mon Sep 17 00:00:00 2001 From: SadhanaBaskaran Date: Wed, 3 Dec 2025 02:42:08 +0530 Subject: [PATCH 162/266] 984957: Updated the UG content and samples for Scrolling in DataGrid --- blazor/datagrid/infinite-scrolling.md | 12 +++------- blazor/datagrid/scrolling.md | 6 ++--- blazor/datagrid/virtual-scrolling.md | 33 ++++++--------------------- 3 files changed, 12 insertions(+), 39 deletions(-) diff --git a/blazor/datagrid/infinite-scrolling.md b/blazor/datagrid/infinite-scrolling.md index d53760cdda..fd9a8a1580 100644 --- a/blazor/datagrid/infinite-scrolling.md +++ b/blazor/datagrid/infinite-scrolling.md @@ -11,13 +11,11 @@ documentation: ug The infinite scrolling feature in the Syncfusion® Blazor DataGrid provides load-on-demand data retrieval to handle large datasets without degrading performance. In default infinite scrolling, the Grid fetches the next block of data when the vertical scrollbar reaches the end of the scroller, creating a seamless browsing experience across extensive data. -In this feature, a block is equivalent to the Grid’s [PageSize](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridPageSettings.html#Syncfusion_Blazor_Grids_GridPageSettings_PageSize). If `PageSize` is not set, the Grid calculates it from the viewport height and row height. To enable infinite scrolling, set [EnableInfiniteScrolling](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_EnableInfiniteScrolling) to true and define a content [Height](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_Height). +In this feature, a block is equivalent to the Grid’s [PageSize](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridPageSettings.html#Syncfusion_Blazor_Grids_GridPageSettings_PageSize). If `PageSize` is not set, the Grid calculates it from the viewport height and row height. To enable infinite scrolling, set [EnableInfiniteScrolling](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_EnableInfiniteScrolling) to **true** and define a content [Height](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_Height). > - With this feature, the Grid does not issue a new data request when revisiting a previously loaded page. > - The `Height` property must be specified when `EnableInfiniteScrolling` is enabled (a fixed container height is required). -The following is an example that demonstrates how to enable infinite scroll in the Grid: - {% tabs %} {% highlight razor tabtitle="Index.razor" %} @@ -88,8 +86,6 @@ At initial load, the Grid renders a specified number of data blocks (pages), whi Configure this using [InitialBlocks](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridInfiniteScrollSettings.html) on [GridInfiniteScrollSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridInfiniteScrollSettings.html). By default, three pages are rendered initially. Afterwards, additional data is buffered and loaded based on page size or the number of rows that fit within the given height. -The following example shows how to set the `initial blocks `based on a `DropDownList` selection: - {% tabs %} {% highlight razor tabtitle="Index.razor" %} @@ -189,11 +185,9 @@ public class TaskDetails In Syncfusion® Blazor DataGrid cache mode, previously loaded blocks are reused when revisited, reducing repeat data requests. The Grid manages the number of rendered DOM row elements using [GridInfiniteScrollSettings.MaximumBlocks](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridInfiniteScrollSettings.html#Syncfusion_Blazor_Grids_GridInfiniteScrollSettings_MaximumBlocks). When this limit is reached, the Grid removes an older block of row elements to render new ones. -Enable cache mode by setting [EnableCache](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridInfiniteScrollSettings.html#Syncfusion_Blazor_Grids_GridInfiniteScrollSettings_EnableCache) to true on [GridInfiniteScrollSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridInfiniteScrollSettings.html). - -Configure the maximum cached blocks with `MaximumBlocks` (default: 3). +Enable cache mode by setting [EnableCache](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridInfiniteScrollSettings.html#Syncfusion_Blazor_Grids_GridInfiniteScrollSettings_EnableCache) to **true** on [GridInfiniteScrollSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridInfiniteScrollSettings.html). -The following example toggles cache mode using a Switch component and updates the Grid accordingly: +Configure the maximum cached blocks with `MaximumBlocks` (**default: 3**). {% tabs %} {% highlight razor tabtitle="Index.razor" %} diff --git a/blazor/datagrid/scrolling.md b/blazor/datagrid/scrolling.md index 65846a02d4..5df5e05495 100644 --- a/blazor/datagrid/scrolling.md +++ b/blazor/datagrid/scrolling.md @@ -9,13 +9,13 @@ documentation: ug # Scrolling in Blazor DataGrid -The scrolling feature in the Syncfusion® Blazor DataGrid enables navigation through content that extends beyond the visible area of the Grid. Scrollbars appear automatically when content exceeds the specified `Width` or `Height` of the Grid element. This is useful for large datasets or when the Grid must fit within a constrained layout. The vertical and horizontal scrollbars are displayed based on the following criteria: +The scrolling feature in the Syncfusion® Blazor DataGrid enables navigation through content that extends beyond the visible area of the Grid. Scrollbars appear automatically when content exceeds the specified **Width** or **Height** of the Grid element. This is useful for large datasets or when the Grid must fit within a constrained layout. The vertical and horizontal scrollbars are displayed based on the following criteria: * The vertical scrollbar appears when the total height of rows exceeds the Grid element’s height. * The horizontal scrollbar appears when the total width of columns exceeds the Grid element’s width. * The [Height](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_Height) and [Width](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_Width) properties define the Grid’s height and width. -> The default values for `Height` and `Width` are `auto`. +> The default values for `Height` and `Width` are **auto**. ## Set width and height @@ -103,8 +103,6 @@ The Syncfusion® Blazor DataGrid can fill it To enable this, set the Grid’s [Width](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_Width) and [Height](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_Height) to 100%. The Grid’s parent element must have an explicit height; otherwise, a vertical scrollbar will not appear. -In the following example, the parent container has explicit height and width, and the Grid container is set to 100% for both dimensions to size responsively with its parent: - {% tabs %} {% highlight razor tabtitle="Index.razor" %} diff --git a/blazor/datagrid/virtual-scrolling.md b/blazor/datagrid/virtual-scrolling.md index 6ac78302bd..890e868921 100644 --- a/blazor/datagrid/virtual-scrolling.md +++ b/blazor/datagrid/virtual-scrolling.md @@ -11,17 +11,13 @@ documentation: ug The virtual scrolling feature in the Syncfusion® Blazor DataGrid efficiently handles large datasets by rendering only the rows currently visible in the viewport instead of the entire data source. This reduces DOM size, improves responsiveness, and lowers initial load time for datasets with thousands of records. -To learn about `virtualization` in the Grid, watch the following video: - {% youtube "youtube:https://www.youtube.com/watch?v=GrxmYYQPJPE"%} ## Row virtualization Row virtualization is a technique that optimizes rendering performance for large datasets in data grids. Instead of loading all rows at once, it dynamically loads and renders only the rows visible within the viewport during vertical scrolling. This approach reduces the initial load time and memory usage, making it a more efficient alternative to traditional paging. -To configure row virtualization, set [EnableVirtualization](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_EnableVirtualization) to `true` and define a fixed content height using the [Height](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_Height) property. The number of rendered records is implicitly determined by the content height. Optionally, you can influence the visible count using [GridPageSettings.PageSize](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridPageSettings.html#Syncfusion_Blazor_Grids_GridPageSettings_PageSize). Data is cached and reused while scrolling. - -The following example enables row virtualization using the `EnableVirtualization` property. +To configure row virtualization, set [EnableVirtualization](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_EnableVirtualization) to **true** and define a fixed content height using the [Height](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_Height) property. The number of rendered records is implicitly determined by the content height. The visible count can be adjusted using [GridPageSettings.PageSize](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridPageSettings.html#Syncfusion_Blazor_Grids_GridPageSettings_PageSize) data is cached and reused while scrolling. {% tabs %} {% highlight razor tabtitle="Index.razor" %} @@ -91,8 +87,6 @@ public class TaskDetails The [OverscanCount](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_OverscanCount) property in the Syncfusion® Blazor DataGrid improves perceived scrolling performance by pre-rendering a buffer of rows before and after the visible viewport. This reduces the frequency of data fetches and DOM updates for smoother scrolling, and applies during both initial rendering and virtual scrolling. -The following example set `OverscanCount` to `5`, which preloaded five additional rows before and after the viewport. - {% tabs %} {% highlight razor tabtitle="Index.razor" %} @@ -184,11 +178,11 @@ public class OrderDetails 2. Detail template 3. Row template 4. Autofill - 5. Hierarchy Grid + * With row virtual scrolling, copy-paste and drag-and-drop apply only to items within the current viewport. * Cell-based selection is not supported for row virtual scrolling. * Variable row heights in template columns—where each row has a different height—are not supported. -* Group expand/collapse state is not persisted. +* By default, the group expand/collapse state is not persisted. To persist the state, set the [GridGroupSettings.PersistGroupState](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridGroupSettings.html#Syncfusion_Blazor_Grids_GridGroupSettings_PersistGroupState) property to **true**. For more details, refer to the [documentation](https://blazor.syncfusion.com/documentation/datagrid/grouping#persist-grouped-row-expand-or-collapse-state). * Due to browser element height limits, the maximum number of records is bounded by browser capabilities. * Grid content height is calculated from row height and total record count; features that change row height (such as text wrapping) are not supported. * To increase row height while keeping all rows uniform, specify a fixed height: @@ -207,9 +201,7 @@ public class OrderDetails Column virtualization in Syncfusion® Blazor DataGrid improves performance when many columns are present by rendering only the columns visible in the viewport. As the user scrolls horizontally, additional columns are loaded dynamically. This reduces initial render time and memory usage. -Enable it by setting [EnableColumnVirtualization](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_EnableColumnVirtualization) to `true`. For predictable behavior, assign explicit widths to columns (see [GridColumn.Width](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridColumn.html#Syncfusion_Blazor_Grids_GridColumn_Width)). - -The following example enables column virtualization using the `EnableColumnVirtualization` property. +Enable it by setting [EnableColumnVirtualization](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_EnableColumnVirtualization) to **true**. For predictable behavior, assign explicit widths to columns (see [GridColumn.Width](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridColumn.html#Syncfusion_Blazor_Grids_GridColumn_Width)). {% tabs %} {% highlight razor tabtitle="Index.razor" %} @@ -402,8 +394,6 @@ Column virtualization in Syncfusion® Blazor Enabling both features together significantly improves the responsiveness and scalability of the Grid, even when working with thousands of rows and hundreds of columns. -The following example demonstrates both features enabled: - {% tabs %} {% highlight razor tabtitle="Index.razor" %} @@ -497,8 +487,6 @@ To configure this setup, set the following properties to true: * [EnableColumnVirtualization](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_EnableColumnVirtualization) – Enables rendering of only visible columns. * [AllowPaging](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_AllowPaging) – Enables paging to limit the number of rows per page. -The following example demonstrates enabling both column virtualization and paging: - {% tabs %} {% highlight razor tabtitle="Index.razor" %} @@ -587,9 +575,8 @@ public class OrderDetails ### Limitations * With column virtualization, column width must be in pixels; percentage values are not supported. -* Selected column details are retained only within the current viewport; selection for off-screen columns is not preserved. * Cell selection is not supported with column virtualization. -* Ctrl + Home and Ctrl + End keyboard shortcuts are not supported with column virtualization. +* **Ctrl + Home** and **Ctrl + End** keyboard shortcuts are not supported with column virtualization. * The following features work within the viewport with column virtualization: 1. Column resizing 2. Column chooser @@ -610,12 +597,10 @@ public class OrderDetails The Syncfusion® Blazor DataGrid offers an option to display cell placeholders while new data is being loaded during row or column virtualization. This feature improves user experience by showing a visual indicator (loading placeholder) in grid cells while data is being fetched. It is especially beneficial when working with large datasets or when virtualization is used to load data dynamically as scrolling occurs. -Set [EnableVirtualMaskRow](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_EnableVirtualMaskRow) to `true` to reuse DOM elements and show placeholders until the incoming data is rendered. +Set [EnableVirtualMaskRow](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_EnableVirtualMaskRow) to **true** to reuse DOM elements and show placeholders until the incoming data is rendered. This requires enabling either row virtualization ([EnableVirtualization](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_EnableVirtualization)) or column virtualization ([EnableColumnVirtualization](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_EnableColumnVirtualization)). -Here’s an example demonstrating placeholders with both row and column virtualization enabled: - {% tabs %} {% highlight razor tabtitle="Index.razor" %} @@ -717,8 +702,6 @@ To enable frozen columns with virtualization: **Enable Virtualization:** Turn on both [EnableVirtualization](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_EnableVirtualization) and [EnableColumnVirtualization](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_EnableColumnVirtualization). -Here's an example demonstrating frozen columns with row and column virtualization: - {% tabs %} {% highlight razor tabtitle="Index.razor" %} @@ -908,8 +891,6 @@ To ensure smooth scrolling behavior, virtualization must be enabled in the Grid. * **Horizontal scrolling:** enable both [EnableVirtualization](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_EnableVirtualization) and [EnableColumnVirtualization](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_EnableColumnVirtualization). * **Vertical scrolling:** enable [EnableVirtualization](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_EnableVirtualization). -The following example shows how to call `ScrollIntoViewAsync` from external buttons to navigate to a specific row or column. - {% tabs %} {% highlight razor tabtitle="Index.razor" %} @@ -1013,7 +994,7 @@ public class OrderDetails The [UpdatePageSizeAsync](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_UpdatePageSizeAsync_System_Int32_System_Int32_) method in the Syncfusion® Blazor DataGrid refreshes the virtualized Grid’s PageSize externally by using the specified Grid height or container height along with the row height. This method calculates the `PageSize` programmatically and updates the Grid with the new value. -To enable external refresh of the virtualized Grid, set [EnableVirtualization](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_EnableVirtualization) to `true`. +To enable external refresh of the virtualized Grid, set [EnableVirtualization](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_EnableVirtualization) to **true**. ```cshtml @using Syncfusion.Blazor.Grids From 6b315e6b1fb757cf1d2b9b7399296265894ff7b8 Mon Sep 17 00:00:00 2001 From: SadhanaBaskaran Date: Wed, 3 Dec 2025 03:14:29 +0530 Subject: [PATCH 163/266] 984045: Updated the UG content and samples for Aggregate section in DataGrid --- blazor/datagrid/aggregates.md | 18 ++++++++---------- blazor/datagrid/custom-aggregate.md | 8 ++------ blazor/datagrid/footer-aggregate.md | 2 +- blazor/datagrid/group-and-caption-aggregate.md | 8 ++------ blazor/datagrid/reactive-aggregate.md | 2 -- 5 files changed, 13 insertions(+), 25 deletions(-) diff --git a/blazor/datagrid/aggregates.md b/blazor/datagrid/aggregates.md index 6f81278594..5adc511b48 100644 --- a/blazor/datagrid/aggregates.md +++ b/blazor/datagrid/aggregates.md @@ -12,7 +12,7 @@ documentation: ug The aggregates feature in the Syncfusion Blazor DataGrid displays summary values in the footer, group footer, and group caption. It enables computing summary information for specific columns and presenting it at key locations in the DataGrid. Configure aggregates with the GridAggregates component. For each aggregate column, specify at least the [Field](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridAggregateColumn.html#Syncfusion_Blazor_Grids_GridAggregateColumn_Field) and [Type](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridAggregateColumn.html#Syncfusion_Blazor_Grids_GridAggregateColumn_Type) properties. -For customized rendering, use aggregate templates and access values via AggregateTemplateContext (for example, Sum, Average, Min, Max, Count, TrueCount, and FalseCount). See: [AggregateTemplateContext](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.AggregateTemplateContext.html) and [AggregateType](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.AggregateType.html). +For customized rendering, use aggregate templates and access values via AggregateTemplateContext (for example, **Sum, Average, Min, Max, Count, TrueCount**, and **FalseCount**). See: [AggregateTemplateContext](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.AggregateTemplateContext.html) and [AggregateType](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.AggregateType.html). **Displaying aggregate values** @@ -139,15 +139,13 @@ The Syncfusion® Blazor DataGrid provides se The available built-in aggregate types are : -* Sum: Calculates the sum of values in the column. -* Average: Calculates the average of values in the column. -* Min: Finds the minimum value in the column. -* Max: Finds the maximum value in the column. -* Count: Counts the number of values in the column. -* TrueCount: Counts the number of true values in the column. -* FalseCount: Counts the number of false values in the column. - -The following example demonstrates built-in aggregate types with footer templates. Access aggregate values through AggregateTemplateContext using the matching type property (for example, Max, Min, TrueCount): +* **Sum**: Calculates the sum of values in the column. +* **Average**: Calculates the average of values in the column. +* **Min**: Finds the minimum value in the column. +* **Max**: Finds the maximum value in the column. +* **Count**: Counts the number of values in the column. +* **TrueCount**: Counts the number of true values in the column. +* **FalseCount**: Counts the number of false values in the column. {% tabs %} {% highlight razor tabtitle="Index.razor" %} diff --git a/blazor/datagrid/custom-aggregate.md b/blazor/datagrid/custom-aggregate.md index 0a2b3e2326..e3abe25235 100644 --- a/blazor/datagrid/custom-aggregate.md +++ b/blazor/datagrid/custom-aggregate.md @@ -19,8 +19,6 @@ The custom aggregate function is invoked differently based on the context: - **Total Aggregation:** The function receives the entire dataset and the current aggregate column object. - **Group Aggregation:** The function receives the current group details and the aggregate column object. -Here’s an example that demonstrates how to use the custom aggregate feature in the DataGrid: - {% tabs %} {% highlight razor tabtitle="Index.razor" %} @using Syncfusion.Blazor.Grids @@ -110,13 +108,11 @@ Here’s an example that demonstrates how to use the custom aggregate feature in {% previewsample "https://blazorplayground.syncfusion.com/embed/VZVIXkVRertPQOeX?appbar=false&editor=false&result=true&errorlist=false&theme=bootstrap5" %} -> To access a custom aggregate value inside a template, use the `Custom` key (AggregateTemplateContext.Custom). +> To access a custom aggregate value inside a template, use the **Custom** key (**AggregateTemplateContext.Custom**). **Show the count of distinct values in aggregate row** -Custom aggregate functions can also compute distinct counts or other domain-specific summaries. Specify the [Type](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridAggregateColumn.html#Syncfusion_Blazor_Grids_GridAggregateColumn_Type) as Custom and provide a function via the [CustomAggregate](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridAggregateColumn.html#Syncfusion_Blazor_Grids_GridAggregateColumn_CustomAggregate) property. The result can be rendered in the footer, group footer, or group caption by using the corresponding template and accessing AggregateTemplateContext.Custom. - -Here’s an example that shows the count of distinct values for the ShipCountry column using a custom aggregate: +Custom aggregate functions can also compute distinct counts or other domain-specific summaries. Specify the [Type](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridAggregateColumn.html#Syncfusion_Blazor_Grids_GridAggregateColumn_Type) as Custom and provide a function via the [CustomAggregate](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridAggregateColumn.html#Syncfusion_Blazor_Grids_GridAggregateColumn_CustomAggregate) property. The result can be rendered in the footer, group footer, or group caption by using the corresponding template and accessing **AggregateTemplateContext.Custom**. {% tabs %} {% highlight razor tabtitle="Index.razor" %} diff --git a/blazor/datagrid/footer-aggregate.md b/blazor/datagrid/footer-aggregate.md index 33da269505..46bb1f8aae 100644 --- a/blazor/datagrid/footer-aggregate.md +++ b/blazor/datagrid/footer-aggregate.md @@ -11,7 +11,7 @@ documentation: ug The Syncfusion® Blazor DataGrid supports calculating and displaying aggregate values in footer cells. Footer aggregates summarize column values across rows and render in the DataGrid footer. Use the [FooterTemplate](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridAggregateColumn.html#Syncfusion_Blazor_Grids_GridAggregateColumn_FooterTemplate) property to render aggregate values in footer cells. -Access aggregate values inside `FooterTemplate` through the implicit template parameter `context`. Cast `context` to [AggregateTemplateContext](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.AggregateTemplateContext.html) to read properties such as Sum, Average, Min, Max, Count, TrueCount, and FalseCount. +Access aggregate values inside `FooterTemplate` through the implicit template parameter **context**. Cast **context** to [AggregateTemplateContext](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.AggregateTemplateContext.html) to read properties such as **Sum, Average, Min, Max, Count, TrueCount,** and **FalseCount**. {% tabs %} {% highlight razor tabtitle="Index.razor" %} diff --git a/blazor/datagrid/group-and-caption-aggregate.md b/blazor/datagrid/group-and-caption-aggregate.md index c1eecfc2de..6267590bbf 100644 --- a/blazor/datagrid/group-and-caption-aggregate.md +++ b/blazor/datagrid/group-and-caption-aggregate.md @@ -11,14 +11,12 @@ documentation: ug Group footer and group caption aggregates in the Syncfusion® Blazor DataGrid calculate values based on items in each group and display results in group footer cells and group caption cells. Configure these using the [GroupFooterTemplate](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridAggregateColumn.html#Syncfusion_Blazor_Grids_GridAggregateColumn_GroupFooterTemplate) and [GroupCaptionTemplate](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridAggregateColumn.html#Syncfusion_Blazor_Grids_GridAggregateColumn_GroupCaptionTemplate) properties of the [GridAggregateColumn](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridAggregateColumn.html#Syncfusion_Blazor_Grids_GridAggregateColumn__ctor) component. Aggregate values inside templates can be accessed through AggregateTemplateContext (for example, Sum, Min, Max). -> For group aggregates, ensure grouping is enabled at the grid level with AllowGrouping set to true, and maintain grouped columns by setting [ShowGroupedColumn](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridGroupSettings.html#Syncfusion_Blazor_Grids_GridGroupSettings_ShowGroupedColumn) to true. +> For group aggregates, ensure grouping is enabled at the grid level with [AllowGrouping](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_AllowGrouping) set to **true**, and maintain grouped columns by setting [ShowGroupedColumn](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridGroupSettings.html#Syncfusion_Blazor_Grids_GridGroupSettings_ShowGroupedColumn) to **true**. ## Group footer aggregates Group footer aggregates appear in the footer cells of each group and provide per-group summary values. To display group footer aggregates, define a template with the [GroupFooterTemplate](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridAggregateColumn.html#Syncfusion_Blazor_Grids_GridAggregateColumn_GroupFooterTemplate) property. The template renders the aggregate value for each group’s footer row. Apply the Format property to present currency or date values using culture-aware formatting as needed. -The following example demonstrates group footer aggregates in the DataGrid: - {% tabs %} {% highlight razor tabtitle="Index.razor" %} @using Syncfusion.Blazor.Grids @@ -110,14 +108,12 @@ The following example demonstrates group footer aggregates in the DataGrid: {% endhighlight %} {% endtabs %} -{% previewsample "https://blazorplayground.syncfusion.com/embed/LDhKCXUDfMsXaMrj?appbar=false&editor=false&result=true&errorlist=false&theme=bootstrap5" %} +{% previewsample "https://blazorplayground.syncfusion.com/embed/VDheZEVxysGhsjjP?appbar=false&editor=false&result=true&errorlist=false&theme=bootstrap5" %} ## Group caption aggregates Group caption aggregates appear in the caption cells at the top of each group and provide a concise summary. To display group caption aggregates, define a template using the [GroupCaptionTemplate](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridAggregateColumn.html#Syncfusion_Blazor_Grids_GridAggregateColumn_GroupCaptionTemplate) property. The template renders the aggregate value in the caption area of each group. Apply the Format property to aggregate values to present culture-aware currency or date results. -The following example demonstrates group caption aggregates in the DataGrid: - {% tabs %} {% highlight razor tabtitle="Index.razor" %} @using Syncfusion.Blazor.Grids diff --git a/blazor/datagrid/reactive-aggregate.md b/blazor/datagrid/reactive-aggregate.md index 109b38282a..f36edeae30 100644 --- a/blazor/datagrid/reactive-aggregate.md +++ b/blazor/datagrid/reactive-aggregate.md @@ -15,8 +15,6 @@ The Syncfusion® Blazor DataGrid supports re When the DataGrid is in batch editing mode, aggregate values in the footer, group footer, and group caption are refreshed each time a cell edit is saved. This ensures that summaries reflect the most recent edits. -The following example demonstrates automatic aggregate value updates in batch editing: - {% tabs %} {% highlight razor tabtitle="Index.razor" %} @using Syncfusion.Blazor.Grids From 61760979bfe3504ed9a319491d8e38f8c788669a Mon Sep 17 00:00:00 2001 From: SadhanaBaskaran Date: Wed, 3 Dec 2025 03:20:17 +0530 Subject: [PATCH 164/266] 984045: Updated the UG content and samples for Aggregate section in DataGrid --- blazor/datagrid/aggregates.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/blazor/datagrid/aggregates.md b/blazor/datagrid/aggregates.md index 5adc511b48..d9bdd75199 100644 --- a/blazor/datagrid/aggregates.md +++ b/blazor/datagrid/aggregates.md @@ -297,7 +297,7 @@ The available built-in aggregate types are : ## See also -* [Handling aggregates in custom adaptor](https://blazor.syncfusion.com/documentation/datagrid/custom-binding#handling-aggregates-in-custom-adaptor) +* [Handling aggregates in custom adaptor](https://blazor.syncfusion.com/documentation/datagrid/connecting-to-adaptors/custom-adaptor#handling-aggregates-operation) * [AggregateTemplateContext API reference](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.AggregateTemplateContext.html) * [AggregateType enumeration](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.AggregateType.html) * [Grouping in DataGrid](https://blazor.syncfusion.com/documentation/datagrid/grouping) From e5c8fa98049f4042fe5113b829489a4a4728f71f Mon Sep 17 00:00:00 2001 From: Backiaraj Date: Wed, 3 Dec 2025 09:38:30 +0530 Subject: [PATCH 165/266] Cleared CI error --- blazor/ribbon/getting-started-webapp.md | 2 +- blazor/sankey/getting-started-wasm.md | 2 +- blazor/sankey/getting-started.md | 2 +- blazor/speech-to-text/getting-started-web-app.md | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/blazor/ribbon/getting-started-webapp.md b/blazor/ribbon/getting-started-webapp.md index 1a793869dc..6274d7738e 100644 --- a/blazor/ribbon/getting-started-webapp.md +++ b/blazor/ribbon/getting-started-webapp.md @@ -285,7 +285,7 @@ To define a ribbon group under each tab, you can use the [RibbonGroups](https:// ### Adding a Ribbon Item -Within a group, items are organized into collections. Use the [RibbonCollection](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Ribbon.RibbonCollection.html) tag ditective for a set of items and the [RibbonItem](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Ribbon.RibbonItem.html) tag directive for each individual item. The [Type](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Ribbon.RibbonGroup.html#Syncfusion_Blazor_Ribbon_RibbonGroup_Orientation) property specifies the kind of item to render, such as a Button, DropDown, or ComboBox. +Within a group, items are organized into collections. Use the [RibbonCollection](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Ribbon.RibbonCollection.html) tag directive for a set of items and the [RibbonItem](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Ribbon.RibbonItem.html) tag directive for each individual item. The [Type](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Ribbon.RibbonGroup.html#Syncfusion_Blazor_Ribbon_RibbonGroup_Orientation) property specifies the kind of item to render, such as a Button, DropDown, or ComboBox. {% tabs %} {% highlight razor %} diff --git a/blazor/sankey/getting-started-wasm.md b/blazor/sankey/getting-started-wasm.md index 7d3acc2dc0..8f9e5597b5 100644 --- a/blazor/sankey/getting-started-wasm.md +++ b/blazor/sankey/getting-started-wasm.md @@ -1,6 +1,6 @@ --- layout: post -title: Getting Stared with Blazor Sankey Diagram | Syncfusion +title: Getting Stared with Sankey Diagram | Blazor WASM App | Syncfusion description: Checkout and learn about getting started with Blazor Sankey Diagram in Blazor WASM App using Visual Studio and more. platform: Blazor control: Sankey diff --git a/blazor/sankey/getting-started.md b/blazor/sankey/getting-started.md index 180d9f231c..cb0ed9e581 100644 --- a/blazor/sankey/getting-started.md +++ b/blazor/sankey/getting-started.md @@ -1,6 +1,6 @@ --- layout: post -title: Getting Stared with Blazor Sankey Diagram | Syncfusion +title: Getting Stared with Blazor Sankey Diagram Component | Syncfusion description: Checkout and learn about getting started with Blazor Sankey diagram in Blazor Server App using Visual Studio and more. platform: Blazor control: Sankey diff --git a/blazor/speech-to-text/getting-started-web-app.md b/blazor/speech-to-text/getting-started-web-app.md index 7e427a1f25..1a81402cec 100644 --- a/blazor/speech-to-text/getting-started-web-app.md +++ b/blazor/speech-to-text/getting-started-web-app.md @@ -1,6 +1,6 @@ --- layout: post -title: Getting Stared with Blazor SpeechToText | Syncfusion +title: Getting Stared with Blazor SpeechToText Component | Syncfusion description: Checkout and learn about getting started with Blazor SpeechToText in Blazor Web App using Visual Studio and more. platform: Blazor control: SpeechToText From 5e20956fb586388c34b76a74979c29ed972b4db6 Mon Sep 17 00:00:00 2001 From: SadhanaBaskaran Date: Wed, 3 Dec 2025 10:18:18 +0530 Subject: [PATCH 166/266] 984421: Updated the UG content and samples for Paging in DataGrid --- blazor/datagrid/paging.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/blazor/datagrid/paging.md b/blazor/datagrid/paging.md index ae436ffea1..d59a698c2a 100644 --- a/blazor/datagrid/paging.md +++ b/blazor/datagrid/paging.md @@ -19,7 +19,7 @@ Paging options can be configured through the [GridPageSettings](https://help.syn ## Customize the pager options -Customizing pager options in Syncfusion® Blazor DataGri helps adjust pagination to specific needs. The **PageCount** property sets the number of numeric buttons. The **CurrentPage** property defines the active page. The **PageSize** property specifies the number of records displayed per page. The **PageSizes** property provides a dropdown for selecting different page sizes. +Customizing pager options in Syncfusion® Blazor DataGrid helps adjust pagination to specific needs. The **PageCount** property sets the number of numeric buttons. The **CurrentPage** property defines the active page. The **PageSize** property specifies the number of records displayed per page. The **PageSizes** property provides a dropdown for selecting different page sizes. ### Change the page size From 9400035da160f6129f4739332337ffafa349fffd Mon Sep 17 00:00:00 2001 From: SadhanaBaskaran Date: Wed, 3 Dec 2025 10:41:35 +0530 Subject: [PATCH 167/266] 984957: Updated the UG content and samples for Grouping in Blazor DataGrid --- blazor/datagrid/caption-template.md | 26 ++++----- blazor/datagrid/grouping.md | 81 ++++++++++----------------- blazor/datagrid/lazy-load-grouping.md | 63 ++++++++++----------- 3 files changed, 70 insertions(+), 100 deletions(-) diff --git a/blazor/datagrid/caption-template.md b/blazor/datagrid/caption-template.md index dc20f20e4b..4c0859c937 100644 --- a/blazor/datagrid/caption-template.md +++ b/blazor/datagrid/caption-template.md @@ -1,7 +1,7 @@ --- layout: post title: Caption template in Blazor DataGrid | Syncfusion -description: Checkout and learn here all about Caption Template in Syncfusion Blazor DataGrid and much more details. +description: Learn how to customize group caption rows in Syncfusion Blazor DataGrid using CaptionTemplate and CaptionTemplateContext. platform: Blazor control: DataGrid documentation: ug @@ -9,11 +9,13 @@ documentation: ug # Caption template in Blazor DataGrid -The caption template feature in the Syncfusion® Blazor DataGrid allows you to customize and enhance the appearance of group caption row. It provides a flexible way to display additional information about grouped data, such as counts or grouped value, and enables you to incorporate custom content like images, icons, or other HTML elements. This feature empowers you to create visually appealing and informative group captions in the Grid. +The caption template feature in the Syncfusion® Blazor DataGrid customizes the content of group caption rows. It can display additional information about grouped data (such as the grouped value and record count) and render custom content including images, icons, or other Razor components. This enables clear, informative, and visually rich group captions in the DataGrid. -To achieve this customization, you can utilize the [CaptionTemplate](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridGroupSettings.html#Syncfusion_Blazor_Grids_GridGroupSettings_CaptionTemplate) property. You can type cast the context as [CaptionTemplateContext](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.CaptionTemplateContext.html#properties) to get the data, which represents the currently displayed group, you can incorporate its properties such as `Field` (column's Field name), `HeaderText` (column's Header text), `Key`(grouped value) and `Count` (Count of the grouped records) into the Caption template. - -The following example demonstrates how to customize the group header caption in the Grid by utilizing the `CaptionTemplate` property. It displays the **HeaderText**, **Key** and **Count** of the grouped columns: +Use the [CaptionTemplate](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridGroupSettings.html#Syncfusion_Blazor_Grids_GridGroupSettings_CaptionTemplate) property to define the template. Cast the context to [CaptionTemplateContext](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.CaptionTemplateContext.html) to access properties for the current group: +- **Field**: grouped column field name +- **HeaderText**: grouped column header text +- **Key**: grouped value +- **Count**: number of records in the group {% tabs %} {% highlight razor tabtitle="Index.razor" %} @@ -98,9 +100,7 @@ public class OrderData ## Adding custom text in group caption -The Syncfusion® Blazor DataGrid allows you to enhance the group captions by adding custom text, providing a more meaningful and informative representation of the grouped data. By utilizing the [CaptionTemplate](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridGroupSettings.html#Syncfusion_Blazor_Grids_GridGroupSettings_CaptionTemplate) property, you can add specific text or information to the group caption, offering flexibility in customization. - -The following example demonstrates how to add a custom text to the group caption using the `CaptionTemplate` property. You can type cast the context as [CaptionTemplateContext](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.CaptionTemplateContext.html#properties) to get the data used to display the key, count and headerText of the grouped columns along with the custom text. +The DataGrid supports adding custom text to group captions for clearer context. Use the [CaptionTemplate](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridGroupSettings.html#Syncfusion_Blazor_Grids_GridGroupSettings_CaptionTemplate) property to output any text or markup, combined with values from [CaptionTemplateContext](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.CaptionTemplateContext.html) such as **Key**, **Count**, and **HeaderText**. {% tabs %} {% highlight razor tabtitle="Index.razor" %} @@ -184,9 +184,7 @@ public class OrderData ## Customize group caption text using locale -The Syncfusion® Blazor DataGrid allows you to customize the group caption text based on the locale. This feature enables you to display localized text or translated content in the group captions according to different language or region settings. - -The following example demonstrates, how to customize group caption text based on **ar** locale: +The Syncfusion® Blazor DataGrid supports customization of group caption text based on locale settings. This feature enables the display of localized or translated content in group captions, allowing the DataGrid to adapt to different languages and regional formats. {% tabs %} {% highlight razor tabtitle="Index.razor" %} @@ -355,11 +353,11 @@ namespace LocalizationSample.Client ## Render custom component in group caption -The Syncfusion® Blazor DataGrid offers the flexibility to render a custom component in the group caption, providing advanced or interactive functionality within the group caption row. This feature allows you to display custom UI elements, like buttons, icons, or dropdowns, and handle user interactions directly within the group caption. +The Syncfusion® Blazor DataGrid offers flexibility to render custom components within the group caption row, enabling advanced or interactive functionality. This feature supports the display of custom UI elements such as buttons, icons, or dropdowns, and allows user interactions to be handled directly within the group caption. -To render custom component in the group caption, you can utilize the [CaptionTemplate](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridGroupSettings.html#Syncfusion_Blazor_Grids_GridGroupSettings_CaptionTemplate) property. This feature enables you to replace plain text with a custom component in the group caption, enhancing customization and interactivity. +Define the custom UI in the [CaptionTemplate](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridGroupSettings.html#Syncfusion_Blazor_Grids_GridGroupSettings_CaptionTemplate) and use `CaptionTemplateContext` to access the current group’s details. This feature enables the replacement of plain text with a custom component in the group caption, enhancing both customization and interactivity. -The following example demonstrates how to add a custom component to the group caption using the `CaptionTemplate` property. In the template, the [Chips](https://ej2.syncfusion.com/angular/documentation/chips/getting-started) is utilized, with the text content set as the group key. +The sample below shows how to render a chip with the group key in the Syncfusion Blazor [Chip](https://blazor.syncfusion.com/documentation/chip/getting-started-with-web-app) component. {% tabs %} {% highlight razor tabtitle="Index.razor" %} diff --git a/blazor/datagrid/grouping.md b/blazor/datagrid/grouping.md index 50e2eaa172..8d02da676d 100644 --- a/blazor/datagrid/grouping.md +++ b/blazor/datagrid/grouping.md @@ -1,7 +1,7 @@ --- layout: post title: Grouping in Blazor DataGrid | Syncfusion -description: Checkout and learn here all about Grouping in Syncfusion Blazor DataGrid component and much more details. +description: Learn how to group data, manage drop area visibility, persist group state, and sort or format grouped columns in the Syncfusion Blazor DataGrid. platform: Blazor control: DataGrid documentation: ug @@ -9,7 +9,7 @@ documentation: ug # Grouping in Blazor DataGrid -The grouping feature in the Syncfusion® Blazor DataGrid allows you to organize data into a hierarchical structure, making it easier to expand and collapse records. You can group the columns by simply dragging and dropping the column header to the group drop area. To enable grouping in the Grid, you need to set the [AllowGrouping](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_AllowGrouping) property to **true**. Additionally, you can customize the grouping options using the [GridGroupSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_GroupSettings). +The grouping feature in the Syncfusion® Blazor DataGrid organizes rows into groups, enabling users to expand or collapse related records. Columns can be grouped by dragging the column header into the group drop area. Enable grouping by setting the [AllowGrouping](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_AllowGrouping) property to **true**. Configure behavior using [GridGroupSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_GroupSettings). {% tabs %} {% highlight razor tabtitle="Index.razor" %} @@ -84,14 +84,12 @@ public class OrderData {% previewsample "https://blazorplayground.syncfusion.com/embed/rNLqMCNQhjHRjNeQ?appbar=false&editor=false&result=true&errorlist=false&theme=bootstrap5" %} -> * You can group and ungroup columns by using the [GroupColumnAsync](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_GroupColumnAsync_System_String_) and [UngroupColumnAsync](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_UngroupColumnAsync_System_String_) methods. -> * To disable grouping for a particular column, set the [AllowGrouping](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridColumn.html#Syncfusion_Blazor_Grids_GridColumn_AllowGrouping) to **false** in **GridColumn**. +> - Group and ungroup columns programmatically using [GroupColumnAsync](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_GroupColumnAsync_System_String_) and [UngroupColumnAsync](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_UngroupColumnAsync_System_String_). +> - To prevent grouping for a specific column, set [GridColumn.AllowGrouping](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridColumn.html#Syncfusion_Blazor_Grids_GridColumn_AllowGrouping) to **false**. ## Initial group -To enable initial grouping in the Syncfusion® Blazor DataGrid, you can use the [GridGroupSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridGroupSettings.html) property and set the GridGroupSettings [Columns](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridGroupSettings.html#Syncfusion_Blazor_Grids_GridGroupSettings_Columns) property to a string array of column names(field of the column) that you want to group by. This feature is particularly useful when working with large datasets, as it allows you to quickly organize and analyze the data based on specific criteria. - -The following example demonstrates how to set an initial grouping for the **CustomerID** and **ShipCity** columns during the initial rendering Grid, by using the `GridGroupSettings` of the `Columns` property. +Configure initial grouping in the Syncfusion® Blazor DataGrid by setting the [Columns](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridGroupSettings.html#Syncfusion_Blazor_Grids_GridGroupSettings_Columns) property of [GridGroupSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridGroupSettings.html) to an array of field names. This pre-groups the specified columns on initial render to accelerate data analysis. {% tabs %} {% highlight razor tabtitle="Index.razor" %} @@ -169,13 +167,11 @@ public class OrderData {% previewsample "https://blazorplayground.syncfusion.com/embed/rXBKsCNQBXkOKmSa?appbar=false&editor=false&result=true&errorlist=false&theme=bootstrap5" %} -> You can group by multiple columns by specifying a string array of column names in the `Columns` property of the `GridGroupSettings`. +> Group multiple columns by listing their field names in the `Columns` property of `GridGroupSettings`. ## Prevent grouping for particular column -The Syncfusion® Blazor DataGrid provides the ability to prevent grouping for a particular column. This can be useful when you have certain columns that you do not want to be included in the grouping process. It can be achieved by setting the [AllowGrouping](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridColumn.html#Syncfusion_Blazor_Grids_GridColumn_AllowGrouping) property of the particular `Column` to **false**. - -The following example demonstrates, how to disable grouping for **CustomerID** column: +To prevent grouping for a specific column, set [GridColumn.AllowGrouping](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridColumn.html#Syncfusion_Blazor_Grids_GridColumn_AllowGrouping) to **false**. This disables the drag-to-group feature for that column, while allowing grouping for other columns. {% tabs %} {% highlight razor tabtitle="Index.razor" %} @@ -247,16 +243,13 @@ public class OrderData {% endhighlight %} {% endtabs %} -{% previewsample "https://blazorplayground.syncfusion.com/embed/LthUWWNcBWKrghqe?appbar=false&editor=false&result=true&errorlist=false&theme=bootstrap55" %} +{% previewsample "https://blazorplayground.syncfusion.com/embed/LthUWWNcBWKrghqe?appbar=false&editor=false&result=true&errorlist=false&theme=bootstrap5" %} ## Hide drop area -By default, the Syncfusion® Blazor DataGrid provides a drop area for grouping columns. This drop area allows you to drag and drop columns to group and ungroup them. However, in some cases, you may want to prevent ungrouping or further grouping a column after initial grouping. - -To hide the drop area in the Grid, you can set the `GridGroupSettings` of the [ShowDropArea](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridGroupSettings.html#Syncfusion_Blazor_Grids_GridGroupSettings_ShowDropArea) property to **false**. +By default, the Syncfusion® Blazor DataGrid displays a drop area for grouping columns. In scenarios where further grouping or ungrouping should be restricted after initial grouping, hide the drop area. - -The following example, the [Blazor Toggle Switch Button](https://blazor.syncfusion.com/documentation/toggle-switch-button/getting-started) is added to hide or show the drop area. When the switch is toggled, the [ValueChange](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Buttons.ChangeEventArgs-1.html) event is triggered and the `GridGroupSettings` of the `ShowDropArea` property of the Grid is updated accordingly. +To hide the drop area, set the [ShowDropArea](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridGroupSettings.html#Syncfusion_Blazor_Grids_GridGroupSettings_ShowDropArea) property of `GridGroupSettings` to `false`. {% tabs %} {% highlight razor tabtitle="Index.razor" %} @@ -356,13 +349,12 @@ public class OrderData {% previewsample "https://blazorplayground.syncfusion.com/embed/VZhgiitwBBVMzKlC?appbar=false&editor=false&result=true&errorlist=false&theme=bootstrap5" %} -> By default, the group drop area will be shown only if there is at least one column available to group. +> By default, the group drop area is shown only if at least one column is available to group. ## Show the grouped column -The Syncfusion® Blazor DataGrid has a default behavior where the grouped column is hidden, to provide a cleaner and more focused view of your data. However, if you prefer to show the grouped column in the Grid, you can achieve this by setting the `GridGroupSettings` of the [ShowGroupedColumn](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridGroupSettings.html#Syncfusion_Blazor_Grids_GridGroupSettings_ShowGroupedColumn) property to **true**. +By default, grouped columns are hidden to keep the view focused. To display grouped columns, set [ShowGroupedColumn](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridGroupSettings.html#Syncfusion_Blazor_Grids_GridGroupSettings_ShowGroupedColumn) to **true** in `GridGroupSettings`. -In the following example, the [Blazor Toggle Switch Button](https://blazor.syncfusion.com/documentation/toggle-switch-button/getting-started) is added to hide or show the grouped columns. When the switch is toggled, the [ValueChange](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Buttons.ChangeEventArgs-1.html) event is triggered and the `GridGroupSettings` of the `showGroupedColumn` property of the Grid is updated accordingly. {% tabs %} {% highlight razor tabtitle="Index.razor" %} @@ -468,7 +460,7 @@ public class OrderData ## Persist grouped row expand or collapse state -The Syncfusion® Blazor DataGrid offers the ability to persist the expand or collapse state of grouped rows across various data operations such as paging, sorting, filtering, and editing. By default, these operations reset the grouped rows to their initial collapsed or expanded state. To retain the current state of grouped rows and ensure a consistent user experience, set the [GridGroupSettings.PersistGroupState](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridGroupSettings.html#Syncfusion_Blazor_Grids_GridGroupSettings_PersistGroupState) property to **true**. This also applies when using external grouping methods like [ExpandAllGroupAsync](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_ExpandAllGroupAsync) and [CollapseAllGroupAsync](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_CollapseAllGroupAsync). +The Syncfusion® Blazor DataGrid can persist the expand or collapse state of grouped rows across operations such as paging, sorting, filtering, and editing. By default, these operations reset grouped rows to their initial state. To retain the current state and ensure a consistent user experience, set [GridGroupSettings.PersistGroupState](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridGroupSettings.html#Syncfusion_Blazor_Grids_GridGroupSettings_PersistGroupState) to **true**. This also applies when using external methods like [ExpandAllGroupAsync](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_ExpandAllGroupAsync) and [CollapseAllGroupAsync](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_CollapseAllGroupAsync). {% tabs %} {% highlight razor tabtitle="Index.razor" %} @@ -568,9 +560,7 @@ public class OrderData ## Sort grouped columns in descending order during initial grouping -By default, grouped columns are sorted in ascending order. However, you can sort them in descending order during initial grouping by setting the [Field](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridSortColumn.html#Syncfusion_Blazor_Grids_GridSortColumn_Field) and [Direction](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridSortColumn.html#Syncfusion_Blazor_Grids_GridSortColumn_Direction) in the `GridSortSettings` of the [Columns](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridSortSettings.html#Syncfusion_Blazor_Grids_GridSortSettings_Columns) property. - -The following example demonstrates how to sort the **CustomerID** column by setting the `GridSortSettings` of the `Columns` property to **Descending** during the initial grouping of the Grid. +By default, grouped columns are sorted in ascending order. To sort in descending order during initial grouping, set the [Field](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridSortColumn.html#Syncfusion_Blazor_Grids_GridSortColumn_Field) and [Direction](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridSortColumn.html#Syncfusion_Blazor_Grids_GridSortColumn_Direction) in `GridSortSettings.Columns`. {% tabs %} {% highlight razor tabtitle="Index.razor" %} @@ -659,10 +649,7 @@ public class OrderData ## Group by format -By default, columns are grouped by the data or value present for the particular row. However, you can also group numeric or datetime columns based on the specified format. To enable this feature, you need to set the [EnableGroupByFormat](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridColumn.html#Syncfusion_Blazor_Grids_GridColumn_EnableGroupByFormat) -property of the corresponding Grid column. This feature allows you to group numeric or datetime columns based on a specific format. - -The following example demonstrates how to perform a group action using the `EnableGroupByFormat` property for the **OrderDate** and **Freight** columns of the Grid: +By default, grouping is performed based on the raw values. Alternatively, numeric or datetime columns can be grouped based on a specified display format by setting [EnableGroupByFormat](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridColumn.html#Syncfusion_Blazor_Grids_GridColumn_EnableGroupByFormat) on the corresponding column. {% tabs %} {% highlight razor tabtitle="Index.razor" %} @@ -738,15 +725,13 @@ public class OrderData {% previewsample "https://blazorplayground.syncfusion.com/embed/LDLUisZcqcKfqGvJ?appbar=false&editor=false&result=true&errorlist=false&theme=bootstrap5" %} -> Numeric columns can be grouped based on formats such as currency or percentage, while datetime columns can be grouped based on specific date or time formats. +> Numeric columns can be grouped based on formats such as currency or percentage, and datetime columns can be grouped based on date or time formats. ## Collapse all grouped rows at initial rendering -The Syncfusion® Blazor DataGrid offers a convenient feature to expand or collapse grouped rows, allowing you to control the visibility of grouped data. The option is useful when dealing with a large dataset that contains many groups, and there is a need to provide a summarized view by initially hiding the details. +The Syncfusion® Blazor DataGrid can expand or collapse grouped rows to control the visibility of grouped data. This is useful for summarizing large datasets by initially hiding details. -To collapse all grouped rows at the initial rendering of the Grid using the [DataBound](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridEvents-1.html#Syncfusion_Blazor_Grids_GridEvents_1_DataBound) event along with the [CollapseAllGroupAsync](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_CollapseAllGroupAsync) method. - -The following example demonstrates how to collapse all grouped rows at the initial rendering: +To collapse all grouped rows at initial rendering, use the [DataBound](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridEvents-1.html#Syncfusion_Blazor_Grids_GridEvents_1_DataBound) event with the [CollapseAllGroupAsync](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_CollapseAllGroupAsync) method. {% tabs %} {% highlight razor tabtitle="Index.razor" %} @@ -838,13 +823,11 @@ public class OrderData {% previewsample "https://blazorplayground.syncfusion.com/embed/VjrfDsjKqkAfFfop?appbar=false&editor=false&result=true&errorlist=false&theme=bootstrap5" %} -> The collapse all approach is suggested for a limited number of records since collapsing every grouped record takes some time. If you have a large dataset, it is recommended to use [lazy-load grouping](https://blazor.syncfusion.com/documentation/datagrid/lazy-load-grouping). This approach is also applicable for the [ExpandAllGroupAsync](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_ExpandAllGroupAsync) method. +> Collapsing every grouped record can take time on large datasets. For large data, use [lazy-load grouping](https://blazor.syncfusion.com/documentation/datagrid/lazy-load-grouping). The same consideration applies to [ExpandAllGroupAsync](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_ExpandAllGroupAsync). ## Group or Ungroup column externally -By default, the Syncfusion® Blazor DataGrid supports interaction-oriented column grouping, where users manually group columns by dragging and dropping them into the grouping area of the Grid. The Grid provides an ability to group and ungroup a column using [GroupColumnAsync](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_GroupColumnAsync_System_String_) and [UngroupColumnAsync](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_UngroupColumnAsync_System_String_) methods. These methods provide a programmatic approach to perform column grouping and ungrouping. - -The following example demonstrates how to group and ungroup the columns in a Grid. It utilizes the [DropDownList](https://blazor.syncfusion.com/documentation/dropdown-list/getting-started) to select the column. When an external button is clicked, the `GroupColumnAsync` and `UngroupColumnAsync` methods are called to group or ungroup the selected column. +The Syncfusion® Blazor DataGrid supports interaction-based grouping by dragging headers to the grouping area. It also supports programmatic grouping and ungrouping via [GroupColumnAsync](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_GroupColumnAsync_System_String_) and [UngroupColumnAsync](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_UngroupColumnAsync_System_String_). {% tabs %} {% highlight razor tabtitle="Index.razor" %} @@ -965,13 +948,11 @@ public class OrderData ## Expand or collapse externally -The Syncfusion® Blazor DataGrid offers a convenient feature to expand or collapse grouped rows, allowing you to control the visibility of grouped data. This section will provide guidance on enabling this functionality and integrating it into your application using the Grid properties and methods. +The Syncfusion® Blazor DataGrid can expand or collapse grouped rows programmatically to control the visibility of grouped data. ### Expand or collapse all grouped rows -The Syncfusion® Blazor DataGrid provides an ability to expand or collapse grouped rows using [ExpandAllGroupAsync](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_ExpandAllGroupAsync) and [CollapseAllGroupAsync](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_CollapseAllGroupAsync) methods respectively. - -In the following example, the [Blazor Toggle Switch Button](https://blazor.syncfusion.com/documentation/toggle-switch-button/getting-started) is added to expand or collapse grouped rows. When the switch is toggled, the [ValueChange](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Buttons.ChangeEventArgs-1.html) event is triggered and the `ExpandAllGroupAsync` and `CollapseAllGroupAsync` methods are called to expand or collapse grouped rows. +Use [ExpandAllGroupAsync](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_ExpandAllGroupAsync) and [CollapseAllGroupAsync](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_CollapseAllGroupAsync) to expand or collapse all grouped rows. {% tabs %} {% highlight razor tabtitle="Index.razor" %} @@ -1072,11 +1053,9 @@ public class OrderData ## Clear grouping -The clear grouping feature in the Syncfusion® Blazor DataGrid allows you to removing all the grouped columns from the Grid. This feature provides a convenient way to clear the grouping of columns in your application. +The clear grouping feature in the Syncfusion® Blazor DataGrid removes all grouped columns from the Grid, providing a quick way to reset grouping. -To clear all the grouped columns in the Grid, you can utilize the [ClearGroupingAsync](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_ClearGroupingAsync) method of the Grid. - -The following example demonstrates how to clear the grouping using `ClearGroupingAsync` method in the external button click. +To clear all grouped columns, call the [ClearGroupingAsync](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_ClearGroupingAsync) method. {% tabs %} {% highlight razor tabtitle="Index.razor" %} @@ -1164,13 +1143,11 @@ public class OrderData ## Grouping events -The Syncfusion® Blazor DataGrid provides two events that are triggered during the group action such as [Grouping](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridEvents-1.html#Syncfusion_Blazor_Grids_GridEvents_1_Grouping) and [Grouped](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridEvents-1.html#Syncfusion_Blazor_Grids_GridEvents_1_Grouped). The `Grouping` event is triggered before the group action starts, and the `Grouped` event is triggered after the group action is completed. You can use these events to perform any custom action based on the grouping. - -1. **Grouping Event**: `Grouping` event is triggered before the grouping action or un-grouping action is performed in the Grid. It provides a way to perform any necessary operations before the group action takes place. This event provides a parameter that contains the current sorting column name, and action. +The Syncfusion® Blazor DataGrid provides two events for the group action: [Grouping](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridEvents-1.html#Syncfusion_Blazor_Grids_GridEvents_1_Grouping) and [Grouped](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridEvents-1.html#Syncfusion_Blazor_Grids_GridEvents_1_Grouped). `Grouping` is triggered before the action starts, and `Grouped` is triggered after completion. These events support custom logic based on grouping. -2. **Grouped Event**: `Grouped` event is triggered after the grouping action or un-grouping action is performed in the Grid. It provides a way to perform any necessary operations after the group action has taken place. This event provides a parameter that contains the current sorting column name, and action. +1. **Grouping Event**: Triggered before the grouping or ungrouping action is performed in the Grid. Use this to perform operations or cancel the action. The event parameters include the current grouping column name and the action. -The following example demonstrates how the `Grouping` and `Grouped` events work when grouping is performed. The `Grouping` event event is used to cancel the grouping of the **OrderID** column. The `Grouped` event is used to display a message +2. **Grouped Event**: Triggered after the grouping or ungrouping action is performed in the Grid. Use this to run post-action logic. The event parameters include the current grouping column name and the action. {% tabs %} {% highlight razor tabtitle="Index.razor" %} @@ -1277,6 +1254,6 @@ public class OrderData ## See Also -* [Exporting grouped records](https://blazor.syncfusion.com/documentation/datagrid/excel-exporting#exporting-grouped-records) +- [Exporting grouped records](https://blazor.syncfusion.com/documentation/datagrid/excel-exporting#exporting-grouped-records) -> You can refer to our [Blazor DataGrid](https://www.syncfusion.com/blazor-components/blazor-datagrid) feature tour page for its groundbreaking feature representations. You can also explore our [Blazor DataGrid example](https://blazor.syncfusion.com/demos/datagrid/overview?theme=bootstrap5) to understand how to present and manipulate data. \ No newline at end of file +> Refer to the [Blazor DataGrid](https://www.syncfusion.com/blazor-components/blazor-datagrid) feature tour for an overview of capabilities. Explore the [Blazor DataGrid example](https://blazor.syncfusion.com/demos/datagrid/overview?theme=bootstrap5) to learn how to present and manipulate data. \ No newline at end of file diff --git a/blazor/datagrid/lazy-load-grouping.md b/blazor/datagrid/lazy-load-grouping.md index 86475a8ae9..75a0fe47bb 100644 --- a/blazor/datagrid/lazy-load-grouping.md +++ b/blazor/datagrid/lazy-load-grouping.md @@ -1,7 +1,7 @@ --- layout: post -title: Lazy Load Grouping in Blazor DataGrid | Syncfusion -description: Checkout and learn here all about Lazy Load Grouping in Syncfusion Blazor DataGrid and much more details. +title: Lazy load grouping in Blazor DataGrid | Syncfusion +description: Learn how to enable lazy load grouping in Syncfusion Blazor DataGrid with on-demand data loading, infinite scrolling, and virtual scrolling for large datasets. platform: Blazor control: DataGrid documentation: ug @@ -9,13 +9,11 @@ documentation: ug # Lazy Load Grouping in Blazor DataGrid -In Blazor , lazy loading refers to the technique of loading data dynamically when they are needed, instead of loading everything upfront. Lazy loading can significantly improve the performance of your application by reducing the initial load time. +In Blazor, lazy loading refers to loading data dynamically only when needed, rather than loading everything upfront. This approach reduces initial load time and improves application performance. -Lazy load grouping in the Syncfusion® Blazor DataGrid allows you to load and display grouped data efficiently by fetching only the required data on demand. This feature is useful when dealing with large datasets where loading all the data at once might affect performance. The Grid will render only the initial level caption rows in the collapsed state at grouping. The child rows of each caption will be fetched in on demand and render in the Grid when you expand the caption row. +Lazy load grouping in the Syncfusion® Blazor DataGrid efficiently loads grouped data by fetching only the required records on demand. This feature is especially useful for large datasets where loading all rows at once can affect performance. When grouping is applied, the DataGrid initially renders only top-level group caption rows in a collapsed state. The child rows for each group are fetched on demand and rendered when the corresponding caption row is expanded. -To enable this feature, need to set the [EnableLazyLoading](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridGroupSettings.html#Syncfusion_Blazor_Grids_GridGroupSettings_EnableLazyLoading) as **true** in [GridGroupSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_GroupSettings). - -The following example demonstrates how to enable the lazy load grouping feature by setting the `EnableLazyLoading` as **true** in `GridGroupSettings`: +To enable this feature, set [EnableLazyLoading](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridGroupSettings.html#Syncfusion_Blazor_Grids_GridGroupSettings_EnableLazyLoading) to **true** in [GridGroupSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_GroupSettings). Ensure grouping is enabled by setting AllowGrouping to true. {% tabs %} {% highlight razor tabtitle="Index.razor" %} @@ -116,19 +114,17 @@ public class OrderData ## Lazy load grouping with infinite scrolling -Lazy loading grouping with infinite scrolling is a valuable feature in scenarios where there is a need to present grouped data, efficiently handle large datasets, and ensure a seamless experience. This feature enables loading data on demand as the interface is interacted with, ensuring optimal performance and responsiveness while effectively managing and presenting large grouped datasets +Lazy load grouping with infinite scrolling is useful when presenting grouped data at scale while maintaining responsiveness. Data is loaded on-demand as users interact with the interface, improving performance and user experience. **How lazy load grouping with infinite scrolling works** -1. When you enable lazy load grouping with infinite scrolling, the Grid initially renders only the top-level caption rows in a collapsed state. - -2. The child rows associated with each group caption are loaded and rendered in the Grid only when you expand the corresponding caption row. +1. When enabled, the DataGrid initially renders only the top-level group caption rows in a collapsed state. -3. Infinite scrolling enables the Grid to load additional data as the user scrolls to the end of the scrollbar. +2. Child rows for a group are fetched and rendered only when the corresponding caption row is expanded. -To enable this feature, you need to set the [EnableInfiniteScrolling](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_EnableInfiniteScrolling) property as **true** and the [EnableLazyLoading](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridGroupSettings.html#Syncfusion_Blazor_Grids_GridGroupSettings_EnableLazyLoading) property of the [GridGroupSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridGroupSettings.html) class as **true**. +3. Infinite scrolling loads additional data as the user reaches the end of the scrollbar. -The following example demonstrates how to enable the lazy load grouping with infinite scrolling feature using the `EnableLazyLoading` property of the `GridGroupSettings` and `EnableInfiniteScrolling` property. +To enable this feature, set [EnableInfiniteScrolling](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_EnableInfiniteScrolling) to **true** and set [EnableLazyLoading](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridGroupSettings.html#Syncfusion_Blazor_Grids_GridGroupSettings_EnableLazyLoading) in [GridGroupSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridGroupSettings.html) to **true**. {% tabs %} {% highlight razor tabtitle="Index.razor" %} @@ -226,24 +222,23 @@ public class OrderData {% previewsample "https://blazorplayground.syncfusion.com/embed/VZBfjiNqTFAghOTK?appbar=false&editor=false&result=true&errorlist=false&theme=bootstrap5" %} -> * The [EnableInfiniteScrolling](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_EnableInfiniteScrolling) property is optional and can be set to **true** or **false** based on the requirement. -> * When `EnableLazyLoading` is enabled with `EnableInfiniteScrolling`, the [Height](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_Height) and the [RowHeight](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_RowHeight) property must be defined. +> * The [EnableInfiniteScrolling](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_EnableInfiniteScrolling) property is optional and can be set based on the requirement. +> * When `EnableLazyLoading` is enabled with `EnableInfiniteScrolling`, the [Height](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_Height) and [RowHeight](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_RowHeight) properties must be defined. +> * `Paging` should not be used together with infinite scrolling. ## Lazy load grouping with virtual scrolling -The lazy load grouping with virtual scrolling feature in the Syncfusion® Blazor DataGrid allows you to efficiently present and analyze large grouped datasets. This feature optimizes performance, reduces initial load time, and provides smooth scrolling through the dataset. +The lazy load grouping with virtual scrolling feature in the Syncfusion® Blazor DataGrid efficiently presents large grouped datasets by reducing initial load time and providing smooth scrolling. **How lazy load grouping with virtual scrolling works** -1. When you enable lazy load grouping with virtual scrolling, the Grid renders only the initial level caption rows in a collapsed state. - -2. The child rows associated with each group caption are loaded and rendered in the Grid only when you expand the respective caption row. +1. When enabled, the DataGrid renders only the initial top-level group caption rows in a collapsed state. -3. Virtual scrolling allows the Grid to load and display a buffered set of records while scrolling vertically. +2. Child rows for each group are fetched and rendered only when the respective caption row is expanded. -To enable this feature, you need to set the [EnableLazyLoading](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridGroupSettings.html#Syncfusion_Blazor_Grids_GridGroupSettings_EnableLazyLoading) property of the [GridGroupSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridGroupSettings.html) and [EnableVirtualization](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_EnableVirtualization) properties to true. +3. Virtual scrolling loads and displays a buffered set of records while scrolling vertically. -The following example demonstrates how to enable the lazy load grouping with virtual scrolling feature using the `EnableLazyLoading` property of the `GridGroupSettings` and `EnableVirtualization` property. +To enable this feature, set [EnableLazyLoading](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridGroupSettings.html#Syncfusion_Blazor_Grids_GridGroupSettings_EnableLazyLoading) in [GridGroupSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridGroupSettings.html) to true and set [EnableVirtualization](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_EnableVirtualization) to true. {% tabs %} {% highlight razor tabtitle="Index.razor" %} @@ -322,19 +317,19 @@ public class OrderData {% previewsample "https://blazorplayground.syncfusion.com/embed/rNVUsCMzgHLDLmbm?appbar=false&editor=false&result=true&errorlist=false&theme=bootstrap5" %} -> * When `EnableLazyLoading` is enabled with `EnableVirtualization`, the [PageSize](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridPageSettings.html#Syncfusion_Blazor_Grids_GridPageSettings_PageSize) property of the [GridPageSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridPageSettings.html) class and the [RowHeight](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_RowHeight) property must be defined. -> * When enabling lazy load grouping with virtual scrolling, the [EnableVirtualMaskRow](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_EnableVirtualMaskRow) property is enabled by default. There is no need to use this property explicitly. +> * When `EnableLazyLoading` is enabled with `EnableVirtualization`, the [PageSize](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridPageSettings.html#Syncfusion_Blazor_Grids_GridPageSettings_PageSize) property of [GridPageSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridPageSettings.html) and the [RowHeight](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_RowHeight) property must be defined. +> * When enabling lazy load grouping with virtual scrolling, the [EnableVirtualMaskRow](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_EnableVirtualMaskRow) property is enabled by default; there is no need to set it explicitly. +> * `Paging` should not be used together with virtual scrolling. ## Lazy load grouping with custom adaptor -You can use the Custom Adaptor of DataManager when binding the remote data. Along with the default server request, this feature will additionally send the below details to handle the lazy load grouping. In the server end, these details are bound with the **LazyLoad** and **LazyExpandAllGroup** parameters in the DataManagerRequest model. +Use a Custom Adaptor of DataManager when binding remote data. Along with the default server request, this feature sends additional details to handle lazy load grouping. On the server, these details are bound to the **LazyLoad** and **LazyExpandAllGroup** parameters in the [DataManagerRequest](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Data.DataManagerRequest.html) model. For implementing server logic, extend the [DataAdaptor](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Data.DataAdaptor.html) class. | Property Name | Description | |-------|---------| -| LazyLoad | To differentiate between default grouping and lazy load grouping.| -| LazyExpandAllGroup | To handle ExpandAll support for lazy load grouping.| +| LazyLoad | Differentiates between default grouping and lazy load grouping. | +| LazyExpandAllGroup | Handles Expand All support for lazy load grouping. | -The following code example describes the lazy load grouping handled at the server-side with other Grid actions. ```csharp // Implementing custom adaptor by extending the DataAdaptor class. @@ -383,13 +378,13 @@ public class CustomAdaptor : DataAdaptor ## Limitations for lazy load grouping -* Due to the element height limitation in browsers, the maximum number of records loaded by the Grid is limited due to the browser capability. -* Lazy load grouping is not compatible with the following features +* Due to browser element height limitations, the maximum number of records that can be rendered is constrained by browser capabilities. +* Lazy load grouping is not compatible with the following features: * Batch editing * Row template * Row drag and drop * Hierarchical Grid * Detail Template -* Programmatic selection is not supported in lazy load grouping when groups are in a collapsed state. -* Drag selection, Cell selection (box and flow), Row Selection is not working in collapsed state. -* Clipboard is not support when the groups are in collapsed state. \ No newline at end of file +* Programmatic selection is not supported when groups are collapsed. +* Drag selection, cell selection (box and flow), and row selection do not work when groups are collapsed. +* Clipboard is not supported when groups are collapsed. \ No newline at end of file From 351eaf0e4e8b14c1d51bbe8b75b060d7a93f27fc Mon Sep 17 00:00:00 2001 From: SadhanaBaskaran Date: Wed, 3 Dec 2025 10:50:16 +0530 Subject: [PATCH 168/266] 983330: Updated the UG for How-To folder Content and Samples in DataGrid --- ...xt-as-additional-parameters-from-events.md | 22 ++--- .../datagrid/how-to/server-side-using-cli.md | 86 +++++++++++-------- .../upgrade-application-to-latest-version.md | 29 ++++--- .../use-radio-button-instead-of-checkbox.md | 43 +++++----- ...ng-dictionary-values-in-grid-datasource.md | 10 +-- 5 files changed, 104 insertions(+), 86 deletions(-) diff --git a/blazor/datagrid/how-to/send-context-as-additional-parameters-from-events.md b/blazor/datagrid/how-to/send-context-as-additional-parameters-from-events.md index 7138b4223b..0c9e9fdc70 100644 --- a/blazor/datagrid/how-to/send-context-as-additional-parameters-from-events.md +++ b/blazor/datagrid/how-to/send-context-as-additional-parameters-from-events.md @@ -1,15 +1,15 @@ --- layout: post -title: Send context as parameters from events in Blazor DataGrid | Syncfusion -description: Checkout the documentation for sending context as additional parameters from events in Blazor DataGrid in Visual Side using .NET CLI and much more. +title: Send Context as Parameters in Blazor DataGrid | Syncfusion +description: Learn how to Pass current row context from Blazor DataGrid events using edit templates to update bound fields instantly. platform: Blazor control: DataGrid documentation: ug --- -# Sending context as additional parameters in Blazor DataGrid events +# Sending Context as additional Parameters in Blazor DataGrid Events -The Syncfusion® Blazor DataGrid offers flexibility to pass additional context information during events. This capability is especially useful for dynamically updating Grid data based on interactions with other components, enabling seamless, real-time data modifications within the Grid. +The Syncfusion® Blazor DataGrid supports passing the current row context to event handlers. This approach is useful for updating Grid fields based on interactions inside the edit dialog, enabling immediate, in-place updates to the bound data. To implement this, follow these steps: @@ -17,15 +17,11 @@ To implement this, follow these steps: 2. Bind the ComboBox’s `ValueChange` event to a handler method. - 3. The method receives two parameters: + 3. The handler receives: + * args: Event arguments that include the new ComboBox value and the selected item. + * context: The template context cast to the row type (Order) and stored in a local variable (order). - * **args**: The event arguments containing the new `ComboBox` value and selected item. - - * **Context**: The current row data is referenced by the variable **Order**, which is cast from the template’s context object as **Order**. - - 4. Within the event handler, you can update properties of the current row, such as **ShipCity**, **ShipCountry** based on the selected `ComboBox` value. The Grid is directly bound to the data object, so changes made to this object are immediately reflected in the Grid UI. - -The following example demonstrates this approach: + 4. Inside the handler, update properties of the current row (for example, ShipCity and ShipCountry) based on the selected ComboBox value. Because the Grid is bound to the same data object instance, changes are reflected immediately in the Grid UI. {% tabs %} {% highlight razor tabtitle="Index.razor" %} @@ -154,4 +150,4 @@ Height="600" @ref="Grid"> {% endhighlight %} {% endtabs %} -{% previewsample "https://blazorplayground.syncfusion.com/embed/hZVoXHDepIVbDBhd?appbar=false&editor=false&result=true&errorlist=false&theme=bootstrap5" %} +{% previewsample "https://blazorplayground.syncfusion.com/embed/hZhIXYrfAswqgaHD?appbar=false&editor=false&result=true&errorlist=false&theme=bootstrap5" %} diff --git a/blazor/datagrid/how-to/server-side-using-cli.md b/blazor/datagrid/how-to/server-side-using-cli.md index df373c813d..4c915b3fac 100644 --- a/blazor/datagrid/how-to/server-side-using-cli.md +++ b/blazor/datagrid/how-to/server-side-using-cli.md @@ -1,24 +1,33 @@ --- layout: post -title: Add Blazor DataGrid to a Server-Side App via .NET CLI | Syncfusion -description: Check out the documentation for getting started with the Syncfusion Blazor DataGrid in a server-side app using the .NET CLI and more. +title: Add Syncfusion DataGrid to standalone Blazor Server app using .NET CLI +description: Add the Syncfusion Blazor DataGrid to a Blazor Server app using the .NET CLI on .NET 8/9, including setup, theme, scripts, and basic features. platform: Blazor control: DataGrid documentation: ug --- -# Blazor DataGrid in Server Side App using CLI +# Blazor DataGrid in a standalone Blazor Server app using .NET CLI -This article provides a step-by-step instructions to build a Blazor Server App with Syncfusion® Blazor DataGrid using the [.NET CLI](https://dotnet.microsoft.com/en-us/download/dotnet). +This article provides step-by-step instructions to build a standalone Blazor Server app with Syncfusion® Blazor DataGrid using the [.NET CLI](https://dotnet.microsoft.com/en-us/download/dotnet). The guidance aligns with .NET 8/9 Blazor Server project standards. ## Manually creating a project -This section provides a brief explanation on how to manually create a Blazor Server App using CLI. +This section explains how to manually create a Blazor Server app using the CLI. ### Prerequisites -Ensure you have the latest version of the [.NET Core SDK](https://dotnet.microsoft.com/en-us/download) installed. -To check the installed version, run the following command in a command prompt (Windows), terminal (macOS), or shell (Linux): +Install the latest [.NET SDK](https://dotnet.microsoft.com/en-us/download) for .NET 8/9. To verify installed SDKs, run: + +{% tabs %} +{% highlight c# tabtitle=".NET CLI" %} + +dotnet --list-sdks + +{% endhighlight %} +{% endtabs %} + +To check the current default .NET SDK version installed on a system, run the following command in a terminal or command prompt: {% tabs %} {% highlight c# tabtitle=".NET CLI" %} @@ -28,9 +37,9 @@ dotnet --version {% endhighlight %} {% endtabs %} -### Create a Blazor Server side project using .NET Core CLI +### Create a standalone Blazor Server side project using .NET Core CLI -To create a new Blazor Server application, open your terminal or command prompt and run: +To create a new standalone Blazor Server application using the .NET CLI, run the following command: {% tabs %} {% highlight c# tabtitle=".NET CLI" %} @@ -41,13 +50,13 @@ cd BlazorApp {% endhighlight %} {% endtabs %} -This command creates new Blazor app project 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](https://learn.microsoft.com/en-us/dotnet/core/tools/dotnet-new) command topics for more details. +This command creates a new standalone Blazor Server app and places it in a directory named BlazorApp within the current working location. For more details, refer to the [Create a Blazor app](https://dotnet.microsoft.com/en-us/learn/aspnet/blazor-tutorial/create) and [dotnet new CLI](https://learn.microsoft.com/en-us/dotnet/core/tools/dotnet-new) documentation. -N> If you have installed multiple SDK versions and need any specific framework version (net5.0/netcoreapp3.1) project, then add -f flag along with dotnet new blazorserver comment. Refer [here](https://learn.microsoft.com/en-us/dotnet/core/tools/dotnet-new) for the available options. +N> If multiple SDK versions are installed and a specific target framework (for example, net8.0/net9.0) is required, add the -f flag with the dotnet new blazorserver command. Refer to the [dotnet new options](https://learn.microsoft.com/en-us/dotnet/core/tools/dotnet-new) for available flags. ### Install Syncfusion® Blazor DataGrid and Themes NuGet in the app -To add the `Syncfusion.Blazor.Grid` NuGet package to your application, use the following command in the command prompt (Windows) or terminal (Linux/macOS). For more details, refer to the [Install and manage packages using the dotnet CLI](https://learn.microsoft.com/en-us/nuget/consume-packages/install-use-packages-dotnet-cli). +To add the `Syncfusion.Blazor.Grid` NuGet package to the application, use the following command in the command prompt (Windows) or terminal (Linux/macOS). For more details, refer to [Install and manage packages using the dotnet CLI](https://learn.microsoft.com/en-us/nuget/consume-packages/install-use-packages-dotnet-cli). {% tabs %} {% highlight c# tabtitle=".NET CLI" %} @@ -59,7 +68,7 @@ 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). Refer to the [NuGet packages](https://blazor.syncfusion.com/documentation/nuget-packages) topic for the list of available packages and component details. If a project requires a Syncfusion license key, see the [licensing](https://blazor.syncfusion.com/documentation/common/essential-studio/licensing/overview) topic to register it at startup. ### Register Syncfusion® Blazor service @@ -75,7 +84,7 @@ Open the **~/_Imports.razor** file and add the following namespaces: ``` 2. Register the Syncfusion® service: -In your **~/Program.cs** file, register the Syncfusion® Blazor service as shown below: +In the **~/Program.cs** file, register the Syncfusion® Blazor service as shown below: {% tabs %} {% highlight C# tabtitle="Blazor Server App" hl_lines="3 10" %} @@ -99,20 +108,23 @@ var app = builder.Build(); ### 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). Reference the stylesheet and script in the `` section of your main layout page as shown below: +The theme stylesheet and script can be accessed from NuGet through [Static Web Assets](https://blazor.syncfusion.com/documentation/appearance/themes#static-web-assets). Reference the stylesheet and script in the `` section of the main layout page as shown below: -* For **.NET 6** Blazor Server app, include it in **~/Pages/_Layout.cshtml** file. - -* For **.NET 7,8,9 and 10** Blazor Server app, include it in the **~/Pages/_Host.cshtml** file. +* For **.NET 8 and .NET 9** Blazor Server apps, include them in the **~/Pages/_Host.cshtml** file. ```html .... - + + + .... + + + ``` -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> Review the [Blazor Themes](https://blazor.syncfusion.com/documentation/appearance/themes) topic to learn 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 a Blazor application. Also, see [Adding Script Reference](https://blazor.syncfusion.com/documentation/common/adding-script-references) for approaches to add script references. ### Add Blazor DataGrid @@ -173,7 +185,7 @@ public class OrderData {% endhighlight %} {% endtabs %} -* To build and run the Blazor Server App, use the following command in your terminal or command prompt: +* To build and run the Blazor Server app, use the following command in the terminal or command prompt: {% tabs %} {% highlight c# tabtitle=".NET CLI" %} @@ -183,11 +195,13 @@ dotnet run {% endhighlight %} {% endtabs %} -{% previewsample "https://blazorplayground.syncfusion.com/embed/BjrIZoWghZXnoxDw?appbar=false&editor=false&result=true&errorlist=false&theme=bootstrap5" backgroundimage "[Blazor DataGrid](../images/blazor-datagrid-component.png)" %} +![Blazor DataGrid](../images/blazor-datagrid-component.png) + +{% previewsample "https://blazorplayground.syncfusion.com/embed/BjrIZoWghZXnoxDw?appbar=false&editor=false&result=true&errorlist=false&theme=bootstrap5" %} ### Defining row data -To bind data for the Syncfusion® Blazor DataGrid, assign a `List` (or any other collection that implements `IEnumerable`) to the [DataSource](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_DataSource) property. The list data source can also be provided as an instance of the `DataManager`. You can assign the data source through the `OnInitialized` life cycle of the page. +To bind data for the Syncfusion® Blazor DataGrid, assign a `List` (or any collection that implements `IEnumerable`) to the [DataSource](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_DataSource) property. The list data source can also be provided as an instance of the `DataManager`. The data source is typically assigned in the `OnInitialized` lifecycle method of the page. {% tabs %} {% highlight razor tabtitle="Index.razor" %} @@ -255,13 +269,13 @@ public class OrderData ### Defining columns -The columns are automatically generated when columns declaration is empty or undefined while initializing the Syncfusion® Blazor DataGrid. +Columns are automatically generated when the column declaration is empty or undefined during initialization of the Syncfusion® Blazor DataGrid. -The Grid has an option to define columns using [GridColumns](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridColumns.html). In `GridColumn` we have properties to customize columns. +The Grid also supports defining columns using [GridColumns](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridColumns.html). In `GridColumn`, several properties are available to customize column behavior. Here are the key properties used in the example below: -* [Field](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridColumn.html#Syncfusion_Blazor_Grids_GridColumn_Field) : Binds the column to a property on your data model. +* [Field](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridColumn.html#Syncfusion_Blazor_Grids_GridColumn_Field) : Binds the column to a property in the data model. * [HeaderText](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridColumn.html#Syncfusion_Blazor_Grids_GridColumn_HeaderText) : Sets the displayed column title. @@ -271,7 +285,7 @@ Here are the key properties used in the example below: * [Type](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridColumn.html#Syncfusion_Blazor_Grids_GridColumn_Type) : Specifies the column data type. -* [Width](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridColumn.html#Syncfusion_Blazor_Grids_GridColumn_Width): Sets the column’s width. +* [Width](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridColumn.html#Syncfusion_Blazor_Grids_GridColumn_Width): Sets the column width. {% tabs %} {% highlight razor tabtitle="Index.razor" %} @@ -347,7 +361,7 @@ public class OrderData ### Enable paging -The Syncfusion® Blazor DataGrid can display records in a paged format. To enable paging, set the [AllowPaging](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_AllowPaging) property to **true**. You can customize the pager using the [GridPageSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_PageSettings). +The Syncfusion® Blazor DataGrid can display records in a paged format. To enable paging, set the [AllowPaging](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_AllowPaging) property to **true**. Customize the pager using the [GridPageSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_PageSettings). {% tabs %} {% highlight razor tabtitle="Index.razor" %} @@ -423,7 +437,7 @@ public class OrderData ### Enable sorting -The Syncfusion® Blazor DataGrid can sort records in ascending or descending order. To enable sorting, set the [AllowSorting](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_AllowSorting) property to **true**. You can customize the sorting using the [GridSortSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_SortSettings). +The Syncfusion® Blazor DataGrid can sort records in ascending or descending order. To enable sorting, set the [AllowSorting](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_AllowSorting) property to **true**. Customize sorting using the [GridSortSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_SortSettings). {% tabs %} {% highlight razor tabtitle="Index.razor" %} @@ -498,7 +512,7 @@ public class OrderData ### Enable filtering -The Syncfusion® Blazor DataGrid can filter records to display only those that meet specific criteria. To enable filtering, set the [AllowFiltering](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_AllowFiltering) property to **true**. You can customize the filtering behavior using the [GridFilterSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_FilterSettings). +The Syncfusion® Blazor DataGrid can filter records to display only those that meet specific criteria. To enable filtering, set the [AllowFiltering](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_AllowFiltering) property to **true**. Customize filtering behavior using the [GridFilterSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_FilterSettings). {% tabs %} {% highlight razor tabtitle="Index.razor" %} @@ -574,7 +588,7 @@ public class OrderData ### Enable grouping -The Syncfusion® Blazor DataGrid can group records by one or more columns. To enable grouping, set the [AllowGrouping](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_AllowGrouping) property to **true**. You can customize grouping behavior using the [GridGroupSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_GroupSettings). +The Syncfusion® Blazor DataGrid can group records by one or more columns. To enable grouping, set the [AllowGrouping](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_AllowGrouping) property to **true**. Customize grouping behavior using the [GridGroupSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_GroupSettings). {% tabs %} {% highlight razor tabtitle="Index.razor" %} @@ -646,14 +660,16 @@ public class OrderData {% endhighlight %} {% endtabs %} -{% previewsample "https://blazorplayground.syncfusion.com/embed/BZBoZosUMRYBBVqA?appbar=false&editor=false&result=true&errorlist=false&theme=bootstrap5" backgroundimage "[Blazor DataGrid](../images/blazor-datagrid.gif)" %} +{% previewsample "https://blazorplayground.syncfusion.com/embed/BZBoZosUMRYBBVqA?appbar=false&editor=false&result=true&errorlist=false&theme=bootstrap5" %} + +![Blazor DataGrid](../images/blazor-datagrid.gif) -> Please find the sample in this [GitHub location](https://github.com/SyncfusionExamples/How-to-Getting-Started-Blazor-DataGrid-Samples/tree/master/BlazorServerApp). +> Find the sample in this [GitHub location](https://github.com/SyncfusionExamples/How-to-Getting-Started-Blazor-DataGrid-Samples/tree/master/BlazorServerApp). ## See also -* [Getting Started with Syncfusion® DataGrid in Blazor Server-Side using Visual Studio 2022](../getting-started) +* [Getting Started with Syncfusion® DataGrid in Blazor Server-Side using Visual Studio 2022](../getting-started-with-server-app.md) * [Getting started with Syncfusion® Data Grid in Blazor WebAssembly App using .NET Core CLI](./blazor-webassembly-data-grid-using-cli) -* [Getting Started with Syncfusion® DataGrid in Blazor WebAssembly using Visual Studio 2022](./blazor-webassembly-datagrid-using-visual-studio) +* [Getting Started with Syncfusion® DataGrid in Blazor WebAssembly using Visual Studio 2022](../getting-started.md) \ No newline at end of file diff --git a/blazor/datagrid/how-to/upgrade-application-to-latest-version.md b/blazor/datagrid/how-to/upgrade-application-to-latest-version.md index fa38330726..44d4677ab7 100644 --- a/blazor/datagrid/how-to/upgrade-application-to-latest-version.md +++ b/blazor/datagrid/how-to/upgrade-application-to-latest-version.md @@ -1,7 +1,7 @@ --- layout: post -title: Upgrade Application To Latest Version in Blazor DataGrid | Syncfusion -description: Learn here all about Upgrade Application To Latest Version in Syncfusion Blazor DataGrid component and more. +title: Upgrade Blazor DataGrid App to Latest Syncfusion Version +description: Learn how to upgrade a Blazor DataGrid application to the latest Syncfusion version, update resource links, and resolve NuGet cache issues. platform: Blazor control: DataGrid documentation: ug @@ -9,38 +9,41 @@ documentation: ug # Upgrade application To latest version in Blazor DataGrid -**Step 1:** Update the latest Syncfusion® Blazor [NuGet](https://www.nuget.org/packages/Syncfusion.Blazor/) from NuGet package manager in your application. +**Step 1:** Update to the latest Syncfusion® Blazor [NuGet](https://www.nuget.org/packages/Syncfusion.Blazor/) package using the NuGet Package Manager in the application. ![Updating Blazor NuGet Package](../images/blazor-datagrid-update-nuget-package.PNG) ## Compatible .NET version -Syncfusion® Blazor components in the latest version `'{:nuget-version:}'` are compatible with the latest version of .NET Core 9.0. So, we suggest you to upgrade the .NET Core 9.0 SDK in your machine before upgrading to the latest version. +The latest Syncfusion® Blazor components are compatible with the latest .NET (for example, .NET 9). It is recommended to upgrade the .NET SDK on the machine before updating to the latest Syncfusion version. ## Client resource file references -Ensure our CSS files have been properly configured in your application. +Ensure Syncfusion CSS resources are properly referenced in the application. -* If you use the Blazor server app, add the following style file references in **~/Pages/_Host.cshtml**. +* For a Blazor Server app, add the following style file reference in **~/Pages/_Host.cshtml**. -* If you use the Blazor WebAssembly app, add the following style file references in **~/wwwroot/index.html**. +* For a Blazor WebAssembly app, add the following style file reference in **~/wwwroot/index.html**. ```html - + + .... + + ``` -N> For production purpose and minimal requirement, Syncfusion® provides an option to generate scripts and styles of selective control by using the Custom Resource Generator (CRG) web tool. Refer to this [link](https://crg.syncfusion.com/) for more details on CRG. +N> For production scenarios and minimal footprint, Syncfusion® provides the Custom Resource Generator (CRG) web tool to generate scripts and styles for selected controls. Refer to this [link](https://crg.syncfusion.com/) for more details on CRG. ## Breaking changes -Some changes have been modified in our Blazor samples for each release. So, we suggest you to ensure the breaking changes. Refer to this [release notes](https://blazor.syncfusion.com/documentation/release-notes/19.4.47?type=all) for our Blazor components. +Some changes may occur across releases that affect existing applications. Review the breaking changes and notes for the target version before upgrading. Refer to the Blazor components [release notes](https://blazor.syncfusion.com/documentation/release-notes) for details. ## Cache problem -Before restoring the NuGet packages, clean the old version Syncfusion.Blazor NuGet package. +Before restoring NuGet packages, clear any cached versions of the Syncfusion.Blazor package to avoid conflicts. The following steps explain how to clean the cache: -1. Delete/clear the package Syncfusion.Blazor from the installed location `{System-driver}/Users/{user-name}/.nuget/packages/syncfusion.blazor`. In Windows, the installed location of Syncfusion.Blazor package can be found using `%userprofile%/.nuget/packages/syncfusion.blazor`. +1. Delete/clear the `Syncfusion.Blazor` package from the installed location `{System drive}/Users/{user-name}/.nuget/packages/syncfusion.blazor`. On Windows, the installed location can also be accessed using `%userprofile%/.nuget/packages/syncfusion.blazor`. -2. Update the latest version of Syncfusion.Blazor NuGet package. \ No newline at end of file +2. Update to the latest version of the `Syncfusion.Blazor` NuGet package. diff --git a/blazor/datagrid/how-to/use-radio-button-instead-of-checkbox.md b/blazor/datagrid/how-to/use-radio-button-instead-of-checkbox.md index 2bb8eda862..321a59c42a 100644 --- a/blazor/datagrid/how-to/use-radio-button-instead-of-checkbox.md +++ b/blazor/datagrid/how-to/use-radio-button-instead-of-checkbox.md @@ -1,24 +1,22 @@ --- layout: post -title: Use radio button instead of checkbox in Blazor DataGrid | Syncfusion -description: Learn here all about how to use radio button instead of checkbox in single selection mode in Syncfusion Blazor DataGrid component and more. +title: Use Radio Button Instead of Checkbox in Blazor DataGrid | Syncfusion +description: Learn how to use radio buttons for single-row selection in Syncfusion Blazor DataGrid using templates and ValueChange event. platform: Blazor control: DataGrid documentation: ug --- -# How to use radio button instead of checkbox in Blazor DataGrid +# How to use Radio Button Instead of Checkbox in Blazor DataGrid -By default, the Syncfusion® Blazor DataGrid provides checkbox selection to allow multiple row selection. If there is a need to allow only one row to be selected at a time, a radio button can be used instead of checkbox selection. This can be achieved by using the column [Template](https://blazor.syncfusion.com/documentation/datagrid/column-template) feature to render a [SfRadioButton](https://blazor.syncfusion.com/documentation/radio-button/getting-started-webapp) in each row. The radio button can be linked to a unique value from the data source, such as the primary key field. +By default, the Syncfusion® Blazor DataGrid provides checkbox selection for multiple row selection. When only one row should be selectable at a time, a radio button can be used instead of checkbox selection. This is achieved by using the [Column Template](https://blazor.syncfusion.com/documentation/datagrid/column-template) feature to render an [SfRadioButton](https://blazor.syncfusion.com/documentation/radio-button/getting-started-webapp) in each row. Assign the same radio group name for all rows so only one radio button can be selected at a time, and bind each radio button to a unique value from the data source (typically the primary key field). Steps to configure row selection using radio buttons: -* When a radio button is selected, the [valueChange](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Buttons.SfRadioButton-1.html#Syncfusion_Blazor_Buttons_SfRadioButton_1_ValueChange) event is triggered. -* In the `ValueChange` event, retrieve the row index using the [GetRowIndexByPrimaryKey](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_GetRowIndexByPrimaryKeyAsync_System_Object_) method based on the selected value. -* Select the corresponding row using the [selectRow](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_SelectRowsAsync_System_Double___) method. -* To prevent selection in the Grid by clicking the row, the [CheckboxOnly](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridSelectionSettings.html#Syncfusion_Blazor_Grids_GridSelectionSettings_CheckboxOnly) property is enabled. - -The following example demonstrates how to handle row selection in the Grid using radio buttons: +* When a radio button is selected, the [ValueChange](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Buttons.SfRadioButton-1.html#Syncfusion_Blazor_Buttons_SfRadioButton_1_ValueChange) event is triggered. +* In the `ValueChange` event, retrieve the row index using [GetRowIndexByPrimaryKeyAsync](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_GetRowIndexByPrimaryKeyAsync_System_Object_) based on the selected unique value. Ensure the unique value corresponds to the Grid’s primary key column. +* Select the corresponding row using [SelectRowAsync](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.SfGrid-1.html#Syncfusion_Blazor_Grids_SfGrid_1_SelectRowAsync_System_Double_) (or the appropriate selection method). +* To prevent selection by clicking on the row itself, enable the [CheckboxOnly](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.GridSelectionSettings.html#Syncfusion_Blazor_Grids_GridSelectionSettings_CheckboxOnly) property. This ensures selection occurs only through the radio button interaction. {% tabs %} {% highlight razor tabtitle="Index.razor" %} @@ -29,14 +27,14 @@ The following example demonstrates how to handle row selection in the Grid using -