È possibile aggirare questo comportamento memorizzando il valore della riga (o delle righe) attualmente selezionata prima di ordinare e quindi riselezionare la riga in seguito.
È necessario utilizzare l'evento CellMouseDown: è necessario utilizzare questo evento poiché è l'unico che viene attivato prima che avvenga l'ordinamento. Eventi alternativi come ColumnHeaderMouseClick sono fin troppo tardi.
Nel gestore di eventi CellMouseDown controllare che l'indice di riga sia -1 per garantire che le intestazioni siano state selezionate.
void dataGridView1_CellMouseDown(object sender, DataGridViewCellMouseEventArgs e)
{
if (e.RowIndex == -1)
{
selected = dataGridView1.SelectedRows[0].Cells[0].Value.ToString();
}
}
Ho un campo livello di classe selected
che uso per memorizzare l'identificatore univoco della colonna selezionata. Se non si dispone di un ID univoco, è possibile aggiungere una colonna per questo scopo e nasconderlo.
Poi nel Sorted
EventHandler della DataGridView è possibile utilizzare il metodo .find() della fonte vincolante della griglia:
void dataGridView1_Sorted(object sender, EventArgs e)
{
if (!string.IsNullOrEmpty(selected))
{
int itemFound = _bindingSource.Find("name", selected);
_bindingSource.Position = itemFound;
}
}
Mentre indaga questo ho trovato la seguente post sui forum MSDN Qualora le applicazioni di risposta l'evento DataBindingComplete: non sono al 100% il motivo per cui l'hanno trovato necessario in quanto il mio approccio ha funzionato per tutti i miei test, ma potresti trovarlo un utile riferimento.
fonte
2011-04-09 23:21:15
Sei corretto. Le righe selezionate vengono "ricordate" dall'indice di riga e non dai valori di riga. –
ASP .NET 4 ha introdotto la proprietà EnablePersistedSelection per GridView. Ma non sembra che sia disponibile per WinForms. http://www.asp.net/learn/whitepapers/aspnet4#0.2__Toc253429262 –