以文本方式查看主题 - Foxtable(狐表) (http://foxtable.net/bbs/index.asp) -- 专家坐堂 (http://foxtable.net/bbs/list.asp?boardid=2) ---- 如何在点击禁止修改的列时执行PrepareEdit (http://foxtable.net/bbs/dispbbs.asp?boardid=2&id=95606) |
-- 作者:zhangchi96 -- 发布时间:2017/1/25 10:48:00 -- 如何在点击禁止修改的列时执行PrepareEdit 1、有个表【职工信息】,其PrepareEdit代码: If e.IsFocusCell Then \'如果是焦点所在单元格 If e.Col.Name = "工龄起算" Then \'如果正在编辑的是[..]列 \'---开始调某数据库中的部分数据到表【部分信息】 Dim mg As New Merger \'此处省略一些合并的代码 mg.Merge() DataTables("部分信息").save() end if end if
2、建一个窗体【职工信息浏览】,插入页面集合控件,共4个页面,前3个页面都插入表且都绑定表【职工信息】,第4个页面插入表,绑定表【部分信息】,第1页面中表不作为副本,第2、3页面都作为副本。
3、当点击第1个页面中的列【工龄起算】,程序就执行前面的合并代码,窗体中的第4个页面中的表里可看到信息,但如果点击的是第2个页面中的列【工龄起算】就不会执行合并代码,估计是因为第2个页面中的表是作为副本的。
请教老师,我的页面集合事实用的时候有很多页面,也不能把有些列都放到第1页面去,有办法解决这个问题吗? [此贴子已经被作者于2017/1/29 21:10:09编辑过]
|
-- 作者:有点蓝 -- 发布时间:2017/1/25 11:28:00 -- 副本一样会触发主表的事件的。具体做个例子发上来看看 |
-- 作者:zhangchi96 -- 发布时间:2017/1/25 13:31:00 -- 谢谢版主,我再试试。提前祝版主新年快乐啊! |
-- 作者:zhangchi96 -- 发布时间:2017/1/28 21:03:00 -- 祝版主新年快乐,生意兴隆!!! 副本可以触发主表的事件了,开始没有做到是因为: 在窗体【职工信息浏览】中插入表,因为数据较多,窗体打开时设置了DataTables("职工信息").AllowEdit = False,然后增加一个按钮,在需要修改的时候点击,去除锁定。 现在需要的是:不想解除锁定,如果才能触发前面提到的事件呢?PrepareEdit可以需要在编辑时才可以执行的。 |
-- 作者:有点色 -- 发布时间:2017/2/2 10:37:00 -- 不明白你表达的意思。为什么要在prepareEdit写合并代码?你要做什么功能?上传实例说明。 |
-- 作者:zhangchi96 -- 发布时间:2017/2/2 14:11:00 -- 我的合并功能和这里的运行没有直接的关系,我的想法是: 【职工信息】是2017年1月的信息,我想在点击某行某列后,用合并的方法把数据库文件中的该职工的2016年的1-12月的信息调到表【部分信息】中 ,用来观察该职工的信息逐月变化情况。 If e.IsFocusCell Then \'如果是焦点所在单元格 If e.Col.Name = "工龄起算" Then \'如果正在编辑的是[..]列 \'---开始调某数据库中的部分数据到表【部分信息】 Dim mg As New Merger \'调取该行的职工的其他月份的“工龄起算”信息 mg.Merge() DataTables("部分信息").save() end if end if 请教,实现这个代码是需要对表编辑的时候才可以,如果这里无法实现的话,可不可以把代码放到MouseEnterCell中呢? [此贴子已经被作者于2017/2/2 14:42:13编辑过]
|
-- 作者:有点色 -- 发布时间:2017/2/2 16:39:00 -- 你可以写 click 事件 或者 AfterSelChange 事件。 |
-- 作者:zhangchi96 -- 发布时间:2017/2/3 19:55:00 -- 谢谢老师,在老师的指点下,基本成功实现了,剩下一个小问题 原来在PrepareEdit的代码(此代码执行时需要当前列是允许修改的): If Vars("执行事件") = 0 Then \'从外部表mdb读取数据的时候,Vars("执行事件") = 1,此时不执行所有代码的内容 Return \'返回 End If
Dim frm As WinForm.Form \'定义一个窗体\' frm = Forms.ActiveForm \'活动窗口的名字表示方法就是:frm.Name If frm IsNot Nothing Then If frm.Name <> "在职教职工窗体" Then \'设置只有在这个窗体中才起作用 Return \'返回 End If Else Return \'返回 End If
If e.IsFocusCell Then \'如果是焦点所在单元格 If e.Col.Name <> "姓名" And e.Col.Name <> "身份证号" And e.Col.Name <> "台帐年月" Then \'如果正在编辑的是[..]列 Dim dr As Row = e.Row With DataTables("教职工历月信息") .DataRows.Clear() End With \'()---调数据库中的当月数据 Dim mg As New Merger mg.SourcePath = ProjectPath &"\\Data\\信息数据库.mdb" \'指定数据文件 mg.Password = "zhang" mg.SourceTableName = "教职工信息表" mg.DataTableName = "教职工历月信息" mg.Filter = "单位代码 = " & myDWDM & " And 是否在职 = \'在职\' and 身份证号 = \'"& dr("身份证号") &"\' " mg.FieldMaps.Add("台帐年月","台帐年月") mg.FieldMaps.Add("身份证号","身份证号") mg.FieldMaps.Add("姓名","姓名") mg.FieldMaps.Add( e.Col.Name ,"信息列") mg.Merge() \'-- 定位上月为当前行 Tables("教职工历月信息").sort = "台帐年月,姓名" With Tables("教职工历月信息") .Position = .Rows.Count - 1 End With End If End If
现改为: 在AfterSelChange中加了代码,写法有了一点变化,使用效果很好,不要考虑表中的列是否允许修改 If Vars("执行事件") = 0 Then \'从外部表mdb读取数据的时候,Vars("执行事件") = 1,此时不执行所有代码的内容 Return \'返回 End If Dim frm As WinForm.Form \'定义一个窗体\' frm = Forms.ActiveForm \'活动窗口的名字表示方法就是:frm.Name If frm IsNot Nothing Then If frm.Name <> "在职教职工窗体" Then \'设置只有在这个窗体中才起作用 Return \'返回 End If Else Return \'返回 End If Dim c As Col = e.Table.Cols(e.NewRange.ColSel) \'C 为当前行 Dim dr As Row = e.Table.Rows(e.NewRange.rowSel) \'dr 为当前列 If C.Name <> "姓名" And C.Name <> "身份证号" And C.Name <> "台帐年月" Then \'如果正在编辑的是[..]列 With DataTables("教职工历月信息") .DataRows.Clear() End With \'()---调数据库中的当月数据 Dim mg As New Merger mg.SourcePath = ProjectPath &"\\Data\\信息数据库.mdb" \'指定数据文件 mg.Password = "zhang" mg.SourceTableName = "教职工信息表" mg.DataTableName = "教职工历月信息" mg.Filter = "单位代码 = " & myDWDM & " And 是否在职 = \'在职\' and 身份证号 = \'"& dr("身份证号") &"\' " mg.FieldMaps.Add("台帐年月","台帐年月") mg.FieldMaps.Add("身份证号","身份证号") mg.FieldMaps.Add("姓名","姓名") mg.FieldMaps.Add( C.Name ,"信息列") mg.Merge() With DataTables("教职工历月信息") .DataCols("信息列").Caption = C.Name End With \'-- 定位上月为当前行 Tables("教职工历月信息").sort = "台帐年月,姓名" With Tables("教职工历月信息") .Position = .Rows.Count - 1 End With End If 敬请老师指教!其中绿色代码想请教老师,此代码在第一次点击列“A”时成功把“信息列”改成了“A”,再点击列“B”时,应该是由A改为B,但此代码无法执行了。
[此贴子已经被作者于2017/2/3 20:05:10编辑过]
|
-- 作者:有点蓝 -- 发布时间:2017/2/3 20:25:00 -- With DataTables("教职工历月信息") .DataCols("信息列").Caption = C.Name .BuildHeader End With [此贴子已经被作者于2017/2/3 22:51:17编辑过]
|
-- 作者:zhangchi96 -- 发布时间:2017/2/3 22:41:00 -- 请教老师,新遇到问题,在执行上面的代码AfterSelChange时, 如果运行到 筛选命令 Tables("教职工信息表").Filter = "",系统提示出错,出错在代码事件AfterSelChange中。
|