状況: Windows 8 タブレットに展開する予定の Access 2010 データベースがあります。アプリのメイン フォームには Treeview コントロールが含まれています。ツリービューでノードを選択すると、選択したノード項目の詳細を表示/編集するために使用されるいくつかのサブフォームの 1 つの可視性が設定されます。はい/いいえのメッセージ ボックスと、各サブフォームの BeforeUpdate イベントに関するいくつかの基本的なコードがあります。そのため、サブフォームのレコードがダーティで、ユーザーがメイン フォームの任意の場所 (Treeview コントロールの任意の場所を含む) をクリックすると、このコードがトリガーされます。
問題: サブフォーム レコードがダーティで、ユーザーが Treeview コントロールの任意の場所をタップすると、メッセージ ボックスが表示されますが、アプリがビジーであるため操作できません。何をしているのかわかりませんが、タスク マネージャーで Access をシャットダウンするまでそのままです。Click イベント以外のコードは Treeview に添付されていません。これは、既存のノードの下の Treeview の空白に触れた場合でも発生します。
レコードが汚れていなければ、すべて正常に機能します。
レコードがダーティで、ユーザーがサブフォームの [保存] ボタンをクリックして BeforeUpdate イベントをトリガーした場合、すべて正常に機能します。
ユーザーが別のコントロールまたはメイン フォームの空のスペースをタップすると、BeforeUpdate イベントがトリガーされ、すべて正常に動作します。
マウスをタブレットに接続し、同じ一連の手順をタップの代わりにクリックして実行すると、すべて正常に動作します。
私はたくさんの検索をしましたが、これに関連するものを見つけることができませんでした.
これらの各サブフォームに存在する BeforeUpdate コードのサンプルを添付しました。これはかなり基本的なものですが、タップと Treeviews が気に入らない部分があるかもしれません。
Private Sub Form_BeforeUpdate(Cancel As Integer)
'If the form data has changed a message is shown asking if
'the changes should be saved. If the answer is no then
'the changes are undone
On Error GoTo BeforeUpdate_Error
If Me.Dirty Then
'Add PropertyID, LPParentNodeID and TreeNodeID if Record is new
If Me.NewRecord Then
Me.PropertyID = Me.Parent!PropertyID
Me.LPParentNodeID = Me.Parent!txtCurrKey
Me.TreeNodeID = DateDiff("s", Date, Now())
End If
'Display prompt to save the record
If MsgBox("The record has changed - do you want to save it?", _
vbYesNo + vbQuestion, "Save Changes") = vbNo Then
Me.Undo
End If
End If
'If the record is still dirty, then record the change in the Audit table
If Me.Dirty Then
Call AuditTrail(Me, InstanceID, PropertyID)
End If
BeforeUpdate_Exit:
Exit Sub
BeforeUpdate_Error:
MsgBox Err.Description
Resume BeforeUpdate_Exit
End Sub
2013/08/30 追加: 元の質問でデバッグ動作について言及するのを忘れていました。サブフォームの BeforeUpdate Sub で、実際の Sub エントリ ポイントからメッセージ ボックスのある If ステートメントまでの任意の行にブレークポイントを設定すると、コード ウィンドウは表示されますが、アプリは再びビジー状態になり、操作できません。どちらかのウィンドウ。前と同じように、この動作は呪われた Treeview コントロールをタップした場合にのみ発生します。