Home arrow Blog
A blog of all section with no images
Drag 'n' Drop und Scroll im Windows Forms Datagrid Drucken E-Mail

Heute musste ich mich mit einem Problem unseres Tabellen Objektes kümmern, es ging dabei um das automatische Scrollen nach unten bzw. oben wenn man per Drag and Drop eine Zeile hinzufügen möchte. Da man das von überall aus Windows kennt dachte ich, naja das wird nur ein Property sein, aber so leicht war es dann doch nicht.

Die Funktionalität wird dabei komplett in der eigenen vom DataGrid abgeleiteten Komponente implementiert. Die dabei überschriebene OnDragOver(...) wird folgendermaßen erweitert.

/// <summary>
/// Autoscroll beim Drag'n'Drop einbauen
/// </summary>
/// <param name="drgevent"></param>
protected override void OnDragOver(DragEventArgs drgevent)
{
 
Point cp = this.PointToClient(new Point(drgevent.X, drgevent.Y));   int scrollBereich = 20;
  if( (cp.Y + scrollBereich) > this.Height )
      
this.AutoScrollDown();
 
if( cp.Y <= scrollBereich)    
      
this.AutoScrollUp();

  base.OnDragOver (drgevent);

}

Um das Scrollen zu realisieren gibt es mehrere Möglichkeiten.

  1. Scrollen durch Navigieren in den Zeilen

    Bei dieser ersten und sehr einfachen Möglichkeit wird einfach die aktuelles Zeile des Grids geändert, so dass nach unten gesprungen wird. Problematisch hierbei ist, dass sich damit auch die selektierte Zeile ändert, was nicht so ganz Sinn und Zweck der Aufgabe sein kann. Realisiert würde die mit dem folgenden Code:

    public void AutoScrollDown()
    {
       this.CurrentRowIndex++;
    }


    Wobei außerdem darauf zu achten ist, dass vor dem ersten Aufruf der aktuelle Index auf die letzte Zeile gesetzt wird.
  2. Scrollen durch eine Windows Message an die Scrollbar des Grid

    Die zweite Möglichkeit ist das verwenden von Windows Messages, diese Methodik eignet sich ganz besonders, wenn man nicht vom Datagrid abgeleitet hat, einen entsprechende Aufruf "von außen" werde ich gleich noch zeigen. Aber erstmal die implementierung in der Komponente selbst.

    public void AutoScrollDown()
    {
    SendMessage(
    this.Handle, M_VSCROLL,
            SB_LINEDOWN,
    this.VertScrollBar.Handle);
    }

    [DllImport("user32.dll", CharSet=CharSet.Auto)]
    public static extern IntPtr SendMessage(IntPtr hWnd, int msg,
        IntPtr wParam, IntPtr lParam);

    const int WM_VSCROLL=0x0115;
    IntPtr SB_LINEUP =(IntPtr)0;
    IntPtr SB_LINEDOWN =(IntPtr)1;

    Zum Hochscrollen wird einfach der Zeiger SB_LINEUP verwendet.
    Wie versprochen hier nun noch der Aufruf wenn das ganze von außen geschehen soll, wobei der SendMessage Aufruf der selbe bleibt.

    private void DoAutoScroll()
    {
      for(int i=0;i<this.dataGrid1.Controls.Count;i++)
      {
        if(this.dataGrid1.Controls[i] is VScrollBar)
        {
           SendMessage(
    this.dataGrid1.Handle, WM_VSCROLL, SB_VERT,
              
    this.dataGrid1.Controls[i].Handle);
        }
      }
    }

    Aber das unschöne an dieser Methodik ist, dass hier mit Windows Messages gearbeitet wird, Und das wollen wir unter .NET ja schließlich verhindern.

  3. Scrollen direkt über die Scrollbar des abgeleiteten Grids

    Die dritte Möglichkeit funktioniert nur wenn man vom Datagrid Control ableitet. Das Datagrid Control bietet nämlich die beiden protected Methoden "GridVScrolled" und "GridHScrolled" mit denen man nach Herzenslust scrollen kann.

    /// <summary>
    /// Langsam nach oben Scrollen.
    /// Wird z.B. beim Drap'n'Drop benötigt
    /// </summary>
    public void AutoScrollDown()
    {
       #region Body
       //Die Scrolleiste bzw. diese Methode ist von außen nicht erreichbar
       GridVScrolled
       (
        
    this, new ScrollEventArgs
          (
            ScrollEventType.SmallIncrement,VertScrollBar.Value++
          )
       );
       #endregion
    }

Die dritte ist aus meiner Sicht die sauberste und beste Methode, proble ist nur das man dafür vom Grid ableiten muss. Warum Microsoft das Scrollen nicht von vorn herein implementiert hat bleibt mir allerdings immernoch schleierhaft.

 
Herzlich Willkommen Drucken E-Mail

Ich freue mich, Sie hier begrüßen zu dürfen.

Im Bereich Über mich finden Sie Informationen zu meiner Person.

In der Rubrik Projekte sind einige Beispiele meiner bisherigen Tätigkeit in der IT-Branche aufgeführt.

In meinem Blog schreibe ich, sofern sich die Zeit hierfür findet, Alltägliches; es lohnt sich hier ab und an vorbei zu schauen.

Und jetzt wünsche ich viel Spaß auf meiner Website