Announcement

Collapse
No announcement yet.

"Zeilenvorschub" bei DataGridView verhindern (.NET)

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • "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
    Attached Files
    PHP rocks!
    Eine Initiative der PHP Community

  • #2
    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.

    Comment


    • #3
      Hallo Ralf,

      Ich habe mir eine kleine Methode geschrieben:
      [highlight=csharp]
      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;
      }
      [/highlight]
      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

      Comment


      • #4
        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?

        Comment


        • #5
          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

          Comment


          • #6
            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.

            [HIGHLIGHT=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);
            }
            [/HIGHLIGHT]

            Comment


            • #7
              Originally posted by Ralf Jansen View Post
              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...

              Originally posted by Ralf Jansen View Post
              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

              Comment


              • #8
                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

                Comment

                Working...
                X