与OnRead事件绑定数据
本文介绍了OnRead
事件,并描述如何使用它来数据绑定Telerik Blazor组件。
- 目的及好处
OnRead
- 哪些Blazor组件使用
OnRead
- 项目描述
OnRead
事件参数 - 如何返回数据
OnRead
与ToDataSourceResult
方法 - 例子
- 使用时如何刷新组件数据
OnRead
目的和收益
向组件提供数据的最简单方法是设置组件的数据
参数IEnumerable < T >
。这允许组件拥有所有数据项,并在内部执行所有数据操作(筛选、分页、排序等)。然而,这种情况并不总是最优的。
有两个主要原因使用OnRead
事件:性能而且定制。
性能
大量数据需要按需加载。这样可以提高数据库、后端、网络和浏览器的性能。当组件触发时OnRead
,它期望收到只呈现数据项。确切的数字取决于组件页大小
参数。
OnRead
还卸载组件外部的数据操作,例如在远程服务器上。这可以提高WebAssembly应用程序的性能。
定制
OnRead
允许完全控制数据操作。例如,如果内置的排序和过滤算法不适合给定的场景,则可以使用自定义排序和过滤算法。这里只是一些例子,但还有更多可能的场景:
OnRead
使数据绑定到OData万博体育手机版网址。
OnRead
还允许应用程序知道用户当前看到的确切数据项。
带有OnRead事件的组件
下面的Blazor组件公开了一个OnRead
事件。获得性能好处,使用事件一起配合分页或虚拟化(也称为虚拟滚动)。
每个组件名称都指向特定于组件的OnRead
文档和示例:
组件 | 支持分页 | 支持虚拟化 |
---|---|---|
自动完成 | - | 自动完成虚拟化 |
组合框 | - | 组合框的虚拟化 |
DropDownList | - | DropDownList虚拟化 |
网格 | 网格分页 | 网格行虚拟化 |
列表视图 | ListView分页 | - |
多选 | - | 多选虚拟化 |
像TreeList和树状视图不要有OnRead
事件。相反,它们通过OnExpand
事件。
事件参数
的OnRead
事件处理程序接收参数,该参数继承自ReadEventArgs
。确切的类型取决于组件。例如,网格处理程序接收GridReadEventArgs
。ComboBox处理程序接收ComboBoxReadEventArgs
等等。
事件参数对象的以下属性对所有对象都是通用的具有OnRead
事件。其他属性将在特定于组件的文章中讨论。
财产 | 类型 | 描述 |
---|---|---|
请求 |
DataSourceRequest |
该对象携带有关请求数据项的信息。它将显示页面索引或虚拟滚动偏移量、排序和过滤状态等。 |
数据 |
IEnumerable |
将其设置为块的数据项,组件将渲染。 |
总计 |
int |
将其设置为总数的物品。这个值将帮助组件生成它的寻呼机或虚拟滚动条正确。 |
使用DataSourceRequest属性
async Task GridReadHandler(GridReadEventArgs args){//新页面是什么?// args.Request.Page //页面大小(返回多少项)?// args.Request.PageSize //用户在虚拟场景中滚动了多少行?// args.Request.Skip}
的
DataSourceRequest
对象可以序列化并发送到远程服务器。使用System.Text.Json
序列化器。
ToDataSourceResult方法
的DataSourceRequest
对象提供有关所需数据的信息。问题是如何最容易地检索这些数据。有时OnRead
数据绑定称为“手动”,但在大多数情况下,它根本不必是手动的。解决办法是ToDataSourceResult
。
的ToDataSourceResult
扩展方法能够从中提取所请求的数据项IEnumerable
,这个IQueryable
而且数据表
。该方法是Telerik DataSource Extensions。它期望DataSourceRequest
论点。
ToDataSourceResult
返回一个DataSourceResult
对象。它最重要的属性是:
财产 | 类型 | 描述 |
---|---|---|
数据 |
IEnumerable |
要呈现的数据项块(页)。已经应用了所有数据操作(排序、筛选等) |
总计 |
int |
数据源中项的总数。 |
的数据
而且总计
的属性DataSourceRequest
而且DataSourceResult
匹配,并允许轻松赋值:
使用ToDataSourceResult
IEnumerable AllGridData {get;设置;} async Task GridReadHandler(GridReadEventArgs args) {DataSourceResult result = AllGridData.ToDataSourceResult(args. request);arg游戏。数据= result.Data; args.Total = result.Total; args.AggregateResults = result.AggregateResults; // Grid only }
ToDataSourceResultAsync
的可等待(异步)替代方法吗ToDataSourceResult
。
它是可以使用的
DataSourceRequest
,ToDataSourceResult
而且ToDataSourceResultAsync
在与特定Telerik组件无关的场景中。
例子
让我们想象一下,我们的数据源包含1000个项目,而我们只想向Grid发送一页项目。
- 导入
Telerik.DataSource.Extensions
名称空间。 - 设置网格的
TItem
参数设置为模型类型。(有些组件需要TValue
参数来定义值类型,而不是Grid。使用TValue
使用自动完成、组合框、下拉列表和多选功能。) - 订阅
OnRead
事件。使用异步任务
而不是异步无效
。事件处理程序接收一个GridReadEventArgs
论点。我们给它命名arg游戏
。 - 使用
arg游戏。请求
而且ToDataSourceResult ()
获取一页网格数据。可以根据用户的操作对数据进行筛选和排序。 - 集
arg游戏。数据
到要呈现的数据项。 - 集
arg游戏。总计
到数据项的总数(1000)。
使用OnRead事件
@using telerikk . datasource . extensions OnGridRead fired at: @LastOnRead
@code {private List GridData {get;设置;}私有字符串LastOnRead {get;设置;} //总是使用async Task,而不是async void private async Task OnGridRead(GridReadEventArgs args) {var result = GridData.ToDataSourceResult(args. request);arg游戏。数据= result.Data; args.Total = result.Total; var now = DateTime.Now; LastOnRead = now.ToLongTimeString() + "." + now.Millisecond; } protected override void OnInitialized() { GenerateData(); base.OnInitialized(); } private void GenerateData() { GridData = new List(); for (int i = 1; i <= 1000; i++) { GridData.Add(new SampleModel() { Id = i, Text = $"Grid Text {i}" }); } } public class SampleModel { public int Id { get; set; } public string Text { get; set; } } }
刷新数据
组件触发OnRead
用户执行某个操作(如分页、排序、虚拟滚动等)时的事件。调用OnRead
手动处理程序将不起作用,因为组件将不会跟踪方法参数。
所有带有OnRead
事件有一个重新绑定
方法也是。要以编程方式刷新组件数据,请调用此方法。它将迫使组件发射OnRead
并接收新的数据。
使用OnRead时重新绑定下拉列表和网格
@using telerikdatasource . extensions @context. txtId: @context。Text 重新绑定组件
< TelerikGrid @ref="@TheGrid" TItem="@SampleModel" OnRead="@OnGridRead" AutoGenerateColumns="true" Sortable="true" Pageable="true" PageSize="5" /> @code {TelerikGrid TheGrid {get;设置;} TelerikDropDownList TheDropDown {get;设置;} List GridData {get; set; } List DropDownData { get; set; } int DropDownValue { get; set; } = 1; void RebindComponents() { GenerateData(); // simulate change in the data TheGrid.Rebind(); TheDropDown.Rebind(); } async Task OnGridRead(GridReadEventArgs args) { var result = GridData.ToDataSourceResult(args.Request); args.Data = result.Data; args.Total = result.Total; } async Task OnDropDownRead(DropDownListReadEventArgs args) { var result = DropDownData.ToDataSourceResult(args.Request); args.Data = result.Data; args.Total = result.Total; } protected override void OnInitialized() { GenerateData(); base.OnInitialized(); } void GenerateData() { GridData = new List(); DropDownData = new List(); var rnd = new Random(); for (int i = 1; i <= 10; i++) { GridData.Add(new SampleModel() { Id = i, Text = $"Text {rnd.Next(1, 100)}" }); DropDownData.Add(new SampleModel() { Id = i, Text = $"Text {rnd.Next(1, 100)}" }); } } public class SampleModel { public int Id { get; set; } public string Text { get; set; } } }