如果添加了GroupDescriptors, RadGridView在单击一行时会抛出异常
本文关键字:一行 抛出异常 单击 添加 GroupDescriptors RadGridView 如果 | 更新日期: 2023-09-27 18:16:16
我的RadGridView抛出了一个系统。当有groupdescriptor对网格中的项应用分组时,InvalidCastException。
异常是相当无用的:
[A]DynamicDataType cannot be cast to [B]DynamicDataType. Type A originates from 'DynamicData, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null' in the context 'Default' in a byte array. Type B originates from 'DynamicData, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null' in the context 'Default' in a byte array.
at Telerik.Windows.Data.FuncExtensions.<>c__DisplayClass1`2.<ToUntypedFunc>b__0(Object item)
at Telerik.Windows.Data.QueryableCollectionViewGroup.FindLastLevelGroupByItem(Object item)
at Telerik.Windows.Controls.GridView.GridViewDataControl.GetRowForItem(Object item, Boolean forceGroupExpand)
at Telerik.Windows.Controls.GridView.GridViewDataControl.get_CurrentCell()
at Telerik.Windows.Controls.GridView.GridViewDataControl.CanCellBecomeCurrent(GridViewCell cell)
at Telerik.Windows.Controls.GridView.GridViewCell.OnMouseLeftButtonDown(MouseButtonEventArgs e)
at System.Windows.Controls.Control.OnMouseLeftButtonDown(Control ctrl, EventArgs e)
at MS.Internal.JoltHelper.FireEvent(IntPtr unmanagedObj, IntPtr unmanagedObjArgs, Int32 argsTypeIndex, Int32 actualArgsTypeIndex, String eventName)
当组从网格顶部的条中移除时,就没有问题了,我可以按正常方式选择网格的行。
这个问题似乎与我用来在刷新之间保存griddescriptor的一段代码有关。该方法接受refreshitemsourcelife - timestage,它是一个枚举。此代码在(AboutToRefresh)之前调用,在(FinishedRefresh)之后调用,ItemSource使用适当的参数进行更改。
public void RefreshGrid(RefreshItemSourceLifetimeStage stage)
{
switch (stage)
{
case RefreshItemSourceLifetimeStage.AboutToRefresh:
if (_grid.ItemsSource == null && !_grid.GroupDescriptors.Any())
{
// default group descriptor that you get on initial page load
_savedGroupDescriptors.Add(new GroupDescriptor { Member = "_CallFactorSet.CreatedAt.Year", DisplayContent = "Year Created", SortDirection = ListSortDirection.Descending});
}
else
{
_savedGroupDescriptors.Clear();
foreach (var igd in _grid.GroupDescriptors)
{
// we have to clone the objects into the _savedGroupDescriptors collection because otherwise they disappear when the itemsource is refreshed
if (igd is GroupDescriptor)
{
var gd = (GroupDescriptor) igd;
_savedGroupDescriptors.Add(new GroupDescriptor { Member = gd.Member, DisplayContent = gd.DisplayContent, SortDirection = gd.SortDirection });
}
else if (igd is ColumnGroupDescriptor)
{
var cgd = (ColumnGroupDescriptor) igd;
_savedGroupDescriptors.Add(new ColumnGroupDescriptor { Column = cgd.Column, DisplayContent = cgd.DisplayContent, SortDirection = cgd.SortDirection });
}
}
}
break;
case RefreshItemSourceLifetimeStage.FinishedRefresh:
_grid.GroupDescriptors.Clear();
foreach(var groupDescriptor in _savedGroupDescriptors)
{
_grid.GroupDescriptors.Add(groupDescriptor);
}
break;
default:
throw new ArgumentOutOfRangeException("stage");
}
}
任何想法?
有趣的是,更新到最新版本的Telerik控件(在撰写本文时为2011年Q3,高于2011年Q2 SP1)似乎解决了这个问题。