Select a Cell Region by Dragging the Mouse from One Cell to Another
Environment
Product Version | 2022.3.912 |
Product | RadVirtualGrid for WPF |
Description
How to select a RadVirtualGrid cell region by dragging the mouse from one cell to another.
Solution
To achieve this requirement, first set up handlers for the MouseLeftButtonDown
and MouseLeftButtonUp
events of RadVirtualGrid:
Adding the event handlers
this.VirtualGrid.AddHandler(RadVirtualGrid.MouseLeftButtonDownEvent, new MouseButtonEventHandler(VirtualGrid_MouseLeftButtonDown), true);
this.VirtualGrid.AddHandler(RadVirtualGrid.MouseLeftButtonUpEvent, new MouseButtonEventHandler(VirtualGrid_MouseLeftButtonUp), true);
AddHandler
method so that we can set the handledEventsToo
parameter. This is required, because the RadVirtualGrid internally handles these events and our custom handlers will not be invoked otherwise.
Then, in the MouseLeftButtonDown
event handler, with the help of the GetRowIndexAtMousePosition and GetColumnIndexAtMousePosition methods we get ahold of the row and column indexes of the initial cell which will serve as an anchor for the selected region.
Handling the MouseLeftButtonDown event
private int startRowIndex = -1;
private int startColumnIndex = -1;
private void VirtualGrid_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
var virtualGrid = sender as RadVirtualGrid;
var border = e.OriginalSource as CanvasInputBorder;
this.startRowIndex = virtualGrid.GetRowIndexAtMousePosition(border);
this.startColumnIndex = virtualGrid.GetColumnIndexAtMousePosition(border);
}
MouseLeftButtonUp
event handler. Then, based on the start and end cells, we can create a new CellRegion
and use the SelectCellRegion method to select it.
Handling the MouseLeftButtonDown event
private void VirtualGrid_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
{
var virtualGrid = sender as RadVirtualGrid;
var border = e.OriginalSource as CanvasInputBorder;
var endColumnIndex = virtualGrid.GetColumnIndexAtMousePosition(border);
var endRowIndex = virtualGrid.GetRowIndexAtMousePosition(border);
var left = Math.Min(startColumnIndex, endColumnIndex);
var top = Math.Min(startRowIndex, endRowIndex);
var width = Math.Abs(startColumnIndex - endColumnIndex) + 1;
var height = Math.Abs(startRowIndex - endRowIndex) + 1;
virtualGrid.SelectCellRegion(new CellRegion(left, top, width, height));
}
You can also perform the logic of the
MouseLeftButtonUp
event onMouseMove
but you will need to add some additional logic to stop the selection process when the mouse button is released.