4

状況: 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 コントロールをタップした場合にのみ発生します。

4

1 に答える 1

1

あなたができることは、サブフォームのそれぞれに一種の編集/保存構造を配置することです。これにより、サブフォームのコントロールは、編集がクリックされるまでロックされ、保存がクリックされると再度ロックされます。そう:

private sub bEdit()
    editMode true
end sub
private sub bSave()
    ...save logic
    editMode false
end sub
private sub editMode(isEdit as boolean)
    dim ctl as control
    for each ctl in me.controls
        if ctl.controltype is actextbox or ctl.controltype is accombobox then
            ctl.locked = (not isEdit)
        end if
    next
end sub

このアプローチでは、親フォームに editmode コントロールを追加するのは簡単な作業です。

me.parent.editmode isEdit

editmode 手順の最後まで。

親フォームでは、editMode は PUBLIC サブである必要があります。

このサブでは、クリックされたときにツリーが何かを行うかどうかを制御します。

public sub editMode(isEdit as boolean)
    tree.enabled = (not isEdit)
end sub
于 2013-11-06T03:06:46.027 に答える