Neuigkeiten:

Ist euer Problem gelöst, dann bitte den Knopf "Thema gelöst" drücken!

Mobiles Hauptmenü

Selektion von Einträgen in in einem Listfeld aufheben

Begonnen von DerSolide, April 23, 2025, 03:27:22

⏪ vorheriges - nächstes ⏩

DerSolide

Hallo,

ich habe ein Formular mit ca. 50 Steuerelementen (Listenfelder, Kombinationsfelder, Textfelder, Checkboxen, etc.) welche zur Dateneingabe/-aktualisierung dienen.

In einem Listenfeld sind Dateinamen aufgelistet, aus dem über eine Schaltfläche "Hinzufügen" Dateinamen hinzugefügt und über eine Schaltfläche "Entfernen" ausgewählte Dateien in demselben Listenfeld (Multiselect ist möglich) entfernt werden sollen. Dabei ist die Schaltfläche "Entfernen" nur aktiviert, wenn mindestens 1 Dateieintrag ausgewählt ist.

Problem beim Abbruch des Löschvorgangs:
Sollte sich der Benutzer nun während der Eingabe entscheiden, bereits ausgewählte Dateien im Listenfeld nicht zu löschen und sich stattdessen einem anderen Steuerelement zuwenden, bleiben diese Selektierung auch optisch erhalten.

Das LostFocus-Ereignis des Listenfeldes würde sich mittels des Aufruf's einer Prozedur (welche die ausgewählten Einträge wieder rückgängig macht und die Schaltfläche "Löschen" deaktiviert - ist bereits implementiert) anbieten, allerdings hebt sich dann auch die Dateiauswahl in dem Listenfeld auf, wenn die Dateinamen tatsächlich aus dem Listenfeld entfernt werden sollen!
Hier beißt sich die Katze in den eigenen Schwanz.

Eine - sehr aufwendige - Möglichkeit, das Problem zu lösen, wäre bei jedem anderen Steuerelemnt des Formulars (außer der Schaltfläche "Löschen") das GotFocus-Ereignis des jeweiligen Steuerelements dazu zu verwenden und in jeder die Prozedur aufzurufen.

Frage:
Ich hegte die Hoffnung, dass im Formular - in dem die ganzen Steuerelemente vorhanden sind - es ein Ereignis gibt, welche beim Wechsel von einem Steuerelement zum nächsten aufgerufen wird, habe aber kein entsprechendes gefunden.

Kenn vielleicht jemand von Euch einen "eleganteren" Weg, das Problem zu lösen? 

Vielen Dank im Voraus.


Schöne Grüße,
Christian

Josef P.

#1
Hallo!

Ein Formular-Ereignis, dass den Wechsel von Steuerelement X zu Y meldet, gibt es nicht.
Du könntest eigene Klassen dafür verwenden, um LostFocus/GetFocus der Steuerelemente zentral bereitzustellen.

Nur so als Idee: Vielleicht ist ein zweckmäßiger den Ablauf so zu gestalten, dass die Eingabereihenfolge keine Rolle spielt.

Oder falls die Listbox unbedingt die letzte Auswahl sein muss: was wäre, wenn dann die Eingabe 2-stufig wäre?
1. Stufe: Dateneingabe in x Steuerelemente + Bestätigung zum "Weiterschalten" zur Dateiauswahl.
2. Stufe: Listbox mit Dateien + Schaltfläche für Abschluss (z. B. in einer extra Seite auf einem Tab control)

=> Wenn man dann im Register auf die 1. Seite zurückblättert, hast du dein Ereignis, um die Listbox einzustellen.

Gruß
Josef


Bitsqueezer

Hallo,

solche Automatismen sind aus Usersicht immer problematisch. Wenn er nun ein anderes Control nur versehentlich angeklickt hat, ist die mühsam getroffene Auswahl in der Listbox wieder weg.
Ich würde einfach einen Button einbauen, um die Auswahl bei Bedarf durch den User aufheben zu lassen bzw. die Einträge zu entfernen.

Du könntest natürlich die Control-Events gesammelt über Klassenmodule abfragen, so daß man nicht für jedes Control eine eigene Event-Prozedur braucht. Wäre aber mit Kanonen auf Spatzen geschossen für einen eher fragwürdigen Komfortgewinn, den der User u.U. als Ärgernis empfindet.

Gruß

Christian

DerSolide

#3
Hallo Josef und Christian,

vielen Dank für die Information und Anregungen.

Ein eigenes Klassenmodul wäre wirklich die "Kanonen"-Lösung. Den Spass habe ich mir einmal vor Jahren - in ähnlicher Form - unter VB angetan ... nie wieder.

Mit der Idee der Umstrukturierung der Eingabe kann ich mich schon eher anfreunden.


Schöne Grüße,
Christian

Knobbi38

Hallo Christian,

was hindert dich daran, die Indexe der selektierten Items temporär in einem Array im LostFocus Ereignis zwischenzuspeichern und dieses Array dann im Klick Ereignis des Entfernen-Buttons auszuwerten? Dann könntest du die Selektion beim Verlassen immer löschen.

Gruß Knobbi38



PhilS

Zitat von: DerSolide am April 23, 2025, 03:27:22Sollte sich der Benutzer nun während der Eingabe entscheiden, bereits ausgewählte Dateien im Listenfeld nicht zu löschen und sich stattdessen einem anderen Steuerelement zuwenden, bleiben diese Selektierung auch optisch erhalten.
Was ist denn eigentlich genau dein Problem damit?
Der Benutzer nimmt eine Selektion vor. Diese bleibt auch weiterhin erhalten, wenn der Benutzer sie nicht sofort verwedet.
Das ist ist doch so eigentlich gut und sinnvoll.
Neue Videoserie: Windows API in VBA

Klassische CommandBars visuell bearbeiten: Access DevTools CommandBar Editor

DerSolide

Hallo PhilS,

Zitat von: PhilS am April 23, 2025, 11:11:31Der Benutzer nimmt eine Selektion vor. Diese bleibt auch weiterhin erhalten, wenn der Benutzer sie nicht sofort verwedet.
Das ist ist doch so eigentlich gut und sinnvoll.
Das liegt im Auge des Betrachters. Ich persönliche versuche immer eine Eingabemaske so zu entwerfen, dass selbst der DAU keinen Schaden anrichten kann.

In meinem Fall besteht immer die Möglichkeit, dass bei einer falschen oder unerwünschten Auswahl die dann ja immer noch aktivierte "Löschen"-Schaltfläche gedrückt wird .. und schon ist das Malheur - trotz der nachgeschalteten Sicherheitsabfrage, die aber nach dem 10-ten Datensatz erfahrungsgemäß sowieso keiner mehr liest - passiert.

Schöne gGrüße,
Christian

Beaker s.a.

Bleibt immer noch die, für den User nervige, Rückfrage pro ausgewähltem
Eintrag.
Alles, was geschieht, geschieht. - Alles, was während seines Geschehens etwas anderes geschehen lässt, lässt etwas anderes geschehen. - Alles, was sich selbst im Zuge seines Geschehens erneut geschehen lässt, geschieht erneut. - Allerdings tut es das nicht unbedingt in chronologischer Reihenfolge.
(Douglas Adams, Mostly Harmless)

DerSolide

Hallo Beaker,

korrekt, aber das war so gewünscht und ist nicht so schlimm wie es sich anhört, da das Löschen einzelner Einträge nur

  • beim Anlegen eines neuen Datensatzes, für den Fall, dass man versehentlich eine falsche Anlage hinzugefügt hat oder
  • bei der Datenpflege, wenn eine Datei des Datensatzes aktualisiert werden muss, also - wenn überhaupt - ein Mal im Jahr)

zum Tragen kommt. Zudem hat nicht jeder Datensatz auch Dateien als Anlage, d.h. im Listenfeld befinden sich dann gar keine Einträge.

Die Datensätze selbst sind in deren Änderungsverhalten nicht sehr dynamisch, es wir hauptsächlich die Filterfunktion benötigt. um nach verschiedenen Kriterien Listen zu erstellen.

Schöne Grüße,
Christian

DerSolide

Hallo knobbi38,

irgendwie ist mir Dein Beitrag durch die Finger geschlüpft.

Zitat von: knobbi38 am April 23, 2025, 11:07:12was hindert dich daran, die Indexe der selektierten Items temporär in einem Array im LostFocus Ereignis zwischenzuspeichern und dieses Array dann im Klick Ereignis des Entfernen-Buttons auszuwerten? Dann könntest du die Selektion beim Verlassen immer löschen.

Das Problem dabei ist, dass wenn keine selektierten Einträge im Listenfeld mehr vorhanden sind,  auch der Entfernen-Button - wie eingangs erwähnt - deaktiviert ist.

Schöne Grüße,
Christian

Knobbi38

Hallo Christian,

du kannst doch prüfen, ob beim Verlassen der Listbox Einträge selektiert sind und damit deinen Button steuern. Im Übrigen muß der gar nicht getoggelt werden. Wenn keine Einträge selektiert sind, kann auch nichts gelöscht werden, ein Klick hat dann einfach keine Reaktion.

Gruß Knobbi38
 

DerSolide

#11
Hallo Knobbi38,

ja, das wäre eine Möglichkeit, wo auch ein DAU keinen Schaden anrichten kann  ;) .

Danke für den Tipp, ich war zu sehr auf die Optik als auf die Funktion fixiert.

Schöne Grüße,
Christian.