vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
NEU! sevCoolbar 3.0 - Professionelle Toolbars im modernen Design!  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   Impressum  | Datenschutz  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2024
 
zurück
Rubrik:    |   VB-Versionen: VB4, VB5, VB601.02.03
AutoEdit-Funktion für das MSFlexGrid

Auch wenn das FlexGrid-Control es nicht direkt unterstützt - mit ein paar Zeilen Code und einer zusätzlichen TextBox statten Sie das FlexGrid-Control mit einer AutoEdit-Funktion aus.

Autor:  Dieter OtterBewertung:     [ Jetzt bewerten ]Views:  1.537 
http://www.tools4vb.de/System:  Win9x, WinNT, Win2k, WinXP, Win7, Win8, Win10, Win11 Beispielprojekt 

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!