Office中国论坛/Access中国论坛

标题: [求助]如何获取子窗体查询数据表中当前单元格的位置? [打印本页]

作者: cjnt007    时间: 2011-8-25 22:33
标题: [求助]如何获取子窗体查询数据表中当前单元格的位置?
大家好!请教各位一个问题,出于需要,将一个子窗体的SourceObject属性设置为一个查询,运行时,当子窗体数据表单元格被选中后,需要知道选中的单元格位置,本想用seltop、selleft实现,无奈此属性只能用于窗体。

之所以有这个需求,是因为想通过获取当前单元格的位置来求得查询数据表中的当前单元格对应的记录ID和对应的列字段,现在直接获取数据表当前记录的ID没有什么问题,难点在于获取这个单元格所在的列字段,谁能帮到我呢?在此先行谢过!

特别说明下,如果改用窗体来实现技术上没有任何问题,只是想知道使用查询或表作为子窗体源对象有没有实现的可能。
作者: todaynew    时间: 2011-8-26 10:12
本帖最后由 todaynew 于 2011-8-26 10:13 编辑

1、可用seltop、selleft标识子窗体中的单元格,只所以无奈一定是没搞对方法。
2、问题本身不需要用seltop、selleft属性。光标所在列的控件名称一般与字段名称相同(用向导建立时),如果不相同则可取控件的ControlSource值,该值要么是字段名称,要么是一个由字段名称构成的表达式。
作者: cjnt007    时间: 2011-8-26 11:32
多谢版主todaynew的回复,也许我的问题描述还不够清楚,对于您的回答我作进一步的说明如下:

1、我的这个子窗体控件设定的源对象不是窗体,而是一个查询。子窗体名称为child0,在使用me.child0.form.seltop试图获取选中单元格位置时报错,说是对属性seltop的引用表达式错误,我想这可能是由于child0子窗体源对象不是窗体的缘故,对seltop等属性不支持(我作过测试,子窗体是窗体时是支持的),当然也可能是我的方法不对头,还请明示。

2、如果不用seltop、selleft属性,我可以通过语句me.child0.form.recordset.id来获取子窗体数据表中当前记录的ID值,这个值对应于选中单元格所在的记录,但对于此单元格对应的列字段如何获取呢?我可以遍历子窗体数据表的所有字段,但无法确定选中单元格对应的是哪个字段。如能提供帮助,将不甚感激!
作者: sgrshh29    时间: 2011-8-26 11:55
row = CurrentRecord
Column = ActiveControl.name 或者 Controls.Count
作者: cjnt007    时间: 2011-8-26 12:36
感谢sgrshh29的回复,使用ActiveControl.name可以达到我的目的了,再次感谢您的帮助!
作者: cjnt007    时间: 2011-8-26 12:44
随便问下,我在这个查表数据表(不是窗体)的子窗体中点击单元格或改变选中的单元格是否有相应事件产生,如果有我就可以把相应的处理代码写到其中,不然只能在主窗体上加个按钮来实现。
作者: excessstone    时间: 2011-8-26 16:25
cjnt007 发表于 2011-8-26 12:44
随便问下,我在这个查表数据表(不是窗体)的子窗体中点击单元格或改变选中的单元格是否有相应事件产生,如 ...

我也想知道
作者: excessstone    时间: 2011-8-26 16:34
我也要到过类似问题,我的解决方法是把那个查询用窗体显示。
也就是做一个 连续 窗体,数据源是查询,需要的字段分配一个 文本框,用标签做一个总表头。
这样这个窗体看起来和查询是一样的。
然后每个文本框可以设置事件。
作者: cjnt007    时间: 2011-8-26 21:28
我这里之所以要用查询直接作为子窗体而不是用窗体作为子窗体,就是因为作为子窗体的查询是交叉表查询,列数是不固定的,用窗体来实现比较复杂(当然可以使用动态绑定控件的方法来实现,或使用第三方控件比如FlexGrid来实现)。如果用窗体实现,以上的问题都比较好解决,用查询或表的话,平时研究得不多,现在要通过查询数据表来能实现我的需求,算是给自己找了个小小研究课题。目前如果能解决给查询数据表添加事件的话就比较完美了,我记得以前看到过一个示例是给窗体添加自定义事件的,不知道对查询数据表是否适用。
作者: cjnt007    时间: 2011-8-27 13:29
双休日斑竹休息?今天回复了几条帖子竟然需要等待审核后才能显示,开始没有发现这个问题,有个帖子时我竟回复了好几遍!{:soso_e127:}唉……

回到正题,今天上午正好闲着就继续研究下自己的小课题,最终发现,无论是用窗体、表还是查询作为子窗体源对象,都有一个form对象,这个对象的所有属性与普通窗体比都是一样的。那我就可以这样实现我的需求:

1、在主窗体中用代码设置子窗体中form对象的onTimer为一个现有的函数,并启动窗体计时器,200毫秒触发一次。
    Me.Child0.Form.onTimer="=test()"
    Me.Child0.Form.TimerInterval = 200
2、函数test()的实现
  1. Public currentID As Integer, currentColumn As String
  2. Function test()
  3.     Dim fm As Form
  4.     Set fm = Forms!窗体1!Child0.Form
  5.     If fm!id <> currentID Or fm.ActiveControl.Name <> currentColumn Then
  6.         currentID = fm!id
  7.         currentColumn = fm.ActiveControl.Name
  8.         '测试输出
  9.         Debug.Print fm!id & " - " & fm.ActiveControl.Name
  10.     End If
  11. End Function
复制代码
这样就模拟实现了在子窗体数据表中改变选中的单元格中触发一个事件的目的,把需要执行的代码加到上面的Debug.Print处。
作者: aslxt    时间: 2011-8-28 21:51
如果在主窗体中放置一个按钮(Command15),其事件如下:
Private Sub Command15_Click()
  MsgBox "子窗体的当前控件:" & Me.Child9.Form.ActiveControl.Name
End Sub
注:“Child9”为子窗体控件,子窗体的sourceobject为动态的表或查询。
作者: chaosheng    时间: 2011-8-28 22:57
不错的门道,学习了,多谢.
作者: excessstone    时间: 2011-8-29 18:00
我也去试试




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