Puede solucionar este problema almacenando el valor de la fila (o filas) seleccionada actualmente antes de ordenar y luego volver a seleccionar la fila después.
Debe usar el evento CellMouseDown - es necesario utilizar este evento ya que es el único que se dispara antes de que ocurra la clasificación. Eventos alternativos como ColumnHeaderMouseClick son demasiado tarde.
En el controlador de eventos CellMouseDown, compruebe que el índice de la fila sea -1 para asegurarse de que se seleccionaron los encabezados.
void dataGridView1_CellMouseDown(object sender, DataGridViewCellMouseEventArgs e)
{
if (e.RowIndex == -1)
{
selected = dataGridView1.SelectedRows[0].Cells[0].Value.ToString();
}
}
que tienen un campo de nivel de clase selected
que utilizo para almacenar el identificador único de la columna que se ha seleccionado. Si no tiene una identificación única, puede agregar una columna para este propósito y ocultarla.
Luego, en el Sorted
eventhandler del DataGridView puede utilizar el método .find() de origen de enlace de la red:
void dataGridView1_Sorted(object sender, EventArgs e)
{
if (!string.IsNullOrEmpty(selected))
{
int itemFound = _bindingSource.Find("name", selected);
_bindingSource.Position = itemFound;
}
}
Si bien la investigación de este encontré la siguiente post en los foros de MSDN donde los usos de respuesta el evento DataBindingComplete: no estoy al 100% de por qué lo consideraron necesario ya que mi enfoque ha funcionado para todas mis pruebas, pero podría encontrarlo como una referencia útil.
Usted está correcto. Las filas seleccionadas son 'recordadas' por el índice de fila y no por los valores de fila. –
ASP .NET 4 ha introducido la propiedad EnablePersistedSelection para GridView. Pero no parece que esté disponible para WinForms. http://www.asp.net/learn/whitepapers/aspnet4#0.2__Toc253429262 –