DGV Größe aus Spaltenbreite und Zeilenhöhe errechnen

  • VB.NET
  • .NET (FX) 3.0–3.5

Es gibt 10 Antworten in diesem Thema. Der letzte Beitrag () ist von DerSmurf.

    DGV Größe aus Spaltenbreite und Zeilenhöhe errechnen

    Nachdem ich es nun geschafft habe, meine Daten ansehnlich in einem DGV anzeigen zu lassen, möchte ich das DGV noch dynamisch in seiner Größe ändern.
    Dies wollte ich mit folgendem Code erreichen:

    VB.NET-Quellcode

    1. 'DGV Größe ändern
    2. Dim width As Integer
    3. Dim Height As Integer
    4. For i = 0 To DGVColumnCount - 1 'Variable die ich vorher in der Sub deklariert habe = DGVEvaluation.ColumnCount
    5. width += DGVEvaluation.Columns(i).Width
    6. Next
    7. For i = 0 To DGVEvaluation.Rows.Count - 1
    8. Height += DGVEvaluation.Rows(i).Height
    9. Next
    10. Height += DGVEvaluation.ColumnHeadersHeight
    11. DGVEvaluation.Width = width
    12. DGVEvaluation.Height = Height

    Klappt aber nicht, das DGV ist weder breit, noch hoch genug.
    Wo ist denn hier mein Denkfehler?
    Wie steht es mit den RowHeadern und dem Rahmen? Wenn Du die vergessen hast und es dann noch nicht passt, werden die ScollBars angezeigt, und dann passt es noch weniger. Daher noch die RowHeaderWidth dazu und ein bisken Puffer für den Rahmen. Dann verschwinden die ScrollBars und dann sollte es passen. Klappt es dann?
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Nein leider nicht.
    RowHeaders.Visible steht auf False und Borderstyle auf none.
    Die Scrollbar wird zwar angezeigt, aber ich kann damit nicht weit genug nach rechts. Nur so ein klein Minnibischen, aber eben nicht so weit, wie ich eigentlich müsste, um die Daten sehen zu können.
    Es fehlt einfach die letzte Spalte (Zufall nehme ich an). Ich muss die Variable width mit 70 addieren und height mit 20, damits passt.

    Edit:
    MessageBox.Show(DGVEvaluation.RowHeadersWidth.ToString) gibt mit trotzdem 41 zurück.
    Kapier ich zwar nicht, weil .Visible ist eben False, aber ich habs jetzt mal addiert.
    Nun muss ich noch 30 zu meiner width addieren. Könnten das die Linien zwischen den Spalten sein?
    Lad es mal bitte hoch. Vielleicht finden wir so das Problem.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Guten Morgen
    Sorry, hat ein bisschen gedauert.
    Das DGV versteckt sich auf der Form frmEvaluation (Name: DGVEvaluation). Im kompilierten Programm über MenüStrip "Auswertung" zu erreichen.
    Das zweite DGV (unten) einfach ignorieren. Ich fand es super cool, die Daten in zwei DGVs anzeigen zu lassen.
    Nachdem meine beiden DGVs dann auf der Form waren hat sich supercoll, in kacke geändert.
    Also werde ich die Daten wieder aufs erste DGV holen und das zweite DGV entfernen.
    Ich habe einen kleinen Datensatz für den Dezember 2019 erstellt. und einen einzigen Eintrag für Dezember 2018. Die restlichen Monate sind im Dts leer.
    Da ich diesmal kein Demoprojekt gemacht habe, sondern die komplette Solution hochlade (auch wenn das eigentlich auch nur eine Demo ist), habe ich den Anfang der DGV Formatierung mit einem 'TODO und uübesehbahren "#" gekennzeichnet.
    Die Größenveränderung ist dann der letzte Punkt im Code.
    Den restlichen Code bitte einfach überlesen.
    Dateien
    • Income.zip

      (131,16 kB, 79 mal heruntergeladen, zuletzt: )
    Ah, Du grätschst Dir effektiv selbst rein. Du legst im Designer eine DGV-Breite fest und da versucht sich dann die letzte Spalte dank AutoSizeMode-Einstellung Fill reinzuquetschen. Und wenn Du das DGV durch Berechnung vergrößerst, wird auch wieder die letzte Spalte automatisch größer, was dann aber leider dazu führt, dass es wieder nicht ganz passt. Du musst das DGV sehr breit machen*, das Fill gegen AllCells tauschen, dann die benötigte Breite berechnen, diese anwenden und dann wieder auf AllCells für die letzte Spalte zurück.
    Den Berechnungscode kannst Du dank LINQ kürzen zu:

    VB.NET-Quellcode

    1. DGVEvaluation.Width = DGVEvaluation.Columns.Cast(Of DataGridViewColumn).Sum(Function(x) x.Width) + DGVEvaluation.RowHeadersWidth + 2 '2 = kleiner Fix-Aufschlag
    2. DGVEvaluation.Height = DGVEvaluation.Rows.Cast(Of DataGridViewRow).Sum(Function(x) x.Height) + DGVEvaluation.ColumnHeadersHeight


    * Du kannst, wenn Du es genau machen willst, es auch bei der jetzigen Breite belassen und dann durch cleveren Code das ganze solange verbreitern, bis der untere Scrollbalken nicht mehr sichtbar ist. Ist aber n bisken aufwendiger.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Super. Ist nicht ganz richtig - jetzt irgendwie zu groß.
    Ich habe mal ein Screenshot nach dem DGV Resize, vor dem zurücksetzen auf AutoSize.Fill der letzten Spalte, angehängt.
    Aber ich kann mit dem Ergebnis leben - versteh nur nicht, warum das DGV nun auf einmal zu groß dargestellt wird.
    Bilder
    • autosireDGV.jpg

      422,51 kB, 1.600×900, 100 mal angesehen
    Mist, ich hab was vergessen. Wenn ich die Größe des DGV anpasse, sollte ich ja auch die Größe der Form selbst anpassen.
    Also habe ich mir die "Position" der DGV gesucht - diese ist 15; 72.
    Also wollte ich die Größe meiner Form mit folgendem Code anpassen:

    VB.NET-Quellcode

    1. Me.Width = DGVEvaluation.Width + 30 '15links + 15rechts + Breite DGV
    2. Me.Height = DGVEvaluation.Height + 100 '72oben + 28unten + HöheDGV

    Die Breite stimmt fast, es wird ein mini Stückchen des DGV abgeschnitten. Ich muss zur DGV Breite 45 addieren, damit rechts (optisch) der gleiche Abstand zwischen den Rändern Form --> DGV entsteht.
    In der Höhe wird die letzte Reihe des DGV halbiert. Hier muss ich 120 addieren, um unterhalb des DGV einen kleinen Abstand zum Formende zu erzeugen.

    Was habe ich denn hier für einen Denkfehler?

    DerSmurf schrieb:

    jetzt irgendwie zu groß
    Das liegt daran, dass die RowHeaderWidth noch in der Berechnung drin ist, obwohl die nicht angezeigt werden. Die RowHeader sind zwar unsichtbar, aber daher nicht automatisch mit Breite 0. Einfach in der Berechnung weglassen.
    Bzgl Formbreite und -höhe: Stell mal auch da den Border auf FixedSingle oder gar None und schaue, ob es dann passt (Bei mir passt es dann). Der Rahmen nimmt ja auch was weg. (Achtung: dann ggf. einen Schließen-Button noch einbauen)
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

    DerSmurf schrieb:

    sollte ich ja auch die Größe der Form selbst anpassen.
    Was hat denn das Primat?
    Die Größe des DGV oder die Größe der Form?
    Und:
    Sieh Dir mal diesen Post an: Größe von Datagridview an Inhalt anpassen
    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!
    Danke @Vaporized.
    Die DGVGröße passt perfekt, nach dem entfernen der Row.Headers.Width. Das hatte ich irgendwie überlesen.
    Auch die Formgröße passt. Wenn ich den Form Border Style auf none setze, haut die Größe hin. Da ich aber ohne Border doof finde, hab ichs nun wie folgt gelöst:

    VB.NET-Quellcode

    1. 'DGV Größe ändern
    2. DGVEvaluation.Width = DGVEvaluation.Columns.Cast(Of DataGridViewColumn).Sum(Function(x) x.Width) + 2
    3. DGVEvaluation.Height = DGVEvaluation.Rows.Cast(Of DataGridViewRow).Sum(Function(x) x.Height) + DGVEvaluation.ColumnHeadersHeight
    4. DGVEvaluation.Columns(DGVColumnCount - 1).AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill
    5. 'Form Größe ändern
    6. Dim Rahmenbreite As Integer
    7. Rahmenbreite = Integer.Parse(((Me.Size.Width - Me.ClientSize.Width) / 2).ToString)
    8. Dim Headerhoehe As Integer
    9. Headerhoehe = Me.Size.Height - Me.ClientSize.Height - Rahmenbreite
    10. Me.Width = DGVEvaluation.Width + Rahmenbreite * 2 + 30
    11. Me.Height = DGVEvaluation.Height + Rahmenbreite + Headerhoehe + 100

    scheint perfekt zu passen.