Команда Accessbox VBA Listbox.Requery очищает ListItems
У меня есть форма доступа, где я хочу, чтобы пользователи выбирали AwardNumber. Когда они выбирают награду, соответствующие документы для этой награды отображаются в списке "Неполный" или "Полный". Затем я хочу, чтобы они могли перемещать элементы из одного списка в другой. ListBoxes являются одним выбором.
Вот бэкэнд:
Incomplete ListBox (говорит Unbound в дизайне) имеет 3 столбца. Столбец Bound равен 1, но 1-й и 3-й столбцы имеют ширину 0 и поэтому скрыты. В списке также есть следующий RowSource:SELECT DocTbl.DocID, DocTbl.DocTitle, DocTbl.DocLink
FROM DocTbl
WHERE ((DocTbl.Complete <> Yes) AND (DocTbl.AwardNumber = Forms!Select_Doc_To_Code!Award_CBox.Text))
ORDER BY DocTbl.DocID
(Полный ListBox имеет то же самое, кроме DocTbl.Complete <> Yes
, она имеет DocTbl.Complete = Yes
.)
Когда они выбирают AwardNumber в ComboBox, есть какой-то VBA, который выполняет следующее, чтобы заполнить списки, что работает, как и ожидалось: Me.Incompletes.Requery
Me.Completes.Requery
Две кнопки запускают код для "перемещения" предметов. Вот код для верхней кнопки, которая предназначена для "перемещения" документа из списка "Неполные" в список "Завершено" (т. Е. Путем установки значения "Завершить" в документе в "Да" и последующего запроса списков). В указанных строках все идет не так:
Sub Move_To_Complete_Click()
docID = Incompletes.Column(0, Incompletes.ListIndex)
Set Tbl = CurrentDb.TableRefs("DocTbl")
Set db = CurrentDb
db.Execute = "UPDATE DocTbl " & _
" SET DocTbl.Complete = Yes " & _
" WHERE DocTbl.DocID = " & docID
---->Me.Incompletes.Requery
---->Me.Completes.Requery
End Sub
Другими словами, запрос UPDATE работает (я вижу обновленные данные в таблице), но когда я пытаюсь запросить оба ListBox для их обновления, все элементы исчезают из обоих!. Кроме того, если я выберу другую награду в ComboBox, а затем повторно выберу ту же награду, списки снова заполнятся правильно, просто выполнив те же команды.Requery!
я пробовал Me.Refresh
, Me.Recalc
, Я также попытался установить RowSource снова. Интересно, это слишком рано? Я поставил точки останова и DoEvents, так что я не думаю, что это вопрос времени, но, может быть, это больше код, который нужно остановить, чтобы запустить для работы. Что не имеет смысла, потому что запрос это код.
Я знаю, что есть другие способы сделать это (я попробовал и потерпел неудачу с ними), но я действительно хотел бы знать, почему ЭТОТ способ не работает.
Заранее спасибо!!
1 ответ
Вы используете .Text
свойство, и, как предлагает DataWriter, вы не должны.
.Text
свойство доступно только тогда, когда поле имеет фокус (см. MSDN).
Потому что вы называете это в OnClick
событие для Move_To_Complete
кнопка, эта кнопка имеет фокус, и поэтому .Text
собственность недоступна.
Два обходных пути:
- использование
Award_CBox.SetFocus
прежде чем запрашивать - использование
Forms!Select_Doc_To_Code!Award_CBox.Value
использовать значение свойства. Обратите внимание, что предполагается, что связанный столбец совпадает с отображаемым столбцом.