110 votes

Comment redimensionnez-vous automatiquement les colonnes dans un contrôle DataGridView ET autorisez l'utilisateur à redimensionner les colonnes sur cette même grille?

Je suis le remplissage d'un contrôle DataGridView sur un Formulaire Windows (C# 2.0 pas WPF).

Mon objectif est d'afficher une grille parfaitement remplit tout largeur disponible avec les cellules - c'est à dire pas de inutilisés (gris foncé) les domaines du droit et des tailles de chaque colonne de façon appropriée selon les données qu'il contient, mais aussi permet à l'utilisateur de redimensionner les colonnes à leur goût.

Je suis d'essayer d'atteindre ce par la définition de la AutoSizeMode de chaque colonne à DataGridViewAutoSizeColumnMode.AllCells l'exception d'une des colonnes qui j'ai mis à l' DataGridViewAutoSizeColumnMode.Remplir afin d'assurer l'ensemble de la zone de la grille est bien rempli avec des données. (Je n'ai pas l'esprit que lorsque l'utilisateur de tenter de redimensionner cette colonne, il revient à une taille qui assure l'espace horizontal est toujours utilisé.)

Cependant, comme je l'ai mentionné, une fois chargé, je voudrais permettre à l'utilisateur de redimensionner les colonnes en fonction de leurs besoins - dans la définition de ces AutoSizeMode valeurs pour chaque colonne, il apparaît que l'utilisateur est alors dans l'impossibilité de redimensionner les colonnes.

J'ai essayé de ne pas le réglage de la AutoSizeMode de toutes les colonnes qui ne permet pas de redimensionnement, MAIS ne définit pas la taille initiale selon les données les cellules contiennent. Le même résultat se produit lors de la modification de la grille de l'AutoSizeMode retour à la "Non Défini" après le chargement des données.

Est-il un paramètre qui me manque ici, ce qui permet le réglage automatique des largeurs de colonne par défaut ET l'utilisateur de redimensionnement ou est-il une autre technique que je doit utiliser lors du remplissage du contrôle DataGridView?

134voto

Miroslav Zadravec Points 1064

Cette astuce fonctionne pour moi:

     grd.DataSource = DT

    'set autosize mode
    grd.Columns(0).AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells
    grd.Columns(1).AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells
    grd.Columns(2).AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill

    'datagrid has calculated it's widths so we can store them
    For i = 0 To grd.Columns.Count - 1
        'store autosized widths
        Dim colw As Integer = grd.Columns(i).Width
        'remove autosizing
        grd.Columns(i).AutoSizeMode = DataGridViewAutoSizeColumnMode.None
        'set width to calculated by autosize
        grd.Columns(i).Width = colw
    Next
 

Ce qui se passe ici, c’est que vous définissez la taille automatique sur le mode souhaité, puis que vous stockez colonne par colonne la largeur obtenue à partir du calcul de la taille automatique, supprimez la taille automatique et définissez la largeur sur la valeur précédemment stockée.

45voto

Umair Points 295

Peut-être que vous pourriez appeler

 dataGridView1.AutoResizeColumns(DataGridViewAutoSizeColumnsMode.Fill);
 

Après avoir défini la source de données. Il va définir la largeur et permettre le redimensionnement.

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

32voto

Schnapple Points 6117

Version AC # 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;
        }
 

Publié en tant que Wiki communautaire pour ne pas perdre de la réputation des autres

15voto

Jehof Points 14720

Dans mon application, j'ai mis le AutoSizeColumnsMode à DataGridViewAutoSizeColumnMode.Remplir et le AutoSizeRowsMode à DataGridViewAutoSizeRowsMode.Aucun.

Aussi, j'ai mis le AllowUserToOrderColumns et AllowUserToResizeColumns à 'true'.

Maintenant, la largeur des colonnes peut être modifié et les colonnes peuvent être modifiés par l'utilisateur. Ça fonctionne assez bien pour moi.

Peut-être qui va travailler pour vous.

9voto

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