Currently when you highlight a row in the child GridView, the ParentRow becomes highlighted. It would be really nice to have an option so that the ParentRow would be selected when a row in the child GridView is selected. This should work recursively selecting the ParentRow all the way up the hierarchy.
I've written a workaround, but it isn't pretty.
Please add this functionality. :)
My case involves a three tier hierarchical GridView. If I select a row in a third tier GridView, then I want its ParentRow to become selected on the second tier and the second tier's ParentRow to become selected on the first tier. Hopefully that makes sense.
5 Answers, 1 is accepted
Indeed this behavior is not supported out of the box. If you think that this is a good-to-have feature you can log a feature request in our Feedback Portal. This way our development team will review it and consider its implementation.
As a possible workaround is to subscribe to the SelectionChanged child grid and manually select the parent row. To set properties of the child grid you can check the How-to: Set properties to the child gridview help article in our documentation.
Regards,
Dinko
Progress Telerik
Thanks! I didn't realize that there was a different forum for feature requests. I went ahead and added it there.
https://feedback.telerik.com/wpf/1409213-hierarchical-gridview-auto-select-option-so-the-parentrow-is-selected-when-a-child-is-selected
Hi Cale and Dinko,
Can you please suggest how to achieve this behaviour. A possible code snippet would help too.
There are probably a few different ways to do this.
In my case I also wanted the selection of a parent to deselect the children, so you might need to massage the code a bit if you don't want that functionality.
Here is the basic code that I wrote:
namespace MyNamespace { public class RadGridViewParentAndChildSelectionSyncer { private RadGridView _rootGridView; private RadGridView _lastSelectedSecondGridView; private RadGridView _lastSelectedThirdGridView; private bool _selectingParents; public void RootGridViewSelectionChanged(object sender, SelectionChangeEventArgs e) { e.Handled = true; if (e.AddedItems.Any()) { _rootGridView = e.Source as RadGridView; if (!_selectingParents) { _lastSelectedSecondGridView?.UnselectAll(); _lastSelectedSecondGridView = null; _lastSelectedThirdGridView?.UnselectAll(); _lastSelectedThirdGridView = null; SelectParentRow(_rootGridView); } } } public void SecondGridViewSelectionChanged(object sender, SelectionChangeEventArgs e) { e.Handled = true; if (e.AddedItems.Any()) { _lastSelectedSecondGridView = e.Source as RadGridView; if (!_selectingParents) { _rootGridView?.UnselectAll(); _lastSelectedThirdGridView?.UnselectAll(); _lastSelectedThirdGridView = null; SelectParentRow(_lastSelectedSecondGridView); } } } public void ThirdGridViewSelectionChanged(object sender, SelectionChangeEventArgs e) { e.Handled = true; if (e.AddedItems.Any()) { if (!_selectingParents) { _lastSelectedThirdGridView = e.Source as RadGridView; _rootGridView?.UnselectAll(); _lastSelectedSecondGridView?.UnselectAll(); _lastSelectedSecondGridView = null; SelectParentRow(_lastSelectedThirdGridView); } } } internal void OnMouseButtonUp(object sender, System.Windows.Input.MouseButtonEventArgs e) { if (!_selectingParents) { var radGridView = (e.OriginalSource as DependencyObject).GetVisualParent<RadGridView>(); if (radGridView == _rootGridView) { _lastSelectedSecondGridView?.UnselectAll(); _lastSelectedSecondGridView = null; _lastSelectedThirdGridView?.UnselectAll(); _lastSelectedThirdGridView = null; } if (radGridView == _lastSelectedSecondGridView) { _lastSelectedThirdGridView?.UnselectAll(); _lastSelectedThirdGridView = null; } } } private void SelectParentRow(RadGridView radGridView) { _selectingParents = true; var parentRow = radGridView.ParentRow; if (parentRow != null) { var radGridViewParent = parentRow.GetVisualParent<RadGridView>(); radGridViewParent.SelectedItem = parentRow.Item; SelectParentRow(radGridViewParent); } _selectingParents = false; } }}Here is an example of the View.xaml.cs:
using System.Windows;using Telerik.Windows.Controls;using Telerik.Windows.Controls.GridView;namespace MyNamespace { public partial class ViewWithRadGridView { private RadGridViewParentAndChildSelectionSyncer _selectionSyncer = new RadGridViewParentAndChildSelectionSyncer(); public RouteStatusView() { InitializeComponent(); } private void FirstGridSelectionChanged(object sender, SelectionChangeEventArgs e) { _selectionSyncer.RootGridViewSelectionChanged(sender, e); } private void SecondGridSelectionChanged(object sender, SelectionChangeEventArgs e) { _selectionSyncer.SecondGridViewSelectionChanged(sender, e); } private void ThirdGridSelectionChanged(object sender, SelectionChangeEventArgs e) { _selectionSyncer.ThirdGridViewSelectionChanged(sender, e); } private void OnMouseButtonUp(object sender, System.Windows.Input.MouseButtonEventArgs e) { _selectionSyncer.OnMouseButtonUp(sender, e); } }}Here is an example of the View.xaml :
<UserControl x:Class="QRouterView.Views.TablesVersion.RouteStatusView" xmlns:telerik="http://schemas.telerik.com/2008/xaml/presentation" xmlns:System="clr-namespace:System;assembly=mscorlib" <Grid> <Grid.RowDefinitions> <RowDefinition Height="30"/> <RowDefinition Height="*"/> </Grid.RowDefinitions> <telerik:RadGridView Name="FirstGridView" Grid.Row="1" ItemsSource="{Binding ItemsSource}" IsReadOnly="True" AutoGenerateColumns="False" ShowGroupPanel="False" RowIndicatorVisibility="Collapsed" SelectedItem="{Binding SelectedItem}" SelectionChanged="FirstGridSelectionChanged" PreviewMouseUp="OnMouseButtonUp" EnableLostFocusSelectedState="False" > <telerik:RadGridView.Columns> </telerik:RadGridView.Columns> <telerik:RadGridView.ChildTableDefinitions> <telerik:GridViewTableDefinition/> </telerik:RadGridView.ChildTableDefinitions> <telerik:RadGridView.HierarchyChildTemplate> <DataTemplate> <telerik:RadGridView x:Name="SecondGridView" ItemsSource="{Binding ItemsSource}" IsReadOnly="True" AutoGenerateColumns="False" ShowGroupPanel="False" RowIndicatorVisibility="Collapsed" SelectedItem="{Binding SelectedItem}" SelectionChanged="SecondGridSelectionChanged" PreviewMouseUp="OnMouseButtonUp" EnableLostFocusSelectedState="False" ScrollViewer.HorizontalScrollBarVisibility="Disabled" > <telerik:RadGridView.Columns> </telerik:RadGridView.Columns> <telerik:RadGridView.ChildTableDefinitions> <telerik:GridViewTableDefinition/> </telerik:RadGridView.ChildTableDefinitions> <telerik:RadGridView.HierarchyChildTemplate> <DataTemplate> <telerik:RadGridView Name="ThirdGridView" ItemsSource="{Binding ItemsSource}" IsReadOnly="True" AutoGenerateColumns="False" ShowGroupPanel="False" RowIndicatorVisibility="Collapsed" SelectedItem="{Binding SelectedItem}" SelectionChanged="ThirdGridSelectionChanged" EnableLostFocusSelectedState="False" ScrollViewer.HorizontalScrollBarVisibility="Disabled" > <telerik:RadGridView.Columns> </telerik:RadGridView.Columns> </telerik:RadGridView> </DataTemplate> </telerik:RadGridView.HierarchyChildTemplate> </telerik:RadGridView> </DataTemplate> </telerik:RadGridView.HierarchyChildTemplate> </telerik:RadGridView> </Grid></UserControl>Thanks Cale,
As our requirements were not too complex, I used following behaviour to achieve this functionality. I use this behaviour in child grids.
public class ChildGridRowSelectionToParentRowSelectionBehavior : Behavior<RadGridView> { protected override void OnAttached() { base.OnAttached(); this.AssociatedObject.GotFocus += AssociatedObject_GotFocus; } private void AssociatedObject_GotFocus(object sender, RoutedEventArgs e) { if( this.AssociatedObject.ParentRow != null) { var parentRow = this.AssociatedObject.ParentRow; if (parentRow.DataContext != null) { var grid = parentRow.ParentOfType<RadGridView>(); if (grid != null) { grid.SelectedItem = parentRow.DataContext; } } } } protected override void OnDetaching() { base.OnDetaching(); this.AssociatedObject.GotFocus -= AssociatedObject_GotFocus; } }