Syncfusion中DataGrid的服务器端分页(Blazor服务器应用程序)



我正在使用Syncfusion UI组件开发Blazor服务器应用程序。我对Equipment Table组件使用以下代码:

<div>
<SfGrid @ref="DefaultGrid" DataSource="@Equipments" EnableRtl="true" class="table-eq" AllowResizing="true" AllowSorting="true" AllowFiltering="true" AllowPaging="true" Height="@TableHeight.ToString()">
<GridPageSettings PageSize="@PageSize" PageCount="PageCount"></GridPageSettings>
<GridColumns>
<GridColumn Field="EquipmentCode" HeaderText="Equipment Code" TextAlign="TextAlign.Right" Width="40"></GridColumn>
<GridColumn Field="EquipmentTitle" HeaderText="Equipment Title" TextAlign="TextAlign.Right" Width="120"></GridColumn>
<GridColumn Field="equipmentType.EquipmentTypeTitle" HeaderText="Equipment Type" TextAlign="TextAlign.Right" Width="60"></GridColumn>
<GridColumn Field="EquipmentCategory.CategoryName" HeaderText="Equipment Category" TextAlign="TextAlign.Right" Width="60"></GridColumn>
<GridColumn Field="CostCenter.Title" HeaderText="Cost Center" TextAlign="TextAlign.Right" Width="60"></GridColumn>
<GridColumn Field="IsActive" HeaderText="Status" TextAlign="TextAlign.Right" Width="30"></GridColumn>
</GridColumns>
</SfGrid>
</div>
@code {
SfGrid<Equipment> DefaultGrid;
int totalCount;
public static List<Equipment> Equipments { get; set; }
public int TableHeight { get; set; } = 400;
public int PageSize { get; set; } = 50;
public int PageCount { get; set; } = 1;
public int CurrentPage { get; set; } = 1;
private void GetCurrentPage()
{
CurrentPage = DefaultGrid.PageSettings.CurrentPage;
}
protected override async Task OnInitializedAsync()
{
totalCount = await Task.Run(() => equipmentServices.GetTotalEquipmentsCount());
Equipments = await Task.Run(() => equipmentServices.GetPagedEquipmentsData(CurrentPage, PageSize));
PageCount = (totalCount % PageSize) > 0 ? (totalCount / PageSize) - totalCount % PageSize : totalCount / PageSize;
}
}

我使用以下代码从数据库中获取分页数据:

public async Task<List<Equipment>> GetPagedEquipmentsData(int pageNumber, int pageCapacity)
{
int skip = (pageNumber - 1) * pageCapacity;
var list = await _sqlServerContext.Equipments
.OrderByDescending(x => x.EquipmentId)
.Skip(skip).Take(pageCapacity)
.Include(x => x.CostCenter)
.Include(x => x.EquipmentCategory)
.Include(x => x.equipmentType)
.ToListAsync();
return list;
}

当我运行该应用程序时,只显示50条带有1页的记录。我需要在表的底部有PageCount的页数。我怎样才能做到这一点?

在我看来,你对PageCount的计算似乎不正确
您拥有的是:

PageCount = (totalCount % PageSize) > 0 ? (totalCount / PageSize) - totalCount % PageSize : totalCount / PageSize;

我想你想要的是:

PageCount = (totalCount % PageSize) > 0 ? (totalCount / PageSize) + 1 : totalCount / PageSize;

(注意:记住+ 1是足够的,因为totalCount % PageSize的结果不能>=PageSize。否则它会被%吃掉。)

但这仍然不能完全解决你的问题。。。问题是,你从GetPagedEquipmentsData得到Equipment,在那里你做.Skip(0).Take(50)。从这里你可以得到前50台设备。你拿着它们,把它们传给网格(DataSource="@Equipments")。因此,网格只知道这50台设备,并将对它们进行分页。不再进行设备获取。

所以。。。解决方案
1.)您可以获取GetPagedEquipmentsData中所有设备的ALL(只需删除SkipTake)。这样你就可以很容易地完成分页网格,但这可能不是你想要的。。。

2.)如果你的目标是在需要的时候获取数据(当你在1.页面上时,你想要数据库中的前50台设备(或任何数据源),当你在2.页面上时你想要数据库(或任何数据来源等)中的另外50台设备)。那么我认为你必须将SfDataManagerCustomAdaptor结合使用。可能还有其他方法可以做到这一点,但一种方法是创建新的组件YourCustomDataAdaptor,继承自Syncfusion的DataAdaptor<T>,覆盖/实现其方法,然后在网格中使用它:

<SfGrid ...>
<SfDataManager Adaptor="Adaptors.CustomAdaptor">
<YourCustomDataAdaptor />
</SfDataManager>
...
</SfGrid>

您可以在这里看到更多关于自定义适配器的信息(包括如何使用它的示例):https://blazor.syncfusion.com/documentation/datagrid/custom-binding

为了实现这一点,我建议使用以下代码片段来检索网格的PageCount。

<SfButton OnClick="PageCount">PageCount</SfButton><SfGrid @ref="DefaultGrid" DataSource="@Orders" AllowPaging="true" Height="200">
私有SfGrid DefaultGrid;
private void PageCount()
{
var pagecount = (DefaultGrid.TotalItemCount % DefaultGrid.PageSettings.PageSize) > 0 ?
(DefaultGrid.TotalItemCount / DefaultGrid.PageSettings.PageSize) + 1 :
DefaultGrid.TotalItemCount / DefaultGrid.PageSettings.PageSize;
}

最新更新