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


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

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

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


加好友 发短信
等级:二尾狐 帖子:556 积分:5053 威望: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编辑过]

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


加好友 发短信
等级:二尾狐 帖子:556 积分:5053 威望:0 精华:0 注册:2012/2/11 13:27:00
  发帖心情 Post By:2017/1/25 13:31:00 [显示全部帖子]

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

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


加好友 发短信
等级:二尾狐 帖子:556 积分:5053 威望:0 精华:0 注册:2012/2/11 13:27:00
  发帖心情 Post By:2017/1/28 21:03:00 [显示全部帖子]

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

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

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

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


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


加好友 发短信
等级:二尾狐 帖子:556 积分:5053 威望: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编辑过]

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


加好友 发短信
等级:二尾狐 帖子:556 积分:5053 威望: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编辑过]

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


加好友 发短信
等级:二尾狐 帖子:556 积分:5053 威望:0 精华:0 注册:2012/2/11 13:27:00
  发帖心情 Post By:2017/2/3 22:41:00 [显示全部帖子]

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

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

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


加好友 发短信
等级:二尾狐 帖子:556 积分:5053 威望:0 精华:0 注册:2012/2/11 13:27:00
  发帖心情 Post By:2017/2/4 13:44:00 [显示全部帖子]

经过调试,发现,运行Tables("教职工信息表").Filter = "",就提示是事件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

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


加好友 发短信
等级:二尾狐 帖子:556 积分:5053 威望:0 精华:0 注册:2012/2/11 13:27:00
  发帖心情 Post By:2017/2/4 14:24:00 [显示全部帖子]

个人估计,在筛选的时候,表一瞬间被认为是不存在的,所以我加了个条件语句如下:

If Tables("教职工信息表").Rows.count > 0 Then '求行数
Else
    Return '返回
End If
Dim dr As Row = e.Table.Rows(e.NewRange.rowSel)   'dr 为当前列   ‘此行是引起出错的行

敬请老师指导一下真实的原因。

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


加好友 发短信
等级:二尾狐 帖子:556 积分:5053 威望:0 精华:0 注册:2012/2/11 13:27:00
  发帖心情 Post By:2017/2/4 14:58:00 [显示全部帖子]

加了下面一句话后,原来该运行的也不运行了
If e.NewRange.rowSel < 0 Then
     return
end if

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


加好友 发短信
等级:二尾狐 帖子:556 积分:5053 威望:0 精华:0 注册:2012/2/11 13:27:00
  发帖心情 Post By:2017/2/4 17:34:00 [显示全部帖子]

谢谢老师!

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