8wDlpd.png
8wDFp9.png
8wDEOx.png
8wDMfH.png
8wDKte.png

当被要求时,Visual Basic Form 不会处理所有项目

pmdj 1月前

33 0

希望有人能帮忙..我正在用 VB.NET 表单编写一个小型 Windows 应用程序,我创建了一个子程序,它在被调用时会处理表单上的所有项目:Sub disposer()'处理...

希望有人可以帮忙。

我正在用 VB.NET 表单编写一个小型 Windows 应用程序,

我创建了一个子程序,它在被调用时会处理表单上的所有项目:

Sub disposer() 'disposes of all the items in the form

        For Each i In Me.Controls

            i.dispose

        Next

End Sub

如果我没记错的话,上述内容应该会处理表单中的所有内容,但是,它似乎只删除了表单上的某些项目,例如,只有一半的文本框。

帖子版权声明 1、本帖标题:当被要求时,Visual Basic Form 不会处理所有项目
    本站网址:http://xjnalaquan.com/
2、本网站的资源部分来源于网络,如有侵权,请联系站长进行删除处理。
3、会员发帖仅代表会员个人观点,并不代表本站赞同其观点和对其真实性负责。
4、本站一律禁止以任何方式发布或转载任何违法的相关信息,访客发现请向站长举报
5、站长邮箱:yeweds@126.com 除非注明,本帖由pmdj在本站《vb.net》版块原创发布, 转载请注明出处!
最新回复 (0)
  • 发生了什么:您正在遍历表单(或继承的另一个类 Control )的控件集合。

    每次调用 Dispose() 它的一个成员时,都会主动将其从集合中删除,因此您正在修改正在迭代的集合。

    当你处理第一个控件时,它将从集合中删除,并且列表中的下一个控件 将取代它 .
    您的循环调用 Enumerator.MoveNext() ,因此当您 Dispose() 再次调用时,您将处理索引 1 处的元素,该元素之前是索引 2 处的元素。
    跳过索引 1 处现在索引 0 处的元素。
    这个过程一直持续,结果是你处理掉了集合中一半的控件。

    你可以使用以下方法测试它:

    For Each ctrl As Control In Me.Controls
        ctrl.Dispose()
        Console.WriteLine(Me.Controls.Count)
    Next
    

    您会发现最终计数是初始计数的一半:一半的控件仍然活跃。

    您可以使用向后 For 循环(从 [Collection].Count - 1 0 ),从集合的顶部开始。
    在这种情况下,当您处理控件时,集合会从顶部调整大小,因此 Enumerator.MovePrevious() 不会跳过集合中的任何元素。

    For i As Integer = Me.Controls.Count - 1 To 0 Step -1
        Me.Controls(i).Dispose()
    Next
    

    您还可以使用正向循环并在索引 0 处进行处理。当索引 0 处的元素被处理后,下一个元素将在该索引处取代它的位置,因此您不会跳过任何元素。不过,在这种情况下,集合中的元素会不断 向底部 ,因此这是一个相当缓慢的过程。
    如果收藏品数量较少,您可能不会注意到,但请牢记这一点。

    For i As Integer = 0 To Me.Controls.Count - 1
        Me.Controls(0).Dispose()
    Next
    

    您还可以过滤控件集合,以便仅考虑特定的类型。
    例如,要处置 Form 的所有 TextBox 控件子项(或从 Control 派生的任何其他类):

    Dim textBoxes = Me.Controls.OfType(Of TextBox).ToList()
    For i As Integer = textBoxes.Count - 1 To 0 Step -1
        textBoxes(i).Dispose()
    Next
    
  • 但是,如果不知道有多少个控件,我怎么能创建 For 循环呢?我调用这个子程序,其中有 2 个或 20 个文本框,或者介于两者之间的任何文本框,具体取决于页面。

返回
作者最近主题: