[VBA] Textbox on change event verliest form focus

Pagina: 1
Acties:

Vraag


Acties:
  • 0 Henk 'm!

  • BSeB
  • Registratie: Juni 2001
  • Laatst online: 22-09 06:31
Mijn vraag:
Ik heb voor mijn werkgever een uitgebreide Access frontend gebouwd (VBA dymische code & plug & play) gecombineerd met een MySQL backend. NU werkt dit allemaal top, maar heb hierin een aantal design dingetjes moeten bouwen die niet handig/makkelijk zijn.

Er zitten veel datagrids in waarbij gefilterd moet kunnen worden, zoals bijvoorbeeld bij excel (top row filter). Nu heb ik als start een continues form gemaakt waarbij de filter boxen in de header staan en de datagrid in de main form. Dit werkte niet. Overigens kan ik wel filteren, maar als je in een textbox typt dan wil ik realtime filteren. Op dit moment schiet de cursor na elke filteractie weg naar de datagrid. Geen probleem uiteraard, gewoon setfocus op de betreffende txtbox -> Niet dus. het lijkt alsof het scherm "freezed", de cursor is dan weg, als ik alt-tab naar een ander scherm en dan terug dan is de cursor er weer. Ook het klikken "naast of willekeurig op het form brengt de cursor weer tot leven/terug.

Momenteel heb ik dit opgelost door een subform in de form waarbij de header nog steeds de filters bevat, maar de dataset in de subform wordt weergegeven. Hiermee blijft de cursor wel bestaan. Het liefste wil ik hier van af, want het is een hels karwei om de steeds bij winjzigingen de alligment weer te vinden.

Relevante software en hardware die ik gebruik:
- Access 2010
- Mysql (niet belangrijk voor mijn vraag)

Wat ik al gevonden of geprobeerd heb
Dit is de code die ik gebruik voor de txtbox in een form, dit werkt dus OOK niet, heb gespeeld met Doevents, met cancelevent, maar alles met hetzelfde resultaat:
Visual Basic .NET:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
Option Compare Database
Dim rst As New ADODB.Recordset

Private Sub Form_Open(Cancel As Integer)
'Dim rst As New ADODB.Recordset
Dim FormSQLString As String

FormSQLString = "SELECT IDUpdateTool, " & vbCrLf & _
                                "    UniqueExecutionID, " & vbCrLf & _
                                "    FullName, " & vbCrLf & _
                                "    UpdateDateTimeStart, " & vbCrLf & _
                                "    UpdateDateTimeEnd, " & vbCrLf & _
                                "    UpdateStatus " & vbCrLf & _
                                "FROM GLSUpdateTool a " & vbCrLf & _
                                "ORDER BY UpdateStatus ASC;"



With rst
    Set .ActiveConnection = CurrentProject.Connection
    .CursorLocation = adUseClient
    .Source = FormSQLString
    .LockType = adLockOptimistic
    .CursorType = adOpenDynamic
    .Open
End With

If Not (rst.EOF And rst.BOF) Then
    Set Me.Recordset = rst
ElseIf ConnectRST = True Then
    Set Me.Recordset = rst
End If

'Set rst = Nothing

End Sub

Private Sub Text8_Change()
Me.Text8.value = Me.Text8.Text
UpdateFilter
'DoCmd.CancelEvent
Me.SetFocus
Me.Text8.SetFocus
'Me.SetFocus
'If (Me.Text8 Is Me.ActiveControl) Then Me!Text8.SelStart = Me!Text8.SelLength
'Me.SetFocus

Me.Text0.SetFocus
Me.Text8.SetFocus
Me.Text8.SelStart = Me.Text8.SelLength


'If (Me.Text8 Is Me.ActiveControl) Then Me!Text8.SelStart = Me!Text8.SelLength
End Sub
Function UpdateFilter()
'Dim rst As New ADODB.Recordset
Dim a As String
Dim ctlCurrentControl As Control
Dim strControlName As String


' Build a filter string based on user input
' Supplier Filter
With Me
    ' Mat Description filter
   
    
    ' Mat Description filter
    If Not IsNull(Me.Text8) And Me.Text8 <> "" Then
        a = a & " AND FullName LIKE '*" & Me.Text8 & "*'"
    End If
     
    'Set rst = Me.Form.Recordset.Clone

    With rst
       .Filter = adFilterNone
       If a <> "" Then
            .Filter = adFilterFetchedRecords
            .Filter = Right(a, Len(a) - 4)
            
       End If
    End With
    
    If rst.RecordCount = 0 Then
        Set Me.Form.Recordset = Nothing
    Else
        Set Me.Form.Recordset = rst
    End If
End With

'Set rst = Nothing
End Function


Doel is een singleform textfilterbox (heb natuurlijk veel meer filters, maar als dit concept werkt, dan kan ik weer verder)