Foxtable(狐表)用户栏目专家坐堂 → [求助]高速合并出错


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

主题:[求助]高速合并出错

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


加好友 发短信
等级:管理员 帖子:47497 积分:251403 威望:0 精华:91 注册:2008/6/17 17:14:00
  发帖心情 Post By:2010/11/28 12:30:00 [显示全部帖子]

根据错误提示,你应该检查“申请”表的“DataColChanged“事件代码


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


加好友 发短信
等级:管理员 帖子:47497 积分:251403 威望:0 精华:91 注册:2008/6/17 17:14:00
  发帖心情 Post By:2010/11/29 8:23:00 [显示全部帖子]

不是不能加代码,而是你加的代码有问题。

不仅有问题,而且“申请”表的“DataColChanged“存在很多无用的代码,可以说是不堪入目。
你也算是元老级用户了,不能总是不求甚解地拼凑代码了,应该好好看看帮助的。

 

首先这段代码有意义吗:

 

If e.DataCol.Name = "林种" OrElse e.DataCol.Name = "亚林种" Then
    Dim dr As DataRow
    '在行政区域表查找所输入省市和县市的行
    dr = DataTables("林种").Find("[林种] = '" & e.DataRow("林种") & "' And [亚林种] = '" & e.DataRow("亚林种") & "'")
End If

 

还有一个事件,这么多:

 

Dim dr1 As DataRow = e.DataRow
Dim dr2 As DataRow = e.DataRow
Dim dr3 As DataRow = e.DataRow
Dim dr4 As DataRow = e.DataRow

 

实在是有点那个了,并非每次应用,都要重新定义一个变量的,只要一个就行:

Dim dr As DataRow = e.DataRow

 

 

你最大的错误在于这段,也是导致你运行出错的原因:

 

If CurrentTable.current("身份证号").length <> 18 Then
    MessageBox.Show("请录入18位身份证号!", "提示")
End If

 

首先你的表已经初始化了,CurrentTable.Current可能是Nothing,当然出错,其次DataColChanged是针对DataTable的事件,你在这里使用CurrentTable.Current很不严谨,因为CurrentTable.Current表示的是选定表的选定行,并非一定就是发生变化的行,甚至可能还不是发生变化的表。而且DataColChanged输在数据修改成功后出发,你还验证个啥?

 

所以这一段应该删除。

 

有很多地方可以写代码来规范用户输入的,可以在DataColChanging事件:

If e.DataCol.Name = "身份证号" AndAlso e.NewValue.Length < 18
    MessageBox.Show("请录入18位身份证号!", "提示")
    e.Cancel = True
End If

 

也可以是ValidateEdit事件,这样写:

If e.Col.Name = "身份证号" AndAlso e.Text.Length < 18
    MessageBox.Show("请录入18位身份证号!", "提示")
    e.Cancel = True
End If


后面的那些判断,都不应该出现在DataColChanged事件中,原因是一样:既然修改已经成为现实,你还验证个啥?

 

最后我帮你修改一下代码.

 

DataColChanging代码为:

 

Dim dr As DataRow = e.DataRow
If e.DataCol.Name = "身份证号" AndAlso e.NewValue.Length < 18
    MessageBox.Show("请录入18位身份证号!", "提示")
    e.Cancel = True
End If
If e.DataCol.Name = "是否为退耕还林" And dr("林种") <> "防护林" AndAlso dr("林种") <> "经济林" Then
    If e.NewValue = True Then
        MessageBox.Show("退耕还林只有防护林和经济林!", "提示")
        e.Cancel = True
    End If
End If
If e.DataCol.Name = "是否重点公益林" And dr("林种") <> "防护林" Then
    If e.NewValue = True Then
        MessageBox.Show("重点公益林只有防护林!", "提示")
        e.Cancel = True
    End If
End If
If e.DataCol.Name = "是否地方公益林" And dr("林种") <> "防护林" Then
    If e.NewValue = True Then
        MessageBox.Show("地方公益林只有防护林!", "提示")
        e.Cancel = True
    End If
End If
If e.DataCol.Name = "是否为退耕还林" And dr("林分起源") <> "人工林" Then
    If e.NewValue = True Then
        MessageBox.Show("退耕还林只有人工林!", "提示")
        e.Cancel = True
    End If
End If

 

DataColChanged事件代码:

 

If e.DataCol.Name = "乡名" Then
    Dim dr As DataRow = DataTables("人员").Find("[乡名] = '" & e.DataRow("乡名") & "'  ")
    If dr IsNot Nothing Then
        e.DataRow("填证机关经办人") =  dr("填证机关经办人")
        e.DataRow("填证机关负责人") = dr("填证机关负责人")
        e.DataRow("调查人") = dr("调查人") '
    End If
End If

 

我花了差不多一个小时来回你这个帖子,说了很多,希望你能重视。

有些话说得也不中听,如果是接触狐表才几个月的用户,我是不会这么说的,但你是元老级的用户,对你的要求和期待自然不一样。

[此贴子已经被作者于2010-11-29 8:33:38编辑过]

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


加好友 发短信
等级:管理员 帖子:47497 积分:251403 威望:0 精华:91 注册:2008/6/17 17:14:00
  发帖心情 Post By:2010/11/29 16:44:00 [显示全部帖子]

1、那就删除DataColChanging事件代码,改用AfterEdit事件。

 

2、如果要继续用DataColChanging事件,那就增加一个全局变量,事件代码首先检测此变量的值,如果为True就Return即可。然后自己做一个合并按钮,合并开始前将变量的值设置为True,结束后设置为False。

[此贴子已经被作者于2010-11-29 16:48:21编辑过]

 回到顶部