Ich fülle ein DataGridView-Steuerelement in einem Windows Form (C # 2.0 nicht WPF).
Mein Ziel ist es, ein Raster anzuzeigen, das die gesamte verfügbare Breite sauber mit Zellen ausfüllt - dh keine unbenutzten (dunkelgrauen) Bereiche rechts unten und jede Spalte entsprechend den darin enthaltenen Daten entsprechend dimensioniert, dem Benutzer jedoch auch die Größenänderung aller Spalten ermöglicht nach ihrem Geschmack.
Ich versuche dies zu erreichen, indem ich den AutoSizeMode jeder Spalte auf DataGridViewAutoSizeColumnMode.AllCells setze, mit Ausnahme einer der Spalten, die ich auf DataGridViewAutoSizeColumnMode.Fill gesetzt habe , um sicherzustellen, dass der gesamte Bereich des Rasters sauber mit Daten gefüllt ist. (Es macht mir nichts aus, dass der Benutzer beim Versuch, die Größe dieser Spalte zu ändern, auf eine Größe zurückspringt, die sicherstellt, dass der horizontale Raum immer verwendet wird.)
Wie bereits erwähnt, möchte ich dem Benutzer nach dem Laden erlauben, die Größe der Spalten an seine eigenen Anforderungen anzupassen. Wenn Sie diese AutoSizeMode-Werte für jede Spalte festlegen, kann der Benutzer diese Spalten anscheinend nicht ändern.
Ich habe versucht, den AutoSizeMode nicht für alle Spalten festzulegen, wodurch eine Größenänderung möglich ist, ABER die Anfangsgröße wird nicht gemäß den in den Zellen enthaltenen Daten festgelegt. Das gleiche Ergebnis tritt auf, wenn der AutoSizeMode des Rasters nach dem Laden der Daten wieder auf "Nicht festgelegt" geändert wird.
Fehlt hier eine Einstellung, die die automatische Einstellung der Standardspaltenbreiten UND der Größenänderung des Benutzers ermöglicht, oder muss ich beim Auffüllen des DataGridView-Steuerelements eine andere Technik anwenden?
quelle
Antworten:
Dieser Trick funktioniert bei mir:
Was hier passiert, ist, dass Sie die automatische Größe auf den gewünschten Modus einstellen und dann spaltenweise die Breite speichern, die sie aus der automatischen Größenberechnung erhalten hat, die automatische Größe entfernen und die Breite auf den zuvor gespeicherten Wert einstellen.
quelle
grd.Columns(i).Width = grd.Columns(i).Width
bereits den Trick macht. Siehe hier .dataGridView1.Columns[i].AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells;
Vielleicht könntest du anrufen
Nach dem Einstellen der Datenquelle. Dadurch wird die Breite festgelegt und die Größenänderung ermöglicht.
Weitere Informationen zur MSDN DataGridView.AutoResizeColumns-Methode (DataGridViewAutoSizeColumnsMode) .
quelle
DataGridViewAutoSizeColumnsMode.DisplayedCells
. Darüber hinaus ist im Forms Designer der AutoSizeColumnsMode auf None festgelegt. Ich musste diesen Methodenaufruf im DataBindingComplete-Ereignishandler von DataGridView ausführen, um sicherzustellen, dass die Größe immer richtig ist.AC # -Version von Miroslav Zadravecs Code
Gepostet als Community-Wiki, um den Ruf anderer nicht zu beeinträchtigen
quelle
In meiner Bewerbung habe ich eingestellt
Auch ich habe das eingestellt
Jetzt können die Spaltenbreiten geändert und die Spalten vom Benutzer neu angeordnet werden. Das funktioniert ziemlich gut für mich.
Vielleicht funktioniert das für Sie.
quelle
Fügen Sie nach dem Hinzufügen der Daten zum Raster den folgenden Code hinzu, der die Spalte entsprechend der Datenlänge in jeder Zelle anpasst
Hier ist das Ergebnis
quelle
Nun, ich habe das so gemacht:
in dieser bestimmten Reihenfolge. Die Größe der Spalten wird geändert (erweitert) UND der Benutzer kann die Größe der Spalten anschließend ändern.
quelle
Wenn ich die Frage richtig verstanden habe, sollte es einen einfacheren Weg geben, das zu erreichen, was Sie brauchen. Anruf
dgvSomeDataGrid.AutoResizeColumns(DataGridViewAutoSizeColumnsMode.AllCells);
Das sollte den Trick machen. Es gibt jedoch eine Gefahr, da Sie diese Methode nicht einfach direkt nach dem Auffüllen Ihres DataGridView-Steuerelements aufrufen können. Stattdessen müssen Sie einen EventHandler für das VisibleChanged-Ereignis hinzufügen und die Methode dort aufrufen.
quelle
Ein einfacher Codecode funktioniert für mich.
quelle
Fortsetzung der Frage:
Lassen Sie die Spaltenbreite an den Inhalt anpassen (mit unterschiedlichen Methoden in der Spalte),
aber erlauben Sie dem Benutzer dann, die Spaltenbreite festzulegen ...
Ausgehend von Miroslav Zadravecs Antwort funktionierte für mich sofort die Verwendung des automatisch berechneten
column.Width
Satzes ...column.Width
!Dies wird auf der Arbeit getestet , wenn die
DataGridView
bereits erstellt wird, einen Trick , wie mit dieser .quelle
Das hat Wunder für mich bewirkt:
quelle
dataGridView1.AutoResizeColumns(DataGridViewAutoSizeColumnsMode.AllCells);
dataGridView1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.None;
Dadurch werden alle Spalten entsprechend ihrem Inhalt automatisch angepasst, der verbleibende leere Bereich durch Dehnen einer angegebenen Spalte ausgefüllt und das Sprungverhalten verhindert, indem die letzte Spalte festgelegt wird, die für zukünftige Größenänderungen gefüllt werden soll.
quelle
Etwas übersichtlicherer C # -Code aus Miroslav Zadravecs Code, vorausgesetzt, alle Spalten müssen automatisch angepasst werden
quelle
Eine andere Version von Miroslav Zadravecs Code, aber etwas automatisierter und universeller:
Ich habe den zweiten Teil in ein separates Ereignis
datagridvew
eingefügt , da ich die Initialisierung des Formulars ausfülle und wenn beide Teile vorhanden sind, ändert sich nichts, da die automatische Größe wahrscheinlich die Breite berechnet, nachdem siedatagridview
angezeigt wurde, sodass die Breite in derForm1()
Methode immer noch Standard ist. Nach Abschluss dieser Methode macht die automatische Größe ihren Trick und unmittelbar danach (wenn das Formular angezeigt wird) können wir die Breiten nach dem zweiten Teil des Codes festlegen (hier für denForm1Shown
Fall). Das funktioniert für mich wie ein Zauber.quelle
Hier ist ein vereinfachter Code für Miroslav Zadravecs Antwort in c #:
quelle
Haben Sie versucht, die
FillWeight
Eigenschaft IhresDataGridViewColumns
Objekts einzurichten ?Beispielsweise:
Ich denke, es sollte in Ihrem Fall funktionieren.
quelle
Eine kleine Verbesserung gegenüber Schnapples Version
quelle
dataGridView1.AutoResizeColumns ();
quelle
Die Spaltenbreiten wurden so eingestellt, dass sie zum Inhalt passen. Ich habe die folgende Anweisung verwendet. Sie hat mein Problem behoben.
Erster Schritt :
Zweiter Schritt :
Dritter Schritt :
quelle
Dies sollte funktionieren, unabhängig davon, ob das
dataGridView
angezeigt wurde oder nicht (dh auch wenn es vom Klassenkonstruktor aufgerufen wird).Die gleiche Methode, jedoch mit
DataGridViewAutoSizeColumnMode.DisplayedCells
, schlägt im obigen Fall aus dem offensichtlichen Grund fehl - es wurde noch keine Zelle angezeigt! Aus irgendeinem nicht offensichtlichen GrundAutoResizeColumns
schlägt dies auch in diesem Fall fehl.quelle
Wenn Sie Ihre Datenquelle beispielsweise an eine Datentabelle binden, müssen Sie die Eigenschaften nach Abschluss der Bindung festlegen:
quelle
DataGridView.Columns
, wechseln SieAutoSizeMode
zu einem gültigen, sammeln Sie den Breitenwert und setzen Sie ihn nach der ÄnderungAutoSizeMode
auf zurückDataGridViewAutoSizeColumnMode.None
).Form.Show()
oder aufgerufen wirdForm.ShowDialog()
. Also habe ich dieses Code-Snippet in dasForm.Shown
Event eingefügt und das funktioniert für mich.Mein transformierter Code, unabhängig von
DataGridView.AutoSizeColumnsMode
den zuvor festgelegten, verwende ich,DataGridViewColumn.GetPreferredWidth()
anstatt den BreitenwertDataGridViewColumn.AutoSizeMode
sofort zu ändern und festzulegen , und ändere ihn dannDataGridView.AutoSizeColumnsMode
einmal:Stellen Sie sicher, dass Sie einstellen
Ich weiß nicht, warum das erst funktioniert, nachdem das Formular angezeigt wurde.
quelle
Ich musste dies in VB tun und es vorziehen, es auf eine Methode aufzuteilen, die ich in ein Modul eingefügt habe. Falls gewünscht, können Sie die Spalte Füllen als weiteren ByRef-Parameter hinzufügen.
quelle
Sie könnten so etwas tun:
Alle Spalten werden an den Inhalt angepasst, mit Ausnahme der letzten, die das Raster ausfüllt.
quelle
Mit $ array als Inhalt eines PSCustomObject funktioniert dies:
quelle