122 votes

Comment redimensionner automatiquement les colonnes dans un contrôle DataGridView ET permettre à l'utilisateur de redimensionner les colonnes de cette même grille ?

Je remplis un contrôle DataGridView dans un formulaire Windows (C# 2.0, pas WPF).

Mon objectif est d'afficher une grille qui remplit proprement toute la largeur disponible avec des cellules - c'est-à-dire aucune zone inutilisée (gris foncé) en bas à droite et qui dimensionne chaque colonne de manière appropriée en fonction des données qu'elle contient, mais permet également à l'utilisateur de redimensionner n'importe laquelle des colonnes à sa convenance.

J'essaie d'obtenir ce résultat en définissant le mode de dimensionnement automatique de chaque colonne comme suit DataGridViewAutoSizeColumnMode.AllCells à l'exception d'une des colonnes que j'ai réglée sur DataGridViewAutoSizeColumnMode.Fill (Remplir) afin de s'assurer que toute la zone de la grille est proprement remplie de données. (Cela ne me dérange pas que lorsque l'utilisateur tente de redimensionner cette colonne, elle revienne à une taille qui garantit que l'espace horizontal est toujours utilisé).

Cependant, comme je l'ai mentionné, j'aimerais permettre à l'utilisateur de redimensionner les colonnes en fonction de ses propres besoins. En définissant ces valeurs AutoSizeMode pour chaque colonne, il semble que l'utilisateur ne soit pas en mesure de redimensionner ces colonnes.

J'ai essayé de ne pas paramétrer l'AutoSizeMode de toutes les colonnes, ce qui permet de les redimensionner MAIS ne définit pas la taille initiale en fonction des données que les cellules contiennent. Le même résultat se produit lorsque l'on remet l'AutoSizeMode de la grille sur "Not Set" après avoir chargé les données.

Manque-t-il un paramètre qui permette de définir automatiquement les largeurs de colonne par défaut ET le redimensionnement par l'utilisateur ou existe-t-il une autre technique que je dois utiliser pour remplir le contrôle DataGridView ?

0 votes

Ne pas le régler sur "Not Set" le régler sur "Aucun" donc redimensionnement ne reviendra pas en arrière -- testé pour c# , .net2.0

151voto

Miroslav Zadravec Points 1064

Cette astuce fonctionne pour moi :

    grd.DataSource = DT;

    // Set your desired AutoSize Mode:
    grd.Columns[0].AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells;
    grd.Columns[1].AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells;
    grd.Columns[2].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;

    // Now that DataGridView has calculated it's Widths; we can now store each column Width values.
    for (int i = 0; i <= grd.Columns.Count - 1; i++)
    {
        // Store Auto Sized Widths:
        int colw = grd.Columns[i].Width;

        // Remove AutoSizing:
        grd.Columns[i].AutoSizeMode = DataGridViewAutoSizeColumnMode.None;

        // Set Width to calculated AutoSize value:
        grd.Columns[i].Width = colw;
    }

Dans le code ci-dessus : Vous réglez la propriété AutoSize des colonnes sur le mode AutoSize dont vous avez besoin. Ensuite (colonne par colonne), vous enregistrez la valeur de la largeur de chaque colonne (à partir de la valeur AutoSize) ; Désactivez la propriété AutoSize et enfin, réglez la largeur de la colonne sur la valeur de largeur que vous avez précédemment enregistrée.

1 votes

J'ai placé un code similaire dans une routine appelée AutoResizeColumnWidthsYetAllowUserResizing. Elle est appelée après le remplissage initial de la grille et également après que l'utilisateur ait modifié les données (c'est-à-dire à partir de l'événement CellEndEdit de la grille).

7 votes

Ce code est excellent. Il doit être placé dans l'événement 'DataGridView1_DataSourceChanged'.

1 votes

Il me semble que faire grd.Columns(i).Width = grd.Columns(i).Width fera déjà l'affaire. Voir aquí .

51voto

Umair Points 295

Vous pourriez peut-être appeler

dataGridView1.AutoResizeColumns(DataGridViewAutoSizeColumnsMode.Fill);

Après avoir défini la source de données. Il définira la largeur et permettra le redimensionnement.

Plus d'informations sur MSDN Méthode DataGridView.AutoResizeColumns (DataGridViewAutoSizeColumnsMode) .

2 votes

Je ne sais pas pourquoi cette réponse n'attire pas plus l'attention. C'est beaucoup plus propre. Bien que si vous cherchez à faire correspondre la largeur du contenu des cellules, DataGridViewAutoSizeColumnsMode.AllCells fonctionne un peu mieux.

37 votes

En utilisant cette solution, j'obtiens l'erreur suivante : "Le paramètre autoSizeColumnMode n'est pas valide pour cette opération. Il ne peut pas être NotSet, None ou Fill mais doit indiquer un critère de dimensionnement." . J'ai fini par utiliser ceci dataGridView1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill ;

6 votes

L'utilisation de DataGridViewAutoSizeColumnMode.Fill ne fonctionne pas car elle ignore le contenu des cellules lors du dimensionnement des colonnes.

33voto

Schnapple Points 6117

Une version C# du code de Miroslav Zadravec

for (int i = 0; i < dataGridView1.Columns.Count-1; i++)
{
    dataGridView1.Columns[i].AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells;
}
dataGridView1.Columns[dataGridView1.Columns.Count - 1].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;

for (int i = 0; i < dataGridView1.Columns.Count; i++)
{
    int colw = dataGridView1.Columns[i].Width;
    dataGridView1.Columns[i].AutoSizeMode = DataGridViewAutoSizeColumnMode.None;
    dataGridView1.Columns[i].Width = colw;
}

Posté en tant que Wiki communautaire afin de ne pas profiter de la réputation des autres.

21voto

Jehof Points 14720

Dans mon application, j'ai défini

grid.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill;
grid.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.None;

De plus, j'ai défini le

grid.AllowUserToOrderColumns = true;
grid.AllowUserToResizeColumns = true;

Désormais, la largeur des colonnes peut être modifiée et les colonnes peuvent être réorganisées par l'utilisateur. Cela fonctionne très bien pour moi.

Peut-être que ça marchera pour vous.

0 votes

En réglant le mode AutoSizeColumnsMode de la grille sur "Fill", toutes les colonnes semblent avoir la même largeur. Oui, les colonnes sont ensuite redimensionnables, mais les largeurs initiales sont toutes fausses. Il se peut que je doive définir les largeurs des colonnes dans le code "manuellement".

0 votes

DV- grid.AutoSizeColumnsMode = DataGridViewAutoSizeColumn-> s <- Mode.Fill ; (vous avez oublié le s, c'est ColumsMode à gauche et à droite, donc votre ligne ne compile pas) Le code pour obtenir l'autosize de datagridview est très ennuyeux tel quel, donc vérifiez au moins votre réponse d'abord. C'est la toute première ligne que vous avez écrite et elle est fausse.

0 votes

@barlop merci pour votre réponse. Vous avez le privilège de modifier les questions et les réponses. Si vous repérez une erreur dans mon code, n'hésitez pas à l'éditer.

10voto

mpss Points 41

Eh bien, j'ai fait ça comme ça :

dgvReport.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.None;
dgvReport.AutoResizeColumns();
dgvReport.AllowUserToResizeColumns = true;
dgvReport.AllowUserToOrderColumns = true;

dans cet ordre particulier. Les colonnes sont redimensionnées (étendues) ET l'utilisateur peut redimensionner les colonnes par la suite.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X