Spaltenbreite im Datagridview bei mehrzeiliger HeaderCell

  • VB.NET

Es gibt 7 Antworten in diesem Thema. Der letzte Beitrag () ist von HPC.

    Spaltenbreite im Datagridview bei mehrzeiliger HeaderCell

    Hallo Community,

    ich habe die Frage schon vor einiger Zeit in einem anderen Forum gestellt, habe aber leider keine Antwort erhalten. Deshalb will ich es hier mal versuchen:

    Ich habe ein Problem mit den Spaltenbreiten im Datagridview. Ich habe die Spaltenbreite per DataGridViewAutoSizeColumnsMode.AllCells bereits verkleinern können, aber in einigen Spalten ist ein längerer Text, der in der Headercell zweizeilig dargestellt wird. Hier scheint DataGridViewAutoSizeColumnsMode.AllCells nicht zu funktionieren. Gibt es eine Möglichkeit auch diese Spalten automatisch anzupassen?

    Gibt es hier überhaupt eine Möglichkeit das anzupassen?

    Gruß
    HPC
    Ich fürchte, wenn AutoSizeColumnMode.AllCells bei mehrzeiligen Headern Fehldarstellungen erzeugt, dann wirds sehr schwierig - also ich weiß da spontan nix zu, und das erklärt wohl auch die Zurückhaltung in deim anneren Forum.
    Vielleicht kann man zu einer anderen Darstellung übergehen - DGV-Zellen sind nunmal klein, und also auch nur für klein darstellbare Werte konzipiert.
    Kannst du vlt. Screenshot machen von dem Fehlverhalten?

    Nutze dafür bitte die Datei-Anhäng-Funktion des Forums

    HPC schrieb:

    aber in einigen Spalten ist ein längerer Text
    da muss man eben das ganze in mehreren Etappen machen:

    VB.NET-Quellcode

    1. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    2. Dim txt = DataGridView1.Columns(1).HeaderText
    3. Dim g = Me.CreateGraphics
    4. Dim sz = g.MeasureString(txt, DataGridView1.Font)
    5. DataGridView1.Columns(1).Width = CInt(sz.Width + 10) ' die Spalte expandieren
    6. DataGridView1.Update() ' die Überbreite zur Anzeige bringen
    7. DataGridView1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells
    8. End Sub
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    HPC schrieb:

    leider sehen die Header Spalten immer noch so aus wie im Screenshot.
    OK, da musst Du ein wenig experimentieren, der Wert 10 war zu knapp.

    VB.NET-Quellcode

    1. Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
    2. Dim g = Me.CreateGraphics
    3. For Each column As DataGridViewColumn In DataGridView1.Columns
    4. Dim txt = column.HeaderText
    5. Dim sz = g.MeasureString(txt, DataGridView1.Font)
    6. column.Width = CInt(sz.Width + 20) ' die Spalte expandieren
    7. Next
    8. DataGridView1.Update() ' die Überbreite zur Anzeige bringen
    9. DataGridView1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells
    10. End Sub
    Bilder
    • nachher.jpg

      15,27 kB, 594×300, 209 mal angesehen
    • vorher.jpg

      14,89 kB, 594×300, 210 mal angesehen
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Ich weiß nicht warum, aber der Code funktioniert bei mir nicht :-/

    In meiner Test Applikation läuft es, aber in meiner richtigen Anwendung nicht.
    Kurz mal zu meiner Vorgehensweise:

    Ich hänge ein Datatable von einem Dataset als DataSource ans DGV.
    Danach benenne ich die Headerspalten per HeaderText in einen Klartext um.
    Dann formatiere ich einige Spalten per DefaultCellStyleFormat um (die im Screenshot zu sehenden Spalten gehören nicht dazu)
    Dann lasse ich Deinen Code durchlaufen.
    Das Ergebnis ist, dass sich nichts verändert hat :-/

    Ich habe mich jetzt so beholfen, dass ich die Spalten, die anscheinend vom AutoSIzeColumnsMode nicht formatiert wurden, manuell per Columns.Width formatiert habe. Aber das ist ja nicht im Sinne des Erfinders.

    Falls Du noch einen Tipp hast …

    Ich werde hier dann wohl noch etwas rumprobieren.

    Gruß
    HPC

    HPC schrieb:

    Das Ergebnis ist, dass sich nichts verändert hat
    Setz mal einen Haltepunkt rein und sieh Dir die Überschriften an. Sind die da bereits vorhanden?
    das DataGridView1.Update() vor DataGridView1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells ist ganz wichtig.
    Wie oft rufst Du DataGridView1.AutoSizeColumnsMode = XXX auf? Das darfst Du nur ein Mal tun!
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Dachte erst ich hätte den Fehler gefunden und der Code funktioniert, aber es geht leider doch nicht.
    Ich habe mal einen Haltepunkt gesetzt, die Überschriften sind bereits vorhanden.

    Das Seltsame ist, dass, wenn ich AutoSizeColumnsMode auskommentiere, dann wird es auch ohne den Code richtig dargestellt, aber dann werden halt die Spalten nicht mehr automatisch angepasst :(

    Gruß
    HPC

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „HPC“ ()