1 Answer, 1 is accepted
0
Irwing
Top achievements
Rank 1
answered on 10 Jan 2012, 12:08 PM
I wrote a code like this based on your trial example, does it works?
using
System;
using
System.Linq;
using
System.Windows;
using
System.Windows.Data;
using
System.ComponentModel;
using
Telerik.Windows.Controls;
using
Telerik.Windows.Controls.GridView;
using
Telerik.Windows;
using
Telerik.Windows.Data;
namespace
esAccessCenterControls
{
public
class
GridViewHeaderMenu
{
private
RadGridView grid =
null
;
static
ColumnGroupDescriptor g =
new
ColumnGroupDescriptor();
public
GridViewHeaderMenu(RadGridView grid)
{
this
.grid = grid;
}
public
static
readonly
DependencyProperty IsEnabledProperty
= DependencyProperty.RegisterAttached(
"IsEnabled"
,
typeof
(
bool
),
typeof
(GridViewHeaderMenu),
new
PropertyMetadata(
new
PropertyChangedCallback(OnIsEnabledPropertyChanged)));
public
static
void
SetIsEnabled(DependencyObject dependencyObject,
bool
enabled)
{
dependencyObject.SetValue(IsEnabledProperty, enabled);
}
public
static
bool
GetIsEnabled(DependencyObject dependencyObject)
{
return
(
bool
) dependencyObject.GetValue(IsEnabledProperty);
}
public
static
void
SetGroupDescriptor(
ref
ColumnGroupDescriptor groupDescriptor)
{
g = groupDescriptor;
}
private
static
void
OnIsEnabledPropertyChanged(DependencyObject dependencyObject, DependencyPropertyChangedEventArgs e)
{
RadGridView grid = dependencyObject
as
RadGridView;
if
(grid !=
null
)
{
if
((
bool
) e.NewValue)
{
// Create new GridViewHeaderMenu and attach RowLoaded event.
GridViewHeaderMenu menu =
new
GridViewHeaderMenu(grid);
menu.Attach();
}
}
}
private
void
Attach()
{
if
(grid !=
null
)
{
// create menu
RadContextMenu contextMenu =
new
RadContextMenu();
// set menu Theme
StyleManager.SetTheme(contextMenu, StyleManager.GetTheme(grid));
contextMenu.Opened += OnMenuOpened;
contextMenu.ItemClick += OnMenuItemClick;
RadContextMenu.SetContextMenu(grid, contextMenu);
}
}
void
OnMenuOpened(
object
sender, RoutedEventArgs e)
{
RadContextMenu menu = (RadContextMenu) sender;
GridViewHeaderCell cell = menu.GetClickedElement<GridViewHeaderCell>();
if
(cell !=
null
)
{
menu.Items.Clear();
RadMenuItem item =
new
RadMenuItem();
item.Header =
"Funções:"
;
menu.Items.Add(item);
RadMenuItem subMenu1 =
new
RadMenuItem();
subMenu1.Header =
"Média total"
;
subMenu1.IsCheckable =
true
;
subMenu1.IsChecked =
false
;
item.Items.Add(subMenu1);
RadMenuItem subMenu2 =
new
RadMenuItem();
subMenu2.Header =
"Soma total"
;
subMenu2.IsCheckable =
true
;
subMenu2.IsChecked =
false
;
item.Items.Add(subMenu2);
RadMenuItem subMenu3 =
new
RadMenuItem();
subMenu3.Header =
"Contar entradas"
;
subMenu3.IsCheckable =
true
;
subMenu3.IsChecked =
false
;
item.Items.Add(subMenu3);
RadMenuItem subMenu4 =
new
RadMenuItem();
subMenu4.Header =
"Maior valor"
;
subMenu4.IsCheckable =
true
;
subMenu4.IsChecked =
false
;
item.Items.Add(subMenu4);
RadMenuItem subMenu5 =
new
RadMenuItem();
subMenu5.Header =
"Menor valor"
;
subMenu5.IsCheckable =
true
;
subMenu5.IsChecked =
false
;
item.Items.Add(subMenu5);
RadMenuItem subMenu6 =
new
RadMenuItem();
subMenu5.Header =
"Limpar funções"
;
subMenu5.IsCheckable =
true
;
subMenu5.IsChecked =
false
;
item.Items.Add(subMenu5);
item =
new
RadMenuItem();
item.Header =
"Exibir Colunas:"
;
menu.Items.Add(item);
// create menu items
foreach
(GridViewColumn column
in
grid.Columns)
{
RadMenuItem subMenu =
new
RadMenuItem();
subMenu.Header = column.Header;
subMenu.IsCheckable =
true
;
subMenu.IsChecked =
true
;
Binding isCheckedBinding =
new
Binding(
"IsVisible"
);
isCheckedBinding.Mode = BindingMode.TwoWay;
isCheckedBinding.Source = column;
// bind IsChecked menu item property to IsVisible column property
subMenu.SetBinding(RadMenuItem.IsCheckedProperty, isCheckedBinding);
item.Items.Add(subMenu);
}
}
else
{
menu.IsOpen =
false
;
}
}
void
OnMenuItemClick(
object
sender, RoutedEventArgs e)
{
RadContextMenu menu = (RadContextMenu) sender;
GridViewHeaderCell cell = menu.GetClickedElement<GridViewHeaderCell>();
RadMenuItem clickedItem = ((RadRoutedEventArgs) e).OriginalSource
as
RadMenuItem;
GridViewColumn column = cell.Column;
if
(clickedItem.Parent
is
RadMenuItem && ((RadMenuItem)clickedItem.Parent).Header ==
"Exibir Colunas:"
)
return
;
string
header = Convert.ToString(clickedItem.Header);
using
(grid.DeferRefresh())
{
ColumnSortDescriptor sd = (from d
in
grid.SortDescriptors.OfType<ColumnSortDescriptor>()
where
object
.Equals(d.Column, column)
select d).FirstOrDefault();
if
(header.Contains(
"Média Total"
))
{
if
(clickedItem.IsChecked)
{
AverageFunction a =
new
AverageFunction();
a.Caption =
"Média de "
+ column.Header +
": "
;
a.SourceField = column.UniqueName;
g.Column.AggregateFunctions.Add(a);
clickedItem.IsChecked =
false
;
}
else
{
foreach
(AggregateFunction func
in
g.Column.AggregateFunctions)
{
if
(func.Caption.Substring(0, 5) == header.Substring(0, 5))
{
g.Column.AggregateFunctions.Remove(func);
clickedItem.IsChecked =
true
;
break
;
}
}
}
}
else
if
(header.Contains(
"Soma total"
))
{
if
(clickedItem.IsChecked)
{
SumFunction s =
new
SumFunction();
s.Caption =
"Soma de "
+ column.Header +
": "
;
s.SourceField = column.UniqueName;
g.Column.AggregateFunctions.Add(s);
clickedItem.IsChecked =
false
;
}
else
{
foreach
(AggregateFunction func
in
g.Column.AggregateFunctions)
{
if
(func.Caption.Substring(0, 4) == header.Substring(0, 4))
{
g.Column.AggregateFunctions.Remove(func);
clickedItem.IsChecked =
true
;
break
;
}
}
}
}
else
if
(header.Contains(
"Contar entradas"
))
{
if
(clickedItem.IsChecked)
{
CountFunction c =
new
CountFunction();
c.Caption =
"Quantidade de "
+ column.Header +
": "
;
g.Column.AggregateFunctions.Add(c);
clickedItem.IsChecked =
false
;
}
else
{
foreach
(AggregateFunction func
in
g.Column.AggregateFunctions)
{
if
(func.Caption.Substring(0, 6) == header.Substring(0, 6))
{
g.Column.AggregateFunctions.Remove(func);
clickedItem.IsChecked =
true
;
break
;
}
}
}
}
else
if
(header.Contains(
"Maior valor"
))
{
if
(clickedItem.IsChecked)
{
MaxFunction m =
new
MaxFunction();
m.Caption =
"Maior valor de "
+ column.Header +
": "
;
g.Column.AggregateFunctions.Add(m);
clickedItem.IsChecked =
false
;
}
else
{
foreach
(AggregateFunction func
in
g.Column.AggregateFunctions)
{
if
(func.Caption.Substring(0, 5) == header.Substring(0, 5))
{
g.Column.AggregateFunctions.Remove(func);
clickedItem.IsChecked =
true
;
break
;
}
}
}
}
else
if
(header.Contains(
"Menor valor"
))
{
if
(clickedItem.IsChecked)
{
MinFunction m =
new
MinFunction();
m.Caption =
"Menor valor de "
+ column.Header +
": "
;
g.Column.AggregateFunctions.Add(m);
clickedItem.IsChecked =
false
;
}
else
{
foreach
(AggregateFunction func
in
g.Column.AggregateFunctions)
{
if
(func.Caption.Substring(0, 5) == header.Substring(0, 5))
{
g.Column.AggregateFunctions.Remove(func);
clickedItem.IsChecked =
true
;
break
;
}
}
}
}
else
if
(header.Contains(
"Limpar funções"
))
{
g.Column.AggregateFunctions.Clear();
}
}
}
}
}