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.