This is a migrated thread and some comments may be shown as answers.

[Solved] PersistenceManager: Error when restoring GridView Layout

1 Answer 279 Views
GridView
This is a migrated thread and some comments may be shown as answers.
This question is locked. New answers and comments are not allowed.
Philipp
Top achievements
Rank 1
Philipp asked on 01 Aug 2011, 04:12 PM
Hi,

I'm currenty trying to extend the sample from http://demos.telerik.com/silverlight/#PersistenceFramework/GridViewCustomSerialization to my needs. Specifically I need to store the visibility information of each column.
To accomplish that I extended the ColumnProxy to look like this:
public class ColumnProxy
    {
        public string UniqueName { get; set; }
        public int DisplayOrder { get; set; }
        public string Header { get; set; }
        public GridViewLength Width { get; set; }
        public bool IsVisible { get; set; }
    }

Storing the values works fine, but as soon as I try to restore them using this code
public void RestoreValue(CustomPropertyInfo customPropertyInfo, object context, object value)
{
    var gridView = context as RadGridView;
    if (gridView == null)
        throw new ArgumentException("context is not a RadGridView");
    switch (customPropertyInfo.Name)
    {
        case "Columns":
            {
                var savedProxies = value as List<ColumnProxy>;
         
                // restore properties on the saved columns:
                foreach (var proxy in savedProxies)
                {
                    var column = getColumnInstance(gridView, proxy.UniqueName);
                    if (column == null)
                        continue;
                    column.DisplayIndex = proxy.DisplayOrder;
                    column.Header = proxy.Header;
                    column.Width = proxy.Width;
                    column.IsVisible = proxy.IsVisible;
                }
            }
            break;
    ...
}
 
an InvalidOperationException is thrown when trying to assign the DisplayIndex.
The exact StackTrace is:

{System.InvalidOperationException: Cannot change or check the contents or Current position of the QueryableCollectionView while Refresh is being deferred.
   at Telerik.Windows.Data.QueryableCollectionView.VerifyRefreshNotDeferred()
   at Telerik.Windows.Data.QueryableCollectionView.get_Count()
   at Telerik.Windows.Data.DataItemCollection.get_Count()
   at Telerik.Windows.Controls.GridView.Selection.CellInfoCollection.RemoveRegionForColumn(Int32 columnIndex)
   at Telerik.Windows.Controls.GridView.Selection.CellInfoCollection.OnColumnMoved(Int32 oldColumnIndex, Int32 newColumnIndex)
   at Telerik.Windows.Controls.GridView.Selection.CellSelectionHandler.HandleColumnsChanged(ColumnCollectionChangedAction action, Int32 oldDisplayIndex, GridViewColumn oldColumn, Int32 newDisplayIndex)
   at Telerik.Windows.Controls.GridView.Selection.CompositeSelectionHandler.HandleColumnsChanged(ColumnCollectionChangedAction action, Int32 oldDisplayIndex, GridViewColumn oldColumn, Int32 newDisplayIndex)
   at Telerik.Windows.Controls.GridView.GridViewDataControl.UpdateSelectionOnColumnsChanged(ColumnCollectionChangedAction action, Int32 oldDisplayIndex, GridViewColumn oldColumn, Int32 newDisplayIndex)
   at Telerik.Windows.Controls.GridViewColumnCollectionInternal.SetDisplayIndexForColumn(Int32 oldDisplayIndex, Int32 newDisplayIndex)
   at Telerik.Windows.Controls.GridViewColumnCollectionInternal.OnDisplayIndexChanged(GridViewColumn column, Int32 oldDisplayIndex, Int32 newDisplayIndex)
   at Telerik.Windows.Controls.GridViewColumnCollectionInternal.NotifyPropertyChanged(DependencyObject d, String propertyName, DependencyPropertyChangedEventArgs e, UpdateTarget target)
   at Telerik.Windows.Controls.GridView.GridViewDataControl.NotifyPropertyChanged(DependencyObject d, String propertyName, DependencyPropertyChangedEventArgs e, UpdateTarget target)
   at Telerik.Windows.Controls.GridView.GridViewDataControl.NotifyPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e, UpdateTarget target)
   at Telerik.Windows.Controls.GridViewColumn.NotifyPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e, UpdateTarget target)
   at Telerik.Windows.Controls.GridViewColumn.DisplayIndexChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
   at Telerik.Windows.PropertyMetadata.<>c__DisplayClass1.<Create>b__0(DependencyObject d, DependencyPropertyChangedEventArgs e)
   at System.Windows.DependencyObject.RaisePropertyChangeNotifications(DependencyProperty dp, Object oldValue, Object newValue)
   at System.Windows.DependencyObject.UpdateEffectiveValue(DependencyProperty property, EffectiveValueEntry oldEntry, EffectiveValueEntry& newEntry, ValueOperation operation)
   at System.Windows.DependencyObject.SetValueInternal(DependencyProperty dp, Object value, Boolean allowReadOnlySet, Boolean isBindingInStyleSetter)
   at System.Windows.DependencyObject.SetValue(DependencyProperty dp, Object value)
   at Telerik.Windows.Controls.GridViewColumn.set_DisplayIndex(Int32 value)
   at SilverlightApplication1.Persistence.GridViewCustomPropertyProvider.RestoreValue(CustomPropertyInfo customPropertyInfo, Object context, Object value)
   at Telerik.Windows.Persistence.Serialization.Deserializer.LoadProperties(ReferenceValue refValue, String path, Object obj)
   at Telerik.Windows.Persistence.Serialization.Deserializer.Deserialize(ReferenceValue refValue, Object obj)
   at Telerik.Windows.Persistence.Serialization.Deserializer.Deserialize(Stream stream, Object objectToDeserialize)
   at Telerik.Windows.Persistence.PersistenceManager.Load(Object obj, Stream stream)
   at SilverlightApplication1.GridViewHeaderMenu.onMenuItemClick(Object sender, RoutedEventArgs e)
   at Telerik.Windows.Controls.MenuBase.OnItemClick(RadRoutedEventArgs args)
   at Telerik.Windows.Controls.MenuBase.OnItemClick(Object sender, RadRoutedEventArgs args)
   at Telerik.Windows.RadRoutedEventArgs.InvokeEventHandler(Delegate genericHandler, Object genericTarget)
   at Telerik.Windows.RadRoutedEventArgs.InvokeHandler(Delegate handler, Object target)
   at Telerik.Windows.RoutedEventHandlerInfo.InvokeHandler(Object target, RadRoutedEventArgs routedEventArgs)
   at Telerik.Windows.RouteItem.InvokeHandler(RadRoutedEventArgs routedEventArgs)
   at Telerik.Windows.EventRoute.InvokeHandlersImpl(Object source, RadRoutedEventArgs args, Boolean raisedAgain)
   at Telerik.Windows.EventRoute.InvokeHandlers(Object source, RadRoutedEventArgs args)
   at Telerik.Windows.RadRoutedEventHelper.RaiseEvent(DependencyObject element, RadRoutedEventArgs args)
   at Telerik.Windows.DependencyObjectExtensions.RaiseEvent(DependencyObject element, RadRoutedEventArgs e)
   at Telerik.Windows.Controls.RadMenuItem.OnClickImpl()
   at Telerik.Windows.Controls.RadMenuItem.OnClick()
   at Telerik.Windows.Controls.RadMenuItem.ClickItem()
   at Telerik.Windows.Controls.RadMenuItem.HandleMouseUp()
   at Telerik.Windows.Controls.RadMenuItem.OnMouseLeftButtonUp(MouseButtonEventArgs e)
   at System.Windows.Controls.Control.OnMouseLeftButtonUp(Control ctrl, EventArgs e)
   at MS.Internal.JoltHelper.FireEvent(IntPtr unmanagedObj, IntPtr unmanagedObjArgs, Int32 argsTypeIndex, Int32 actualArgsTypeIndex, String eventName, UInt32 flags)}

Any hints?

Thanks,
Philipp

1 Answer, 1 is accepted

Sort by
0
Philipp
Top achievements
Rank 1
answered on 01 Aug 2011, 04:18 PM
Sorry, my fault: there was a  using (_grid.DeferRefresh()) around the whole code block. See -> http://www.telerik.com/community/forums/silverlight/gridview/329225.aspx

Problem solved :)

Cheers,
phi
Tags
GridView
Asked by
Philipp
Top achievements
Rank 1
Answers by
Philipp
Top achievements
Rank 1
Share this question
or