Willkommen bei Entwickler-Forum.
Ergebnis 1 bis 8 von 8
  1. #1
    Stammgast
    Registriert seit
    03.03.2007
    Ort
    Schleswig-Holstein
    Beiträge
    342

    Standard "Zeilenvorschub" bei DataGridView verhindern (.NET)

    Hallo,

    Ich habe mal wieder einen kleinen Kosmetikfehler bei einer DataGridView.

    Ich nutze eine DGV, um Titel für Produkte abhängig von der Sprache zu verwalten.
    Die Fensterhöhe passt sich immer sauber an die Content-Höhe an, so dass ich keine überflüssigen Ränder/Zwischenräume habe.

    Wenn ich mit den Pfeiltasten durch die Zellen navigiere und mich von der vorletzten zur letzten Zeile bewege, erscheint plötzlich ein Zwischenraum ( im Anhang zu sehen ).
    Wechsle ich mit Klick in die Zelle der letzten Zeile, passiert das nicht.

    Ich habe das Hinzufügen von Zeilen deaktiviert.

    Ist nur kosmetischer Natur, aber would be nice wenn jemand dazu was sagen kann.


    Danke
    Angehängte Grafiken Angehängte Grafiken
    PHP rocks!
    Eine Initiative der PHP Community

  2. #2
    Stammgast
    Registriert seit
    26.02.2003
    Beiträge
    4.851

    Standard

    Die Fensterhöhe passt sich immer sauber an die Content-Höhe an, so dass ich keine überflüssigen Ränder/Zwischenräume habe.
    Zeig mal wie du das gemacht hast. Vielleicht kann man dann was raten was da passiert.

  3. #3
    Stammgast
    Registriert seit
    03.03.2007
    Ort
    Schleswig-Holstein
    Beiträge
    342

    Standard

    Hallo Ralf,

    Ich habe mir eine kleine Methode geschrieben:
    Code C#:
            private void ReHeightForm()
            {
                int CaptionHeight = RectangleToScreen( this.ClientRectangle ).Top - this.Top;
                int frmHeight = CaptionHeight + dgvTitles.ColumnHeadersHeight + dgvTitles.Rows.Count;
     
     
                foreach (DataGridViewRow row in dgvTitles.Rows)
                    frmHeight += row.Height;
     
     
                this.Height = frmHeight;
            }
    Da das Formular nur das DataGrid anzeigt ( voll ausgefüllt ), berechne ich die Summe aller Zeilenhöhen ( Zeilen können durch Wrapping größer sein als andere ) + die Höhe der Titelleiste und Kopfzeile des DataGrid.
    Die Anzahl der Rows addiere ich zusätzlich, um die Zellrahmen zu berücksichtigen.

    Das passt auch wunderbar, selbst wenn eine Zeile wrappt, passt sich die Form exakt an.

    Ich kann wie gesagt auch mit der Maus in die letzte Zeile klicken und alles ist i.O.
    Das Problem tritt nur auf, wenn ich von der vorletzten in die letzte Zeile per Tastatur wechsle.

    Die ReHeightForm()-Methode rufe ich an diesen beiden Stellen auf:
    Code:
    Form1_Load
    dgvTitles_CurrentCellDirtyStateChanged

    EDIT:
    Beitrag 333 nach knapp 11 Jahren!!! PowerUser würde ich mal sagen...
    PHP rocks!
    Eine Initiative der PHP Community

  4. #4
    Stammgast
    Registriert seit
    26.02.2003
    Beiträge
    4.851

    Standard

    Beide Events sollten nicht beim navigieren durch das Grid aufgerufen werden.

    Hast du den EditMode des Grids geändert und irgendwelchen zusätzlichen Code der automatisch den Zelleninhalt ändert?
    Wenn nicht sehe ich nicht wie dein gezeigter Code dann da beteiligt sein kann und es muß doch an was anderem liegen. Kannst du mal einen Breakpoint in den Code setzen und schauen ob den ReHeightForm() aufgerufen wird?

  5. #5
    Stammgast
    Registriert seit
    03.03.2007
    Ort
    Schleswig-Holstein
    Beiträge
    342

    Standard

    Hmmm... Nein, Code, der am Zelleninhalt etwas schraubt, habe ich nicht.
    Ich zähle während der Eingabe die Anzahl Zeichen, aber ich glaube nicht, dass es daran liegt.

    Aber man soll nicht nie sagen. :-)
    Danke für den Hinweis, ich schau mir das morgen mal mit Breakpoints an.
    PHP rocks!
    Eine Initiative der PHP Community

  6. #6
    Stammgast
    Registriert seit
    26.02.2003
    Beiträge
    4.851

    Standard

    Ich hätte da einen verdacht. Kann es sein das du die vertikale Scrollbar ausgeblendet hast? Und das der im Screenshot angezeigte erste Eintrag "Deutsch Ebay" gar nicht der erste Eintrag ist?

    Dann hast du dich schön getölpelt Durch das nach unten Navigieren in die letzte Zeile per Cursortasten möchte das Grid die letzte Zeile komplett anzeigen. Es sieht bei dir nur so aus als würde die Zeile komplett da sein. Aber es fehlt genau 1 Pixel Zeile (oder so in etwa) und da du die Scrollbar ausgeblendet hast merkst du das auch nicht.
    Um die letzte Zeile komplett anzuzeigen scrollt nun das Grid die Ansicht um genau eine ~normale~ Zeilenhöhe nach oben und du siehst den Gridhintergrund ungefähr in der Größe einer Zeile.

    In deiner ReHeightForm Code solltest du den Code bezüglich CaptionHeight entfernen. Der wird so nicht in jeder Windows Version funktionieren.
    Direkt die ClientSize setzen sollte da stabiler sein da das unabhängig davon ist wie die konkrete Windowsversion den Fensterrahmen zeichnet z.B.

    Code C:
    private void ReHeightForm()
    {
        int frmHeight = dataGridView1.ColumnHeadersHeight + dataGridView1.Rows.Cast<DataGridViewRow>().Sum(x => x.Height) + 2; // 2 wegen 1 Pixel Border (oben und unten) verhindert Notwendigkeit der Scrollbar und das dazugehörende Scrollverhalten
        this.ClientSize = new Size(this.ClientSize.Width, frmHeight);
    }

  7. #7
    Stammgast
    Registriert seit
    03.03.2007
    Ort
    Schleswig-Holstein
    Beiträge
    342

    Standard

    Zitat Zitat von Ralf Jansen Beitrag anzeigen
    Ich hätte da einen verdacht. Kann es sein das du die vertikale Scrollbar ausgeblendet hast? Und das der im Screenshot angezeigte erste Eintrag "Deutsch Ebay" gar nicht der erste Eintrag ist?
    Damned... you're right man...

    Zitat Zitat von Ralf Jansen Beitrag anzeigen
    In deiner ReHeightForm Code solltest du den Code bezüglich CaptionHeight entfernen. Der wird so nicht in jeder Windows Version funktionieren.
    Direkt die ClientSize setzen sollte da stabiler sein da das unabhängig davon ist wie die konkrete Windowsversion den Fensterrahmen zeichnet z.B.
    Werde ich nachher mal testen und Feedback geben, aber ich vermute, dass das der Grund ist.

    Danke Dir!
    Gruß Arne
    PHP rocks!
    Eine Initiative der PHP Community

  8. #8
    Stammgast
    Registriert seit
    03.03.2007
    Ort
    Schleswig-Holstein
    Beiträge
    342

    Standard

    Läuft perfekt, danke für Deine Mühe.
    Cast<> hatte ich bisher auch nicht auf der Palette. Bin kein Freund von vielen Schleifen und daher dankbar auch für solche Hinweise!

    Schöne Grüße
    Arne
    PHP rocks!
    Eine Initiative der PHP Community

 

 

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •