点击时Treeview的行为与点击时不同

时间:2013-08-29 21:14:54

标签: vba treeview touch access-vba ms-access-2010

情况:我有一个Access 2010数据库,可以部署在Windows 8平板电脑上。该应用程序的主要形式包含Treeview控件。在Treeview上选择节点可设置用于查看/编辑所选节点项详细信息的多个子表单之一的可见性。我有一个是/否消息框和每个子表单的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

08/30/2013补充:我忘记在原始问题中提及调试行为。当我在从实际Sub入口点到带有消息框的If语句的任何行上的子窗体的BeforeUpdate Sub上设置断点时,代码窗口出现但应用程序再次变得繁忙,我无法与之交互无论是窗户。就像之前一样,这种行为对于挖掘那些被诅咒的Treeview控件来说是独一无二的。

1 个答案:

答案 0 :(得分: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