none
Selektieren von List- und Comboboxwerten in Acc2007

    Frage

  • Hallo,

    in einer mit Access 2003  entwickelten Anwendung (adp) gibt es seit der Umstellung beim Kunden auf Office 2007 ein merkwürdiges Verhalten. Auf einem Formular befinden sich u.a. eine Listbox, die mit hierarchischen Daten gefüllt wird der Art

    Order-Nr   Liefer-Nr  HU

    12345
                   6789
                                  2

    Ein Rechtsklick auf einen Eintrag öffnet ein dynamisch erstelltes Kontextmenü, über das z.B. neue Liefernummern über ein Popup-Formular eingetragen werden können. Nach dem Schließen des Popup-Formulars, das Werte direkt in die DB (SQL server 2005) schreibt, werden die aktualisierten Werte neu geladen, in einen String konvertiert und der Listbox als Recordsource übergeben. Die aktualisierten Werte werden auch korrekt angezeigt.

    Danach kann ich aber keinen Listbox-Eintrag mehr selektieren. Schlimmer noch, auch Combobox-Einträge, die mit diesem Vorgang gar nichts zu tun haben, sind nicht mehr selektierbar bzw. die Combobox aktualisiert nicht mehr.

    Datengrundlage des Formulars ist ein selbst erstelltes Objekt. Änderungen - mit Ausnahme der o.g. Nummern in der Listbox - werden explizit programmatisch zurück geschrieben. Die Änderung z.B. eines Comboboxwerts wird zunächst in das Objekt geschrieben und erst bei Speicherung des Objekts zurück in die Datenbank.

    Das auftretende Problem lässt sich nur dadurch beheben, dass die Anwendung komplett geschlossen und neu gestartet wird. Ein Schließen des Formulars und neu laden bringt nichts.

    Für jeden Tipp bin ich dankbar.

     

    Viele Grüße,

    Michael Schörner

    Donnerstag, 18. November 2010 12:16

Antworten

  • Hallo allerseits,

    da dieses merkwürdige Verhalten weder erklärbar noch zu beseitigen war, habe ich mich entschlossen, die Listbox durch ein Treeview zu ersetzen. Für den Anwender ändert sich kaum etwas. Das Kontextmenü wird auf die gleiche Weise weiter benutzt. Und...

    ...keinerlei Probleme mehr!

     

    Vielen Dank für alle, die sich wie ich den Kopf darüber zerbrochen haben.

     

    Viele Grüße und eine gute Nacht,

    Michael Schörner

    Donnerstag, 18. November 2010 20:13

Alle Antworten

  • hallo Michael,

    als erstes solltest du mal im Direktfenster den Focus auf deine Liste setzen

    lstDaten.SetFocus

    Und schauen ob es dann geht. Auch solltest du mal dort abfragen ob es gesperrt ist

    ?lstDaten.Enabled
    ?lstDaten.Locked

    Wenn das alles nicht hilft: Hast du unsichtbare Schaltflächen? Ist die ListBox die Standardlistbox oder ein ActiveX? Wie sieht der involvierte Code aus? Vom Neuanlegen bis zum Reload?


    Microsoft MVP Office Access
    https://mvp.support.microsoft.com/profile/Stefan.Hoffmann
    Donnerstag, 18. November 2010 12:26
    Moderator
  • Hallo Stefan,

    enabled = Wahr
    locked = Falsch

    Die Listbox reagiert, als wären keine Daten bzw. keine Zeilen vorhanden. Ein Rechtsklick liefert ein Kontextmenü mit dem Eintrag eine neue Order anzulegen. Dies wäre korrekt, wenn die Listbox komplett leer wäre und ich klicke hinein.

    Ich werte das Ereignis MouseDown aus. Darin wird u.a. abgefragt, ob ein Eintrag ausgewählt ist. Das Auswählen geht nur leider nicht.

    ...
    If Me.OrderNr.ItemsSelected.Count > 0 Then
      ' wertet die Zeile aus
      Call MenueErstellen(parent, id, typ, OrderNr, LieferNr, HuNr)
      CommandBars("Orders").ShowPopup
    Else
      typ = order
      Call MenueErstellen(0, 0, typ)
      CommandBars("Orders").ShowPopup
    End If
    ...

     Ich kriege maximal den Else-Zweig, da ich keine Zeile selektieren kann.

    MenueErstellen bastelt je nach übergebenen Daten das Kontextmenü zusammen. Bspw. kann ich dann eine neue Order anlegen:

    Public Function mnuNewOrder()
      DoCmd.OpenForm "frmOrdersByAuftrag", , , , , acDialog, Me.A_ID
      ' Öffnet einen Dialog zum Eintragen einer Order-Nr. Wird sofort in die DB geschrieben
      Call m_objAuftragsmanager.RefreshOrderList(m_objAuftrag)
      ' m_objAuftragsmanager ist ein BAPI-Objekt, das alle Vorgänge rund um Aufträge handelt. m_objAuftrag ist ein BOM-Objekt, das einem Auftrag entspricht
      ' Die Funktion RefreshOrderList holt Daten aus der DB und gibt einen String zurück, der als RecordSource für die Listbox dient
      Me.OrderNr.RowSource = m_objAuftrag.OrderLieferungList
    End Function

    Jetzt wird der Fokus an das Formular bzw. die Listbox zurückgegeben, und hier beginnt das Dilemma.

    Bevor ich´s vergesse: Nachdem die Listbox aktualisiert worden ist, erscheint oben links im Access-Fenster ein mehrerer Zentimeter langer und etwa ein Zentimeter breiter schwarzer Balken, der nach einer Weile wieder verschwindet. Sieht aus wie ein Artefakt nach einer Bildschirmaktualisierung.

    Viele Grüße,

    Michael Schörner

    Donnerstag, 18. November 2010 13:11
  • Hallo Michael,

    teste mal, ob es geht, wenn dein PopUp aufgeht, aber keine weiteren Methoden wie mnuNewOrder() aufruft.


    Microsoft MVP Office Access
    https://mvp.support.microsoft.com/profile/Stefan.Hoffmann
    Donnerstag, 18. November 2010 13:44
    Moderator
  • Hallo Stefan,

    wenn ich das Kontextmenü öffne und ohne Aktion wieder schließe, funktioniert es. Rufe ich eine Funktion auf, füge aber weder etwas hinzu noch ändere ich etwas, funktioniert es nicht mehr.

    Wenn ich dann im Direktfenster OrderNr.RowSource abfrage, erhalte ich - NICHTS - obwohl die Daten korrekt angezeigt werden. Ebenso bei ControlSource.

    Noch merkwürdiger wird es, wenn ich das Formular dann in der Entwurfsansicht öffne und versuche im Eigenschaftenblatt einen Wert zu ändern, den ich aus einem Dropdown-feld auswähle - das geht nämlich genauso wenig wie auf dem Formular. Das geht ebenfalls erst wieder, nachdem ich die Anwendung geschlossen und wieder geöffnet habe. Anscheinend hat sich da grundlegend etwas aufgehängt.

    Donnerstag, 18. November 2010 14:24
  • hallo Michael,

    sounds weird. Erzeuge mal ein neues Projekt und importiere alle Formulare, Berichte und Module, nicht das hier einfach bloß Code-Korruption vorliegt.

    Ansonsten denke ich, das du dir peinlichst genau deine Klassenmodule anschauen mußt, ob diese auch alle sauber sind. Z.b.

    Kein Dim mit As New, alle Recordsets mit Close schließen, alle Objekte freigeben, d.h. Set obj = Nothing.

    Eventuell liegt der Fehler aber auch in der Art, wie du im PopUp deine Methoden aufrufst.


    Microsoft MVP Office Access
    https://mvp.support.microsoft.com/profile/Stefan.Hoffmann
    Donnerstag, 18. November 2010 14:35
    Moderator
  • Hallo Stefan,

    neues Projekt erzeugt, alles importiert = gleiches Ergebnis.
    Ich habe die Listbox gelöscht und neu erstellt = gleiches Ergebnis.

    Die Funktion MenueErstellen sieht folgendermaßen aus

    Private Sub MenueErstellen(ByVal parent As Long, ByVal id As Long, ByVal typ As Art, Optional ByVal OrderNr As String = "", _
         Optional ByVal LieferNr As String = "", Optional ByVal HuNr As String = "")
        Dim cbr As CommandBar
        Dim cbb As CommandBarButton

        Set cbr = KontextmenueHinzufuegen("Orders", True)

        If typ = Lieferung Then
          Set cbb = SchaltflaecheHinzufuegen(cbr, "Neue Lieferung zur Order " & OrderNr, "=mnuNewLiefer()", "Neue Lieferung")
          Set cbb = SchaltflaecheHinzufuegen(cbr, "Order ändern", "=mnuChangeOrder()", "Order ändern")
          Set cbb = SchaltflaecheHinzufuegen(cbr, "Order " & OrderNr & " löschen", "=mnuDeleteOrder()", "Order löschen")
        ElseIf typ = order Then
          Set cbb = SchaltflaecheHinzufuegen(cbr, "Neue Order", "=mnuNewOrder()", "Neue Order")
        Else
          Set cbb = SchaltflaecheHinzufuegen(cbr, "Lieferung ändern", "=mnuChangeLieferung()", "Lieferung ändern")
          Set cbb = SchaltflaecheHinzufuegen(cbr, "Lieferung " & LieferNr & " löschen", "=mnuDeleteLieferung()", "Lieferung löschen")
          Set cbb = SchaltflaecheHinzufuegen(cbr, "HU bearbeiten", "=mnuChangeLieferung()", "Neue HU")
        End If

        Set cbb = Nothing
        Set cbr = Nothing
    End Sub

    Die Funktion SchaltflaecheHinzufuegen sieht folgendermaßen aus:

    Public Function SchaltflaecheHinzufuegen(cbr As Object, ByVal strBeschriftung As String, _
         ByVal strAktion As String, Optional strTooltiptext As String, _
        Optional lngsymbol As Long, Optional bolNeueGruppe As Boolean) As CommandBarButton

        Dim objResult As CommandBarButton

        Set objResult = cbr.Controls.Add(msoControlButton)

        With objResult
          .Caption = strBeschriftung
          .TooltipText = strTooltiptext
          .OnAction = strAktion
          .FaceId = lngsymbol
          .BeginGroup = bolNeueGruppe
        End With

        Set SchaltflaecheHinzufuegen = objResult
        Set objResult = Nothing

    End Function

     

    Unter Access 2003 lief die ganze Sache völlig problemlos. Ich habe eine andere weit komplexere Anwendung (auch adp) jüngst ohne größere Zickereien in eine Office 2007-Umgebung portiert, deren Formulare z.T. mit einem weit exzessiveren Einsatz von Controls aufwarten. Auch dort kommen dynamisch erstellte Menüs zum Einsatz (der Code oben ist aus diesem Projekt entlehnt). Bislang gab´s keine Klagen.

     

    Nachtrag:

    Ich habe zu Beginn des OrderNr_MouseDown ein OrderNr.Requery eingebaut und kriege jetzt, wenn ich etwas geändert habe und in die Listbox klicke die Fehlermeldung, ich möge doch bitte die Daten erst speichern, bevor ich sie neu abrufe.

    Donnerstag, 18. November 2010 15:06
  • Hallo allerseits,

    da dieses merkwürdige Verhalten weder erklärbar noch zu beseitigen war, habe ich mich entschlossen, die Listbox durch ein Treeview zu ersetzen. Für den Anwender ändert sich kaum etwas. Das Kontextmenü wird auf die gleiche Weise weiter benutzt. Und...

    ...keinerlei Probleme mehr!

     

    Vielen Dank für alle, die sich wie ich den Kopf darüber zerbrochen haben.

     

    Viele Grüße und eine gute Nacht,

    Michael Schörner

    Donnerstag, 18. November 2010 20:13