in my project I have a RadGridView with all features enable: Sorting, Grouping, etc...
In my grid, I have a GridViewSelectColumn to let my users to select all the rows they want. With this kind of column, I think, the logical pattern was respected by having a checkbox in the header to select/unselect all the rows in the grid. I'm trying to get an answer why this kind of column is missing when you grouping data. What should I do if I group a set of data by date and for a specific date I want to select all the subset items (more than 500 items)???
I'm trying to implement something but I don't know how to acheive it. Actually, I have a problem with the interaction of the groupcheckbox and the rest of the grid. I need to have my groupcheckbox to react the same has the header one, I mean, if I click a on of my groupcheckbox, I need to select all teh group subset and of course, if that mean that all data in the grid is selected after my click, of course the header checkbox should become check. Of course, my groupcheckbox should react to the fact that not all subset data was selected or not by becoming check or not. If the master header checkbox in the header should check all my groupcheckbox and so on...
Please help me, I know I'm not for from the solution ;)
Window1.xaml
------------------
<Window x:Class="RadControlsWpfApp6.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:telerik="http://schemas.telerik.com/2008/xaml/presentation"
xmlns:alain="clr-namespace:RadControlsWpfApp6"
Title="Window1" Height="300" Width="300" WindowState="Maximized" Name="Me">
<Grid>
<telerik:RadGridView x:Name="grid" AutoGenerateColumns="False" IsReadOnly="True" RowIndicatorVisibility="Collapsed" SelectionMode="Multiple" PreviewMouseLeftButtonUp="grid_PreviewMouseLeftButtonUp" SelectionChanged="grid_SelectionChanged">
<telerik:RadGridView.GroupHeaderTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal" >
<alain:GridViewGroupCheckBox x:Name="GroupCheckBox"/>
<TextBlock Margin="5 0" Text="{Binding Group.Key}" />
</StackPanel>
</DataTemplate>
</telerik:RadGridView.GroupHeaderTemplate>
<telerik:RadGridView.Columns>
<telerik:GridViewSelectColumn />
<telerik:GridViewDataColumn DataMemberBinding="{Binding Path=LastName}" Header="LastName" />
<telerik:GridViewDataColumn DataMemberBinding="{Binding Path=FirstName}" Header="FirstName" />
</telerik:RadGridView.Columns>
</telerik:RadGridView>
</Grid>
</Window>
Window1.xaml.cs
---------------------
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using Telerik.Windows.Controls;
using Telerik.Windows.Controls.GridView;
using Telerik.Windows.Data;
namespace RadControlsWpfApp6
{
/// <summary>
/// Interaction logic for Window1.xaml
/// </summary>
public partial class Window1 : Window
{
public Window1()
{
InitializeComponent();
AllPersons = new List<Person>();
AllPersons.Add(new Person() { LastName = "Test2", FirstName = "Test1" });
AllPersons.Add(new Person() { LastName = "Test1", FirstName = "Test2" });
AllPersons.Add(new Person() { LastName = "Test2", FirstName = "Test1" });
grid.ItemsSource = AllPersons;
}
public List<Person> AllPersons { get; set; }
private void grid_PreviewMouseLeftButtonUp(object sender, MouseButtonEventArgs e)
{
var senderElement = (FrameworkElement)e.OriginalSource;
var clickedCell = senderElement.ParentOfType<GridViewHeaderCell>();
if (clickedCell != null)
{
CheckBox chkHeader = clickedCell.Column.Header as CheckBox;
if (chkHeader != null)
{
IEnumerable<GridViewGroupRow> grpRows = grid.ChildrenOfType<GridViewGroupRow>();
GridViewGroupCheckBox.CheckUncheckItems(true, !(bool)chkHeader.IsChecked, grpRows);
}
}
}
private void grid_SelectionChanged(object sender, SelectionChangeEventArgs e)
{
GridViewItemContainerGenerator container = this.grid.ItemContainerGenerator;
foreach (var oneItem in e.AddedItems)
{
object obj = container.ContainerFromItem(oneItem);
}
foreach (var oneItem in e.RemovedItems)
{
}
}
}
public class Person
{
public string LastName { get; set; }
public string FirstName { get; set; }
}
}
GridViewGroupCheckBox.xaml
--------------------------------------
<UserControl x:Class="RadControlsWpfApp6.GridViewGroupCheckBox"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Height="Auto" Width="Auto">
<Grid>
<CheckBox x:Name="cbGroup" Click="cbGroup_Click" />
</Grid>
</UserControl>
GridViewGroupCheckBox.xaml.cs
------------------------------------------
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using Telerik.Windows.Controls;
using Telerik.Windows.Controls.GridView;
using Telerik.Windows.Data;
namespace RadControlsWpfApp6
{
/// <summary>
/// Interaction logic for GridViewGroupCheckBox.xaml
/// </summary>
public partial class GridViewGroupCheckBox : UserControl
{
#region Constructors.
/// <summary>
/// Costructor.
/// </summary>
public GridViewGroupCheckBox()
{
InitializeComponent();
mIsChecked = false;
}
#endregion
#region Public properties.
public bool IsChecked
{
get
{
return mIsChecked;
}
set
{
if (mIsChecked != value)
{
mIsChecked = value;
cbGroup.IsChecked = mIsChecked;
}
}
}
public GridViewGroupRow GroupRow
{
get
{
return cbGroup.ParentOfType<GridViewGroupRow>();
}
}
#endregion.
#region Private event handlers.
/// <summary>
/// CheckBox click triggered.
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void cbGroup_Click(object sender, RoutedEventArgs e)
{
mIsChecked = (bool)(sender as CheckBox).IsChecked;
applyChangesOnGrid(sender as CheckBox);
}
#endregion
#region Private medthods.
/// <summary>
/// Apply changes
/// </summary>
/// <param name="pCheckBox"></param>
private void applyChangesOnGrid(CheckBox pCheckBox)
{
CheckUncheckItems(false, (bool)pCheckBox.IsChecked, this.GroupRow);
IEnumerable<GridViewGroupRow> groupsChildRows = this.GroupRow.ChildrenOfType<GridViewGroupRow>();
CheckUncheckItems(false, (bool)pCheckBox.IsChecked, groupsChildRows);
}
/// <summary>
/// Select/unselect all items in a group.
/// </summary>
/// <param name="pCheck">TRUE to select or FALSE to unselect.</param>
/// <param name="pGroupRows">Group of rows.</param>
static public void CheckUncheckItems(bool pIsInAllSelectionMode, bool pCheck, GridViewGroupRow pGroupRows)
{
if (!pIsInAllSelectionMode)
{
var theGrid = pGroupRows.ParentOfType<GridViewDataControl>();
IEnumerable<CheckBox> allCheckBox = pGroupRows.ChildrenOfType<CheckBox>();
if (allCheckBox != null)
{
foreach (CheckBox oneCheckBox in allCheckBox)
{
oneCheckBox.IsChecked = pCheck;
}
}
if (theGrid != null)
{
foreach (var item in pGroupRows.Items)
{
if (pCheck)
{
theGrid.SelectedItems.Add(item);
}
else
{
theGrid.SelectedItems.Remove(item);
}
}
}
}
}
/// <summary>
/// For each sub group rows, select/unselect all items in a group.
/// </summary>
/// <param name="pCheck">TRUE to select or FALSE to unselect.</param>
/// <param name="pGroupsRows">List of groups rows.</param>
static public void CheckUncheckItems(bool pIsInAllSelectionMode, bool pCheck, IEnumerable<GridViewGroupRow> pGroupsRows)
{
foreach (GridViewGroupRow oneGroupRow in pGroupsRows)
{
CheckUncheckItems(pIsInAllSelectionMode, pCheck, oneGroupRow);
}
}
#endregion
#region Private declarations.
private bool mIsChecked;
#endregion
}
}
Thank's