@if (_isLoading)
{
<LoadingScreen/>
}
else
{
<PageTitle>@_pageTitle</PageTitle>
<div class="mb-2">
<h3>@Localizer["CheckSurveysOverview"]</h3>
</div>
<div>
<RadzenDataGrid Id="surveytable" @ref="_ongoingGrid" Data="@_ongoingSurveys" TItem="CheckSurveysOverviewModel" @bind-Settings="@OngoingSettings"
AllowColumnResize="true" AllowAlternatingRows="true" AllowPaging="true" PageSize="10" ExpandMode="DataGridExpandMode.Single"
AllowSorting="true" AllowMultiColumnSorting="true" AllowFiltering="true" FilterCaseSensitivity="FilterCaseSensitivity.CaseInsensitive"
RowClick="OnSurveyRowClick" RowExpand="SaveExpandedRow" RowCollapse="RemoveExpandedRow">
<EmptyTemplate>
<p class="emptyText">@Localizer["NoData"]</p>
</EmptyTemplate>
<Template Context="survey">
<RadzenTabs SelectedIndex="@_selectedTabIndex" Change=OnTabChange>
<Tabs>
<RadzenTabsItem Text="@Localizer["CompletedSurveys"]">
<RadzenDataGrid Data="@survey.OngoingSurveyDetails.Where(s => s.SurveyAnswerStatus == SurveyAnswerStatus.Submitted)" TItem="OngoingSurveyDetailModel"
Density="Density.Compact" AllowSorting="true" AllowMultiColumnSorting="true" AllowFiltering="true" FilterCaseSensitivity="FilterCaseSensitivity.CaseInsensitive"
RowClick="OnSurveyAnswerRowClick">
<EmptyTemplate>
<p class="emptyText">@Localizer["NoData"]</p>
</EmptyTemplate>
<Columns>
<RadzenDataGridColumn TItem="OngoingSurveyDetailModel" Property="ClubName" Filterable="true" Title="@_clubName" TextAlign="TextAlign.Center"/>
<RadzenDataGridColumn TItem="OngoingSurveyDetailModel" Property="SubmitDate" Filterable="true" Title="@Localizer["SubmitDate"]" TextAlign="TextAlign.Center"/>
<RadzenDataGridColumn TItem="OngoingSurveyDetailModel" Property="DueDate" Filterable="true" Title="@Localizer["DueDate"]" TextAlign="TextAlign.Center"/>
<RadzenDataGridColumn TItem="OngoingSurveyDetailModel" Property="OverallScore" Filterable="true" Title="@Localizer["OverallScore"]" TextAlign="TextAlign.Center"/>
@if (Configuration.GetValue<bool>("ClubChat"))
{
<RadzenDataGridColumn TItem="OngoingSurveyDetailModel" Filterable="false" Sortable="true" Title="@Localizer["Messages"]" Width="10px" TextAlign="TextAlign.Center">
<Template Context="data">
<RadzenBadge IsPill="true" Variant="Variant.Outlined" BadgeStyle="BadgeStyle.Danger" Text="@data.NewMessagesCount.ToString()" Visible="@(data.NewMessagesCount != 0)"/>
</Template>
</RadzenDataGridColumn>
}
<RadzenDataGridColumn TItem="OngoingSurveyDetailModel" Filterable="false" Sortable="false" Width="10px" TextAlign="TextAlign.Center" Visible="@survey.OngoingSurveyDetails.Any(s => s.SurveyAnswerStatus == SurveyAnswerStatus.Submitted)">
<Template Context="data">
@GetValidatedQuestionsCount(data)
</Template>
</RadzenDataGridColumn>
<RadzenDataGridColumn TItem="OngoingSurveyDetailModel" Filterable="false" Sortable="false" Width="80px" TextAlign="TextAlign.Center" Title="@Localizer["Actions"]">
<Template Context="data">
<RadzenButton title="@Localizer["Reopen"]" Click="@(() => { _isReopen = true; return EditDueDateOrReopenSurveyAnswer(data); })" @onclick:stopPropagation Icon="assignment_return" Style="color: inherit" Id="IconOnlyButton"/>
</Template>
</RadzenDataGridColumn>
</Columns>
</RadzenDataGrid>
</RadzenTabsItem>
<RadzenTabsItem Text="@Localizer["PendingSurveys"]">
<RadzenDataGrid Data="@survey.OngoingSurveyDetails.Where(s => s.SurveyAnswerStatus != SurveyAnswerStatus.Submitted)" TItem="OngoingSurveyDetailModel"
Density="Density.Compact" AllowSorting="true" AllowMultiColumnSorting="true" AllowFiltering="true" FilterCaseSensitivity="FilterCaseSensitivity.CaseInsensitive"
RowClick="OnSurveyAnswerRowClick">
<EmptyTemplate>
<p class="emptyText">@Localizer["NoData"]</p>
</EmptyTemplate>
<Columns>
<RadzenDataGridColumn TItem="OngoingSurveyDetailModel" Property="ClubName" Filterable="true" Title="@_clubName" TextAlign="TextAlign.Center"/>
<RadzenDataGridColumn TItem="OngoingSurveyDetailModel" Property="DueDate" Filterable="true" Title="@Localizer["DueDate"]" TextAlign="TextAlign.Center"/>
<RadzenDataGridColumn TItem="OngoingSurveyDetailModel" Filterable="true" Title="@Localizer["Status"]" TextAlign="TextAlign.Center">
<Template Context="data">
@Localizer[GetStatusString(data.SurveyAnswerStatus)]
</Template>
</RadzenDataGridColumn>
<RadzenDataGridColumn TItem="OngoingSurveyDetailModel" Filterable="false" Sortable="false" Width="80px" TextAlign="TextAlign.Center" Title="@Localizer["Actions"]">
<Template Context="data">
<RadzenButton title="@Localizer["EditDueDate"]" Click="@(() => { return EditDueDateOrReopenSurveyAnswer(data); })" @onclick:stopPropagation Icon="edit_calendar" Style="color: inherit" Id="IconOnlyButton"/>
</Template>
</RadzenDataGridColumn>
</Columns>
</RadzenDataGrid>
</RadzenTabsItem>
</Tabs>
</RadzenTabs>
</Template>
<Columns>
<RadzenDataGridColumn TItem="CheckSurveysOverviewModel" Property="Title" Filterable="true" Title="@Localizer["Title"]" TextAlign="TextAlign.Center"/>
<RadzenDataGridColumn TItem="CheckSurveysOverviewModel" Property="SendDate" Filterable="true" Title="@Localizer["SendDate"]" Width="10px" TextAlign="TextAlign.Center"/>
<RadzenDataGridColumn TItem="CheckSurveysOverviewModel" Property="DueDate" Filterable="true" Title="@Localizer["DueDate"]" Width="10px" TextAlign="TextAlign.Center"/>
<RadzenDataGridColumn TItem="CheckSurveysOverviewModel" Filterable="false" Sortable="false" Width="10px" TextAlign="TextAlign.Center">
<Template Context="survey">
@GetSurveyCount(survey)
</Template>
</RadzenDataGridColumn>
<RadzenDataGridColumn TItem="CheckSurveysOverviewModel" Filterable="false" Sortable="false" Width="80px" TextAlign="TextAlign.Center" Title="@Localizer["Actions"]">
<Template Context="data">
<RadzenButton title="@Localizer["RecalculateScores"]" Click="@(() => { return ConfirmRecalculateSurveyAnswers(data.OngoingSurveyDetails); })" @onclick:stopPropagation Icon="calculate" IconColor="@Colors.Black" Id="IconOnlyButton"/>
@if (Configuration.GetValue<bool>("ExportToCsv"))
{
<RadzenButton title="@Localizer["ExportCsv"]" Click="@(() => { return ExportDataToCsv(data); })" @onclick:stopPropagation Image="img/CSV96.png" Id="IconOnlyButton"/>
}
</Template>
</RadzenDataGridColumn>
</Columns>
</RadzenDataGrid>
</div>
}
@code {
[CascadingParameter (Name="isTest")]
public bool isTest{ get; set; }
private string _pageTitle;
private string _clubName;
private bool _isSetData;
private bool _isLoading = true;
private bool _isReopen;
private Guid _expandedRowId;
private bool _expandRowOnInit;
private int _selectedTabIndex;
IEnumerable<CheckSurveysOverviewModel> _ongoingSurveys = new List<CheckSurveysOverviewModel>();
RadzenDataGrid<CheckSurveysOverviewModel?> _ongoingGrid = new();
DataGridSettings? _ongoingSettings;
private DataGridSettings? OngoingSettings
{
get => _ongoingSettings;
set
{
if (_isSetData)
{
_isSetData = false;
return;
}
_ongoingSettings = value;
InvokeAsync(SaveOngoingSettingsAsync);
}
}
protected override async Task OnInitializedAsync()
{
await base.OnInitializedAsync();
await SetDataAsync();
_isSetData = false;
_isLoading = false;
_pageTitle = $"{(isTest ? "Test" : "Production")} - {Localizer["CheckSurveysOverview"]}";
_clubName = isTest? Localizer["Respondent"] : Localizer["Club"];
}
private async Task SetDataAsync()
{
var result = await GetOngoingSurveys.QueryAsync();
_ongoingSurveys = result.GroupBy(item => item.SurveyId)
.Select(survey => new CheckSurveysOverviewModel
{
SurveyId = survey.Key,
Title = survey.First().Title,
SendDate = survey.First().SendDate,
DueDate = survey.First().DueDate,
OngoingSurveyDetails = survey
.Select(item => new OngoingSurveyDetailModel
{
ClubName = item.ClubName,
SubmitDate = item.SubmitDate,
DueDate = item.DueDate,
SurveyAnswerId = item.SurveyAnswerId,
SurveyAnswerStatus = item.SurveyAnswerStatus,
AnswerList = item.AnswerList,
OverallScore = item.OverallScore,
NewMessagesCount = item.NewMessagesCount
}).ToList()
}).ToList();
_isSetData = true;
}
protected override async Task OnAfterRenderAsync(bool firstRender)
{
if (firstRender)
{
await LoadOngoingSettingsAsync();
await LoadOngoingGridStateAsync();
}
}
private async Task LoadOngoingGridStateAsync()
{
await LoadExpandedRowAsync();
if (_expandRowOnInit)
{
await _ongoingGrid.ExpandRow(_ongoingSurveys.FirstOrDefault(s => s.SurveyId == _expandedRowId));
_expandRowOnInit = false;
}
await LoadSelectedTabAsync();
await _ongoingGrid.Reload();
StateHasChanged();
}
private async Task SaveOngoingSettingsAsync()
{
await Task.CompletedTask;
await JsRuntime.InvokeVoidAsync("window.sessionStorage.setItem", "OngoingSettings", JsonSerializer.Serialize(OngoingSettings));
}
private async Task LoadOngoingSettingsAsync()
{
await Task.CompletedTask;
var result = await JsRuntime.InvokeAsync<string>("window.sessionStorage.getItem", "OngoingSettings");
if (!string.IsNullOrEmpty(result))
{
_ongoingSettings = JsonSerializer.Deserialize<DataGridSettings>(result);
}
}
}
When I open my page I get the following error:
System.InvalidOperationException: The render handle is not yet assigned.
at Microsoft.AspNetCore.Components.RenderHandle.ThrowNotInitialized()
at Microsoft.AspNetCore.Components.ComponentBase.StateHasChanged()
at Radzen.Blazor.RadzenDataGrid1.ReloadInternal() at Radzen.Blazor.RadzenDataGrid
1.Reload()
at WebApp.Pages.Federation.Overviews.CheckSurveysOverview.LoadOngoingGridStateAsync() in C:\WebApp\Pages\Federation\Overviews\CheckSurveysOverview.razor:line 218
at WebApp.Pages.Federation.Overviews.CheckSurveysOverview.OnAfterRenderAsync(Boolean firstRender) in C:\WebApp\Pages\Federation\Overviews\CheckSurveysOverview.razor:line 204
at Microsoft.AspNetCore.Components.RenderTree.Renderer.GetErrorHandledTask(Task taskToHandle, ComponentState owningComponentState)
Can you tell me how to solve this... It used to work but now I have like a really big survey that has been added.
Regards,
Tino