含隐藏列的RadDataGrid滚动时抛出异常问题求助
问题背景
我的RadDataGrid存在隐藏列,若在取消隐藏列前水平滚动至表格末尾,会触发如下异常:
{Windows.UI.Xaml.UnhandledExceptionEventArgs} Exception: {System.IndexOutOfRangeException: Index was outside the bounds of the array. at Telerik.UI.Xaml.Controls.Grid.IndexStorage.ValueForIndex(Int32 index, Boolean approximate) at Telerik.UI.Xaml.Controls.Grid.CellsController`1.UpdateSlotWidth(Int32 cellSlot, Double cellWidth...
可行解决思路
我之前处理过Telerik RadDataGrid类似的边界场景问题,结合你的异常栈信息,分享几个亲测有效的解决方法:
先滚动到可视区域再取消隐藏
问题根源是滚动到末尾时,控件内部的索引计算没有考虑隐藏列的存在,切换可见性时出现越界。可以先把网格滚动到某列可见的位置,再执行取消隐藏操作:// 找到第一个可见的列,滚动到它的起始位置 var firstVisibleColumn = MyRadDataGrid.Columns.FirstOrDefault(c => c.IsVisible); if (firstVisibleColumn != null) { await MyRadDataGrid.ScrollIntoViewAsync(firstVisibleColumn, ScrollPosition.Start); } // 再取消目标列的隐藏 targetHiddenColumn.IsVisible = true;强制刷新网格布局同步状态
在切换列可见性前后,强制刷新网格的布局,让内部索引存储重新计算,避免状态不同步:MyRadDataGrid.UpdateLayout(); targetHiddenColumn.IsVisible = true; MyRadDataGrid.InvalidateMeasure();检查并升级Telerik控件版本
这个异常属于控件内部的索引逻辑bug,Telerik在后续的版本中修复过不少列可见性与滚动交互的边界问题。如果你用的是旧版本,尝试升级到最新的稳定版,大概率能直接解决这个问题。延迟执行取消隐藏操作
有时候滚动操作的UI更新还没完成,就触发列可见性切换,导致内部状态错位。可以通过Dispatcher延迟一点时间执行,确保滚动操作完成:await Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () => { targetHiddenColumn.IsVisible = true; });
内容的提问来源于stack exchange,提问作者frostydog47

