这种代码本身就是灾难。任何一个单元格编辑都会加载一下合同签订数据,有句话叫啥来着:吃饱了.....
1、加载{合同签订}表也没有看到什么条件,还不如一开始就加载这张表所有数据进来使用。要学会从逻辑上思考一下怎么处理业务合适,而不仅仅是在写代码上。就好比我要修车,就要用到a/b/c/d各种工具,那么是用到每样工具的时候再临时去仓库找呢,还是一次性把需要使用的工具拿过来放到身边合适!不要把写代码看做是多么高深的玩意,代码的逻辑就是业务逻辑的实现,先思考一下怎么样的逻辑是合理的,再考虑写代码。我们说动态加载,有时候是为了提高程序启动的速度,一开始用不到的数据就慢一点加载。但不是一刀切,转到另外一个极端:任何时候都必须临时加载使用。一些常用的数据,或者某个功能密集需要使用到的数据,就应该先加载出来使用。如果是在主表里用,可以在afteropenproject加载,如果是窗口表要使用,可以在窗口afterload加载。就算不作为主表加载,也可以做为临时表加载,不需要了再卸载掉。
2、就算您喜欢一定要每次都动态加载,也不要把代码放在这个事件开头呀,写了这么久代码,应该也知道这个datacolchanged事件是除了表达式列之外所有单元格数据更改都会触发的吧!不要说到现在还搞不懂?
3、再说了既然最终也就使用到其中一行数据,那么为什么不一开始就只加载这一行数据呢,加载其它数据有啥用!
If e.DataCol.Name = "项目名称" Then
Dim nms()As String = {"合同编码","所属机构","合同金额"}
If e.NewValue Is Nothing Then
For Each nm As String In nms
e.DataRow(nm)= Nothing
Next
Else
Dim cmd As New SQLCommand
Dim dt As DataTable
cmd.C
cmd.CommandText = "SELECT DISTINCT 合同编码,所属机构,项目名称,合同金额 From {合同签订} where [项目名称]= '" & e.NewValue & "'"
dt = cmd.ExecuteReader()
If dt.datarows.count > 0
Dim dr As DataRow = dt.datarows(0)
For Each nm As String In nms
e.DataRow(nm)= dr(nm)
Next
End If
End If
End If