web-dev-qa-db-fra.com

Meilleure façon de désactiver le tri des en-têtes de colonne dans DataGridView

J'ai besoin de désactiver le tri de l'en-tête de colonne dans DataGridView.

Nous pouvons le faire en définissant la propriété de colonnes individuelles comme

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

Si tel est le cas, je devrai parcourir toutes les colonnes.

Y a-t-il une meilleure façon?

28
Ananth

Non, je pense que définir directement le SortMode sur la colonne est aussi bon que possible. Mais honnêtement, qui s'en soucie? Qu'est-ce qui est si mauvais avec une simple boucle?

14
bitbonk

Qu'est-ce qui est si mauvais à ce sujet? Si cela vous dérange de parcourir les colonnes ou si vous avez plusieurs DataGridViews, vous pouvez écrire une méthode d'extension pour cela:

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

Utilisez-le comme ceci:

BalancesGridView.SetColumnSortMode(DataGridViewColumnSortMode.NotSortable);
13
VVS

Je ne sais pas pourquoi personne ne vous propose une méthode Linq pour ce faire:

BalancesGridView.Columns.Cast<DataGridViewColumn>().ToList().ForEach(f => f.SortMode = DataGridViewColumnSortMode.NotSortable);
8
Co. Aden

Je dis que parcourir les colonnes n'est pas une si bonne réponse, surtout si votre source de données change de temps en temps. Une ligne de code dans l'événement ColumnAdded fait l'affaire:

e.Column.SortMode = DataGridViewColumnSortMode.NotSortable
4
oldvbguy

eh bien, c'est un peu vieux, mais il y a un petit problème avec la boucle pour définir le mode de tri de la colonne individuelle, par exemple, vous autorisez l'utilisateur à ajouter plus de colonnes, puis vous devez tout recommencer ou trouver la colonne ajoutée et définissez son mode de tri. c'est un peu plus de travail.

la solution que j'ai trouvée est comme ce lien: Désactiver le tri en cliquant sur l'en-tête de colonne DataGridView

vous y ajoutez simplement un gestionnaire d'événements de ColumnAdded pour ce DataGridView, donc chaque fois que le datagrid ajoute une colonne, il est automatiquement défini comme non triable

c'est en fait exactement comme la réponse de @ OldDog, la différence est que dans sa réponse, le mode de tri est défini de manière détournée.

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

J'ai rencontré ce problème aujourd'hui. J'ai écrit cette méthode et l'ai appelée lors de l'événement de chargement de formulaire.

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

Il semble que vous soyez à peu près bloqué dans le DataGridView, peu importe comment vous le faites, sauf si vous utilisez des données liées. Ensuite, vous pouvez définir non triable pour chaque colonne individuelle.

3
Andrew

Si vous générez DataGridView au moment de l'exécution, vous pouvez désactiver le tri des colonnes lors de l'ajout des colonnes à l'aide de l'événement ColumnAdded:

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

Je l'ai fait de cette façon:

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

Dans VB j'utilise un petit sous-programme que j'appelle pour chaque dgv où je veux que les colonnes ne soient pas triables:

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
0
Kristian

Le meilleur moyen que j'ai trouvé pour empêcher le tri est de le définir est de le définir comme une boucle for lorsque vous pensez que vous avez trop de colonnes à traiter.

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