Hallo,
ich habe ein Formular, das an eine Tabelle gebunden ist, mit einem Listenfeld "lstJobs" zur Datensatzauswahl.
"lstJobs_AfterUpdate()" sorgt mittels recordsetclone, find und Me.bookmark für die Synchronisation zwischen Formular und Listenfeld. Funktioniert einwandfrei, z. B.
Private Sub cmdAufAnfang_Click()
If Me!lstJobs.ListCount > 0 Then
Me!lstJobs.SetFocus
Me!lstJobs.ListIndex = 0
End If
End Sub
setzt Liste und Formular auf den 1. Eintrag.
Mein Problem: Am Ende von Form_Load() sage ich
Private Sub Form_Load()
[...]
If Me!lstJobs.ListCount > 0 Then ' selber Code wie oben
Me!lstJobs.SetFocus
Me!lstJobs.ListIndex = 0 ' (*)
End If
End Sub
Hier wird zwar der 1. Eintrag der Liste selektiert, die Anweisung Me.bookmark = rs.bookmark in lstJobsAfterUpdate() löst nun aber Laufzeitfehler 2001 "Sie haben den vorherigen Vorgang abgebrochen" aus.
M. a. W.: Der Code funktioniert hinter einem CommandButton, nicht aber in Form_Load(). Noch komischer: Wenn ich auf die mit (*) markierte Zeile einen breakpoint setze und mit F8 die Anweisungen nacheinander ausführe, gibt es keinen Laufzeitfehler!
Ratlose Grüße
Stefan
PS: Habe beim Googeln den Tip gefunden, mit rs.MoveLast und rs.MoveFirst sicherzustellen, daß das Formular komplett geladen wurde. Hilft aber nüscht.
Hallo,
das ist nicht komisch, es sind lediglich beim (während des) Load-Ereignis noch nicht alle Steuerelemente geladen, was gerade passiert ...
Nimm statt des Load-Ereignisses das Form_Current-Ereignis um das Listenfeld zu synchronisieren.
Hallo,
Zitat von: DF6GL am Januar 27, 2012, 15:04:47
das ist nicht komisch, es sind lediglich beim (während des) Load-Ereignis noch nicht alle Steuerelemente geladen, was gerade passiert ...
grad rausgefunden: wenn man Form_Load etwas Zeit gibt, dann klappt's:
Wait(1000) ' wait() von http://dbwiki.net/wiki/; Angabe in Millisekunden
eingefügt vor der Zeile
Me!lstJobs.ListIndex = 0
-> kein Laufzeitfehler mehr.
Wait(500) reicht nicht, das finde ich schon etwas komisch. ;) Vor allem ist diese Lösung natürlich auch unbefriedigend, da ich ja nicht weiß, ob 1000 ms Wartezeit unter allen Umständen (Größe der Tabelle, Netzwerkauslastung, ...) ausreicht.
Zitat
Nimm statt des Load-Ereignisses das Form_Current-Ereignis um das Listenfeld zu synchronisieren.
Ich möchte das Formular über das Listenfeld steuern, deshalb scheidet das aus.
Viele Grüße
Hallo,
mit der Warterei handelst Du Dir nur Ärger ein...
Warum scheidet Form_Current aus??
Hallo,
optimal finde ich das mit wait() auch nicht.
Form_Current() scheidet meiner Meinung nach aus, weil ich das Formular durch das Listenfeld steuern will, nicht umgekehrt. Dazu muß ich "Me.bookmark = rs.bookmark" sagen. Das löst das Ereignis Form_Current aus, somit kann ich das nicht in Form_Current() machen. (?)
Viele Grüße
Hallo,
"Dazu muß ich "Me.bookmark = rs.bookmark" sagen."
Warum?
"Das löst das Ereignis Form_Current aus, somit kann ich das nicht in Form_Current() machen"
As kannst Du dort nicht machen? Dort mußt Du nur das Listenfeld synchronisiren, d. h. den Listenfeldentrag markieren, der als DS im Form angezeigt wird.
Um einen anderen DS anzuzeigen, den Du mit Hilfe des Listenfeldes auswählst, bzw. darin markierst,kannst Du das Klick-Ereignis des Listenfeldes benutzen, um den DS zu suchen und im Form anzuzeigen.
Hallo Franz,
ZitatWas kannst Du dort nicht machen?
Den Bookmark setzen (Me.Bookmark = rs.Bookmark). Das würde IMO dann aber auch wirklich keinen Sinn machen, da dadurch ja sowas wie eine Endlosschleife gestartet wird; - Current -> Bookmark -> Current usw.
Obwohl nicht ersichtlich ist wo er das jetzt macht, - im geposteten Code ist davon jedenfalls nichts zu sehen.
gruss ekkehard
Hallo,
Zitat von: Beaker s.a. am Januar 27, 2012, 22:39:15
ZitatWas kannst Du dort nicht machen?
Den Bookmark setzen (Me.Bookmark = rs.Bookmark). Das würde IMO dann aber auch wirklich keinen Sinn machen, da dadurch ja sowas wie eine Endlosschleife gestartet wird; - Current -> Bookmark -> Current usw.
Genau.
Zitat
Obwohl nicht ersichtlich ist wo er das jetzt macht, - im geposteten Code ist davon jedenfalls nichts zu sehen.
Er hatte es im Ausgangsbeitrag kurz erwähnt (2. Zeile). Es ist praktisch unverändert der Code, den Access erzeugt, wenn man mit dem Assistenten ein Listenfeld ins Formular einfügt und die Option "Datensatzauswahl" wählt. Hab den Code deshalb nicht explizit gepostet. Was zugegebenerweise ungeschickt war, da genau die Zeile "Me.Bookmark = rs.Bookmark" den Laufzeitfehler verursacht.
Viele Grüße
Stefan
Hallo,
und was ist jetzt Stand Deiner Dinge??
Hallo,
Zitat von: DF6GL am Januar 30, 2012, 15:42:17
und was ist jetzt Stand Deiner Dinge??
Bis vor ein paar Minuten: ratlos und verzweifelt. ;)
Inzwischen meine ich eine Lösung zu haben. Und zwar in sub Form_Load():
Me.Recordset.MoveLast
Me.Recordset.MoveFirst
Das soll dafür sorgen, daß das Formular komplett geladen wird, bevor man Me.Bookmark setzt. Funktioniert anscheinend und ist auch schneller als wait(1000). :)
Ich hatte im Ausgangsbeitrag geschrieben, daß genau dieses MoveLast/First nix nützt; das stimmt aber nur, wenn man das falsche recordset nimmt (das geklonte); wenn man das Formular-recordset nimmt, dann klappt's.
Viele Grüße
Hallo,
naja, wenn's geht...
trotzdem als Tipp nochmal mein Vorschlag:
Zitat
Dort (im Form_Current-Ereignis) mußt Du nur das Listenfeld synchronisieren, d. h. den Listenfeldentrag markieren, der als DS im Form angezeigt wird.
Um einen anderen DS anzuzeigen, den Du mit Hilfe des Listenfeldes auswählst, bzw. darin markierst, kannst Du das Klick-Ereignis des Listenfeldes benutzen, um den DS zu suchen und im Form anzuzeigen.