InfiniteAsyncSource.ReloadRows(Object[]) Method
Reloads rows with specified keys.
Namespace: DevExpress.Xpf.Data
Assembly: DevExpress.Xpf.Core.v20.1.dll
NuGet Packages: DevExpress.WindowsDesktop.Wpf.Core, DevExpress.Wpf.Core
Declaration
Parameters
Name | Type | Description |
---|---|---|
keys | Object[] | Key field values that identify the rows you want to reload. |
Remarks
Tip
Use the ReloadRows method to reload a subset of grid data. To refresh data in all rows, call the VirtualSourceBase.RefreshRows method.
Before you use the ReloadRows method, make sure that the virtual source’s KeyProperty specifies a key field. The code sample below sets this property to the Id field. The ReloadRows method then accepts an array of key values that identify the rows to be reloaded:
private void Button_Click(object sender, RoutedEventArgs e) {
int[] selectedRowIds = grid.SelectedItems.Cast<IssueData>().Select(x => x.Id).ToArray();
((InfiniteAsyncSource)(grid.ItemsSource)).ReloadRows(selectedRowIds);
}
// ...
var source = new InfiniteAsyncSource() {
ElementType = typeof(IssueData),
KeyProperty = nameof(IssueData.Id)
};
The ReloadRows method raises the FetchRows event. In the event handler, process the keys that you passed to the ReloadRows method. Use one of the following approaches:
Use the e.Keys property to get the keys. Return rows that correspond to these keys.
static async Task<FetchRowsResult> FetchRowsAsync(FetchRowsAsyncEventArgs e) { if(e.Keys != null) { var reloadedIssues = await IssuesService.GetIssuesById(e.Keys.Cast<int>().ToArray()); return new FetchRowsResult(reloadedIssues); } // ... }
Use the e.Filter property to identify rows using a filter object. The filter contains an InOperator constructed from the keys you passed to the ReloadRows method. Parse the filter and return rows.
static async Task<FetchRowsResult> FetchRowsAsync(FetchRowsAsyncEventArgs e) { var take = e.Take ?? 30; var issues = await IssuesService.GetIssuesAsync( skip: e.Skip, take: take, sortOrder: IssueSortOrder.Default, filter: MakeIssueFilter(e.Filter)); return new FetchRowsResult(issues, hasMoreRows: issues.Length == take); } static IssueFilter MakeIssueFilter(CriteriaOperator filter) { return filter.Match( // ... @in: (propertyName, values) => { if (propertyName == nameof(IssueData.Id)) return new IssueFilter(ids: values.Cast<int>().ToArray()); throw new InvalidOperationException(); }, // ... ); }
When you call the ReloadRows method, the e.Take property returns int.Max
. It allows the virtual source to refresh all rows you want to reload even if their number is greater than the number of rows you fetch at a time.
The code sample below fetches 30 rows at a time after a users scolls data.
static async Task<FetchRowsResult> FetchRowsAsync(FetchRowsAsyncEventArgs e) {
// ...
var take = e.Take ?? 30;
var issues = await IssuesService.GetIssuesAsync(
skip: e.Skip,
take: take,
sortOrder: sortOrder,
filter: filter);
// ...
}
If you select 50 rows and reload them, the virtual source will refresh all 50 rows.
((InfiniteAsyncSource)(grid.ItemsSource)).ReloadRows(selectedRowIds);