The FilterColumn method does not position the filtering popup on the passed column index when it is opened.
A workaround to this behavior would be to manually position the filtering popup using the following approach:
this.virtualGrid.FilterColumn(2);
var virtualizingCanvasBase = this.virtualGrid.ChildrenOfType<VirtualizingCanvasBase>().FirstOrDefault();
var columnsRenderInfoInfo = virtualizingCanvasBase.GetType().GetProperty("ColumnsRenderInfo", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic);
var columnsRenderInfo = columnsRenderInfoInfo.GetValue(virtualizingCanvasBase);
var offsetMethodInfo = columnsRenderInfo.GetType().GetMethod("OffsetFromIndex");
var filteringPopupPropertyInfo = this.virtualGrid.GetType().GetProperty("FilteringPopup", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic);
Popup filteringPopup = (Popup)filteringPopupPropertyInfo.GetValue(this.virtualGrid);
filteringPopup.HorizontalOffset = (double)offsetMethodInfo.Invoke(columnsRenderInfo, new object[1] { 2 });
The FilterColumn method should be called, in order for the filtering Popup to be created.
HeaderSizeNeeded is fired twice with the same index and affects the header row width.
Available in LIB version 2017.3.1113, it will be also available in the R1 2018 Release.
The CellDecorationsNeeded event isn't raised for pinned columns/rows
I would expect this event would be raised regardless of pinned state. Otherwise the UI would not be consistent when columns/rows are pinned.
// SomeVirtualGrid.xaml.cs
public SomeVirtualGrid()
{
InitializeComponent();
vg.PinColumnLeft(0);
vg.PinColumnLeft(1);
vg.PinColumnLeft(2);
}
Cell contents are missing when the header size is assigned through the e.Size property of the HeaderSizeEventArgs in the HeaderSizeNeeded event handler of RadVirtualGrid.
This happens only for some of the cells and when the viewport has many rows and columns.
To work this around, instead of setting the header size in the HeaderSizeNeeded event handler, use the ColumnWidth property of RadVirtualGrid.
<telerik:RadVirtualGrid ColumnWidth="50" />
An ArgumentOutOfRangeException is thrown if you try to copy a pinned cell using Ctrl+C while there is a selected cell. This is reproduced by selecting an unpinned cell, then click a pinned cell to set is a current, and then press Ctrl+C to copy the pinned cell.
To work this around, override the RadVirtualGridCommands.Copy command behavior and implement the copy action from scratch.
static MainWindow()
{
CommandManager.RegisterClassCommandBinding(typeof(RadVirtualGrid), new CommandBinding(RadVirtualGridCommands.Copy, OnVirtualGridCopyExecuted, OnVirtualGridCopyCanExecute));
}
private static void OnVirtualGridCopyCanExecute(object sender, CanExecuteRoutedEventArgs e)
{
e.Handled = true;
e.CanExecute = true;
}
private static void OnVirtualGridCopyExecuted(object sender, ExecutedRoutedEventArgs e)
{
var virtualGrid = (RadVirtualGrid)sender;
var strBuilder = new StringBuilder();
// DataView is a custom property in MyDataProvider (deriving from DataProvider) and it just returns this.Source (which is a protected property).
var items = ((MyDataProvider)virtualGrid.DataProvider).DataView;
int pinnedColumnsCount = (int)virtualGrid.Tag;
foreach (VirtualGridCellInfo cell in virtualGrid.SelectedCells)
{
int columnIndex = cell.ColumnIndex + pinnedColumnsCount;
ItemPropertyInfo propertyInfo = virtualGrid.DataProvider.ItemProperties[columnIndex];
var descriptor = (PropertyDescriptor)propertyInfo.Descriptor;
object rowData = items.GetItemAt(cell.RowIndex);
object cellValue = descriptor.GetValue(rowData);
strBuilder.Append(cellValue + " ");
}
Clipboard.SetText(strBuilder.ToString());
}
I have an application that uses docking. Each pane contain a virtual grid.
If the user toggles between panes, any future font size changes are not reflected by the virtual grid
I have attached a demo project that shows the problem.
After launching the application:
1) click the Increase/Decrease Font buttons to see the font size change.
2) click tab2 then go back to tab1
3) click the Increase/Decrease Font buttons to see the Virtual Grids font size no longer updates.
(I have a third virtual grid outside of the Docking that shows that the font does change if not used inside of a docking control)
I believe this is caused a bug in Telerik.Windows.Controls.VirtualGrid.Selection.CellSelectionHandler.ToggleSingleSelect() method:
internal void ToggleSingleSelect()
{
if (this.owner.SelectionUnit != VirtualGridSelectionUnit.Cell && this.SelectedCells.Count <= 1)
return;
this.BeginSelection();
VirtualGridCellInfo selectedCell = this.SelectedCells[0];
this.DeselectAll();
this.Select(selectedCell);
this.EndSelection();
}
If SelectionUnit = Cell but no cells are selected, the code still attempts to retrieve the first selected cell what causes an exception.
Stack trace:
System.ArgumentOutOfRangeException: Specified argument was out of the range of valid values.