NullReferenceException when removing items from source collection

10 posts, 0 answers
  1. Michelle
    Michelle avatar
    1 posts
    Member since:
    Jan 2011

    Posted 09 Nov 2011 Link to this post

    To reproduce:

    1. Create a RadGridView
    2. Set or bind the ItemSource to an ObservableCollection
    3. Define a column with a button that removes the item
    4. Click the remove button at a fast rate

    Can reproduce with version 2011.2.1010.1040 or 2011.3.1020.1040 of the assemblies.

    Example XAML:

    <UserControl x:Class="NullReference.MainPage"
        mc:Ignorable="d"
        d:DesignHeight="300" d:DesignWidth="400">
     
        <Grid x:Name="LayoutRoot" Background="White">
             
            <telerik:RadGridView x:Name="MainGrid">
     
                <telerik:RadGridView.Columns>
     
                    <telerik:GridViewDataColumn Header="Name" UniqueName="Name" DataMemberBinding="{Binding Name, Mode=TwoWay}"/>
     
                    <telerik:GridViewDataColumn Header="Remove" UniqueName="Remove" IsReadOnly="True">
                        <telerik:GridViewColumn.CellTemplate>
                            <DataTemplate>
                                <Button x:Name="RemoveButton" Content="X" Click="RemoveButton_Click"/>
                            </DataTemplate>
                        </telerik:GridViewColumn.CellTemplate>
                    </telerik:GridViewDataColumn>
     
                </telerik:RadGridView.Columns>
            </telerik:RadGridView>
        </Grid>
    </UserControl>

    Example code-behind:

    using System.Collections.ObjectModel;
    using System.Windows;
    using System.Windows.Controls;
     
    namespace NullReference
    {
        public partial class MainPage : UserControl
        {
            public MainPage()
            {
                InitializeComponent();
     
                ItemCollection = new ObservableCollection<string>();
                for (int i = 0; i < 20; i++)
                {
                    ItemCollection.Add(i.ToString());
                }
     
                MainGrid.ItemsSource = ItemCollection;
            }
     
            public ObservableCollection<string> ItemCollection { get; private set; }
     
            private void RemoveButton_Click(object sender, RoutedEventArgs e)
            {
                Button button = sender as Button;
                if (button == null)
                {
                    return;
                }
     
                button.IsEnabled = false;
     
                string itemToRemove = button.DataContext as string;
                ItemCollection.Remove(itemToRemove);
            }
        }
    }


    Result:

    An exception is thrown:

    System.NullReferenceException: Object reference not set to an instance of an object.
       at Telerik.Windows.Controls.GridView.GridViewRow.OnMouseButtonUpInternal(Object sender, MouseButtonEventArgs e)
       at Telerik.Windows.Input.Mouse.RaiseMouseButtonEventImpl(DependencyObject element, RoutedEvent routedEvent, MouseButton button, MouseButtonState state, MouseButtonEventArgs e)
       at Telerik.Windows.Input.Mouse.OnElementMouseLeftButtonUp(Object sender, MouseButtonEventArgs e)
       at MS.Internal.CoreInvokeHandler.InvokeEventHandler(Int32 typeIndex, Delegate handlerDelegate, Object sender, Object args)
       at MS.Internal.JoltHelper.FireEvent(IntPtr unmanagedObj, IntPtr unmanagedObjArgs, Int32 argsTypeIndex, Int32 actualArgsTypeIndex, String eventName)


  2. Vlad
    Admin
    Vlad avatar
    11100 posts

    Posted 10 Nov 2011 Link to this post

    Hi Michelle,

     This issue is already fixed and the fix will be part of our upcoming Q3 2011 release next week.

    Regards,
    Vlad
    the Telerik team

    Explore the entire Telerik portfolio by downloading the Ultimate Collection trial package. Get it now >>

  3. DevCraft banner
  4. Michael
    Michael avatar
    10 posts
    Member since:
    Sep 2008

    Posted 25 Nov 2011 Link to this post

    Hi,
    i encounter the same problem with a large data amount in a gridview (actual Q3 2011 Release).
    The exception occurs while asynchronous data loading and double-clicking a row.
    It's just a the next method in your GridViewRow Class.
    My call-stack:

    System.NullReferenceException: Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt.
       bei Telerik.Windows.Controls.GridView.GridViewRow.OnMouseDoubleClick(MouseButtonEventArgs e)
       bei System.Windows.Controls.Control.HandleDoubleClick(Object sender, MouseButtonEventArgs e)
         ....

    Would be nice if you check for "GridViewDataControl != null" there too.

    Greetings, Michael
  5. Vlad
    Admin
    Vlad avatar
    11100 posts

    Posted 25 Nov 2011 Link to this post

    Hello Michael,

     This is already fixed! Please download our latest build for Q3 2011. 

    Best wishes,
    Vlad
    the Telerik team

    Explore the entire Telerik portfolio by downloading the Ultimate Collection trial package. Get it now >>

  6. Michael
    Michael avatar
    10 posts
    Member since:
    Sep 2008

    Posted 25 Nov 2011 Link to this post

    Hi Vlad,
    thanks four your reply. I'm using the Q3.  2011.3.1116 binaries.
    At the moment i check out whether the latest Hotfix (2011.3.1122) fixes the bug.
    Greetings, Michael
  7. Maulik Patel
    Maulik Patel avatar
    36 posts
    Member since:
    Mar 2010

    Posted 09 Apr 2012 Link to this post

    Hi,

    I am facing similar problem. The grid view item is being added/removed on the cell double click event (actually allows selection). The code was working well before upgrade to latest build 2012.1.215.1040. It throws internal error when item is removed/added runtime. The error is intermittent. Is it something a known issue? 

    A quick response is really appreciated.

    The code snippet:
    using System;
    using System.Windows;
    using System.Windows.Controls;
    using System.Windows.Media;
    using Telerik.Windows.Controls;
    using System.Collections.ObjectModel;
    using Telerik.Windows.Controls.GridView;
    using Telerik.Windows;
    using System.Windows.Media.Imaging;
     
    namespace Silverlight.Core.Controls
    {
        public partial class ApplicationForm : RadWindow
        {
            #region Constructors
            public ApplicationForm()
            {
                InitializeComponent();
                this.AvailableItemsGrid.AddHandler(GridViewCell.CellDoubleClickEvent, new EventHandler<Telerik.Windows.RadRoutedEventArgs>(this.OnAvailableItemsCellDoubleClick), true);
                this.SelectedItemsGrid.AddHandler(GridViewCell.CellDoubleClickEvent, new EventHandler<Telerik.Windows.RadRoutedEventArgs>(this.OnSelectedItemsCellDoubleClick), true);
                this.AvailableItemsGrid.IsEnabled = false;
                this.AvailableItemsGrid.LayoutUpdated += new EventHandler(AvailableItemsGrid_LayoutUpdated);
                this.SelectedItemsGrid.IsEnabled = false;
                this.SelectedItemsGrid.LayoutUpdated += new EventHandler(SelectedItemsGrid_LayoutUpdated);
                this.Closed += new EventHandler<WindowClosedEventArgs>(ApplicationForm_Closed);
            }
     
            private void ApplicationForm_Closed(object sender, WindowClosedEventArgs e)
            {
                if(this.SelectedItemsGrid != null)
                    this.SelectedItemsGrid.LayoutUpdated -= SelectedItemsGrid_LayoutUpdated;
                if(this.AvailableItemsGrid != null)
                    this.AvailableItemsGrid.LayoutUpdated -= AvailableItemsGrid_LayoutUpdated;
            }
     
            private void SelectedItemsGrid_LayoutUpdated(object sender, EventArgs e)
            {
                this.SelectedItemsGrid.IsEnabled = true;
                this.SelectedItemsGrid.RemoveHandler(GridViewCell.CellDoubleClickEvent, (EventHandler<Telerik.Windows.RadRoutedEventArgs>)this.OnSelectedItemsCellDoubleClick);
                this.SelectedItemsGrid.AddHandler(GridViewCell.CellDoubleClickEvent, new EventHandler<Telerik.Windows.RadRoutedEventArgs>(this.OnSelectedItemsCellDoubleClick), true);
            }
     
            private void AvailableItemsGrid_LayoutUpdated(object sender, EventArgs e)
            {
                this.AvailableItemsGrid.IsEnabled = true;
                this.AvailableItemsGrid.RemoveHandler(GridViewCell.CellDoubleClickEvent, (EventHandler<Telerik.Windows.RadRoutedEventArgs>)this.OnAvailableItemsCellDoubleClick);
                this.AvailableItemsGrid.AddHandler(GridViewCell.CellDoubleClickEvent, new EventHandler<Telerik.Windows.RadRoutedEventArgs>(this.OnAvailableItemsCellDoubleClick), true);
            }
            #endregion
     
            #region Private Methods
            private void OnAvailableItemsCellDoubleClick(object sender, Telerik.Windows.RadRoutedEventArgs e)
            {
                e.Handled = true;
                System.Diagnostics.Debug.WriteLine("ApplicationForm.OnAvailableItemsCellDoubleClick:Before BtnAdd_Click");
                this.BtnAdd_Click(this, null);
                System.Diagnostics.Debug.WriteLine("ApplicationForm.OnAvailableItemsCellDoubleClick:Exit");
            }
     
            private void OnSelectedItemsCellDoubleClick(object sender, Telerik.Windows.RadRoutedEventArgs e)
            {
                e.Handled = true;
                this.BtnRemove_Click(this, null);
            }
     
            private void BtnRemove_Click(object sender, RoutedEventArgs e)
            {
                System.Diagnostics.Debug.WriteLine("ApplicationForm.BtnRemove_Click.Enter");
                if (GridAddedItems.SelectedItems.Count > 0)
                {
                    var selectedItems = GridAddedItems.SelectedItems;
                    var sourceAvailableItems = (ObservableCollection<ApplicationFormItem>)GridAvailableItems.ItemsSource;
                    foreach (var item in selectedItems)
                    {
                        sourceAvailableItems.Add(item as ApplicationFormItem);
                    }
                    var sourceAddedItems = (ObservableCollection<ApplicationFormItem>)GridAddedItems.ItemsSource;
                     
                    int iCount = selectedItems.Count;
                    for (int i = iCount - 1; i >= 0; i--)
                        sourceAddedItems.Remove(selectedItems[i] as ApplicationFormItem);
                }
                if (GridAddedItems.Items.Count == 0)
                    BtnRemove.IsEnabled = false;
                if (GridAvailableItems.Items.Count > 0)
                    BtnAdd.IsEnabled = true;
                btnOK.IsEnabled = true;
                this.AvailableItemsGrid.IsEnabled = false;
                this.SelectedItemsGrid.IsEnabled = false;
     
                System.Diagnostics.Debug.WriteLine("ApplicationForm.BtnRemove_Click.Exit");
            }
     
            private void BtnAdd_Click(object sender, RoutedEventArgs e)
            {
                System.Diagnostics.Debug.WriteLine("ApplicationForm.BtnAdd_Click.Enter");
     
                if (GridAvailableItems.SelectedItems.Count > 0)
                {
                    System.Diagnostics.Debug.WriteLine("ApplicationForm.BtnAdd_Click.SelectedItems.Count > 0");
                    var selectedItems = GridAvailableItems.SelectedItems;
                    System.Diagnostics.Debug.WriteLine("ApplicationForm.BtnAdd_Click.GridAvailableItems.SelectedItems assigned");
                    var sourceAddedItems = (ObservableCollection<ApplicationFormItem>)GridAddedItems.ItemsSource;
                    System.Diagnostics.Debug.WriteLine("ApplicationForm.BtnAdd_Click.GridAddedItems.ItemsSource assigned");
                    foreach (var item in selectedItems)
                    {
                        System.Diagnostics.Debug.WriteLine("ApplicationForm.BtnAdd_Click iterate selected items");
                        sourceAddedItems.Add(item as ApplicationFormItem);
                    }
     
                    var sourceAvailableItems = (ObservableCollection<ApplicationFormItem>)GridAvailableItems.ItemsSource;
                    System.Diagnostics.Debug.WriteLine("ApplicationForm.BtnAdd_Click.GridAvailableItems.ItemsSource assigned.");
     
                    int iCount = selectedItems.Count;
                    for (int i = iCount - 1; i >= 0; i--)
                    {
                        System.Diagnostics.Debug.WriteLine("ApplicationForm.BtnAdd_Click.Remove Selected item.");
                        sourceAvailableItems.Remove(selectedItems[i] as ApplicationFormItem);
                        System.Diagnostics.Debug.WriteLine("ApplicationForm.BtnAdd_Click.Selected item removed.");
                    }
                }
     
                if (GridAvailableItems.Items.Count == 0)
                {
                    System.Diagnostics.Debug.WriteLine("ApplicationForm.BtnAdd_Click.Disable BtnAdd.");
                    BtnAdd.IsEnabled = false;
                }
                if (GridAddedItems.Items.Count > 0)
                {
                    System.Diagnostics.Debug.WriteLine("ApplicationForm.BtnAdd_Click.Enable BtnRemove.");
                    BtnRemove.IsEnabled = true;
                }
                System.Diagnostics.Debug.WriteLine("ApplicationForm.BtnAdd_Click.Enable btnOK.");
                btnOK.IsEnabled = true;
                this.AvailableItemsGrid.IsEnabled = false;
                this.SelectedItemsGrid.IsEnabled = false;
     
                System.Diagnostics.Debug.WriteLine("ApplicationForm.BtnAdd_Click.Exit.");
            }
     
            private void SetTitle()
            {
                StackPanel panel = new StackPanel() { Orientation = Orientation.Horizontal };
                Image icon = new Image() { Stretch = Stretch.Uniform };
                icon.Source = new BitmapImage(new Uri("/Silverlight.Core;component/Images/A_v01_18.png", UriKind.Relative));
                panel.Children.Add(icon);
                TextBlock title = new TextBlock();
                title.Text = Convert.ToString(this.FormTitle);
                panel.Children.Add(title);
                this.Header = panel;
            }
     
            #endregion
     
            #region Public Methods
     
            public void ShowForm()
            {
                if (this.SelectedItemsGrid.ItemsSource != null)
                {
                    int cnt = Convert.ToInt32(this.SelectedItemsGrid.ItemsSource.GetType().GetProperty("Count").GetValue(this.SelectedItemsGrid.ItemsSource, null));
                    if (cnt > 0)
                        BtnRemove.IsEnabled = true;
                    else
                        BtnRemove.IsEnabled = false;
                }
                else
                    BtnRemove.IsEnabled = false;
                if (this.AvailableItemsGrid.ItemsSource != null)
                {
                    int cnt = Convert.ToInt32(this.AvailableItemsGrid.ItemsSource.GetType().GetProperty("Count").GetValue(this.AvailableItemsGrid.ItemsSource, null));
                    if (cnt > 0)
                        BtnAdd.IsEnabled = true;
                    else
                        BtnAdd.IsEnabled = false;
                }
                else
                    BtnAdd.IsEnabled = false;
                SetTitle();
                this.ShowDialog();
            }
     
            #endregion
        }
    }


    Error:

    Object reference not set to an instance of an object.

       at Telerik.Windows.Controls.GridView.GridViewRow.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)

    Regards,
    Maulik
  8. Vlad
    Admin
    Vlad avatar
    11100 posts

    Posted 09 Apr 2012 Link to this post

    Hi,

    This is already fixed. Please get our official service pack (Q1 2012 SP1)!

    All the best,
    Vlad
    the Telerik team

    Explore the entire Telerik portfolio by downloading the Ultimate Collection trial package. Get it now >>

  9. Maulik Patel
    Maulik Patel avatar
    36 posts
    Member since:
    Mar 2010

    Posted 09 Apr 2012 Link to this post

    Thanks for the quick reply. We will check after upgrading to the mentioned one.

    Regards,
    Maulik
  10. Maulik Patel
    Maulik Patel avatar
    36 posts
    Member since:
    Mar 2010

    Posted 08 May 2012 Link to this post

    Hi  Vlad,

    We are still facing the same problem. The version of GridView.dll is 2012.1.326.1040. Is it the expected version or we need to get any other version?

    Regards,
    Maulik
  11. Yordanka
    Admin
    Yordanka avatar
    634 posts

    Posted 11 May 2012 Link to this post

    Hi Maulik,

    Thank you for the details.

    We reproduced the exception using Silverlight4 binaries and it was resolved immediately. You can find it fixed with the next internal build expected on Monday.
     
    Greetings,
    Yordanka
    the Telerik team

    Explore the entire Telerik portfolio by downloading the Ultimate Collection trial package. Get it now >>

Back to Top
DevCraft banner