none
Treeview: checked=true bereits beim Öffnen des Formulars anzeigen

    Frage

  • Hallo zusammen

    Habe folgendes Problem mit ActiveX-Treeview 6.0 in Access 2013:

    Ich möchte in einem Treeview alle Datensätze aus einer Tabelle anzeigen lassen (2 Ebenen). Zusätzlich soll ein Kästchen vor den Datensätzen erscheinen. Falls Informationen zum Datensatz in einer anderen Tabelle vorhanden sind, soll das Kästchen  im Baum angekreuzt sein. Irgendwie kriege ich es nicht hin, dass die Kreuze bereits beim ersten Öffnen des Formulars angezeigt werden. Es funktioniert erst, nachdem ich das Formular später von Hand (oder mit Prozedur) aktualisiere, oder auch zu einem anderen Datensatz wechsle (Wenn das Formular vorher bereits in der Entwurfsansicht geöffnet war, klappts jedoch auch). Ist das ein Bug oder habe ich einen Fehler in den Prozeduren oder ein Timing-Problem? (Habe sowohl Form_Load wie auch Form_Current erfolglos probiert. Vielleicht wäre eine Idee das Formular im Hintergrund zuerst in der Entwurfsansicht zu öffnen, jedoch funktioniert das mit dem Runtime wohl nicht.

    Hier mein Listing:

    Dim objTreeview As Object
    Dim objNode As node
    Dim db As Database
    Dim abteilung As Recordset, rs As Recordset
    Dim s As String
    Set objTreeview = Me.TreeTeilnehmer.Object
    Set db = CurrentDb()
    Set abteilung = db.OpenRecordset("SELECT ID, Stammklasse, [KLP Stammklasse], Nachname, Vorname FROM Teilnehmer " & _
        "ORDER BY Stammklasse, Nachname, Vorname")
    Set rs = db.OpenRecordset("SELECT * FROM [Projekte-Teilnehmer] ORDER BY ID_Projekt", dbOpenDynaset)
        
    objTreeview.Font.Size = 11 'Schriftgrösse

    s = ""
    p = 3

    objTreeview.Nodes.Clear 'alle Knoten löschen

    'abteilungen einlesen
    While Not abteilung.EOF
        If Not abteilung!Stammklasse & ": " & abteilung![KLP Stammklasse] = s Then
            Set objNode = objTreeview.Nodes.Add(, , "p_" & abteilung!Stammklasse & ": " & abteilung![KLP Stammklasse], abteilung!Stammklasse & ": " & abteilung![KLP Stammklasse], 2)
            s = abteilung!Stammklasse & ": " & abteilung![KLP Stammklasse]
            'objNode.Bold = True 'abteilungen fett markieren
        End If
        'teilnehmer einlesen
        Set objNode = objTreeview.Nodes.Add("p_" & abteilung!Stammklasse & ": " & abteilung![KLP Stammklasse], tvwChild, abteilung!ID, abteilung!Nachname & " " & abteilung!Vorname, 1)
        rs.FindFirst "ID_Projekt = " & p & " AND ID_Teilnehmer LIKE '" & abteilung!ID & "'"
        If Not rs.NoMatch Then
            'objNode.Selected = True
            objNode.Checked = True 'markieren
        End If
        abteilung.MoveNext
    Wend

    Herzlichen Dank im Voraus für die Hilfe

    Paul

    Samstag, 5. April 2014 13:01

Antworten

  • Hallo Paul,

    das Problem kommt mir sehr vertraut vor. Das besteht schon seit Access 2000.

    Ich habe mir Dein Listing nicht im Detail angeschaut, aber ich gehe davon aus, dass Du bereits geprüft hast, dass beim Öffnen des Formulars, das Property Checked der Knoten wirklich auf True gesetzt wird und lediglich nicht angezeigt wird.

    Wir haben haben dieses Problem auf einem wenig schönen aber pragmatischen Weg umgangen. Dieser Funktioniert bei uns schon seit über 10 Jahren Jahren mit den verschiedenen Access Versionen:

    Load Ereignishandler des Formulars rufen wir eine Methode (-> BuildTree) auf, welche die Knoten des Formulars erstmal erstellt.

    Eine Weitere Funktion (-> InitTree) ist verantwortlich, die Häkchen einzelner Knoten zu setzen. Da das Ergebnis dieser Funktion nicht zur Anzeige kommt, wenn diese ebenfalls im Load oder Open Ereginishandler des Formulars aufgerufen wird, nutzen wir einen Timer, um dies etwas zeitversetzt/nachgelagert durchzuführen.

    In etwa in dieser Art:

    Private Sub Form_Load()
    
       BuildTree
       Me.TimerInterval = 50
    
    End Sub
    
    
    
    Private Sub Form_Timer()
    
        Me.TimerInterval = 0
        InitTree
    
    End Sub
    
    
    
    Private Sub BuildTree()
    
        ....
        mTreeView.Nodes.Add ....
        ....
    
    End Sub
    
    
    
    Private Sub InitTree()
    
        ....
        tTReeNode.Checked = True
        ....
    
    End Sub
    Die 50ms für das TimerIntervall sind sind einfach pauschal gewählt: Möglichst Kurz, aber dass es noch funktioniert.

    Nicht sehr schön mit dem TimerInterval aber funktioniert für uns. Villeicht hilft Dir dieser Ansatz ja auch.

    Grüße!

    Stefan

    Mittwoch, 9. April 2014 07:16

Alle Antworten

  • Hallo Paul,

    das Problem kommt mir sehr vertraut vor. Das besteht schon seit Access 2000.

    Ich habe mir Dein Listing nicht im Detail angeschaut, aber ich gehe davon aus, dass Du bereits geprüft hast, dass beim Öffnen des Formulars, das Property Checked der Knoten wirklich auf True gesetzt wird und lediglich nicht angezeigt wird.

    Wir haben haben dieses Problem auf einem wenig schönen aber pragmatischen Weg umgangen. Dieser Funktioniert bei uns schon seit über 10 Jahren Jahren mit den verschiedenen Access Versionen:

    Load Ereignishandler des Formulars rufen wir eine Methode (-> BuildTree) auf, welche die Knoten des Formulars erstmal erstellt.

    Eine Weitere Funktion (-> InitTree) ist verantwortlich, die Häkchen einzelner Knoten zu setzen. Da das Ergebnis dieser Funktion nicht zur Anzeige kommt, wenn diese ebenfalls im Load oder Open Ereginishandler des Formulars aufgerufen wird, nutzen wir einen Timer, um dies etwas zeitversetzt/nachgelagert durchzuführen.

    In etwa in dieser Art:

    Private Sub Form_Load()
    
       BuildTree
       Me.TimerInterval = 50
    
    End Sub
    
    
    
    Private Sub Form_Timer()
    
        Me.TimerInterval = 0
        InitTree
    
    End Sub
    
    
    
    Private Sub BuildTree()
    
        ....
        mTreeView.Nodes.Add ....
        ....
    
    End Sub
    
    
    
    Private Sub InitTree()
    
        ....
        tTReeNode.Checked = True
        ....
    
    End Sub
    Die 50ms für das TimerIntervall sind sind einfach pauschal gewählt: Möglichst Kurz, aber dass es noch funktioniert.

    Nicht sehr schön mit dem TimerInterval aber funktioniert für uns. Villeicht hilft Dir dieser Ansatz ja auch.

    Grüße!

    Stefan

    Mittwoch, 9. April 2014 07:16
  • Hallo Stefan

    Vielen Dank für den interessanten und tollen Lösungsansatz. Das Problem habe ich inzwischen lösen können: Das Formular habe ich nochmals von Grund auf neu aufgebaut und die Treeview-ocx nochmals neu un- und dann registriert. Und siehe da, nun klappts auch mit dem Timing. Ist doch immer wieder schön auf solche undokumentierten Dinge zu stossen ;) Halbfunktionierende Registrierungen durch irgendwelche Updates liebe ich.....

    Paul

    Mittwoch, 9. April 2014 07:45