Condividi tramite


Modalità di ordinamento delle colonne nel controllo DataGridView di Windows Form

DataGridView le colonne hanno tre modalità di ordinamento. La modalità di ordinamento per ogni colonna viene specificata tramite la SortMode proprietà della colonna, che può essere impostata su uno dei valori di enumerazione seguenti DataGridViewColumnSortMode .

Valore DataGridViewColumnSortMode Descrizione
Automatic Impostazione predefinita per le colonne della casella di testo. A meno che non vengano utilizzate intestazioni di colonna per la selezione, facendo clic sull'intestazione di colonna l'ordinamento viene ordinato automaticamente in base a DataGridView questa colonna e viene visualizzato un glifo che indica l'ordinamento.
NotSortable Impostazione predefinita per le colonne non della casella di testo. È possibile ordinare questa colonna a livello di codice; tuttavia, non è destinato all'ordinamento, quindi non è riservato alcuno spazio per il glifo di ordinamento.
Programmatic È possibile ordinare questa colonna a livello di codice e lo spazio è riservato per il glifo di ordinamento.

È possibile modificare la modalità di ordinamento per una colonna che per NotSortable impostazione predefinita contiene valori che possono essere ordinati in modo significativo. Ad esempio, se si dispone di una colonna di database contenente numeri che rappresentano gli stati dell'elemento, è possibile visualizzare questi numeri come icone corrispondenti associando una colonna immagine alla colonna di database. È quindi possibile modificare i valori numerici delle celle in valori di visualizzazione dell'immagine in un gestore per l'evento DataGridView.CellFormatting . In questo caso, l'impostazione della SortMode proprietà su Automatic consentirà agli utenti di ordinare la colonna. L'ordinamento automatico consentirà agli utenti di raggruppare gli elementi con lo stesso stato anche se gli stati corrispondenti ai numeri non hanno una sequenza naturale. Le colonne della casella di controllo sono un altro esempio in cui l'ordinamento automatico è utile per raggruppare gli elementi nello stesso stato.

È possibile ordinare un oggetto DataGridView a livello di codice in base ai valori in qualsiasi colonna o in più colonne, indipendentemente dalle SortMode impostazioni. L'ordinamento a livello di codice è utile quando si vuole fornire un'interfaccia utente personalizzata per l'ordinamento o quando si vuole implementare l'ordinamento personalizzato. Fornire un'interfaccia utente di ordinamento personalizzata è utile, ad esempio, quando si imposta la modalità di selezione per abilitare la DataGridView selezione dell'intestazione di colonna. In questo caso, anche se le intestazioni di colonna non possono essere usate per l'ordinamento, è comunque necessario che le intestazioni visualizzino il glifo di ordinamento appropriato, quindi impostare la SortMode proprietà su Programmatic.

Le colonne impostate sulla modalità di ordinamento a livello di codice non visualizzano automaticamente un glifo di ordinamento. Per queste colonne, è necessario visualizzare il glifo manualmente impostando la DataGridViewColumnHeaderCell.SortGlyphDirection proprietà . Questa operazione è necessaria se si desidera una flessibilità nell'ordinamento personalizzato. Ad esempio, se si ordina in DataGridView base a più colonne, è possibile visualizzare più glifi di ordinamento o nessun glifo di ordinamento.

Sebbene sia possibile ordinare a livello di codice un oggetto DataGridView in base a qualsiasi colonna, alcune colonne, ad esempio le colonne pulsante, potrebbero non contenere valori che possono essere ordinati in modo significativo. Per queste colonne, un'impostazione SortMode di proprietà di NotSortable indica che non verrà mai usata per l'ordinamento, quindi non è necessario riservare spazio nell'intestazione per il glifo di ordinamento.

Quando un oggetto DataGridView viene ordinato, è possibile determinare sia la colonna di ordinamento che l'ordinamento controllando i valori delle SortedColumn proprietà e SortOrder . Questi valori non sono significativi dopo un'operazione di ordinamento personalizzata. Per altre informazioni sull'ordinamento personalizzato, vedere la sezione Ordinamento personalizzato più avanti in questo argomento.

Quando viene ordinato un DataGridView controllo contenente colonne associate e non associate, i valori nelle colonne non associate non possono essere mantenuti automaticamente. Per mantenere questi valori, è necessario implementare la modalità virtuale impostando la VirtualMode proprietà su true e gestendo gli CellValueNeeded eventi e CellValuePushed . Per altre informazioni, vedere Procedura: Implementare la modalità virtuale nel controllo DataGridView Windows Form. L'ordinamento in base alle colonne non associate in modalità associata non è supportato.

Ordinamento a livello di codice

È possibile ordinare un oggetto DataGridView a livello di codice chiamandone il Sort metodo .

L'overload Sort(DataGridViewColumn,ListSortDirection) del Sort metodo accetta un DataGridViewColumn valore di e un ListSortDirection valore di enumerazione come parametri. Questo overload è utile quando si ordinano in base a colonne con valori che possono essere ordinati in modo significativo, ma che non si desidera configurare per l'ordinamento automatico. Quando si chiama questo overload e si passa una colonna con un SortMode valore della proprietà , DataGridViewColumnSortMode.Automaticle SortedColumn proprietà e SortOrder vengono impostate automaticamente e il glifo di ordinamento appropriato viene visualizzato nell'intestazione di colonna.

Nota

Quando il DataGridView controllo è associato a un'origine dati esterna impostando la DataSource proprietà , l'overload del Sort(DataGridViewColumn,ListSortDirection) metodo non funziona per le colonne non associate. Inoltre, quando la VirtualMode proprietà è true, è possibile chiamare questo overload solo per le colonne associate. Per determinare se una colonna è associata a dati, controllare il valore della IsDataBound proprietà. L'ordinamento delle colonne non associate in modalità associata non è supportato.

Ordinamento personalizzato

È possibile personalizzare DataGridView usando l'overload Sort(IComparer) del Sort metodo o gestendo l'evento SortCompare .

L'overload del Sort(IComparer) metodo accetta un'istanza di una classe che implementa l'interfaccia IComparer come parametro. Questo overload è utile quando si vuole fornire un ordinamento personalizzato; Ad esempio, quando i valori di una colonna non hanno un ordinamento naturale o quando l'ordinamento naturale non è appropriato. In questo caso, non è possibile usare l'ordinamento automatico, ma è comunque consigliabile ordinare gli utenti facendo clic sulle intestazioni di colonna. È possibile chiamare questo overload in un gestore per l'evento ColumnHeaderMouseClick se non si usano intestazioni di colonna per la selezione.

Nota

L'overload del Sort(IComparer) metodo funziona solo quando il DataGridView controllo non è associato a un'origine dati esterna e il valore della VirtualMode proprietà è false. Per personalizzare l'ordinamento per le colonne associate a un'origine dati esterna, è necessario utilizzare le operazioni di ordinamento fornite dall'origine dati. In modalità virtuale è necessario fornire le proprie operazioni di ordinamento per le colonne non associate.

Per usare l'overload del Sort(IComparer) metodo, è necessario creare una classe personalizzata che implementa l'interfaccia IComparer . Questa interfaccia richiede che la classe implementi il IComparer.Compare metodo , a cui passa gli DataGridViewDataGridViewRow oggetti come input quando viene chiamato l'overload del Sort(IComparer) metodo. A questo scopo, è possibile calcolare l'ordinamento corretto delle righe in base ai valori in qualsiasi colonna.

L'overload Sort(IComparer) del metodo non imposta le SortedColumn proprietà e SortOrder , pertanto è necessario impostare sempre la DataGridViewColumnHeaderCell.SortGlyphDirection proprietà per visualizzare il glifo di ordinamento.

In alternativa all'overload del Sort(IComparer) metodo, è possibile fornire un ordinamento personalizzato implementando un gestore per l'evento SortCompare . Questo evento si verifica quando gli utenti selezionano le intestazioni delle colonne configurate per l'ordinamento automatico o quando si chiama l'overload Sort(DataGridViewColumn,ListSortDirection) del Sort metodo. L'evento si verifica per ogni coppia di righe nel controllo, consentendo di calcolare l'ordine corretto.

Nota

L'evento SortCompare non si verifica quando la DataSource proprietà è impostata o quando il valore della VirtualMode proprietà è true.

Vedi anche