109 votes

DataGridView AutoFit et Remplissage

J'ai 3 colonnes dans mon DataGridView . Ce que j'essaie de faire, c'est que les deux premières colonnes s'adaptent automatiquement à la largeur du contenu et que la troisième colonne occupe l'espace restant.

Est-il possible de le faire dans WinForms ? Je charge mes données à partir d'un EF DataContext si cela peut être utile. J'ai inclus une image de ce à quoi cela ressemble actuellement.

enter image description here

201voto

Chris Points 7289

Vous devez utiliser le DataGridViewColumn.AutoSizeMode propriété.

Vous pouvez utiliser l'une de ces valeurs pour les colonnes 0 et 1 :

AllCells : La largeur de la colonne s'ajuste pour s'adapter au contenu de toutes les cellules du fichier la colonne, y compris la cellule d'en-tête.
Toutes les cellules sauf l'en-tête : La largeur de la colonne s'ajuste au contenu de toutes les cellules de la colonne, à l'exception de la cellule d'en-tête.
Cellules affichées : La largeur de la colonne s'ajuste à s'ajuste au contenu de toutes les cellules de la colonne qui se trouvent dans les rangées actuellement actuellement affichées à l'écran, y compris la cellule d'en-tête.
DisplayedCellsExceptHeader : La largeur de la colonne s'ajuste pour s'adapter au contenu de toutes les cellules de la colonne qui se trouvent dans les rangées actuellement actuellement affichées à l'écran, à l'exception de la cellule d'en-tête.

Ensuite, vous utilisez le Remplir valeur pour la colonne 2

La largeur des colonnes s'ajuste de manière à ce que la largeur de toutes les colonnes remplisse exactement la zone d'affichage du contrôle...

this.DataGridView1.Columns[0].AutoSizeMode = DataGridViewAutoSizeColumnMode.DisplayedCells;
this.DataGridView1.Columns[1].AutoSizeMode = DataGridViewAutoSizeColumnMode.DisplayedCells;
this.DataGridView1.Columns[2].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;

Comme l'ont fait remarquer d'autres utilisateurs, la valeur par défaut peut être fixée à datagridview niveau avec DataGridView.AutoSizeColumnsMode propriété.

this.DataGridView1.Columns[0].AutoSizeMode = DataGridViewAutoSizeColumnMode.DisplayedCells;
this.DataGridView1.Columns[1].AutoSizeMode = DataGridViewAutoSizeColumnMode.DisplayedCells;

pourrait être :

this.DataGridView1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.DisplayedCells;

Remarque importante :

Si votre grille est liée à une source de données et que les colonnes sont générées automatiquement ( AutoGenerateColumns définie sur True), vous devez utiliser la propriété DataBindingComplete événement pour appliquer le style APRÈS ont été créées.


Dans certains scénarios (changer la valeur des cellules par code par exemple), j'ai dû appeler DataGridView1.AutoResizeColumns(); pour rafraîchir la grille.

25voto

AlfredBr Points 585

C'est mon approche préférée...

_dataGrid.DataBindingComplete += (o, _) =>
    {
        var dataGridView = o as DataGridView;
        if (dataGridView != null)
        {
           dataGridView.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells;
           dataGridView.Columns[dataGridView.ColumnCount-1].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;
        }
    };

19voto

Ahosan Karim Asik Points 2995

Il suffit de changer la propriété de la propriété du contrôle : AutoSizeColumnsMode:Fill

OU Par code

dataGridView1.AutoSizeColumnsMode=DataGridViewAutoSizeColumnsMode.Fill;

6voto

Sriram Sakthivel Points 33463

Non testé mais vous pouvez faire un essai. Testé et fonctionnant. J'espère que vous pourrez jouer avec AutoSizeMode de DataGridViewColum pour obtenir ce dont vous avez besoin.

Essayez de régler

dataGridView1.DataSource = yourdatasource;<--set datasource before you set AutoSizeMode

//Set the following properties after setting datasource
dataGridView1.Columns[0].AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells;
dataGridView1.Columns[1].AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells;
dataGridView1.Columns[2].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;

Cela devrait fonctionner

2voto

Ignacio Points 451

C'est ce que j'ai fait pour que la colonne "prénom" remplisse l'espace lorsque toutes les autres colonnes ne peuvent le faire.

Lorsque la grille devient trop petite, la colonne "prénom" devient presque invisible (très fine). DataGridViewAutoSizeColumnMode à la propriété AllCells que les autres colonnes visibles. Pour des questions de performance, il est important de les définir sur None avant de le lier aux données et de le remettre à AllCells dans le DataBindingComplete du gestionnaire d'événements de la grille. J'espère que cela vous aidera !

private void dataGridView1_Resize(object sender, EventArgs e)
{
    int ColumnsWidth = 0;
    foreach(DataGridViewColumn col in dataGridView1.Columns)
    {
        if (col.Visible) ColumnsWidth += col.Width;
    }
    if (ColumnsWidth <dataGridView1.Width)
    {
        dataGridView1.Columns["first_name"].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;
    }
    else if (dataGridView1.Columns["first_name"].Width < 10) 
    {
        dataGridView1.Columns["first_name"].AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells;
    }
}

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