Using Shift-Click to Select Multiple DataGrid Rows #1003

Closed
opened 2026-01-29 17:47:37 +00:00 by claunia · 2 comments
Owner

Originally created by @masterworgen on GitHub (Oct 6, 2023).

Hello, you can add the ability to select cells via ctrl or shift, as done here https://demos.devexpress.com/blazor/Grid/Selection/Multiple, but only for cells.
I need to solve a problem related to selecting many cells at once, now the user has to click on each cell separately.

It problem have in forum https://forum.radzen.com/t/using-shift-click-to-select-multiple-datagrid-rows/10650

Originally created by @masterworgen on GitHub (Oct 6, 2023). Hello, you can add the ability to select cells via ctrl or shift, as done here https://demos.devexpress.com/blazor/Grid/Selection/Multiple, but only for cells. I need to solve a problem related to selecting many cells at once, now the user has to click on each cell separately. It problem have in forum https://forum.radzen.com/t/using-shift-click-to-select-multiple-datagrid-rows/10650
Author
Owner

@enchev commented on GitHub (Oct 6, 2023):

We do not plan to add cells selection as a built-in feature. You can extend our demo in the way you need.

@enchev commented on GitHub (Oct 6, 2023): We do not plan to add cells selection as a built-in feature. You can extend our demo in the way you need.
Author
Owner

@masterworgen commented on GitHub (Oct 6, 2023):

An example implementation might look like this

private T? _startRow;
private T? _endRow;
private RadzenDataGridColumn<T>? _startColumn;
private RadzenDataGridColumn<T>? _endColumn;

void Select(DataGridCellMouseEventArgs<T> args)
{
	_startRow = args.Data;
	_startColumn = args.Column;

	if (args.ShiftKey)
	{
		SelectRange(args);
	}
	else
	{
		if (!args.CtrlKey)
			_selectedCellData.Clear();

		var cellData = _selectedCellData.FirstOrDefault(i => i.Item1 == args.Data && i.Item2 == args.Column);
		if (cellData != null)
			_selectedCellData.Remove(cellData);
		else
			_selectedCellData.Add(new Tuple<T, RadzenDataGridColumn<T>>(args.Data, args.Column));

		_endRow = args.Data;
		_endColumn = args.Column;
		_startRow = null;
		_startColumn = null;
	}
}

void SelectRange(DataGridCellMouseEventArgs<T> args)
{
	if (_startRow == null || _endRow == null || _startColumn == null || _endColumn == null)
		return;

	var dataList = Data.ToList();
	var startIndex = dataList.IndexOf(_startRow);
	var endIndex = dataList.IndexOf(_endRow);

	if (startIndex == -1 || endIndex == -1)
		return;

	if (startIndex > endIndex)
		(startIndex, endIndex) = (endIndex, startIndex);

	var columnsList = _dataGrid.ColumnsCollection.ToList();
	var startColumnIndex = columnsList.IndexOf(_startColumn);
	var endColumnIndex = columnsList.IndexOf(_endColumn);

	if (startColumnIndex == -1 || endColumnIndex == -1)
		return;

	if (startColumnIndex > endColumnIndex)
		(startColumnIndex, endColumnIndex) = (endColumnIndex, startColumnIndex);

	for (var i = startIndex; i <= endIndex; i++)
		for (var j = startColumnIndex; j <= endColumnIndex; j++)
		{
			var rowData = schedulesList[i];
			var columnData = columnsList[j];
			var cellData = new Tuple<T, RadzenDataGridColumn<T>>(rowData, columnData);
			if (!_selectedCellData.Contains(cellData))
				_selectedCellData.Add(cellData);
		}

	_endRow = _startRow;
	_startRow = null;
	_endColumn = _startColumn;
	_startColumn = null;
}
@masterworgen commented on GitHub (Oct 6, 2023): An example implementation might look like this ``` private T? _startRow; private T? _endRow; private RadzenDataGridColumn<T>? _startColumn; private RadzenDataGridColumn<T>? _endColumn; void Select(DataGridCellMouseEventArgs<T> args) { _startRow = args.Data; _startColumn = args.Column; if (args.ShiftKey) { SelectRange(args); } else { if (!args.CtrlKey) _selectedCellData.Clear(); var cellData = _selectedCellData.FirstOrDefault(i => i.Item1 == args.Data && i.Item2 == args.Column); if (cellData != null) _selectedCellData.Remove(cellData); else _selectedCellData.Add(new Tuple<T, RadzenDataGridColumn<T>>(args.Data, args.Column)); _endRow = args.Data; _endColumn = args.Column; _startRow = null; _startColumn = null; } } void SelectRange(DataGridCellMouseEventArgs<T> args) { if (_startRow == null || _endRow == null || _startColumn == null || _endColumn == null) return; var dataList = Data.ToList(); var startIndex = dataList.IndexOf(_startRow); var endIndex = dataList.IndexOf(_endRow); if (startIndex == -1 || endIndex == -1) return; if (startIndex > endIndex) (startIndex, endIndex) = (endIndex, startIndex); var columnsList = _dataGrid.ColumnsCollection.ToList(); var startColumnIndex = columnsList.IndexOf(_startColumn); var endColumnIndex = columnsList.IndexOf(_endColumn); if (startColumnIndex == -1 || endColumnIndex == -1) return; if (startColumnIndex > endColumnIndex) (startColumnIndex, endColumnIndex) = (endColumnIndex, startColumnIndex); for (var i = startIndex; i <= endIndex; i++) for (var j = startColumnIndex; j <= endColumnIndex; j++) { var rowData = schedulesList[i]; var columnData = columnsList[j]; var cellData = new Tuple<T, RadzenDataGridColumn<T>>(rowData, columnData); if (!_selectedCellData.Contains(cellData)) _selectedCellData.Add(cellData); } _endRow = _startRow; _startRow = null; _endColumn = _startColumn; _startColumn = null; } ```
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: starred/radzen-blazor#1003