I want to design a common radzen data grid for multiple data types. Which means on the razor page I have common markup for radzen data grid. Record set and column definition bind to the grid dynamically. My problem is with ‘TItme’.
I need something like:
TItem="typeof(data.records[0])"
Datagrid as follows:
<RadzenDataGrid FilterMode="FilterMode.Simple" Data="@data.records" TItem="typeof(data.records[0])" AllowFiltering="@data.allowFiltering" AllowPaging="@data.allowPaging" AllowSorting="@data.allowSorting">
<Columns>
@foreach (var colDef in data.columnDefinitions)
{
<RadzenDataGridColumn TItem="typeof(data.records[0])" Property="@colDef.columnProperty" Title="@colDef.columnTitle" />
}
</Columns>
</RadzenDataGrid>
You may want to try dynamic component in dotnet 6:
<DynamicComponent Type="@componentType" Parameters="@parameters" />
@code {
private Type componentType = ...;
private IDictionary<string, object> parameters = ...;
}
DOCS: https://learn.microsoft.com/en-us/aspnet/core/blazor/components/dynamiccomponent?view=aspnetcore-6.0
Another option for other dotnet versions would be to try to define a render fragment directly in code (notice the line with ATTENTION comment):
@page "/built-content"
<h1>Build a component</h1>
<div>
@CustomRender
</div>
<button @onclick="RenderComponent">
Create three Pet Details components
</button>
@code {
private RenderFragment? CustomRender { get; set; }
private RenderFragment CreateComponent() => builder =>
{
for (var i = 0; i < 3; i++)
{
builder.OpenComponent(0, typeof(PetDetails));
builder.AddAttribute(1, "PetDetailsQuote", "Someone's best friend!");
builder.AddAttribute(2, "TItem", typeof(data.records[0])); // ATTENTION
builder.CloseComponent();
}
};
private void RenderComponent()
{
CustomRender = CreateComponent();
}
}
DOCS: https://learn.microsoft.com/en-us/aspnet/core/blazor/advanced-scenarios?view=aspnetcore-3.1