Office中国论坛/Access中国论坛

标题: [求助]双子窗体与“成为当前”事件的冲突 [打印本页]

作者: 老鬼    时间: 2006-1-16 00:45
标题: [求助]双子窗体与“成为当前”事件的冲突
主窗体有两个组合框A和B,同时在主窗体建了一个子窗体,里面有字段若干,其中一个字段与主窗体的A建了主子链接。

然后,我在子窗体的“成为当前”事件中写了一句代码如下:

Application.Forms!主窗体!B.Requery

该代码用于当我在子窗体加了一行数据并转至下一行时,刷新主窗体的B控件。

本来这样是没问题了,可是现在我又在主窗体里又加了一个新的子窗体,也就是主窗体上有两个子窗体。结果窗体运行时屏幕不停地刷新。此时把“成为当前”的事件过程去掉就不会有问题。可是这个事件过程我又需要。

请问这是什么原因,如何解决?THANKS!
作者: fan0217    时间: 2006-1-16 00:47
需要例子分析
作者: 老鬼    时间: 2006-1-16 15:52
标题: [求助]重传了附件
传了个文件上来,帮忙看一下:[attach]15392[/attach]

作者: 一点通    时间: 2006-1-16 17:18
主要原因是子窗体2不断尝试成为当前不成功(获得焦点),在主窗体的加载事件中写入如下代码就可以了

Private Sub Form_Load()
    Me.表2_子窗体.SetFocus  '先将焦点移到子窗体
    Me.编号.SetFocus  '灰复到正常的焦点位置
End Sub


[此贴子已经被作者于2006-1-16 10:08:03编辑过]


作者: zyz218    时间: 2006-1-16 18:02
从主窗体A中任选一个如:AAA,看看会有什么效果????问题好像还没解决??楼主是否可考虑不用当前事件,试试其它事件?因为还不知道你的最终目的!
作者: zyz218    时间: 2006-1-16 18:02
或用A更新后事件?
作者: 老鬼    时间: 2006-1-16 19:21
确实是还不行,请问在子窗体中,从一个行转到另一个行会发生哪些事件?而增加一个行后,转到另一个行,又会发生哪些事件?
作者: fan0217    时间: 2006-1-16 19:44
应该是成为当前事件

[此贴子已经被作者于2006-1-16 11:44:10编辑过]


作者: 一点通    时间: 2006-1-16 21:42
测试通过的,为什么会不行呢?

[attach]15406[/attach]

作者: 老鬼    时间: 2006-1-17 01:55
真的不行,你选一下"A"控件,子窗体出现数据后就会一直闪动。
作者: fan0217    时间: 2006-1-17 02:22
应该是进入了死循环,选一下"A"控件会更新子窗体,更新子窗体又更新"A"控件。
作者: 一点通    时间: 2006-1-17 02:25
Application.Forms!主窗体!B.Requery

在你的例子中主要起什么作用?
作者: wu8313    时间: 2006-1-18 02:03



只要主窗体是打开状态,即使不添加任何记录,这个情况就一直存在着,事实也就是这样。

不会因为你没有在子窗体中添加任何数据,而不发生这个刷新的事件。因为 子窗体的A是链接到主窗体的。

链接到主窗体,事实上就已经使得记录成为了当前。

---------------------------------------------------

还有一个问题,一旦刷新了主窗体,记录将会被保存。这样的话,一条不完整的记录将会被保存到表中。

这样的设计,如果您一定要使用成为当前事件来刷新的话,无法解决问题。

-------------------------------------------------------

看来你刷新的意思是,希望a的列表会因为添加了数据而得到更新。

我的想法是,将添加和查询数据分开。设计一个相同的窗体(也包含两个子窗体),在原来的窗体中放置一个按钮打开该窗体(如果数据有效该按钮有效,否则该按钮无效)。

供老鬼参考,和诸位网友斧正。

[此贴子已经被作者于2006-1-17 18:04:59编辑过]


作者: 老鬼    时间: 2006-1-19 01:34
呵呵,对不起各位,其实我的问题使用了更新后事件与删除事件已经解决了,就是想更多了解一下成为当前事件的一些属性。

我原来的Application.Forms!主窗体!B.Requery一句是为了在数据更新或删除时让主窗体的B控件刷新一下。因为B控件的数据源引用了子窗体的数据。
作者: 老鬼    时间: 2006-1-21 18:23
有一个问题,就是刷新后光标会自动转到子窗体的第一行的第一个字段,有没有较简单的办法让光标保持在原处?
作者: 一点通    时间: 2006-1-21 18:38
写一段代码将焦点返回到原控件不行吗?
作者: 老鬼    时间: 2006-1-21 19:15
我写了,可是不行。在式设计的窗体中控件非常多,当子窗体发生更新后事件时刷新了主窗体的一个控件。本来焦点应该保持在当前记录,可是不知为什么,好像在主窗体控件刷新后,整个子窗体都刷了一遍,结果焦点就跳到了第一条记录。我查了主窗体的那个控件,只有一个单击事件,没其他的了。

麻烦哪~~~
作者: 一点通    时间: 2006-1-21 19:55
把修改后的例子传上来看一下
作者: wu8313    时间: 2006-1-21 21:45
可以这样试试,先让子窗体获得焦点(setfocus),然后使用 gotocontrol 的方法。[attach]15508[/attach]



更新子窗体的 address 后,子窗体的 CompanyName 控件获得焦点。




[attach]15509[/attach]


[此贴子已经被作者于2006-1-21 14:16:44编辑过]


作者: 老鬼    时间: 2006-1-21 22:25
标题: 真的很晕
[attach]15507[/attach]
大伙看看新的这个附件。里面有一个“表1”主窗体,打开这个主窗体,在主窗体的A控件选一个值,子窗体会随之跳出一些数据。当我在"表2_子窗体"里填加完数据后,移到一下行,将触发窗体“更新后”事件并刷新主窗体中的D控件,光标停在下一行记录。

然后大伙再看看“维护主界面”主窗体,打开后选“维护单号”,然后在子窗体中填数据,也将刷新主窗体的“汇率”控件,可是“更新后”事件发生后,整个主窗体会刷一下,然后光标就跑到子窗体第一行记录了。

这两个主窗体及其子窗体的设置几乎就是一样的,究竟怎么回事,我翻来复去都找不出原因,大伙帮我查一下~~~
作者: 情比金坚    时间: 2006-1-22 05:11
两个窗体一样吗?看不出啊?一个用组合框,一个用文本框,差老鼻子了~~~~~~~~~~`
作者: 一点通    时间: 2006-1-22 17:16
在发票号的获得焦点事件中增加这个代码就可解决问题

    DoCmd.GoToRecord , , acNewRec


但我觉得你在子窗体中写的代码没有什么意义
作者: 老鬼    时间: 2006-1-22 21:26
无论主窗体上被刷新的是文本框还是组合框,其结果都是一样的。这才是我郁闷的地方。就是说,与主窗体里面刷新的是哪个控件是没有任何关系的。

子窗体里面的代码就是测试用的,当然没什么意义了。主窗体的控件的数据源来自子窗体或子窗体更新后想要刷新主窗体里的控件数据源,代码就有意义了。

焦点能不能返回已经不是重点了,重点是,为什么两个同样的窗体得到的结果是不一样的。

另外我把两个主窗体的子窗体进行了对换,发现问题依旧,说明这个问题与子窗体没关系,应该是主窗体造成了。现在的问题是,两个主窗体的设置基本是一致的,到底怎么回事?
作者: 老鬼    时间: 2006-1-24 00:08
哪位高人再帮忙看一下?俺真的想不通啊~~~
作者: 老鬼    时间: 2006-1-24 00:39
将旧主窗体上的所有控件复制到新的主窗体上,就不会出现那种情况了。可惜控件的“事件”属性不能一起复制~~~

为什么“事件”属性不能复制?有什么办法可以复制?
作者: 情比金坚    时间: 2006-1-24 05:59
只有通过复制窗体来复制事件。




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