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。因此这个细节需要改回来。
至此,大致代码可以写了:
'主窗体主要代码
Private Sub 学籍号_AfterUpdate()
Dim rst As DAO.Recordset
Set rst = Me.查询2子窗体.Form.Recordset
rst.FindFirst "学籍号='" & Me.学籍号 & "'"
Me.查询2子窗体.Requery
Forms!按班级查询!查询2子窗体!Text8.SetFocus
End Sub
'子窗体主要代码
Private Sub Text8_AfterUpdate()
Me.Parent.学籍号.Value = Null
Me.Requery
Me.Parent.学籍号.SetFocus
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