DGV automatische Größenanpassung

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 12 Antworten in diesem Thema. Der letzte Beitrag () ist von Hubertus.

    DGV automatische Größenanpassung

    Hallo,

    ich habe eine Frage zu DataGripView.
    Vielleicht es es auch nur eine Einstellungssache im DGV, aber ich habe bis jetzt nichts gefunden. Auch im Internet findet man viel, aber eine Problemlösung für mein Problem war nicht dabei.
    Ich habe ein leeres DGV in meine Form eingebunden und die Höhe (.size-Height) so eingestellt, dass man den Header (Überschrift) und eine leere Zeile sieht. Jede Zeile besteht aus zwei ComboBoxen und einer Textbox. Zur TextBox noch eine wichtige
    Anmerkung, es können auch mehrzeilige Einträge erfolgen, also nicht über ScrollBars, ist so gewollt und funktioniert auch schon alles.

    Ich lese nun eine CSV-Datei ein, und die DGV wird mit Daten gefüllt.
    Nun meine Frage. Wie kann ich es realisieren, dass sich das DGV automatisch von der Höhe her, seinem Inhalt (Anzahl Zeilen und deren Höhe) anpasst? Natürlich soll dies auch geschehen, wenn ich manuell eine Zeile hinzufüge. ?(
    Mit Hilfe von ScrollBars wäre dies einfach umzusetzten, aber ich will immer die gesamte DGV sehen. Wahrscheinlich werden es nie mehr wie 10 Zeilen sein, so dass ich alle Daten auf einen Blick sehen kann

    Ich bin für jegliche Hilfe dankbar

    Gruß Hubert

    Hubertus schrieb:

    10 Zeilen
    Gib ihr gleich diese Größe.
    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!
    Hallo RodFromGermany,

    wenn ich jetzt aber nur eine oder zwei Daten-Zeile hätte (Daten verändern mit der Zeit), dann hätte ich ein grosses leeres DGV -Fenster. Genau dies will ich ja mit der autom. Größenanpassung verhindern.

    Gruß
    Hubert

    Hubertus schrieb:

    Größenanpassung
    OK.
    Du kannst die Zellhöhe auslesen, und immer, wenn Du eine Zeile dranhängst, wendest Du das an.
    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 habe auch schon probiert, mit folgendem Event zu arbeiten.

    Sub DGV1_RowsAdded(ByVal sender As Object, ByVal e As DataGridViewRowsAddedEventArgs) HandlesDGV1.RowsAdded
    Dim NewPosi As Integer = 0
    NewPosi = DGV1.Height + 23
    DGV1.Height = NewPosi
    End Sub


    Dieses Event wird ausgelöst, immer wenn eine neune Zeile erstellt wird. Dann habe ich die Gesamthöhe vom DGV ausgelesen und um den Wert 23 (Höhe der neuen Zeile) erhöht. Dies funktioniert nur kurz, denn entweder wird das DGV immer größer als die erforderliche Größe, oder es schneidet mir unten an der letzten Zeile immer etwas mehr ab. Ich habe auch mir dem Wert 23 gespielt, aber das verschlimmert nur den Effekt.
    Ich würde noch den AutoRowSizeMode auf "All Cells" stellen. Dann sollte es wieder schön aussehen.

    VB.NET-Quellcode

    1. DGV1.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.AllCells
    There is no CLOUD - just other people's computers

    Q: Why do JAVA developers wear glasses?
    A: Because they can't C#

    Daily prayer:
    "Dear Lord, grand me the strength not to kill any stupid people today and please grant me the ability to punch them in the face over standard TCP/IP."
    Danke für den Hinweis, aber ich hatte diese Einstellung auch schon durchgeführt.
    Nach noch mehreren Test habe ich nun die Lösung gefunden, hier meine Quellcode

    Private Sub DGV1_RowsAdded(ByVal sender As Object, ByVal e As DataGridViewRowsAddedEventArgs) Handles DGV1.RowsAdded

    Dim NewPosi As Integer = 0
    NewPosi = DGV1.Height + 23.5
    DGV1.Height = NewPosi

    End Sub

    als Änfänger kurz gefragt.... würde nicht auch ein

    VB.NET-Quellcode

    1. Private Sub DGV1_RowsAdded(ByVal sender As Object, ByVal e As DataGridViewRowsAddedEventArgs) Handles DGV1.RowsAdded
    2. DGV1.Height += 23.5
    3. End Sub

    reichen?
    "Hier könnte Ihre Werbung stehen..."
    Jou.
    @Hubertus Auch wenn Du sagst, dass da bloß 10 Zeilen drankommen, wenn es 11 Zeilen sind und das DGV dann unten am Rand der Form verschwindet, rufst Du wieder um Hilfe.
    Also: Begrenze die Höhe auf die Höhe der Form minus .Location.Y des DGV, den Rest siehst Du dann über die Scrollbar.
    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!
    @MichaHo
    natürlich kannst du auch den neuen Wert gleich so übergeben. Während der Programmierung arbeite ich noch gerne mit Zwischenwerten, die ich eventuell später noch einmal brauchen könnte. Ist die Programmierung abgeschlossen, dann optimiere ich den Quellcode, wie in deinem Beispiel.
    @RodFromGermany
    Ich würde deinen Vorschlag umsetzten, aber es gibt zwei Gründe, die mich davon abhalten.
    1. kein Scrollbar, sonst hätte ich mir den ganzen Aufwand sparen können.
    2. Es werden tatsächlich nie mehr wie 10 Einträge geben. Dies ist durch die Bedingungen der beiden ComboBoxen im DGV gewährleitet.
    Trotzdem Danke für deinen Vorschalg.

    Hubertus schrieb:

    tatsächlich
    wirst Du Dich genau dann wundern, wenn Du in einem anderen Projekt oder in diesem Projekt in einem halben Jahr eine entsprechende Änderung vornimmst.
    Wenn gesichert ist, dass nur 10 Zeilen reinkommen, kannst Du ja die Größe getrost auf 12 Zeilen begrenzen. :D
    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!

    Hubertus schrieb:

    Auch im Internet findet man viel, aber eine Problemlösung für mein Problem war nicht dabei
    vielleicht hilft dir das etwas weiter...

    VB.NET-Quellcode

    1. Private Function GetDataGridViewHeight(dataGridView As DataGridView) As Integer
    2. Dim sum = If(dataGridView.ColumnHeadersVisible, dataGridView.ColumnHeadersHeight, 0)
    3. sum =+ dataGridView.Rows.OfType(Of DataGridViewRow)().Where(Function(r) r.Visible).Sum(Function(r) r.Height)
    4. Return sum
    5. End Function
    hab's aber nicht getestet...
    Hallo VB1963,

    vielen Dank für die Funktion. Leider hat sie nicht so funktioniert, wie erwünscht, aber ich konnte daraus wichtige Information herausnehmen. Das Problem ist immer, dass ich zwar die Höhe der neuen Zeile feststellen kann, aber der kleine Zwischenraum zwischen den Zeilen wird nicht berücksichtigt. Deshalb wurde mir der äussere Rahmen immer zu groß angezeigt, was kein schönes Gesamtbild ergab.
    Ich habe nun mit folgende Programmierung die automatische Höhenanpassung realisiert und durch die Änderung in der Einstellung: BorderStyle = None auch den Effekt des zu großen Rahmes entfernt.
    Diese Programmierung ist unabhängig von den Anzahl der Zeilen.
    Hier der Quellcode:

    Private Sub DGV1_RowsAdded(ByVal sender As Object, ByVal e As DataGridViewRowsAddedEventArgs) Handles Dgv1.RowsAdded
    Dim DgvHight = DGV1.Height
    Dim Neu = DGV1.Rows.Count - 1
    DGV1.Height = DgvHight + DGV1.Rows(Neu).Height() + 3
    End Sub

    Vielen Dank für eure Unterstützung

    Gruß
    Hubertus

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Hubertus“ ()