以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.net/bbs/index.asp)
--  专家坐堂  (http://foxtable.net/bbs/list.asp?boardid=2)
----  很奇怪的一个现象  (http://foxtable.net/bbs/dispbbs.asp?boardid=2&id=103670)

--  作者:zhsenchzhi
--  发布时间:2017/7/13 21:31:00
--  很奇怪的一个现象
一段代码,就是 遍历所有的 Table ,判断 它的主窗口是否打开,如果没有打开,则打开     

(第一段代码)
For Each aTable As Table In Tables
        If aTable.DataTable.Type = 3 OrElse aTable.DataTable.Type = 4 Then  \'仅仅针对外部表, 根据权限显示
            \'aTable.visible = True
            Functions.Execute("打开主窗口",aTable.name & "主窗口")      //  打开主窗口的代码如下
        End If
    Next


打开主窗口的代码如下:(第二段代码)


Dim FormName As String = args(0)

Try
    If Forms.contains(FormName) Then
        If Forms(FormName).Opened = False Then
            Forms(FormName).Open              //注意这里, 如果主句 注释掉,不执行, 则不会保存, 执行,则报以下错误
        End If
        
    End If
Catch ex As Exception
    MessageBox.Show( FormName & "出错        "  & ex.ToString)
End Try


报错误如下:


图片点击可在新窗口打开查看此主题相关图片如下:1234.png
图片点击可在新窗口打开查看

从报错的内容看,并不是 在第二段代码报的错误,而是在第一段代码里报的

好像是 执行    Forms(FormName).Open  时, 引发了  Tables 集合的改变,而导致第一段执行错误,不能继续遍历下去了

那么 Forms(FormName).Open   只是打开窗口,怎么会引起 Tables 集合的改变呢? 该怎么样避免呢?



[此贴子已经被作者于2017/7/13 21:31:32编辑过]

--  作者:有点甜
--  发布时间:2017/7/13 21:49:00
--  

你的Tables集合改变了。因为你窗口有窗口表,打开后就新增了表。

 

你可以改成这样

 

Dim ts as new List(Of table)
For Each t As Table In Tables
    ts.add(t)
Next
For Each t As Table In ts
    forms("窗口1").show
Next


--  作者:zhsenchzhi
--  发布时间:2017/7/13 22:15:00
--  
可是我想弄清楚, 之前的代码,是什么地方出了错误呢?
--  作者:有点甜
--  发布时间:2017/7/13 22:20:00
--  

这句

 

For Each aTable As Table In Tables

 

换成2楼的方法。