Office中国论坛/Access中国论坛

标题: “我跳出来又跳进去,打我呀笨蛋”——浅谈setfocus方法 [打印本页]

作者: roych    时间: 2020-10-9 12:22
标题: “我跳出来又跳进去,打我呀笨蛋”——浅谈setfocus方法
一个叫“lingjiang”的版友在国庆期间提出了一个主子窗体切换的问题,希望在查询和录入之间进行切换。不知道为什么,这让我想起了这个图。
[attach]63900[/attach]
好吧,这种需求确实有些欠揍。事实上,子窗体控件是作为一个整体来看待的,如果非要跳到它内部的某个字段里,我只想说,“这辈子都没听到这么奇怪的要求”。
[attach]63901[/attach]
好吧,满足你!
这里分两部分。一是从主窗体控件跳到子窗体的控件,二是从子窗体控件跳到主窗体的控件(废话)。其中第二部分相对简单些,直接用parent获取控件的父窗体(主窗体),进而引用父窗体的控件,加上获取焦点方法(setfocus)基本就完事了。代码可以在更新后事件里写入。

下面详细讲解下第一部分的实现思路。
首先,子窗体是数据表,因此跳转的时候需要考虑到行(记录)的问题。而这就不得不提下记录集的findfirst方法了。这里用了DAO记录集(ADO的话,好像是find方法,但由于窗体记录集属于DAO记录集,所以就不用ADO了)。
其次,还需要确保跳转的地方是子窗体的控件。那么问题来了,输入后,按下enter键时,如果默认tab顺序不是子窗体,而是别的控件,会怎么样呢?经测试,按下enter键时,会跳转到tab顺序的下一个控件,而不是执行代码中的setfocus。因此这个细节需要改回来。
至此,大致代码可以写了:
  1. '主窗体主要代码
  2. Private Sub 学籍号_AfterUpdate()
  3.     Dim rst As DAO.Recordset
  4.     Set rst = Me.查询2子窗体.Form.Recordset
  5.     rst.FindFirst "学籍号='" & Me.学籍号 & "'"
  6.     Me.查询2子窗体.Requery
  7.     Forms!按班级查询!查询2子窗体!Text8.SetFocus
  8. End Sub
  9. '子窗体主要代码
  10. Private Sub Text8_AfterUpdate()
  11.     Me.Parent.学籍号.Value = Null
  12.     Me.Requery
  13.     Me.Parent.学籍号.SetFocus
  14. End Sub
复制代码
附件如下
[attach]63902[/attach]
其他问题及改进意见:
1、上面子窗体Requery部分是为了方便在子窗体更新后,重新返回全部记录集(findfirst只返回一条记录),以便用户重新选择的一个人性化处理。
2、可以加上查不到记录集的错误提示处理。
3、可以将主窗体的“学籍号”文本框控件改为组合框控件,绑定数据源(仅限列表),这样更有利于用户选择,且保证了不出现“查不到”的错误。
这些我就不一一优化了,留给有兴趣的版友,作为练习吧。


作者: admin    时间: 2020-10-12 11:12

作者: lingjiang    时间: 2020-10-20 21:37
高!!!高!!!!




欢迎光临 Office中国论坛/Access中国论坛 (http://www.office-cn.net/) Powered by Discuz! X3.3