使“DoCmd.GoToRecord”函数在子窗体上工作

Posted

技术标签:

【中文标题】使“DoCmd.GoToRecord”函数在子窗体上工作【英文标题】:Making "DoCmd.GoToRecord" function work on a subform 【发布时间】:2013-06-27 15:41:25 【问题描述】:

我一直在使用函数DoCmd.GoToRecord , , acNewRec 成功地在子表单中创建并移动到新记录(以表为源)。但是,当我尝试从父表单执行相同操作时,这不起作用。我尝试了不同的方法,包括:

Me.sbfrm_subform.Controls("ctrName").SetFocus
DoCmd.GoToRecord , , acNewRec

仅将焦点设置在控件(ctrName)上,但无法添加并转到新记录,或者

DoCmd.GoToRecord acDataForm, Me.sbfrm_subform.Form.Name, acLast

返回运行时错误 2489,“对象 'sbfrm_subform 未打开。”

【问题讨论】:

【参考方案1】:

尝试拆分操作:

Me.[sbfrm_subform].SetFocus
DoCmd.GoToRecord, , acNewRec

或者,您可以尝试在子表单中创建一个公共 Sub,因为它成为表单的一种方法,您可以使用它。 在最新版本的 Access 上使用它,您甚至可以尝试直接使用表单的记录集,例如 Me.Recordset.Movenext

【讨论】:

使用表单记录集而不是 DoCmd.GoToRecord 对我有用。得到相同的“表单未打开错误”。我最终使用了 Recordset.FindFirst 方法。谢谢!【参考方案2】:

尝试将代码放入子窗体中,然后从父窗体中调用它:

子表单代码:

Sub GoToNewRecord()
     DoCmd.GoToRecord , , acNewRec
End Sub

父表单代码:

Me.sbfrm_subform.GoToNewRecord

【讨论】:

这看起来是一个非常优雅的解决方案,但我无法让它发挥作用。我专门去子表单代码,把 Sub GotoNewRecord() 放在那里,然后尝试从主表单(我)访问它。它不识别子,并给出编译错误(预期:=)。我也将 sub 设为 Public,但没有帮助。我很好奇我做错了什么。 抱歉。括号可能是搞砸了。 :-(【参考方案3】:

正如 iDevlop 所指出的,您可以使用子表单的 Recordset 对象移动到新记录。但是,您不需要在子表单中创建公共子。您可以从主窗体中完成所有操作:

Me.[subform control name].SetFocus
Form_[subform form name].Recordset.AddNew

为了使用 Form_[form name] 语法,表单必须有一个 VBA 代码模块。如果表单没有,并且出于某种原因您反对创建一个空表单,那么您可以使用 Forms!MyForm.SubformControl.Form 语法。但是 Form_[Form Name] 更简单。

【讨论】:

【参考方案4】:

我在主窗体“On Current”中执行了以下事件过程:

Private Sub Form_Current()
    Me.SubformName.SetFocus
    Me.SubformName.Requery
    RunCommand acCmdRecordsGoToLast
    DoCmd.GoToRecord , , acNewRec
    Scan.SetFocus
End Sub

DoCmd 用于主窗体开始新记录。在此之前的一切都是将子表单设置为最后一条记录并重新查询它,以便数据是新鲜的。

【讨论】:

【参考方案5】:

这就是我解决问题的方法...

主窗体名称是 FRM_Trader_WorkSheet

子表单名称是 Frm_Trader_Worksheet_Sub

在我的主要表单的打开事件中,我编码如下;

Private Sub Form_Open(Cancel As Integer)
  Me.Frm_Trader_Worksheet_Sub.SetFocus   
  DoCmd.GoToRecord , , acLast    
  DoCmd.GoToRecord , , acNext    
End Sub

由于我没有在我的主窗体上输入任何数据,现在我的主窗体打开,重点是我的子窗体中的新记录。如果需要,我现在可以返回以前的记录,但我已准备好在加载主表单时输入新数据。

话虽如此,您只需在“数据”选项卡下设置子表单的属性“数据条目 = YES”即可获得相同的结果。唯一的区别是您将无法再访问以前的记录...

【讨论】:

【参考方案6】:

答案是使用以下行之一:

DoCmd.RunCommand acRecordsGotoNew
DoCmd.RunCommand acRecordsGotoNext
DoCmd.RunCommand acRecordsGotoPrevious
DoCmd.RunCommand acRecordsGotoFirst
DoCmd.RunCommand acRecordsGotoLast

取决于你想做什么。这在功能上与单击其中一个导航按钮(如果它们保持可见)相同。

如果您从父窗体调用其中之一,您可能首先必须使用以下行将焦点设置到子窗体上

Me.subform_name.SetFocus

不幸的是,似乎没有一个命令可以导航到记录集中的绝对位置,这将完成这组可能性。

【讨论】:

【参考方案7】:

对我有用的是: 在显示记录的表单中,我将焦点设置到我希望的字段并设置记录集。设置记录集后,我只使用记录集的 AddNew 函数。

Public Sub GoToNewRecord()
   Me.<myTextbox>.SetFocus

   Dim rcClone as Recordset
   Set rcClone = Me.Recordset

   rcClone.AddNew
End Sub

【讨论】:

【参考方案8】:
Private Sub anycotrl()
Me.yoursubformname_subform.SetFocus
DoCmd.GoToControl ("[anycontrolyouneed]")
DoCmd.GoToRecord , , acLast
End Sub

【讨论】:

请添加一些 cmets 以便声明您在做什么。 尝试在您的代码中添加一些描述。为什么是工作?你的代码是做什么的?【参考方案9】:

我发现了一个类似的问题(我认为)。使用链接表单的目的是在数据表视图中单击链接表单上的新行,并清除链接表单在父表单中的子表单中与之同步的记录。使用 DoCmd.GoToRecord , , acNewRec 工作但只有一次。找到的解决方案是先将焦点放在父表单上,然后再将焦点放在子表单上。我记得之前在某个地方找到过这个——总是先把焦点放在父级上,然后是子级。 ...... Carpe Dium ....

【讨论】:

以上是关于使“DoCmd.GoToRecord”函数在子窗体上工作的主要内容,如果未能解决你的问题,请参考以下文章

访问当前记录上的 VBA 打开表单

QT在子窗体中控制父窗体

在子窗体之前打开主窗体时出错

C# winform怎么实现子窗体关闭时刷新父窗体数据

使用当前记录字段值创建新记录

C# 在子窗体调用父窗体的值(转)