2013-09-06 23 views
55

Ich habe 3 Spalten in meinem DataGridView. Was ich versuche, ist, dass die ersten beiden Spalten automatisch an die Breite des Inhalts angepasst werden und dass die dritte Spalte den verbleibenden Platz füllt.DataGridView AutoFit und füllen

Ist es möglich, in WinForms zu tun? Ich lade meine Daten aus einem EF DataContext, wenn das nützlich ist. Ich habe ein Bild davon, wie es derzeit aussieht.

enter image description here

Antwort

104

Sie müssen die DataGridViewColumn.AutoSizeMode Eigenschaft verwenden.

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

AllCells:Die Spaltenbreite passt sich den Inhalt aller Zellen in die Spalte, einschließlich der Header-Zelle passen.AllCellsExceptHeader:Die Spaltenbreite passt sich an den Inhalt aller Zellen in der Spalte an, mit Ausnahme der Header-Zelle.
DisplayedCells:Die Spaltenbreite passen die Inhalte aller Zellen in der Spalte passt die aktuell angezeigten Bildschirm in Zeilen, einschließlich der Header-Zelle.
DisplayedCellsExceptHeader:Die Spaltenbreite paßt den Inhalt aller Zellen in der Spalte passen, die zur Zeit in den Reihen sind der Bildschirm angezeigt, ohne die Titelzelle.

Dann nutzen Sie den Fill Wert für Spalte 2

Die Spaltenbreite so einstellt, dass die Breiten aller Spalten genau den Bereich der Kontrollanzeige füllen ...

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 angegeben, kann der Standardwert auf datagridview mit DataGridView.AutoSizeColumnsMode Eigenschaft festgelegt werden.

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

könnte sein:

this.DataGridView1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.DisplayedCells; 

Wichtiger Hinweis:

Wenn Ihr Gitter an eine Datenquelle gebunden ist und Spalten automatisch generiert (AutoGenerateColumns Eigenschaft auf True) , müssen Sie das DataBindingComplete Ereignis verwenden, um NACH Spalten anzuwenden wurde erstellt.


In einigen Szenarien (Änderung Zellen Wert von Code zum Beispiel), hatte ich DataGridView1.AutoResizeColumns(); zu nennen das Raster zu aktualisieren.

+1

Funktioniert perfekt bei Verwendung des DataBindingComplete-Ereignisses. –

+0

Ich kann nicht herausfinden, wie DataBindingComplete-Methode aufgerufen wird, nachdem Datagrid aufgefüllt wurde – Dan

+0

@Dan DataBindingComplete ist keine * Methode *, es ist ein DataGridview * -Ereignis *, die Sie abonnieren müssen. Diese Antwort http://stackoverflow.com/a/31685874/2387010 gibt ein Beispiel. Hilft es? – Chris

4

Nicht getestet, aber Sie können versuchen. Getestet und funktioniert. Ich hoffe, Sie können mit AutoSizeMode von DataGridViewColum spielen, um zu erreichen, was Sie brauchen.

Versuchen Sie,

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; 

Diese Arbeit sollte

+0

Dies 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 mir nicht sicher, wo ich es einstellen soll, da die Daten zur Laufzeit geladen werden und die Spalten aus dem EF-Modell stammen. –

+0

Sieht so aus, aber nicht, die dritte Zeile funktioniert nicht, ich habe das vor 10 Minuten getestet. –

+0

@JamesJeffery Sie sind AutoPopulating Spalten oder manuell bevölkern? –

-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); 
} 
+0

rufen Sie einfach diese Funktion an, es wird sich darum kümmern, die Höhe von datagridview basierend auf der Anzahl der Zeilen zu bestimmen –

+1

Zunächst einmal beantwortet das nicht die Frage des OP. Fügen Sie auch (zur späteren Bezugnahme) einen Kommentar zur Antwort selbst hinzu (Sie können ihn bearbeiten). – Joel

0

Versuchen, tun von Eigentum Steuer

AutoSizeColumnMode = Fill; 
+0

Das sieht aus, was OP bereits macht – Dan

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); 
     } 
    } 
+1

Dieser Code ist nicht großartig. Zuerst brauchen Sie nicht die verschachtelte Schleife, die den Breitenmodus aller Spalten auf das Gleiche setzt wie viele () mal; Sie können auf die AutoSizeMode- und FillWeight-Eigenschaften jeder Spalte direkt von 'GridCol' zugreifen. Zweitens setzt es den AutoSizeMode für jede Spalte auf zwei verschiedene Werte; Die zweite Zuweisung überschreibt die erste. – JonP

3

Gerade Immobilie ändern: AutoSizeColumnsMode:Fill

oder durch Code

dataGridView1.AutoSizeColumnsMode=DataGridViewAutoSizeColumnsMode.Fill;

+1

Danke. Ich war auf der Suche nach einer Lösung wie dieser! :) –

+0

Sieht aus wie OP das schon gemacht hat – Dan

17

Dies ist mein Lieblings Ansatz ...

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

Versuchen Sie folgendes:

DGV.AutoResizeColumns(); 
    DGV.AutoSizeColumnsMode=DataGridViewAutoSizeColumnsMode.AllCells; 
Verwandte Themen