{"id":13450227,"url":"https://github.com/Mewriick/Blazor.FlexGrid","last_synced_at":"2025-03-23T16:31:10.310Z","repository":{"id":51820095,"uuid":"137938034","full_name":"Mewriick/Blazor.FlexGrid","owner":"Mewriick","description":"GridView component for Blazor","archived":false,"fork":false,"pushed_at":"2023-06-27T23:09:37.000Z","size":6713,"stargazers_count":198,"open_issues_count":23,"forks_count":36,"subscribers_count":22,"default_branch":"master","last_synced_at":"2025-03-19T12:39:27.714Z","etag":null,"topics":["blazor","component","grid"],"latest_commit_sha":null,"homepage":null,"language":"C#","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Mewriick.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null}},"created_at":"2018-06-19T19:45:50.000Z","updated_at":"2024-11-15T21:15:45.000Z","dependencies_parsed_at":"2024-01-15T16:52:46.832Z","dependency_job_id":null,"html_url":"https://github.com/Mewriick/Blazor.FlexGrid","commit_stats":null,"previous_names":[],"tags_count":30,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Mewriick%2FBlazor.FlexGrid","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Mewriick%2FBlazor.FlexGrid/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Mewriick%2FBlazor.FlexGrid/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Mewriick%2FBlazor.FlexGrid/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Mewriick","download_url":"https://codeload.github.com/Mewriick/Blazor.FlexGrid/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":245130728,"owners_count":20565701,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["blazor","component","grid"],"created_at":"2024-07-31T07:00:32.489Z","updated_at":"2025-03-23T16:31:08.137Z","avatar_url":"https://github.com/Mewriick.png","language":"C#","funding_links":[],"categories":["Libraries","Libraries \u0026 Extensions"],"sub_categories":["Components"],"readme":"# Blazor.FlexGrid\nGridView component for Blazor\n\n\u003e Easy way for displaying lits of items in table\n\n\u003cimg src=\"/docs/ReadmeImages/table_gif.gif\" alt=\"table_gif\"/\u003e\n\n## IMPORTANT!\n**Still development not completely finished and rapidly continue. Next versions can contain breaking changes** \n\n**Breaking change after support .NET Core 3.1 Preview 1**\n\u003e In Blazor WASM you have to manually add into index.html links to the css and js FlexGrid files\n```cs\n\u003clink href=\"_content/Blazor.FlexGrid/FlexGridStyles.css\" rel=\"stylesheet\" /\u003e\n\u003clink rel=\"stylesheet\" href=\"_content/Blazor.FlexGrid/fontawesome/css/fontawesome.css\" /\u003e\n\u003clink rel=\"stylesheet\" href=\"_content/Blazor.FlexGrid/fontawesome/css/all.css\" /\u003e\n\u003clink rel=\"stylesheet\" href=\"_content/Blazor.FlexGrid/fontawesome/css/regular.css\" /\u003e\n\u003clink rel=\"stylesheet\" href=\"_content/Blazor.FlexGrid/fontawesome/css/solid.css\" /\u003e\n\u003clink rel=\"stylesheet\" href=\"_content/Blazor.FlexGrid/fontawesome/css/svg-with-js.css\" /\u003e\n\u003clink rel=\"stylesheet\" href=\"_content/Blazor.FlexGrid/fontawesome/css/v4-shims.css\" /\u003e\n\u003cscript src=\"_content/Blazor.FlexGrid/flexGridIntereop.js\"\u003e\u003c/script\u003e\n```\n\n**Version 0.11.0 contains new Triggers feature more info in [wiki](https://github.com/Mewriick/Blazor.FlexGrid/wiki/Triggers)** \n\n**Version 1.0.0 contains breaking change more info in [release](https://github.com/Mewriick/Blazor.FlexGrid/releases/tag/release%2F1.0.0)**\n\n# Installation\n[![NuGet Pre Release](https://img.shields.io/badge/nuget-1.0.0-orange.svg)](https://www.nuget.org/packages/Blazor.FlexGrid)\n\nAfter nuget installation you must create in Blazor.Client app Linker.xml file because nuget uses some features which are not supported in default mono managed interpreter from WebAssembly\n(https://github.com/mono/mono/issues/8872)\n\n```cs\n\u003clinker\u003e\n  \u003cassembly fullname=\"mscorlib\"\u003e\n    \u003c!-- Preserve all methods on WasmRuntime, because these are called by JS-side code\n    to implement timers. Fixes https://github.com/aspnet/Blazor/issues/239 --\u003e\n    \u003ctype fullname=\"System.Threading.WasmRuntime\" /\u003e\n  \u003c/assembly\u003e\n  \u003cassembly fullname=\"System.Core\"\u003e\n    \u003c!-- This is required by JSon.NET and any expression.Compile caller --\u003e\n    \u003ctype fullname=\"System.Linq.Expressions*\" /\u003e\n    \u003ctype fullname=\"System.Linq.EnumerableRewriter*\" /\u003e\n    \u003ctype fullname=\"System.Linq.Queryable*\" /\u003e\n    \u003ctype fullname=\"System.Linq.Enumerable*\" /\u003e\n  \u003c/assembly\u003e\n  \u003c!-- Name of the entry point assembly --\u003e\n  \u003cassembly fullname=\"Blazor.FlexGrid.Demo.Client\" /\u003e\n\u003c/linker\u003e\n```\n\nAnd Add this into csproj of client project\n```cs\n\u003cItemGroup\u003e\n\t\u003cBlazorLinkerDescriptor Include=\"Linker.xml\" /\u003e\n\u003c/ItemGroup\u003e\n```\n\n# Setup\n```cs\npublic void ConfigureServices(IServiceCollection services)\n{\n    services.AddFlexGrid();\n}\n```\n\n# Setup Blazor App as RazorComponents AKA ServerSide Blazor App\n```cs\npublic void ConfigureServices(IServiceCollection services)\n{\n    services.AddFlexGridServerSide();\n}\n```\nNote: Add the following line to the Configure(...) method of your Startup.cs file.\n\n```cs\npublic void Configure(IApplicationBuilder app, IWebHostEnvironment env)\n{\n    app.UseFlexGrid(env.WebRootPath);\n}\n```\nFrom your index.(cs)html add references\n```cs\n\u003clink rel=\"stylesheet\" href=\"Blazor.FlexGrid/FlexGridStyles.css\" /\u003e\n\u003clink rel=\"stylesheet\" href=\"Blazor.FlexGrid/fontawesome/css/fontawesome.css\" /\u003e\n\u003clink rel=\"stylesheet\" href=\"Blazor.FlexGrid/fontawesome/css/all.css\" /\u003e\n\u003clink rel=\"stylesheet\" href=\"Blazor.FlexGrid/fontawesome/css/regular.css\" /\u003e\n\u003clink rel=\"stylesheet\" href=\"Blazor.FlexGrid/fontawesome/css/solid.css\" /\u003e\n\u003clink rel=\"stylesheet\" href=\"Blazor.FlexGrid/fontawesome/css/svg-with-js.css\" /\u003e\n\u003clink rel=\"stylesheet\" href=\"Blazor.FlexGrid/fontawesome/css/v4-shims.css\" /\u003e\n\u003cscript src=\"Blazor.FlexGrid/flexGridIntereop.js\"\u003e\u003c/script\u003e\n```\n\nFor properly working of **LazyLoaded** functionality some services must be registered in IoC. Because in web scenario **FlexGrid** uses **Http** services which are provided in IoC\nby default, but in server side scenario you have to provide these services.\n\n```cs\npublic void ConfigureServices(IServiceCollection services)\n{    \n\tservices.TryAddScoped(typeof(ILazyDataSetLoader\u003c\u003e), typeof(NullLazyDataSetLoader\u003c\u003e));\n    services.TryAddScoped(typeof(ILazyDataSetItemManipulator\u003c\u003e), typeof(NullLazyDataSetItemManipulator\u003c\u003e));\n    services.TryAddScoped(typeof(ICreateItemHandle\u003c,\u003e), typeof(NullCreateItemHandler\u003c,\u003e));\n}\n```\n\nThese services are registered by default in IoC if you want for your grid use funtionality like lazy loading data, inline editing or create item form\nyou have to provide these services for your models.\n\nIn your Blazor component add Tag helper and required usings\n```cs\n@addTagHelper *, Blazor.FlexGrid\n```\n\n# Example\n```cs\n@addTagHelper *, Blazor.FlexGrid\n@using Blazor.FlexGrid.Demo.Shared\n@using Blazor.FlexGrid.DataAdapters\n@inject HttpClient Http\n@page \"/grid\"\n\n\u003ch1\u003eWeather forecast\u003c/h1\u003e\n\n\u003cGridView DataAdapter=\"@dataAdapter\" PageSize=\"5\"\u003e\u003c/GridView\u003e\n\n@functions{\n    CollectionTableDataAdapter\u003cWeatherForecast\u003e dataAdapter;\n\n    protected override async Task OnInitAsync()\n    {\n        var forecast = await Http.GetJsonAsync\u003cWeatherForecast[]\u003e(\"/api/SampleData/WeatherForecastsSimple\");\n        dataAdapter = new CollectionTableDataAdapter\u003cWeatherForecast\u003e(forecast);\n    }\n}\n```\n\nResult \n\u003cimg src=\"/docs/ReadmeImages/flextable.png\" alt=\"table\"/\u003e\n\n# Configuration\nYou do not need to define information about columns and components will render columns by **properties** of object type which is associated\nwith **table data adapter** which provide *data set* for **Table** component. Value for column is provided by **ToString** method on the property type.\nOr you can configure some behavior for tables and columns by using fluent api which is supported in classes where interface **IEntityTypeConfiguration\u003cTItem\u003e** is implemented.\n```cs\npublic class WeatherForecastGridConfiguration : IEntityTypeConfiguration\u003cWeatherForecast\u003e\n{\n    public void Configure(EntityTypeBuilder\u003cWeatherForecast\u003e builder)\n    {\n        builder.Property(e =\u003e e.Date)\n            .HasCaption(\"Date\")\n            .HasValueFormatter(d =\u003e d.ToShortDateString());\n\n        builder.Property(e =\u003e e.Summary)\n            .HasCaption(\"MySummary\")\n            .HasOrder(1)\n            .HasValueFormatter(s =\u003e $\"{s}!\");\n\n        builder.Property(e =\u003e e.TemperatureC)\n            .IsSortable();\n\n        builder.Property(e =\u003e e.TemperatureF)\n            .IsSortable();\n    }\n}\n```\nAnd provide this configuration \n```cs\nvar serviceProvider = new BrowserServiceProvider(services =\u003e\n{\n    services.AddFlexGrid(cfg =\u003e\n    {\n        cfg.ApplyConfiguration(new WeatherForecastGridConfiguration());\n    });\n});\n```\n\n# Data Adapters\nYou can use simple **CollectionTableDataAdapter** which requires collection of items. \n```cs\n@functions{\n    CollectionTableDataAdapter\u003cWeatherForecast\u003e dataAdapter;\n\n    protected override async Task OnInitAsync()\n    {\n        var forecast = await Http.GetJsonAsync\u003cWeatherForecast[]\u003e(\"/api/SampleData/WeatherForecastsSimple\");\n        dataAdapter = new CollectionTableDataAdapter\u003cWeatherForecast\u003e(forecast);\n    }\n}\n```\n\nAnother data adapter type is **LazyLoadedTableDataAdapter\u003cTItem\u003e** which support lazy loading data from API. This type of adapter \nis registered in dependency injection conatiner and you must only provide **LazyLoadingOptins** to table component. \n```cs\n@addTagHelper *, Blazor.FlexGrid\n@using Blazor.FlexGrid.Demo.Shared\n@using Blazor.FlexGrid.DataAdapters\n@using Blazor.FlexGrid.DataSet.Options\n@page \"/lazyloadedgrid\"\n@inject HttpClient Http\n@inject LazyLoadedTableDataAdapter\u003cWeatherForecast\u003e forecastAdapter\n\n\u003cGridView DataAdapter=\"@forecastAdapter\" LazyLoadingOptions=\"@(new LazyLoadingOptions() { DataUri = \"/api/SampleData/WeatherForecasts\" })\" PageSize=\"10\"\u003e\u003c/GridView\u003e\n```\nAlso you must provide the server side part\n\n```cs\npublic IActionResult WeatherForecasts(int pageNumber, int pageSize, SortingParams sortingParams)\n{\n    var rng = new Random();\n\n    var items = Enumerable.Range(1, 100).Skip(pageSize * pageNumber).Take(pageSize).Select(index =\u003e\n                new WeatherForecast\n                {\n                    Date = DateTime.Now.AddDays(index),\n                    TemperatureC = rng.Next(-20, 55),\n                    Summary = Summaries[rng.Next(Summaries.Length)]\n\n                });\n\n    items = string.IsNullOrEmpty(sortingParams.SortExpression)\n        ? items\n        : items.AsQueryable().OrderBy(sortingParams.SortExpression).ToList();\n\n    return Ok(\n        new\n        {\n            Items = items,\n            TotalCount = 100\n        });\n}\n```\nAfter that you have fully pageable and sortable table with lazy loaded data after you select new page\n\n# Permission restriction\nYou can configure permission restricion of showing/editing values for each column in table for current logged user. You only have to do 3 things.\nFirst create class which implements interface **ICurrentUserPermission**. Second provide configuration for permission restriction for exmaple:\n\n```cs\npublic void Configure(EntityTypeBuilder\u003cCustomer\u003e builder)\n{\n\tbuilder.Property(c =\u003e c.Email)\n\t\t.HasReadPermissionRestriction(perm =\u003e perm.IsInRole(\"Read\"))\n\t\t.HasWritePermissionRestriction(perm =\u003e perm.IsInRole(\"Write\"));\n}\n```\n\nAnd last thing is register **ICurrentUserPermission** into DI container as **Singleton**.\n\n# Blazor components in column\nYou can configure column value for rendering **Blazor** component this way:\nFirst add using **Blazor.FlexGrid.Components.Configuration**.\nSecond inject required service **BlazorComponentColumnCollection\u003cT\u003e** into HTML of component where you use **FlexGrid**\nAnd the last thing you have to provide **RenderFragment** for columns\n\n```cs\n@inject BlazorComponentColumnCollection\u003cWeatherForecast\u003e Collection\n\n@{\n    RenderFragment\u003cWeatherForecast\u003e weatherTemp = (weather) =\u003e @\u003cBlazorButton\u003e@weather.Summary\u003c/BlazorButton\u003e;\n\tCollection.AddColumnValueRenderFunction(w =\u003e w.Summary, weatherTemp);\n}\n```\n\nAlso you can use registration of fragment in startup configuration\n```cs\nRenderFragment\u003cCustomer\u003e customerEmailComponent = (Customer customer) =\u003e delegate (RenderTreeBuilder rendererTreeBuilder)\n{\n    var internalBuilder = new BlazorRendererTreeBuilder(rendererTreeBuilder);\n    internalBuilder\n        .OpenElement(HtmlTagNames.H4)\n        .AddContent(customer.Email)\n        .CloseElement();\n};\n\nbuilder.Property(c =\u003e c.Email)\n    .HasBlazorComponentValueRender(customerEmailComponent);\n```\n\n# Filtering\nYou can define which column can be filtered.\n\n```cs\nbuilder.Property(e =\u003e e.TemperatureF)\n    .IsFilterable();    \n```\n\nFor filter exists two modes, for standard **TableDataSet** is filtering done on client side across whole collection of items.\nFor **LazyTableDataSet** is filter object sended to the server. More info how it is works is [here](https://github.com/Mewriick/Blazor.FlexGrid/wiki/LazyTableDataSet---Client-Side-Blazor#filtering)\n\n# Grouping\nYou can enable dynamic grouping functionality for table\n```cs\nbuilder.EnableGrouping(options =\u003e\n{\n    options.GroupPageSize = 15;\n});\n```\n\nYou can define page size for grouped items. Grouping works in two modes, for standard **TableDataSet**, grouping is done on client side across whole collection of items.\nFor **LazyTableDataSet**, **GroupExpression** is sent to the server. More info how it is works is [here](https://github.com/Mewriick/Blazor.FlexGrid/wiki/LazyTableDataSet---Client-Side-Blazor#grouping)\n\n# Create item form\nYou can very easily have **Create item form** for your models. You can even configure different type of model for create item form\nthan is used for rendering in **FlexGrid**. You can also specify the return type from your Api which can be different than input.\nNow the restriction for model is that have **default constructor**\nConfiguration example:\n\n```cs\nbuilder.AllowCreateItem\u003cWeatherForecastCreateModel, WeatherForecast\u003e(conf =\u003e\n{\n    conf.CreatePermissionRestriction = p =\u003e p.IsInRole(\"TestRole\");\n    conf.CreateUri = \"/api/SampleData/WeatherForecast\";\n});\n```\n\nYou can also restrict the creation of items only for some users. Important property is **CreateUri** which must be filled. Form also includes  \nvalidations which are run after every change. Submit can be done only if form is in **Valid** state. For rendering, two layout types are used.\nYou can have one column layout or you can have two columns layout. Now the behavior is that every model that have more than 6 properties the\ntwo column layout is used. You can also write your own layout. You only have to inherit from **BaseCreateItemFormLayout** and also you must\ncreate your own layout provider by creating a class which implements **IFormLayoutProvider** and register this provider to IoC. \nProperties are in default layouts rendered in order that they are written in class.\nAfter item is succesfully created the **NewItemCreated** event is fired.\nYou can also change the modal dialog css classes by using:\n\n```\nbuilder.AppendCssClasses(conf =\u003e\n{\n    conf.CreateFormCssClasses.ModalSize = \"modal-lg\";\n});\n```\n\n# Master / Detail \nYou can have multiple **DataSets** related together and rendered only with one **FlexGrid** component. If you have object that have property which is a collection,\nthe **FlexGrid** component automatically finds this and will render this kind of object as Master / Detail grid.\n\nExample configuration\n```cs\npublic void Configure(EntityTypeBuilder\u003cCustomer\u003e builder)\n{\n    builder.IsMasterTable();\n    builder.HasDetailRelationship\u003cOrder\u003e(c =\u003e c.Id, o =\u003e o.CustomerId)\n        .HasLazyLoadingUrl(\"/api/Order/Orders\")\n        .HasUpdateUrl(\"/api/Order/Update\")\n        .HasCaption(\"Orders\")\n        .HasPageSize(10);\n\n    builder.HasDetailRelationship\u003cCustomerAddress\u003e(c =\u003e c.Id, o =\u003e o.CustomerId)\n        .HasCaption(\"Customer addresses\");\n}\n\npublic void Configure(EntityTypeBuilder\u003cOrder\u003e builder)\n{\n    builder.IsMasterTable();\n    builder.HasDetailRelationship(o =\u003e o.OrderItems)\n        .HasCaption(\"Order products\");\n}\n```\n\nFor correct working of Master / Detail grid you must configure relationships between objects. Also you can define some additional options for related grid component.\nIf you want to use **LazyTableDataSet** you must provide url address for loading. This is not required in ServerSide solution because you have to create your own DataSet\nwhich implements **ILazyDataSetLoader**.\n\nExample page with Master/Detail grid\n\n```cs\n@addTagHelper *, Blazor.FlexGrid\n@using Blazor.FlexGrid.Demo.Shared\n@using Blazor.FlexGrid.DataAdapters\n@inject HttpClient Http\n@inject MasterTableDataAdapterBuilder\u003cCustomer\u003e MasterAdapterBuilder\n@inject LazyLoadedTableDataAdapter\u003cOrder\u003e ordersAdapter\n@page \"/masterdetailgrid\"\n\n\u003ch1\u003eCustomers\u003c/h1\u003e\n\n\u003cGridView DataAdapter=\"@customersMasterDataAdapter\" PageSize=\"5\"\u003e\u003c/GridView\u003e\n\n@functions{\n    CollectionTableDataAdapter\u003cCustomer\u003e customerDataAdapter;\n    CollectionTableDataAdapter\u003cCustomerAddress\u003e customerAddressesDataAdapter;\n    MasterTableDataAdapter\u003cCustomer\u003e customersMasterDataAdapter;\n\n    protected override async Task OnInitAsync()\n    {\n        var customers = await Http.GetJsonAsync\u003cCustomer[]\u003e(\"/api/Customer/Customers\");\n        var customersAddresses = await Http.GetJsonAsync\u003cCustomerAddress[]\u003e(\"/api/Customer/CustomersAddresses\");\n        customerDataAdapter = new CollectionTableDataAdapter\u003cCustomer\u003e(customers);\n        customerAddressesDataAdapter = new CollectionTableDataAdapter\u003cCustomerAddress\u003e(customersAddresses);\n\n        customersMasterDataAdapter = MasterAdapterBuilder\n            .MasterTableDataAdapter(customerDataAdapter)\n            .WithDetailTableDataAdapter(ordersAdapter)\n            .WithDetailTableDataAdapter(customerAddressesDataAdapter)\n            .Build();\n    }\n}\n```\nFor building Master / Detail **TableDataSet** is used **MasterTableDataAdapter** which is registered in DI container. \nMaster / Detail usage you can find in ServerSide Blazor demo project\n\n# Inline editing\nYou can use inline editing features by configuring grid\n```cs\npublic void Configure(EntityTypeBuilder\u003cOrder\u003e builder)\n{\n\tbuilder.AllowInlineEdit();\n\t// Or\n    builder.AllowInlineEdit(conf =\u003e\n    {\n        conf.AllowDeleting = true;\n        conf.DeletePermissionRestriction = perm =\u003e perm.IsInRole(\"TestRole\");\n    });\n\n    builder.DoNotUseDeleteConfirmDialog(); // Disable confirmation dialog before delete operation\n}\n```\nYou can also configure which columns will be editable for current logged in user, see **Permission restriction** section. If you are using \n**CollectionTableDataAdapter** changes are saved only into local object in list. For saving to the server you have to write your own functionality.\nIf you are using **LazyLoadedTableDataAdapter** and Client/Server mode you must provide a url for updating item.\n\n```cs\n\u003cGridView DataAdapter=\"@forecastAdapter\"\n          LazyLoadingOptions=\"@(new LazyLoadingOptions() {\n                                    DataUri = \"/api/SampleData/WeatherForecasts\",\n                                    PutDataUri = \"/api/SampleData/UpdateWeatherForecast\",\n                                    DeleteUri = \"/api/SampleData/Delete/{Id}\" })\"\n          PageSize=\"10\"\n          SaveOperationFinished=\"@ItemSavedOperationFinished\"\n          DeleteOperationFinished=\"@ItemDeletedOperationFinished\"\u003e\n\u003c/GridView\u003e\n```\nThe Http request will be sent to the server. For fully working delete feature you have to properly set **DeleteUri** of **LazyLoadingOptions**. \nThe url contains a template where you must specify the name of object property in { } at the end (for example {Id}) which is the key and this key is sent to the action method on server side.\n\nOr if the Grid is used as detail \n\n```cs\nbuilder.HasDetailRelationship\u003cOrder\u003e(c =\u003e c.Id, o =\u003e o.CustomerId)\n    .HasLazyLoadingUrl(\"/api/Order/Orders\")\n    .HasUpdateUrl(\"/api/Order/UpdateOrder\")\n    .HasCaption(\"Orders\")\n    .HasPageSize(10);\n```\n\n# Events\nYou can subscribe to some events which **FlexGrid** provides. The only requirements are add using\n**@using Blazor.FlexGrid.Components.Events** and register **EventHandler** in HTML of Grid component.\n\n**Supported events:**  \n``SaveOperationFinished``  \n``DeleteOperationFinished``  \n``NewItemCreated``  \n``OnItemClicked``  \n\n# Design\nYou can override some default CssClasses by your own CssClasses by using fluent api configuration.\n```cs\npublic void Configure(EntityTypeBuilder\u003cWeatherForecast\u003e builder)\n{  \n\tbuilder.AppendCssClasses(conf =\u003e\n\t{\n\t\tconf.Table = \"my-table\";\n\t\tconf.TableBody = \"my-table-body\";\n\t\tconf.TableCell = \"my-table-cell\";\n\t\tconf.TableHeader = \"my-table-header\";\n\t\tconf.TableHeaderCell = \"my-table-header-cell\";\n\t\tconf.TableHeaderRow = \"my-table-header-row\";\n\t\tconf.TableRow = \"my-table-row\";\n\t});\n}\n```\n\n# Contributions and feedback\nPlease feel free to use the component, open issues, fix bugs or provide feedback.\n\n## RoadMap\n``Create proper Docs``\n``Add UnitTests``\n``More fluent API configuration``\n``Filtration support``\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FMewriick%2FBlazor.FlexGrid","html_url":"https://awesome.ecosyste.ms/projects/github.com%2FMewriick%2FBlazor.FlexGrid","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FMewriick%2FBlazor.FlexGrid/lists"}