我正在使用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(只需删除Skip
和Take
)。这样你就可以很容易地完成分页网格,但这可能不是你想要的。。。
2.)如果你的目标是在需要的时候获取数据(当你在1.页面上时,你想要数据库中的前50台设备(或任何数据源),当你在2.页面上时你想要数据库(或任何数据来源等)中的另外50台设备)。那么我认为你必须将SfDataManager
与CustomAdaptor
结合使用。可能还有其他方法可以做到这一点,但一种方法是创建新的组件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;
}