Вопрос или проблема
Я работаю над проектом Blazor на стороне сервера, используя компонент RadzenPickList для отображения списка данных из моей таблицы People. Я хочу отфильтровать данные по CompanyId и TypeId перед отображением в PickList. Вот мой код ниже
<RadzenCard>
<RadzenPickList @bind-Source="@Source" @bind-Target="@Target" Style="height:300px; width:100%;" Orientation="Orientation.Horizontal"
TextProperty="@nameof(ClassMembers.Name)" AllowFiltering="true" Multiple="true" ShowHeader="true" Disabled="false"
ButtonGap="12px" ButtonJustifyContent="JustifyContent.Center" ButtonStyle="ButtonStyle.Secondary" ButtonSize="ButtonSize.Medium"
ButtonShade="Shade.Default" ButtonVariant="Variant.Flat">
<SourceHeader>
Участник:
</SourceHeader>
<TargetHeader>
Выбранный участник:
</TargetHeader>
<Template>
@context.Name
</Template>
</RadzenPickList>
</RadzenCard>
@code
{
private IEnumerable<People> Peoples;
private IEnumerable<People> _source;
private IEnumerable<People> Source
{
get
{
return _source;
}
set
{
if (_source != value)
{
_source = value;
// Console.WriteLine("Source обновлён);
}
}
}
private IEnumerable<People> _target;
private IEnumerable<People> Target
{
get
{
return _target;
}
set
{
if (_target != value)
{
_target = value;
}
}
}
protected override async Task OnInitializedAsync()
{
Peoples = await DbContext.People
.Select(pl => new People
{
Id = pl.Id,
Name = pl.Name,
CompanyId = pl.CompanyId,
TypeId = pl.TypeId
}).ToListAsync() ?? new List<People>();
Source = Peoples.Where(pl => pl.CompanyId == selectedCompany && pl.TypeId == selectedPeopleType).ToList();
await base.OnInitializedAsync();
}
}
Я хочу отфильтровать коллекцию Peoples по CompanyId и TypeId. Однако отфильтрованные данные не отображаются. Я пробовал получить данные без фильтра, и они показывались нормально. Но когда я добавляю фильтрацию, данные не извлекаются. Кто-нибудь знает, что может быть не так?
Ответ или решение
Чтобы отфильтровать данные для компонента RadzenPickList в серверной части Blazor, вам необходимо убедиться, что значения selectedCompany
и selectedPeopleType
, которые вы используете для фильтрации, действительно содержат корректные идентификаторы. Если этих значений нет или они не совпадают с теми, что есть в базе данных, то результат фильтрации будет пустым.
Вот шаги, которые помогут решить вашу проблему и правильно настроить фильтрацию:
-
Проверьте значения фильтров: Убедитесь, что
selectedCompany
иselectedPeopleType
имеют правильные значения, соответствующие вашим данным в таблицеPeople
. Вы можете временно вывести их в лог или на экран для отладки, чтобы удостовериться в их корректности. -
Измените код фильтрации: Ваш код фильтрации может выглядеть корректным, но лучше добавить некоторую проверку перед выполнением фильтрации:
Source = Peoples .Where(pl => pl.CompanyId == selectedCompany && pl.TypeId == selectedPeopleType) .ToList();
-
Инициализация фильтров: Убедитесь, что
selectedCompany
иselectedPeopleType
инициализируются до вызова фильтрации вOnInitializedAsync
. Например:private readonly int selectedCompany = 1; // Пример значения private readonly int selectedPeopleType = 2; // Пример значения
Если эти переменные устанавливаются динамически где-то в вашем коде, убедитесь, что они инициализируются перед использованием.
-
Проверка наличия данных: После получения данных из базы данных, проверьте, есть ли там записанные значения для выбранных
CompanyId
иTypeId
. Вы можете сделать это, например, перед фильтрацией:var filteredPeoples = Peoples .Where(pl => pl.CompanyId == selectedCompany && pl.TypeId == selectedPeopleType) .ToList(); if(filteredPeoples.Any()) { Source = filteredPeoples; } else { Source = Enumerable.Empty<People>(); // Если нет данных, следующие значения для Source будут пустыми. }
-
Обновление компонента: После обновления
Source
не забудьте вызватьStateHasChanged()
, чтобы обновить интерфейс:Source = filteredPeoples; StateHasChanged();
Вот полный пример из вашего кода с учетом упомянутых изменений:
protected override async Task OnInitializedAsync()
{
Peoples = await DbContext.People
.Select(pl => new People
{
Id = pl.Id,
Name = pl.Name,
CompanyId = pl.CompanyId,
TypeId = pl.TypeId
}).ToListAsync() ?? new List<People>();
var filteredPeoples = Peoples
.Where(pl => pl.CompanyId == selectedCompany && pl.TypeId == selectedPeopleType)
.ToList();
Source = filteredPeoples.Any() ? filteredPeoples : Enumerable.Empty<People>();
await base.OnInitializedAsync();
}
Если вы выполнили все вышеописанные шаги и убедились, что значения фильтров корректны, а данные все еще не отображаются, то стоит проверить, нет ли проблем с самой базой данных или с ячейками данных выбранных идентификаторов.
Если у вас возникают дополнительные вопросы или есть ошибки, связанные с этой реализацией, сообщите об этом, и мы сможем глубже рассмотреть вашу проблему.