Größe von Datagridview an Inhalt anpassen

  • VB.NET
  • .NET 4.5

Es gibt 8 Antworten in diesem Thema. Der letzte Beitrag () ist von Silvergreen.

    Größe von Datagridview an Inhalt anpassen

    Hallo Community,

    ich suche mir hier schon einen Wolf und komme einfach nicht weiter. Da könnt ihr mir vermutlich schneller helfen, als jetzt noch 2 Stunden weiter zu suchen.
    Folgendes Problem: Ich habe den Datagridview und eine Dynamische Anzahl an Rows. Da der Inhalt der Rows mehrere Reihen hat, sind die höhen der Rows unterschiedlich.
    Der graue Hintergrund des DGV soll also genau bis zum Inhalt, dem weißen gehen. Da das DGV so viele verschiedene Einstellungen aufweißt, habe ich mittlerweile leider die Übersicht verloren.
    Bilder
    • 2019-11-14 15_02_04-frm_bestellung_ansicht.png

      2,45 kB, 92×247, 17 mal angesehen
    ?(
    Entweder Du summierst alle Row.Height-Properties und rechnest dann die ColumnHeader-Heights und (notfalls durch Probieren) Fixwerte für Rahmen etc. dazu oder Du setzt den Hintergrund des DGVs auf weiß.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Häufig von mir verwendete Abkürzungen: CEs = control elements (Labels, Buttons, DGVs, ...) und tDS (typisiertes DataSet)
    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht in den Spekulatiusmodus gehen.
    @VaporiZed Ja, dazu muss ich nur jede Row einzeln nehmen, da ein festgelegter Wert hier nicht helfen würde. Eine Funktion um für eine individuelle Zeile eine höhe zu bekommen habe ich aber nicht gefunden.
    Den Hintergrund auf Weiß zu setzten ist auch keine Option, da ich die Größe der Form ans DGV anpasse. Dazu brauche ich nur den dgv.size Wert, den ich halt ermitteln muss.
    ?(
    @Silvergreen ich hab da ein Snippet in C#:
    Spoiler anzeigen

    C#-Quellcode

    1. /// <summary>
    2. /// Spaltenbreite des DGV so einrichten,
    3. /// dass alle Spalten optimal angezeigt werden
    4. /// </summary>
    5. /// <param name="dgv">das zu behandelnde DataGridView</param>
    6. private static void DgvAutoColumnSize(DataGridView dgv)
    7. {
    8. dgv.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells;
    9. int x = 0;
    10. foreach (DataGridViewColumn col in dgv.Columns)
    11. {
    12. x += col.Width;
    13. //Console.Out.WriteLine("{0}\t{1}", col.Width, col.MinimumWidth);
    14. }
    15. if (x < dgv.Width)
    16. {
    17. // getestet, 1. Spalte breiter
    18. foreach (DataGridViewColumn col in dgv.Columns)
    19. {
    20. col.MinimumWidth = col.Width;
    21. }
    22. dgv.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill;
    23. }
    24. else
    25. {
    26. //dgv.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells;
    27. dgv.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill;
    28. }
    29. }
    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).
    VB-Fragen über PN / Konversation werden ignoriert!
    Hab ich was verpasst? Ich dachte, dass es um die Zeilenhöhen geht:

    Dim RowHeightSum = DGV.Rows.Cast(Of DataGridViewRow).Select(Function(x) x.Height).Sum
    (so aus dem Kopf heraus)
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Häufig von mir verwendete Abkürzungen: CEs = control elements (Labels, Buttons, DGVs, ...) und tDS (typisiertes DataSet)
    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht in den Spekulatiusmodus gehen.
    Ich habe mir gestern auch was gebastelt,
    so kleine Helferlein bastel ich mir gerne zusammen und füge sie dann meiner Snippet-Sammlung hinzu.
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Private Sub FitDataGridViewToMinimumHeight(ByVal _dataGridView As DataGridView)
    2. Dim height As Integer =
    3. If(_dataGridView.ColumnHeadersVisible, _dataGridView.ColumnHeadersHeight, 0)
    4. For Each row As DataGridViewRow In _dataGridView.Rows
    5. height += row.Height
    6. Next
    7. If height <> _dataGridView.Height Then _dataGridView.Height = height
    8. End Sub
    9. Private Sub DataGridView1_RowHeightChanged(sender As Object, e As DataGridViewRowEventArgs) Handles DataGridView1.RowHeightChanged
    10. Dim _sender As DataGridView = DirectCast(sender, DataGridView)
    11. FitDataGridViewToMinimumHeight(_sender)
    12. End Sub
    13. Private Sub DataGridView1_RowsAdded(sender As Object, e As DataGridViewRowsAddedEventArgs) Handles DataGridView1.RowsAdded
    14. Dim _sender As DataGridView = DirectCast(sender, DataGridView)
    15. FitDataGridViewToMinimumHeight(_sender)
    16. Invalidate()
    17. End Sub


    @VaporiZed Snippet sieht weniger noobig :D aus, das Haus dankt.

    VB.NET-Quellcode

    1. Private Sub FitDataGridViewToMinimumHeight(ByVal _dataGridView As DataGridView)
    2. Dim height As Integer =
    3. If(_dataGridView.ColumnHeadersVisible, _dataGridView.ColumnHeadersHeight, 0)
    4. height += _dataGridView.Rows.Cast(Of DataGridViewRow).Select(Function(x) x.Height).Sum
    5. If height <> _dataGridView.Height Then _dataGridView.Height = height
    6. End Sub
    Ich verwende solche Snippets gerne als Extension.

    VB.NET-Quellcode

    1. <Extension()>Sub FitToMinimumHeight(_dataGridView As DataGridView)
    2. ...
    3. End Sub

    Dann stellt sich der Aufruf eleganter dar:

    VB.NET-Quellcode

    1. DirectCast(sender, DataGridView).FitToMinimumHeight
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Mache ich meistens auch so.
    Wenn ich eine Methode aber nur ein/zweimal anwenden muss, spare ich mir das Extensions Modul, je nachdem eben.