DataGridView AutoFit und Fill

82

Ich habe 3 Spalten in meinem DataGridView. Ich versuche, die ersten beiden Spalten automatisch an die Breite des Inhalts anzupassen und die dritte Spalte den verbleibenden Platz auszufüllen.

Ist das in WinForms möglich? Ich lade meine Daten aus einem EF DataContext, wenn dies sinnvoll ist. Ich habe ein Bild beigefügt, wie es aktuell aussieht.

Geben Sie hier die Bildbeschreibung ein

James Jeffery
quelle

Antworten:

162

Sie müssen die DataGridViewColumn.AutoSizeModeEigenschaft verwenden.

Sie können einen dieser Werte für die Spalten 0 und 1 verwenden:

AllCells: Die Spaltenbreite wird an den Inhalt aller Zellen in der Spalte angepasst , einschließlich der Kopfzelle.
AllCellsExceptHeader: Die Spaltenbreite wird an den Inhalt aller Zellen in der Spalte angepasst , mit Ausnahme der Kopfzelle.
DisplayedCells: Die Spaltenbreite wird an den Inhalt aller Zellen in der Spalte angepasst, die sich in Zeilen befinden, die derzeit auf dem Bildschirm angezeigt werden, einschließlich der Kopfzelle.
DisplayedCellsExceptHeader: Die Spaltenbreite wird an den Inhalt aller Zellen in der Spalte angepasst, die sich in Zeilen befinden, die derzeit auf dem Bildschirm angezeigt werden, mit Ausnahme der Kopfzelle.

Dann verwenden Sie den Füllwert für Spalte 2

Die Spaltenbreite wird so angepasst, dass die Breite aller Spalten den Anzeigebereich des Steuerelements genau ausfüllt ...

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

Wie von anderen Benutzern hervorgehoben, kann der Standardwert auf der datagridviewEbene der DataGridView.AutoSizeColumnsModeEigenschaft festgelegt werden.

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

könnte sein:

this.DataGridView1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.DisplayedCells;

Wichtige Notiz:

Wenn Ihr Raster an eine Datenquelle gebunden ist und Spalten automatisch generiert werden ( AutoGenerateColumnsEigenschaft auf True festgelegt), müssen Sie das DataBindingCompleteEreignis verwenden, um den Stil anzuwenden, nachdem Spalten erstellt wurden.


In einigen Szenarien (z. B. Ändern des Zellenwerts durch Code) musste ich aufrufen DataGridView1.AutoResizeColumns();, um das Raster zu aktualisieren.

Chris
quelle
1
Funktioniert einwandfrei, wenn das DataBindingComplete-Ereignis verwendet wird.
James Jeffery
Ich kann nicht herausfinden, wie die DataBindingComplete-Methode aufgerufen werden soll, nachdem das Datagrid ausgefüllt wurde
Dan
@Dan DataBindingComplete ist keine Methode , sondern ein Datagridview- Ereignis , das Sie abonnieren müssen. Diese Antwort stackoverflow.com/a/31685874/2387010 gibt ein Beispiel. Hilft es
Chris
Es wäre hilfreich, wenn das Beispiel erklärt würde, aber es wird ausreichen. Der MSDN-Artikel, auf den Sie in Ihrem Beitrag verlinkt haben, zeigt ihn als Methode, die ich als Muster verwendet habe, aber nicht herausfinden kann, wie sie aufgerufen wird.
Dan
1
@ Chris, dass fehlende Informationen auf jeden Fall hilfreich sind, danke. Ich lese dieses Buch und bin gerade zum Kapitel über Delegierte und Lambda-Funktionen gekommen, daher wird dies hoffentlich in Kürze sinnvoller. Danke dir!
Dan
22

Dies ist mein Lieblingsansatz ...

_dataGrid.DataBindingComplete += (o, _) =>
    {
        var dataGridView = o as DataGridView;
        if (dataGridView != null)
        {
           dataGridView.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells;
           dataGridView.Columns[dataGridView.ColumnCount-1].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;
        }
    };
AlfredBr
quelle
Wenn die Spaltengröße = 0 ist, index out of bound exceptionbeheben Sie das einfach, danke !!
TiyebM
14

Ändern Sie einfach das Eigentum vom Eigentum der Kontrolle: AutoSizeColumnsMode:Fill

ODER Nach Code

dataGridView1.AutoSizeColumnsMode=DataGridViewAutoSizeColumnsMode.Fill;

Ahosan Karim Asik
quelle
1
Danke dir. Ich suchte nach einer Lösung wie dieser! :)
Alin Ciocan
4

Nicht getestet, aber Sie können es versuchen. Getestet und funktionsfähig. Ich hoffe , dass Sie mit spielen können , AutoSizeModevon DataGridViewColumzu erreichen , was Sie brauchen.

Versuchen Sie die Einstellung

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;

Das sollte funktionieren

Sriram Sakthivel
quelle
Das funktioniert nicht. Ich setze es, wenn das Formular initialisiert wird, bevor die Datenquelle aus dem DataContext hinzugefügt wird. Könnte das der Grund sein? Ich bin nicht sicher, wo ich es einstellen soll, da die Daten zur Laufzeit geladen werden und die Spalten aus dem EF-Modell stammen.
James Jeffery
Sieht so aus, aber nicht, die dritte Zeile funktioniert nicht, ich habe das vor 10 Minuten getestet.
König König
@JamesJeffery Sie füllen Spalten automatisch aus oder füllen sie manuell aus?
Sriram Sakthivel
@SriramSakthivel Ich verwende die Eigenschaft dataGridView1.DataSource, um eine von meinem DataContext zurückgegebene Liste zu binden.
James Jeffery
0

Versuchen Sie es,

 AutoSizeColumnMode = Fill;
Aki
quelle
0
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);
        }
    }
Jay
quelle
1
Dieser Code ist nicht großartig. Zunächst benötigen Sie keine verschachtelte Schleife, mit der der Breitenmodus aller Spalten viele Male (<Anzahl der Spalten>) auf dasselbe festgelegt wird. Sie können direkt von auf die AutoSizeMode- und FillWeight-Eigenschaften jeder Spalte zugreifen GridCol. Zweitens wird der AutoSizeMode für jede Spalte auf zwei verschiedene Werte eingestellt. Die zweite Zuordnung überschreibt die erste.
JonP
0

Um auf der Antwort von AlfredBr aufzubauen, können Sie, wenn Sie einige Ihrer Spalten ausgeblendet haben, die folgenden Elemente verwenden, um die Größe aller Spalten automatisch zu ändern und dann nur die letzte sichtbare Spalte den leeren Bereich ausfüllen zu lassen:

myDgv.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells;
myDgv.Columns.GetLastColumn(DataGridViewElementStates.Visible, DataGridViewElementStates.None).AutoSizeMode = 
    DataGridViewAutoSizeColumnMode.Fill;
RooiWillie
quelle
0

Dies ist, was ich getan habe, damit die Spalte "Vorname" den Raum ausfüllt, wenn nicht alle Spalten dies können.

Wenn das Raster zu klein wird, wird die Spalte "Vorname" fast unsichtbar (sehr dünn), sodass ich den DataGridViewAutoSizeColumnMode auf AllCells als die anderen sichtbaren Spalten setzen kann. Bei Leistungsproblemen ist es wichtig, diese vor dem Binden der Daten auf Keine und im DataBindingComplete-Ereignishandler des Rasters auf AllCell zurückzusetzen. Ich hoffe es hilft!

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;
    }
Ignacio
quelle
-1
public void setHeight(DataGridView src)
{
    src.Height= src.ColumnHeadersVisible ? src.ColumnHeadersHeight : 0 +   src.Rows.OfType<DataGridViewRow>().Where(row => row.Visible).Sum(row => row.Height);
}
Durga Prasad Guntoju
quelle
Rufen Sie einfach diese Funktion auf, sie kümmert sich um die Bestimmung der Höhe der Datagrid-Ansicht basierend auf der Anzahl der darin enthaltenen Zeilen
Durga Prasad Guntoju
1
Dies beantwortet zunächst nicht die Frage des OP. Fügen Sie (zum späteren Nachschlagen) einen solchen Kommentar zur Antwort selbst hinzu (Sie können ihn bearbeiten).
Joel
-2

Versuche dies :

  DGV.AutoResizeColumns();
  DGV.AutoSizeColumnsMode=DataGridViewAutoSizeColumnsMode.AllCells;
Sudhir
quelle