You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Telerik Grid中FirstOrDefault与LastOrDefault均选中最后行问题

解决Telerik Blazor Grid选中行异常问题

你的问题核心是对象引用不匹配导致Grid无法正确识别选中项,另外手动维护索引也容易出现不同步的情况。以下是修复后的代码和解释:

问题根源

  1. 你通过Where(x => x.ID == ...)查询返回的对象,可能和Grid当前渲染的对象不是同一个引用(比如数据源是EF查询的结果,每次查询生成新实例),Telerik Grid的选择依赖对象引用相等,而非ID匹配。
  2. 手动维护的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 19:05:22