DevTrain

Autor: Rene Paschold

Spaltenbreite und Zeilenhöhe im DataGrid fixieren

In den Newsgroups wird zur Zeit öffters die Frage gestellt wie man in einem Windows DataGrid die Zeilenhöhe und die Spaltenbreite fixieren kann, so dass der Anwender diese nicht mehr verändern kann. Hier sucht der Entwickler vergeblich nach ein Eigenschaft RowResize=False oder ähnliches.

Der moment einzige Weg sowas zu realisieren, ist ein eigenes DataGrid mit zwei überschriebenen Methoden zu erstellen. Als Basisklasse diehnt natürlich das normale DataGrid da ja nur die Breite und Höhe einer Zelle fixieren werden soll.

Als erstes erstellt man eine Klasse MyDataGrid die von System.Windows.Forms.DataGrid erbt.

Public Class MP3DataGrid
  Inherits System.Windows.Forms.DataGrid
End Class

Darin erstellt man dann zwei Methoden die die Basismethode überschreiben:

Protected Overrides Sub OnMouseMove(ByVal e As MouseEventArgs)
End Sub

Protected Overrides Sub OnMouseDown(ByVal e As MouseEventArgs)
End Sub

Da das DataGrid keine Möglichkeit bietet ein Event zu feuern wenn die Breite einer Spalte bzw. die Höhe einer Zeile verändert wird, muss manuell eingegriffen werden. Beide Methoden werden mit fast identischem Code überschrieben:

Dim hti As DataGrid.HitTestInfo = Me.HitTest(New Point(e.X, e.Y))

If (hti.Type = DataGrid.HitTestType.ColumnResize Or _
  hti.Type = DataGrid.HitTestType.RowResize) Then
 
Return
End If

Als erstes wird eine Variable hti erzeugt. Diese Variable bekommt die aktuelle Position welche durch einen Klick auf das DataGrid geliefert wird.

Mit hti.Type rufen wir den Teil des DataGrids ab, auf den geklickt wurde. Wenn jetzt auf das DataGrid geklickt wird um die Spaltenbreite zu verändern, dann wird kein Ergebnis zurück gegeben. Das gleich gilt auch für die Zeilenhöhe.

Am Ende der beiden Methoden wird dann noch die Basismethode aufgerufen. Hier der vollständige Code:

Public Class MyDataGrid
  Inherits DataGrid

  Protected Overrides Sub OnMouseMove(ByVal e As MouseEventArgs)

    Dim hti As DataGrid.HitTestInfo = Me.HitTest(New Point(e.X, e.Y))

    If (hti.Type = DataGrid.HitTestType.ColumnResize Or _
      hti.Type = DataGrid.HitTestType.RowResize) Then
     
Return
    End If

    MyBase.OnMouseMove(e)

  End Sub

  Protected Overrides Sub OnMouseDown(ByVal e As MouseEventArgs)

    Dim hti As DataGrid.HitTestInfo = Me.HitTest(New Point(e.X, e.Y))

    If (hti.Type = DataGrid.HitTestType.ColumnResize Or _
      hti.Type = DataGrid.HitTestType.RowResize) Then
     
Return
    End If

    MyBase.OnMouseDown(e)

  End Sub

End Class

Somit hat der Entwickler ein DataGrid, in dem die Spaltenbreite und die Zeilenhöhe nicht mehr verändert werden kann.


Erfasst am: 03.02.2004 - Artikel-URL: http://www.devtrain.de/news.aspx?artnr=909
© Copyright 2003 ppedv AG - http://www.ppedv.de