.net - una - Selección de mouse de DataGridView
resaltar fila datagridview vb net (3)
Estoy usando un control DataGridView en una aplicación de Windows Forms. Cuando un usuario mantiene presionado el control para seleccionar varios elementos, funciona bien. Ahora cuando el usuario suelta el control y hace clic (y mantiene presionado el botón izquierdo del mouse) para iniciar una operación de arrastre, la selección cambia. ¿Cómo puedo evitar que la selección se borre cuando el usuario mantiene presionado el botón izquierdo del mouse?
Buena pregunta. Aunque puede que esta no sea la respuesta más simple que esperabas, debería brindarte una buena idea de cómo resolver tu problema: http://www.codeproject.com/KB/cpp/DataGridView_Drag- n-Drop.aspx
Encontré esta respuesta en un foro de Microsoft
"Para arrastrar y soltar varias filas, establezca DataGridView.MultiSelect en true y en el evento DataGridView.DragDrop, elimine e inserte todas las filas en la colección DataGridView.SelectedRows".
Esta entrada de blog también muestra cómo implementar arrastrar y soltar en un DataGridView
Pero me parece que tendrá que heredar de DataGridView y anular estos eventos del mouse ya que de lo contrario el cambio de selección siempre se llamará.
- vacío virtual protegido OnCellMouseDown (DataGridViewCellMouseEventArgs e);
- vacío virtual protegido OnCellMouseUp (DataGridViewCellMouseEventArgs e);
Luego puede interceptar el evento SelectionChanged en OnMouseDown y hacer la selección en OnMouseUp. Deberá mantener el punto de ubicación hacia abajo para que pueda seleccionar el elemento correcto si no se trata de una acción de arrastrar.
También tendrá que mantener una lista de las filas seleccionadas en el evento del mouse hacia abajo y si se convierte en un evento de arrastrar y soltar arrastrará todas estas filas seleccionadas y las seleccionará con el mouse hacia arriba.
Y no se olvide de borrar la lista / copia de las filas seleccionadas en el evento del mouse arriba.
Encontré una técnica que funciona. Al seleccionar la última celda (ya sea con Ctrl o Mayús), comienza a arrastrar antes de soltar el botón del mouse, la selección no cambiará. Luego, en la caída, puede usar el siguiente método para obtener una lista de las celdas seleccionadas:
private SC.ArrayList selectedCells()
{
SC.ArrayList cellsList = new SC.ArrayList();
Int32 selectedCellCount = dataViewImages.GetCellCount(DataGridViewElementStates.Selected);
if (selectedCellCount > 0)
{
for (int i = 0;i < selectedCellCount; i++) {
int cell = dataViewImages.SelectedCells[i].RowIndex*ShowImages.NumColumnsForWidth() + dataViewImages.SelectedCells[i].ColumnIndex;
cellsList.Add(cell);
}
cellsList.Sort();
return cellsList;
}
else
return null;
}