Telerik Grid中FirstOrDefault与LastOrDefault均选中最后行问题
解决Telerik Blazor Grid选中行异常问题
你的问题核心是对象引用不匹配导致Grid无法正确识别选中项,另外手动维护索引也容易出现不同步的情况。以下是修复后的代码和解释:
问题根源
- 你通过
Where(x => x.ID == ...)查询返回的对象,可能和Grid当前渲染的对象不是同一个引用(比如数据源是EF查询的结果,每次查询生成新实例),Telerik Grid的选择依赖对象引用相等,而非ID匹配。 - 手动维护的
index变量没有和当前选中项同步,导致上一条/下一条逻辑错误。
修复后的代码
1. 使用Grid内置API直接选中(推荐)
利用Telerik Grid的SelectItemAsync方法,这是最可靠的方式:
private async Task GoToFirstRow() { if (GridDataSource.Any()) { var firstItem = GridDataSource.First(); await Grid.SelectItemAsync(firstItem); } } private async Task GoToLastRow() { if (GridDataSource.Any()) { var lastItem = GridDataSource.Last(); await Grid.SelectItemAsync(lastItem); } } private async Task GoToPreviousRow() { if (!SelectedItems.Any() || GridDataSource.Count() == 0) return; var currentItem = SelectedItems.First(); var currentIndex = GridDataSource.ToList().IndexOf(currentItem); if (currentIndex > 0) { var prevItem = GridDataSource.ElementAt(currentIndex - 1); await Grid.SelectItemAsync(prevItem); } } private async Task GoToNextRow() { if (!SelectedItems.Any() || GridDataSource.Count() == 0) return; var currentItem = SelectedItems.First(); var currentIndex = GridDataSource.ToList().IndexOf(currentItem); if (currentIndex < GridDataSource.Count() - 1) { var nextItem = GridDataSource.ElementAt(currentIndex + 1); await Grid.SelectItemAsync(nextItem); } }
2. 直接更新SelectedItems并确保触发组件刷新
如果不想用异步API,也可以直接更新SelectedItems,然后调用StateHasChanged():
private void GoToFirstRow() { if (GridDataSource.Any()) { SelectedItems = new List<ReportRO> { GridDataSource.First() }; StateHasChanged(); } } private void GoToLastRow() { if (GridDataSource.Any()) { SelectedItems = new List<ReportRO> { GridDataSource.Last() }; StateHasChanged(); } } private void GoToPreviousRow() { if (!SelectedItems.Any() || GridDataSource.Count() == 0) return; var currentItem = SelectedItems.First(); var dataList = GridDataSource.ToList(); var currentIndex = dataList.IndexOf(currentItem); if (currentIndex > 0) { SelectedItems = new List<ReportRO> { dataList[currentIndex - 1] }; StateHasChanged(); } }
关键注意事项
- 确保
GridDataSource是稳定的集合(比如提前转成List<ReportRO>),避免每次LINQ查询生成新的对象实例,导致引用不匹配。 - 因为你用的是Single选择模式,
SelectedItems只需要包含一个元素,不需要用Where查询多个。 - 上一条/下一条逻辑中,必须从当前选中项获取索引,而不是手动维护独立的
index变量,避免不同步。
内容的提问来源于stack exchange,提问作者BlazorWolf
相关产品推荐
相关产品推荐

