Il modo migliore per disabilitare l’ordinamento delle intestazioni delle colonne in DataGridView

Devo disabilitare l’ordinamento delle intestazioni delle colonne in DataGridView .

Possiamo farlo impostando la proprietà di singole colonne come

 BalancesGridView.Columns[1].SortMode = DataGridViewColumnSortMode.NotSortable; 

Se questo è il caso, allora dovrò scorrere tra tutte le colonne.

Esiste un modo migliore ?

No, penso che impostare SortMode direttamente sulla colonna sia buono come si ottiene. Ma onestamente, a chi importa? Cosa c’è di male in un ciclo semplice?

Cosa c’è di male in questo? Se ti infastidisce il loop sulle colonne o hai più DataGridView, puoi scrivere un metodo di estensione per questo:

 public static class DatatGridViewExtensions { public static void SetColumnSortMode(this DataGridView dataGridView, DataGridViewColumnSortMode sortMode) { foreach (var column in dataGridView.Columns) { column.SortMode = sortMode; } } } 

Usalo in questo modo:

 BalancesGridView.SetColumnSortMode(DataGridViewColumnSortMode.NotSortable); 

Non so perché nessuno ti suggerisca il modo in Linq di farlo:

 BalancesGridView.Columns.Cast().ToList().ForEach(f => f.SortMode = DataGridViewColumnSortMode.NotSortable); 

beh, questo è un po ‘vecchio, ma c’è un piccolo problema con il looping per impostare la singola modalità di ordinamento della colonna, ad esempio, si consente all’utente di aggiungere più colonne, quindi è necessario ricominciare tutto di nuovo o trovare la colonna aggiunta e impostarlo è sortmode. questo è un po ‘più di lavoro.

la soluzione che ho trovato è come questo link: Disabilita l’ordinamento quando si fa clic sull’intestazione di colonna DataGridView

in essa basta aggiungere un gestore di eventi di ColumnAdded per quel DataGridView, quindi ogni volta che il datagrid aggiunge una colonna, viene automaticamente impostato come non ordinabile

questo è in realtà proprio come la risposta di @ OldDog, la differenza è che nella sua risposta, la modalità di ordinamento è impostata in modo indiretto.

 Private Sub DataGridView1_ColumnAdded(sender As Object, e As DataGridViewColumnEventArgs) Handles DataGridView1.ColumnAdded e.Column.SortMode = DataGridViewColumnSortMode.NotSortable End Sub 

Dico che passare attraverso le colonne non è una risposta così grande, soprattutto se la tua origine dati sta cambiando di volta in volta. Una linea di codice nell’evento ColumnAdded fa il trucco:

 e.Column.SortMode = DataGridViewColumnSortMode.NotSortable 

Ho incontrato questo problema oggi. Ho scritto questo metodo e l’ho chiamato sull’evento di caricamento del modulo.

  public void DisableGridviewSorting(DataGridView grid, int index) { //Index = DataGridView.Columns.Count for (int i = 0; i < index; i++) { grid.Columns[i].SortMode = DataGridViewColumnSortMode.NotSortable; } } 

Sembra che tu stia bloccando il ciclo di scansione di DataGridView, indipendentemente dal modo in cui lo fai, a meno che non usi dati vincolati. Quindi puoi impostare non-ordinabile per ogni singola colonna.

Se si crea DataGridView in fase di runtime, è ansible disabilitare l’ordinamento delle colonne quando le colonne vengono aggiunte utilizzando l’evento ColumnAdded:

 private void BalancesGridView_ColumnAdded(object sender, System.Windows.Forms.DataGridViewColumnEventArgs e) { e.Column.SortMode = DataGridViewColumnSortMode.NotSortable; } 

L’ho fatto in questo modo:

 private void gvItReq_RowsAdded(object sender, DataGridViewRowsAddedEventArgs e) { for (int colIdx = 0; colIdx < gvItReq.Columns.Count; colIdx++) gvItReq.Columns[colIdx].SortMode = DataGridViewColumnSortMode.NotSortable; } 

In VB uso una piccola subroutine che chiamo per ogni dgv dove voglio che le colonne siano unsumber:

 Public Sub subNo_Sort_DGV_Columns(dgv As DataGridView) For intColumn_Count As Integer = 1 To dgv.Columns.Count - 1 dgv.Columns(intColumn_Count).SortMode = _ DataGridViewColumnSortMode.NotSortable Next End Sub 

Il modo migliore che ho trovato per prevenire l’ordinamento è definire un ciclo for quando pensi di avere a disposizione molte colonne.

 for (int i = 0; i < 10; i++) { dataGridView.Columns[i].SortMode = DataGridViewColumnSortMode.NotSortable; }