Acerca de:

Este blog contiene los códigos, ejemplos y bases de datos que he usado cuando aprendía acerca de algún tema específico. En lugar de borrarlos (una vez dominado ya el tema), he decidido publicarlos :)

martes, 11 de junio de 2013

Cómo mantener la misma fila seleccionada de un DataGridView sin importar si cambia su índice (Index)

Tengo un DatagridView llamado dGridView como el siguiente:



El DataGridView tiene su propiedad SelectMode igual a FullRowSelect.
Las filas no contienen datos únicos y, en otra parte del programa, cambio su propiedad Multiselect de true a false y viceversa.
Al cambiar el valor de la propiedad Multiselect, la fila o filas seleccionadas se deseleccionan (se pierde la selección), además el usuario puede hacer click en las cabeceras de las columnas lo cual cambia el orden y los índices de las filas (hacer click en las cabeceras de las columnas no deselecciona ninguna fila).
Lo que deseo hacer es que la última fila seleccionada por el usuario siempre se mantenga seleccionada a pesar de que se haga click en las cabeceras de las columnas, la filas ya no estén en el mismo orden, y se cambie el valor de MultiSelect (u otra propiedad que haga que se pierda la selección).

Para lograr esto hay que considerar tres eventos del DataGridView: CellMouseDown, CellMouseUp y SelectionChanged.
El código es:

        int selectedIndex;

        private void dGridView_CellMouseDown(object sender, DataGridViewCellMouseEventArgs e)
        {
            if (d
GridView.Rows.Count > 0 && dGridView.SelectedRows.Count >= 1)
                selectedIndex = d
GridView.SelectedRows[0].Index;
        }

        private void d
GridView_CellMouseUp(object sender, DataGridViewCellMouseEventArgs e)
        {
            if (d
GridView.Rows.Count > 0 && dGridView.SelectedRows.Count >= 1)
                selectedIndex = d
GridView.SelectedRows[0].Index;
        }


        private void dGridView_SelectionChanged(object sender, EventArgs e)
        {
            if (d
GridView.Rows.Count > 0 && dGridView.SelectedRows.Count >= 1)
                selectedIndex = d
GridView.SelectedRows[0].Index;
        }

Para restablecer la fila seleccionada se debe poner el siguiente código en donde se cambia la propiedad Multiselect de dGridView, ó después de cualquier código que haga que se pierda la selección:
        dGridView.Rows[selectedIndex].Selected = true;