设为首页收藏本站Access中国

Office中国论坛/Access中国论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

返回列表 发新帖
查看: 3734|回复: 2
打印 上一主题 下一主题

[Access本身] “我跳出来又跳进去,打我呀笨蛋”——浅谈setfocus方法

[复制链接]
跳转到指定楼层
1#
发表于 2020-10-9 12:22:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
一个叫“lingjiang”的版友在国庆期间提出了一个主子窗体切换的问题,希望在查询和录入之间进行切换。不知道为什么,这让我想起了这个图。

好吧,这种需求确实有些欠揍。事实上,子窗体控件是作为一个整体来看待的,如果非要跳到它内部的某个字段里,我只想说,“这辈子都没听到这么奇怪的要求”。

好吧,满足你!
这里分两部分。一是从主窗体控件跳到子窗体的控件,二是从子窗体控件跳到主窗体的控件(废话)。其中第二部分相对简单些,直接用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
复制代码
附件如下

其他问题及改进意见:
1、上面子窗体Requery部分是为了方便在子窗体更新后,重新返回全部记录集(findfirst只返回一条记录),以便用户重新选择的一个人性化处理。
2、可以加上查不到记录集的错误提示处理。
3、可以将主窗体的“学籍号”文本框控件改为组合框控件,绑定数据源(仅限列表),这样更有利于用户选择,且保证了不出现“查不到”的错误。
这些我就不一一优化了,留给有兴趣的版友,作为练习吧。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 分享淘帖 订阅订阅

点击这里给我发消息

2#
发表于 2020-10-12 11:12:01 | 只看该作者
回复

使用道具 举报

3#
发表于 2020-10-20 21:37:36 | 只看该作者
高!!!高!!!!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|站长邮箱|小黑屋|手机版|Office中国/Access中国 ( 粤ICP备10043721号-1 )  

GMT+8, 2024-11-14 10:54 , Processed in 0.081028 second(s), 27 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表