Foxtable(狐表)用户栏目专家坐堂 → 如何在点击禁止修改的列时执行PrepareEdit


  共有7738人关注过本帖树形打印复制链接

主题:如何在点击禁止修改的列时执行PrepareEdit

帅哥哟,离线,有人找我吗?
zhangchi96
  1楼 | QQ | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:二尾狐 帖子:555 积分:5037 威望:0 精华:0 注册:2012/2/11 13:27:00
如何在点击禁止修改的列时执行PrepareEdit  发帖心情 Post By:2017/1/25 10:48:00 [只看该作者]

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页面中表不作为副本,第23页面都作为副本。

 

3、当点击第1个页面中的列【工龄起算】,程序就执行前面的合并代码,窗体中的第4个页面中的表里可看到信息,但如果点击的是第2个页面中的列【工龄起算】就不会执行合并代码,估计是因为第2个页面中的表是作为副本的

 

请教老师,我的页面集合事实用的时候有很多页面,也不能把有些列都放到第1页面去,有办法解决这个问题吗?

[此贴子已经被作者于2017/1/29 21:10:09编辑过]

 回到顶部
帅哥,在线噢!
有点蓝
  2楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:111401 积分:567075 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2017/1/25 11:28:00 [只看该作者]

副本一样会触发主表的事件的。具体做个例子发上来看看

 回到顶部
帅哥哟,离线,有人找我吗?
zhangchi96
  3楼 | QQ | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:二尾狐 帖子:555 积分:5037 威望:0 精华:0 注册:2012/2/11 13:27:00
  发帖心情 Post By:2017/1/25 13:31:00 [只看该作者]

谢谢版主,我再试试。提前祝版主新年快乐啊!

 回到顶部
帅哥哟,离线,有人找我吗?
zhangchi96
  4楼 | QQ | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:二尾狐 帖子:555 积分:5037 威望:0 精华:0 注册:2012/2/11 13:27:00
  发帖心情 Post By:2017/1/28 21:03:00 [只看该作者]

祝版主新年快乐,生意兴隆!!!

副本可以触发主表的事件了,开始没有做到是因为:

在窗体【职工信息浏览】中插入表,因为数据较多,窗体打开时设置了DataTables("职工信息").AllowEdit = False,然后增加一个按钮,在需要修改的时候点击,去除锁定。

现在需要的是:不想解除锁定,如果才能触发前面提到的事件呢?PrepareEdit可以需要在编辑时才可以执行的。


 回到顶部
帅哥哟,离线,有人找我吗?
有点色
  5楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:13837 积分:69650 威望:0 精华:0 注册:2016/11/1 14:42:00
  发帖心情 Post By:2017/2/2 10:37:00 [只看该作者]

 不明白你表达的意思。为什么要在prepareEdit写合并代码?你要做什么功能?上传实例说明。

 回到顶部
帅哥哟,离线,有人找我吗?
zhangchi96
  6楼 | QQ | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:二尾狐 帖子:555 积分:5037 威望:0 精华:0 注册:2012/2/11 13:27:00
  发帖心情 Post By: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编辑过]

 回到顶部
帅哥哟,离线,有人找我吗?
有点色
  7楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:13837 积分:69650 威望:0 精华:0 注册:2016/11/1 14:42:00
  发帖心情 Post By:2017/2/2 16:39:00 [只看该作者]

 你可以写 click 事件 或者 AfterSelChange 事件。

 回到顶部
帅哥哟,离线,有人找我吗?
zhangchi96
  8楼 | QQ | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:二尾狐 帖子:555 积分:5037 威望:0 精华:0 注册:2012/2/11 13:27:00
  发帖心情 Post By: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编辑过]

 回到顶部
帅哥,在线噢!
有点蓝
  9楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:111401 积分:567075 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2017/2/3 20:25:00 [只看该作者]

With DataTables("教职工历月信息")
    .DataCols("信息列").Caption = C.Name
    .BuildHeader
End With

[此贴子已经被作者于2017/2/3 22:51:17编辑过]

 回到顶部
帅哥哟,离线,有人找我吗?
zhangchi96
  10楼 | QQ | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:二尾狐 帖子:555 积分:5037 威望:0 精华:0 注册:2012/2/11 13:27:00
  发帖心情 Post By:2017/2/3 22:41:00 [只看该作者]

请教老师,新遇到问题,在执行上面的代码AfterSelChange时,

如果运行到 筛选命令 Tables("教职工信息表").Filter = "",系统提示出错,出错在代码事件AfterSelChange中。

 回到顶部
总数 18 1 2 下一页