以文本方式查看主题

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

 

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中。