2013-08-29 3 views
4

Ситуация: У меня есть db Access 2010, предназначенная для развертывания на планшете Windows 8. Основная форма приложения содержит элемент управления Treeview. Выбор узла в Treeview устанавливает видимость одной из нескольких подформ, которые используются для просмотра/редактирования деталей выбранного элемента узла. У меня есть окно сообщения yes/no и некоторый базовый код события BeforeUpdate для каждой из подформ. Поэтому, когда запись на субформате грязная, и пользователь щелкает в любом месте основной формы (в том числе в любом месте элемента управления Treeview), этот код запускается.Treeview ведет себя по-разному при нажатии, чем при нажатии

Проблема: Когда запись подформы грязная, и пользователь вступает в действие в любом элементе управления Treeview, появляется окно сообщения, но с ним невозможно взаимодействовать, поскольку приложение занято. Выполняя то, что я не знаю, но он остается таким, пока Access не будет закрыт через диспетчер задач. Для Treeview нет кода, связанного с чем-либо, кроме события Click. Это происходит даже тогда, когда они касаются пробела в 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 

30.08.2013 Дополнение: Я забыл упомянуть поведение отладки в исходном вопросе. Когда я устанавливаю точку останова на Subform SubUpdate подформы в любой строке от фактической точки входа Sub до инструкции If с полем сообщения, появляется окно кода, но приложение снова становится занятым, и я не могу взаимодействовать с либо окно. Как и раньше, это поведение уникально для того, чтобы использовать этот проклятый элемент управления Treeview.

+0

Это звучит, как вы покрыли ваши базы достаточно хорошо. Вы можете попробовать использовать подпрограмму для вывода отладочных сообщений в текстовый файл, чтобы увидеть, где в вашем коде Access зависает, или последние процессы. Это утомительно, потому что вам понадобится строка кода отладки после почти каждой строки кода, который вы опубликовали. Но это может помочь вам понять, где происходит зависание, и затем вы можете попытаться найти творческое решение. – HK1

+0

Tedious меня не беспокоит. На мой взгляд, это связано с устранением неполадок. Но ваш комментарий напомнил мне, что я не поместил отладочное поведение в исходный вопрос. У меня есть сейчас. Считаете ли вы, что писать текст в текст может дать лучшее представление о том, где он висит? С вышеописанным поведением точки останова моя единственная подсказка заключалась в том, что пользователи видят это окно сообщения перед его смертью. – SherryMas

+0

Очень странно. Я бы сказал, что у меня много идей. Это звучит как какая-то ошибка в элементе управления ActiveX или где-то в Windows 8. – HK1

ответ

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 sub.

В этих подлодках, контролировать, будет ли дерево сделать что-либо при нажатии на:

public sub editMode(isEdit as boolean) 
    tree.enabled = (not isEdit) 
end sub 
Смежные вопросы