Я использую MudDataGrid с функцией редактирования данных из модального всплывающего окна (Blazorise.Modal). Нажатие кнопки в строке извлекает экземпляр этих данных (отдельную запись) и помещает его в модальное окно для редактирования. После редактирования нажатие кнопки «Отправить» в модальном всплывающем окне сохраняет данные в базу данных и закрывает модальное всплывающее окно. Это работает отлично, но я не могу впоследствии повторно отобразить (обновить) MudDataGrid, поэтому внесенные мной изменения не отображаются в MudDataGrid. Как обновить сетку? Это код, который у меня есть до сих пор
Настройка сетки данных
<MudDataGrid ServerData = "LoadGridData" T = "AgencyGridViewModel" @ref = "_dataGrid" ReadOnly = "true">
<ToolBarContent>
<MudText Typo = "Typo.h6">Agencies</MudText>
<MudSpacer />
<MudTextField @bind-Value = "_searchString" Placeholder = "Search" Adornment = "Adornment.Start" Immediate = "true"
AdornmentIcon = "@Icons.Material.Filled.Search" IconSize = "MudBlazor.Size.Medium" Class = "mt-0"></MudTextField>
</ToolBarContent>
<Columns>
<PropertyColumn Property = "x => x.Id" Hidden />
<PropertyColumn Property = "x => x.AgencyIdentifier" Hidden />
<PropertyColumn Property = "x => x.AgencyName" Title = "Agency Name" />
<PropertyColumn Property = "x => x.AgencyAdd1" Title = "Address 1" />
<PropertyColumn Property = "x => x.AgencyAdd2" Title = "Address 2" />
<PropertyColumn Property = "x => x.AgencyTown_City" Title = "Town/City" />
<PropertyColumn Property = "x => x.AgencyPostcode" Title = "Postcode" />
<TemplateColumn CellClass = "d-flex justify-end">
<CellTemplate>
<div @onclick:stopPropagation = "true" @onclick:preventDefault = "true">
<MudIconButton Size = "@MudBlazor.Size.Small" Icon = "@Icons.Material.Rounded.Edit" @onclick = "() => EditItem(context.Item!)" />
</div>
</CellTemplate>
</TemplateColumn>
</Columns>
<PagerContent>
<MudDataGridPager T = "AgencyGridViewModel" Disabled = "false" />
</PagerContent>
</MudDataGrid>Это загружает данные в сетку
private async Task<GridData<AgencyGridViewModel>> LoadGridData(GridState<AgencyGridViewModel> state)
{
lastGridState = state;
var result = await AgencyService.GetPagedAsync(new PagedMessageRequest() { Page = state.Page, PageSize = state.PageSize }, this.CancelToken);
Agencies = Mapper.Map<IEnumerable<AgencyDto>, IEnumerable<AgencyGridViewModel>>(result.Result);
GridData<AgencyGridViewModel> data = new()
{
Items = Agencies.AsQueryable(),
TotalItems = result.Count
};
return data;
}
Это активирует модальное всплывающее окно (предварительно определенное на странице).
private async Task<Task> EditItem(AgencyGridViewModel item)
{
var result = await AgencyService.GetAgencyAsync(item.Id, item.AgencyIdentifier, this.CancelToken).ConfigureAwait(true);
Agency = Mapper.Map<AgencyDto, AgencyViewModel>(result);
return modalRef.Show();
}
Этот код запускается при нажатии кнопки отправки во всплывающем модальном окне (в модальном окне есть форма редактирования)
private async void OnValidSubmit(EditContext context)
{
if (context.Validate())
{
var agencyDTO = Mapper.Map<AgencyViewModel, AgencyDto>(Agency);
var request = new UpdateAgencyRequest(agencyDTO);
await AgencyService.SaveAsync(request, this.CancelToken).ConfigureAwait(false);
_ = modalRef.Hide();
await LoadGridData(lastGridState);
await InvokeAsync(StateHasChanged);
}
}
Это работает нормально, данные сохраняются и модальное окно закрывается, однако сетка никогда не обновляется.
Насколько я понимаю, эта строка должна перерисовать компонент
await InvokeAsync(StateHasChanged);
Это не так, хотя я понял это неправильно? Как я могу повторно отобразить (обновить) сетку в этом случае?





Да, это сообщает пользовательскому интерфейсу о необходимости повторной визуализации компонента, но это не обязательно извлекает данные из базы данных для обновления пользовательского интерфейса.
в вашем методе выполните обновление страницы, чтобы получить данные из базы данных после обновления.
public class YourServiceName(NavigationManager navigationManager)
{
private readonly NavigationManager _navigationManager = navigationManager;
YourUpdateMethod()
{
Your update logic
_navigationManager.Refresh(true);
}
}
надеюсь, это поможет
<MudDataGrid T = "AgencyGridViewModel"
ServerData = "@(new
Func<GridState<AgencyGridViewModel>,
Task<GridData<AgencyGridViewModel>>>(LoadGridData))"
@ref = "_dataGrid" ReadOnly = "true">
//other render fragments
</MudDataGrid>
@code{
MudDataGrid<AgencyGridViewModel> _dataGrid;
private async Task OnValidSubmit(EditContext context)
{
if (context.Validate())
{
var agencyDTO = Mapper.Map<AgencyViewModel, AgencyDto>(Agency);
var request = new UpdateAgencyRequest(agencyDTO);
await AgencyService.SaveAsync(request,
this.CancelToken).ConfigureAwait(false);
_ = modalRef.Hide();
//Call ReloadServerData Method
await _dataGrid.ReloadServerData();
}
}
}
вместо того, чтобы звонить
StateHasChangedпопробуйтеawait _dataGrid.ReloadServerData()