web-dev-qa-db-fra.com

DataGridView AutoFit et Fill

J'ai 3 colonnes dans ma DataGridView. Ce que j'essaie de faire est de faire en sorte que les 2 premières colonnes s'ajuste automatiquement à la largeur du contenu et que la 3ème colonne remplisse l'espace restant.

Est-il possible de faire dans WinForms? Je charge mes données depuis un EF DataContext si c'est utile. J'ai inclus une image de son apparence actuelle.

enter image description here

70
James Jeffery

Vous devez utiliser la propriété DataGridViewColumn.AutoSizeMode

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

AllCells: _ ​​la largeur de la colonne est ajustée pour s'adapter au contenu de toutes les cellules de la colonne , Y compris la cellule d'en-tête. 
AllCellsExceptHeader: _ ​​la largeur de la colonne s'ajuste pour s'adapter au contenu de toutes les cellules de la colonne, à l'exclusion de la cellule d'en-tête. 
DisplayedCells: _ ​​La largeur de la colonne est ajustée à Le contenu de toutes les cellules de la colonne figurant dans les lignes S'affiche à l'écran, y compris la cellule d'en-tête. 
DisplayedCellsExceptHeader: _ ​​La largeur de la colonne est ajustée pour s'adapter au contenu De toutes les cellules de la colonne qui sont actuellement en rangées Affichées à l'écran, à l'exception de la cellule d'en-tête.

Ensuite, vous utilisez la valeur Fill pour la colonne 2

La largeur de colonne s'ajuste de sorte que les largeurs de toutes les colonnes remplissent 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 souligné d'autres utilisateurs, la valeur par défaut peut être définie sur datagridview niveau avec DataGridView.AutoSizeColumnsMode property.

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

pourrait être:

this.DataGridView1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.DisplayedCells;

Note importante:

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


Dans certains scénarios (changer la valeur des cellules en code par exemple), je devais appeler DataGridView1.AutoResizeColumns(); pour actualiser la grille.

134
Chris

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;
        }
    };
19
AlfredBr

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

OR Par code

dataGridView1.AutoSizeColumnsMode=DataGridViewAutoSizeColumnsMode.Fill;

6
Ahosan Karim Asik

Non testé mais vous pouvez essayer. Testé et fonctionnel. J'espère que vous pourrez jouer avec AutoSizeMode de DataGridViewColum pour atteindre vos objectifs.

Essayez de mettre 

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 marcher

4
Sriram Sakthivel

Essayez de faire,

 AutoSizeColumnMode = Fill;
0
Aki
public static void Fill(DataGridView dgv2)
   {
        try
        {
            dgv = dgv2;
            foreach (DataGridViewColumn GridCol in dgv.Columns)
            {
                for (int j = 0; j < GridCol.DataGridView.ColumnCount; j++)
                {
                    GridCol.DataGridView.Columns[j].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;
                    GridCol.DataGridView.Columns[j].AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells;
                    GridCol.DataGridView.Columns[j].FillWeight = 1;
                }
            }
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
        }
    }
0
Jay