System.ArgumentOutOfRangeException: Specified argument was out of the range of valid values.
Parameter name: index
at Telerik.Windows.Controls.GridView.GridViewDataControl.CommitCurrentEdit(GridViewRow gridViewRow)
at Telerik.Windows.Controls.GridView.GridViewDataControl.PerformRowEditEnded(GridViewCell currentCell)
at Telerik.Windows.Controls.GridView.GridViewDataControl.CommitCellEdit(GridViewCell currentCell, Boolean isLeavingRow)
at Telerik.Windows.Controls.GridView.GridViewDataControl.OnItemsChanged(NotifyCollectionChangedEventArgs e)
at Telerik.Windows.Controls.GridView.BaseItemsControl.OnItemCollectionChanged(Object sender, NotifyCollectionChangedEventArgs e)
at System.Collections.Specialized.NotifyCollectionChangedEventHandler.Invoke(Object sender, NotifyCollectionChangedEventArgs e)
at Telerik.Windows.Data.DataItemCollection.OnCollectionViewCollectionChanged(NotifyCollectionChangedEventArgs e)
at Telerik.Windows.Data.QueryableCollectionView.RefreshOverride()
at Telerik.Windows.Data.QueryableCollectionView.RefreshInternal()
at System.Collections.ObjectModel.ObservableCollection`1.OnCollectionChanged(NotifyCollectionChangedEventArgs e)
(More that was removed, but entry point from our code)
<telerik:RadGridView x:Name="GridView" ItemsSource="{Binding DataView}" Width="700" MinHeight="386" MaxHeight="500" .........</telerik:RadGridView><telerik:RadDataPager PageSize="100" Grid.Row="1" Source="{Binding DataView}" />public VirtualQueryableCollectionView<VSOEChageItemViewModel> DataView { get { if (_DataView == null) { _DataView = new VirtualQueryableCollectionView<VSOEChageItemViewModel>() { LoadSize = 40, VirtualItemCount = 40 }; _DataView.ItemsLoading += DataViewItemsLoading; } return _DataView; } private set { if (_DataView != null) { _DataView.ItemsLoading -= DataViewItemsLoading; } _DataView = value; if (_DataView != null) { _DataView.ItemsLoading += DataViewItemsLoading; } } }private void DataViewItemsLoading(object sender, VirtualQueryableCollectionViewItemsLoadingEventArgs e) { string filertString = GetFilertString(); var sort = DataView.SortDescriptors; var sortString = sort.ToDynamicLinq(); if (!string.IsNullOrEmpty(sortString)) sortString = sortString.Remove(0, sortString.IndexOf(".") + 1); int allCount = 0; List<VSOEChageItemViewModel> dd1 = LoadData(filertString, sortString, e.StartIndex, e.ItemCount, out allCount); if (allCount != DataView.VirtualItemCount) { DataView.VirtualItemCount = allCount; } DataView.Load(e.StartIndex, dd1); }
DataProvider.csnamespace SampleLinqToSQL{ public static class DataProvider { private static NorthwindDataContext dataContext = null; public static NorthwindDataContext DataContext { get { return dataContext; } } static DataProvider() { dataContext = new NorthwindDataContext(); } public static void SetDataContext(string connectionString) { dataContext = null; dataContext = new NorthwindDataContext(connectionString); } }}MainWindow.xaml<Window x:Class="SampleLinqToSQL.MainWindow" xmlns:telerik="http://schemas.telerik.com/2008/xaml/presentation" Title="MainWindow" Height="350" Width="525"> <DockPanel LastChildFill="True"> <StackPanel DockPanel.Dock="Bottom" HorizontalAlignment="Right" Orientation="Horizontal"> <Button x:Name="SaveBtn" Width="50" Height="25" Margin="5" Click="SaveBtn_Click">Save</Button> <Button x:Name="CancelBtn" Width="50" Height="25" Margin="5" Click="CancelBtn_Click">Cancel</Button> </StackPanel> <ListBox x:Name="TableNames" DockPanel.Dock="Left" Width="140" MouseDoubleClick="TableNames_MouseDoubleClick"></ListBox> <Border> <DockPanel x:Name="DocumentArea"> <telerik:RadGridView x:Name="dataGridView" AutoGenerateColumns="True" ItemsSource="{Binding}" /> </DockPanel> </Border> </DockPanel></Window>MainWindow.xaml.csnamespace SampleLinqToSQL{ /// <summary> /// Interaction logic for MainWindow.xaml /// </summary> public partial class MainWindow : Window { private string sqlConnection = @"Data Source=.\SQLEXPRESS;AttachDbFilename=C:\Path\Northwind.mdf;Integrated Security=True;User Instance=True"; public MainWindow() { InitializeComponent(); DataProvider.SetDataContext(sqlConnection); LoadTableNames(); } private void LoadTableNames() { List<string> tableNames = new List<string>(); foreach (PropertyInfo item in DataProvider.DataContext.GetType().GetProperties()) { tableNames.Add(item.Name); } tableNames = tableNames.OrderBy(s => s).ToList(); TableNames.ItemsSource = tableNames; } private void SaveBtn_Click(object sender, RoutedEventArgs e) { DataProvider.DataContext.SubmitChanges(); } private void CancelBtn_Click(object sender, RoutedEventArgs e) { //TODO } private void TableNames_MouseDoubleClick(object sender, MouseButtonEventArgs e) { if (TableNames.SelectedItem != null) { dataGridView.DataContext = DataProvider.DataContext.GetTableByName(TableNames.SelectedItem.ToString()).AsParallel(); } } }}
I am using a RadGridView to display some data in a hierarchy. I am using MvvM so I am building by grid in XAML and have very little code behind.
I have a very simple hierarchy where I have a list of objects (Agents) and each agent can have a list of sub agents and a list of clients. These lists are two separate properties of my agent object, i.e. Agent.Agents and Agent.ClientAccounts. An agent can have a list of clients and a list of sub agents so when the user expands an agent row they will see two child grids at the same level in the hierarchy.
I am using the grid_RowLoaded event to only allow expanding when I have either a list of SubAgents or a list of Clients.
My issue is that when one of the lists of either SubAgents or Clients doesn’t have any records I would like to hide the grid (or not even create it in the first place)
I have tried to set the visibility of the SubAgents and Clients grids by using a converter so the grids are hidden when the lists have a count of 0 but that didn’t work
Any ideas would be much appreciated
Here is the structure of my grid
<telerik:RadGridView x:Name="grid" BorderThickness="0" Background="Transparent" ShowGroupPanel="False" IsReadOnly="True" DataContext="{Binding}" ItemsSource="{Binding Path=AgentList}" RowIndicatorVisibility="Collapsed" GridLinesVisibility="None" telerik:Theming.Theme="{DynamicResource TelerikThemeName}" IsSynchronizedWithCurrentItem="True" ShowColumnHeaders="True" AutoGenerateColumns="False" acb:CommandBehavior.Event="MouseDoubleClick" acb:CommandBehavior.Command="{Binding OpenAgentDetailsCommand}" acb:CommandBehavior.CommandParameter="{Binding RelativeSource={RelativeSource Self}, Path=SelectedItem.CustomerId}" RowLoaded="grid_RowLoaded"> <telerik:RadGridView.ChildTableDefinitions> <telerik:GridViewTableDefinition/> </telerik:RadGridView.ChildTableDefinitions> <telerik:RadGridView.Columns> <telerik:GridViewDataColumn DataMemberBinding="{Binding AccountId}" Header="Account Id" Width="Auto" /> <telerik:GridViewDataColumn DataMemberBinding="{Binding CustomerId}" Header="CustomerId" Width="Auto" /> <telerik:GridViewDataColumn DataMemberBinding="{Binding FirstName}" Header="FirstName" Width="Auto"/> <telerik:GridViewDataColumn DataMemberBinding="{Binding LastName}" Header="LastName" Width="Auto"/> <telerik:GridViewDataColumn DataMemberBinding="{Binding Volume}" Header="Volume" Width="Auto" DataFormatString="{}{0:N0}"/> </telerik:RadGridView.Columns> <telerik:RadGridView.HierarchyChildTemplate> <DataTemplate> <StackPanel> <!--sub agents--> <telerik:RadGridView ItemsSource="{Binding Path=Agents}" AutoGenerateColumns="False" ShowGroupPanel="False" Visibility="{Binding Path=Agents.Count, Converter={StaticResource countToVisibleConverter}}"> <telerik:RadGridView.Columns> <telerik:GridViewDataColumn DataMemberBinding="{Binding AccountId}" Header="Account Id" Width="Auto" /> <telerik:GridViewDataColumn DataMemberBinding="{Binding CustomerId}" Header="CustomerId" Width="Auto" /> <telerik:GridViewDataColumn DataMemberBinding="{Binding FirstName}" Header="FirstName" Width="Auto"/> <telerik:GridViewDataColumn DataMemberBinding="{Binding LastName}" Header="LastName" Width="Auto"/> <telerik:GridViewDataColumn DataMemberBinding="{Binding Volume}" Header="Volume" Width="Auto" DataFormatString="{}{0:N0}"/> </telerik:RadGridView.Columns> <telerik:RadGridView.ChildTableDefinitions> <telerik:GridViewTableDefinition /> </telerik:RadGridView.ChildTableDefinitions> <!--sub agents : clients--> <telerik:RadGridView.HierarchyChildTemplate> <DataTemplate> <telerik:RadGridView ItemsSource="{Binding Path=ClientAccounts}" AutoGenerateColumns="False" ShowGroupPanel="False" Visibility="{Binding Path=ClientAccounts.Count, Converter={StaticResource countToVisibleConverter}}"> <telerik:RadGridView.Columns> <telerik:GridViewDataColumn DataMemberBinding="{Binding AccountId}" Header="Account Id" Width="Auto" /> <telerik:GridViewDataColumn DataMemberBinding="{Binding FirstName}" Header="FirstName" Width="Auto"/> <telerik:GridViewDataColumn DataMemberBinding="{Binding LastName}" Header="LastName" Width="Auto"/> <telerik:GridViewDataColumn DataMemberBinding="{Binding Volume}" Header="Volume" Width="Auto" DataFormatString="{}{0:N0}"/> </telerik:RadGridView.Columns> </telerik:RadGridView> </DataTemplate> </telerik:RadGridView.HierarchyChildTemplate> </telerik:RadGridView> <!--clients--> <telerik:RadGridView ItemsSource="{Binding Path=ClientAccounts}" AutoGenerateColumns="False" ShowGroupPanel="False" Visibility="{Binding Path=ClientAccounts.Count, Converter={StaticResource countToVisibleConverter}}"> <telerik:RadGridView.Columns> <telerik:GridViewDataColumn DataMemberBinding="{Binding AccountId}" Header="Account Id" Width="Auto" /> <telerik:GridViewDataColumn DataMemberBinding="{Binding FirstName}" Header="FirstName" Width="Auto"/> <telerik:GridViewDataColumn DataMemberBinding="{Binding LastName}" Header="LastName" Width="Auto"/> <telerik:GridViewDataColumn DataMemberBinding="{Binding Volume}" Header="Volume" Width="Auto" DataFormatString="{}{0:N0}"/> </telerik:RadGridView.Columns> </telerik:RadGridView> </StackPanel> </DataTemplate> </telerik:RadGridView.HierarchyChildTemplate> </telerik:RadGridView>
<Window x:Class="GridviewDataTemplateFocusExample.MainWindow" xmlns:telerik="http://schemas.telerik.com/2008/xaml/presentation" xmlns:GridviewDataTemplateFocusExample="clr-namespace:GridviewDataTemplateFocusExample" Title="MainWindow" Height="350" Width="525"> <Window.Resources> <DataTemplate x:Key="DetailView" > <GridviewDataTemplateFocusExample:DetailView /> </DataTemplate> </Window.Resources> <Grid> <telerik:RadGridView HorizontalAlignment="Stretch" Name="radGridView1" VerticalAlignment="Stretch" ItemsSource="{Binding MyData}" AutoGenerateColumns="False" CanUserInsertRows="True" RowIndicatorVisibility="Collapsed" CanUserDeleteRows="False" ShowInsertRow="True" ShowGroupPanel="False" IsSynchronizedWithCurrentItem="True" AddingNewDataItem="radGridView1_AddingNewDataItem" LoadingRowDetails="radGridView1_LoadingRowDetails" RowDetailsVisibilityMode="Collapsed" RowDetailsTemplate="{StaticResource DetailView}" > <telerik:RadGridView.Columns> <telerik:GridViewToggleRowDetailsColumn/> <telerik:GridViewDataColumn Header="Title" Width="250" DataMemberBinding="{Binding Name}" UniqueName="TitleColumn"/> </telerik:RadGridView.Columns> </telerik:RadGridView> </Grid></Window>using System;using System.Windows;using System.Windows.Input;using Telerik.Windows.Controls.GridView;namespace GridviewDataTemplateFocusExample{ /// <summary> /// Interaction logic for MainWindow.xaml /// </summary> public partial class MainWindow : Window { public MainWindow() { this.DataContext = new MainWindowVM(); InitializeComponent(); } private void radGridView1_AddingNewDataItem(object sender, Telerik.Windows.Controls.GridView.GridViewAddingNewEventArgs e) { (this.DataContext as MainWindowVM).AddNewDataObject(); radGridView1.CommitEdit(); var gridView = e.OwnerGridViewItemsControl; gridView.ScrollIntoViewAsync(gridView.Items[gridView.Items.Count - 1], //the row gridView.Columns[1], //the column new Action<FrameworkElement>((f) => { var row = f as GridViewRow; if (row != null) { row.IsSelected = true; row.DetailsVisibility = Visibility.Visible; } })); e.Cancel = true; } private void radGridView1_LoadingRowDetails(object sender, Telerik.Windows.Controls.GridView.GridViewRowDetailsEventArgs e) { Keyboard.Focus((e.DetailsElement as DetailView).tbxTitle); } }}using System.Collections.ObjectModel;namespace GridviewDataTemplateFocusExample{ public class MainWindowVM { public ObservableCollection<DataObject> MyData { get; set; } public MainWindowVM() { MyData = new ObservableCollection<DataObject>(); MyData.Add(new DataObject("Test 1")); MyData.Add(new DataObject("Test 2")); MyData.Add(new DataObject("Test 3")); MyData.Add(new DataObject("Test 4")); MyData.Add(new DataObject("Test 5")); } public void AddNewDataObject() { MyData.Add(new DataObject("Test ??????")); } } public class DataObject { public DataObject(string name) { Name = name; } public string Name { get; set; } }}<UserControl x:Class="GridviewDataTemplateFocusExample.DetailView" xmlns:telerik="http://schemas.telerik.com/2008/xaml/presentation" mc:Ignorable="d" d:DesignHeight="300" d:DesignWidth="300"> <Grid> <Grid FocusManager.FocusedElement="{Binding ElementName=tbxTitle}" FocusManager.IsFocusScope="True"> <Border BorderThickness="2" Margin="3" BorderBrush="Black" CornerRadius="12" Padding="5" Background="Transparent" HorizontalAlignment="Stretch" > <telerik:RadTabControl Margin="2" BackgroundVisibility="Hidden" HorizontalAlignment="Stretch" > <telerik:RadTabItem Header="Details" > <Grid Width="Auto" HorizontalAlignment="Stretch" Background="Transparent" Margin="5" > <Grid.RowDefinitions> <RowDefinition Height="Auto" /> </Grid.RowDefinitions> <Grid.ColumnDefinitions> <ColumnDefinition Width="Auto" /> <ColumnDefinition Width="*" /> </Grid.ColumnDefinitions> <TextBlock Text="Name: " Margin="0,5,0,5" FontWeight="Bold" Grid.Row="0" Grid.Column="0" VerticalAlignment="Center" HorizontalAlignment="Left" Focusable="False"/> <TextBox Name="tbxTitle" Text="{Binding Name}" Margin="0,5,0,5" Grid.Row="0" Grid.Column="1" VerticalAlignment="Center" HorizontalAlignment="Stretch" Focusable="true" /> </Grid> </telerik:RadTabItem> <telerik:RadTabItem Header="Page 2" > </telerik:RadTabItem> <telerik:RadTabItem Header="Page 3" > </telerik:RadTabItem> </telerik:RadTabControl> </Border> </Grid> </Grid></UserControl>