Das Microsoft FlexGrid Control ist bei den Entwicklern - wie man im Forum immer wieder hört - im regen Einsatz. Egal, ob mit Datenbank-Anbindung oder als "Unbound"-Grid. Für kleinere Datenmengen ist das FlexGrid ja auch durchaus zu gebrauchen. Was dem FlexGrid Control aber in jedem Fall fehlt, ist eine AutoEdit-Funktion, d.h. dass der Anwender z.B. durch Doppelklick auf eine Zelle deren Inhalt direkt im Grid verändern kann. Um das FlexGrid mit dieser fehlenden Funktion nachzurüsten, bedarf es auch gar nicht viel Alles was wir benötigen ist eine zusätzliche, zunächst unsichtbare TextBox (txtEdit) auf der Form. Im DblClick-Ereignis des FlexGrid-Controls ermitteln wir die Zelle unter dem Mauszeiger, dann die exakte Position der Zelle, so dass wir nun die Textbox genau über die Zelle platzieren und sichtbar machen. Option Explicit ' aktuelle Zelle, die editiert wird Private m_Row As Long Private m_Col As Long Private Sub MSFlexGrid1_DblClick() With MSFlexGrid1 ' Gültige Zelle? If .MouseCol > .FixedCols And .MouseRow > .FixedRows Then txtEdit.Move .Left + .CellLeft, .Top + .CellTop, _ .CellWidth, .CellHeight ' Zelle "merken m_Row = .MouseRow: m_Col = .MouseCol ' Zelleninhalt auslesen und in die ' Textbox übertragen txtEdit.Text = .TextMatrix(m_Row, m_Col) ' TextBox sichtbar machen und Fokus setzen txtEdit.Visible = True txtEdit.SetFocus End If End With End Sub So, jetzt lässt sich die Zelle schon mal editieren. Was fehlt jetzt noch? Genau! Der geänderte Text muss wieder ins FlexGrid übertragen werden - und zwar dann, wenn der Anwender die Enter-Taste drückt. Und bei dieser Gelegenheit: Drückt der Anwender die ESC-Taste soll die TextBox wieder "verschwinden" - ohne Textübertragung. Private Sub txtEdit_KeyPress(KeyAscii As Integer) With MSFlexGrid1 If KeyAscii = 13 Then ' ENTER: Text ins Grid übertragen ' und TextBox ausblenden KeyAscii = 0 .TextMatrix(m_Row, m_Col) = txtEdit.Text txtEdit.Visible = False ' Fokus auf das FlexGrid setzen .Row = m_Row: .Col = m_Col .SetFocus ElseIf KeyAscii = 27 Then ' ESC: Eingabe abbrechen KeyAscii = 0 txtEdit.Visible = False .Row = m_Row: .Col = m_Col .SetFocus End If End With End Sub Das funktioniert jetzt schon recht gut. Aber etwas fehlt immer noch Und zwar sollte die TextBox auch dann wieder "verschwinden", wenn der Anwender im EditMode auf eine andere Zelle im FlexGrid klickt: Private Sub MSFlexGrid1_GotFocus() ' Falls TextBox nocht sichtbar ist, ' jetzt ausblenden If txtEdit.Visible Then txtEdit.Visible = False End Sub So, das war jetzt erst einmal. Ab sofort verfügt Ihr MSFlexGrid-Control über eine AutoEdit-Funktion. Viel Spaß damit! |