微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在另一个面板内删除面板

如何解决在另一个面板内删除面板

我有一个面板,里面有4个面板。内部面板的名称为“ XXXX | 1 | A”,“ XXXX | 1 | B”,“ XXXX | 1 | C”和“ XXXX | 1 | D”,如您所见,它们以最后一个字符来区分一封信。

在这种情况下,我要执行的操作始终是仅删除标识为A和B的面板。

这是我的代码

filter() {
     this.myDataList = this.newArrayAfterProjectFilter.filter(element => 
      this.selectedItems.some(item=> element.properties.map.aclrq_rfqNum == item.item_text));
    console.log(this.myDataList)
  }

如您所见,使用变量controls_number,我知道内部有4个面板,但是在进行排列时,它仅读取3,并且仅删除标识为B的面板,而不会到达面板A。 / p>

您能告诉我为什么您不阅读这四个面板吗?有什么想法可以让我经历全部4个过程吗?

谢谢。

解决方法

首先,您无法使用管道字符“ |”重命名控件。因为设计师不允许这样做。 但是在下面的示例中,我假设它是下划线字符“ _”。 现在,如果您要在一个集合中进行循环操作(如果它在此循环中更改了尺寸),那么在新的长度/尺寸之后,您将丢失(删除)的元素数量。 因此,您可以将循环作为逆向(最大尺寸为0)作为技巧,在这种情况下,其余元素始终位于循环中/在循环中。

下面的代码片段显示了我的意思。

    For i As Integer = pb.Controls.Count - 1 To 0 Step -1
        If pb.Controls(i).Name Like "*_A" OrElse pb.Controls(i).Name Like "*_B" Then
            pb.Controls.Remove(pb.Controls(i))
        End If
    Next
,

在用For Each循环枚举列表时,切勿修改列表。在这种情况下以及许多其他情况下,简单的解决方案是将所需的项目提取到一个单独的列表中并循环遍历,同时从原始列表中删除这些项目。因此,删除将不会对您要枚举的列表产生影响。在您的情况下,可能看起来像这样:

Dim panels = pb.Controls.
                OfType(Of Panel)().
                Where(Function(pnl) pnl.Name.EndsWith("|A") OrElse
                                    pnl.Name.EndsWith("|B")).
                ToArray()

For Each pnl In panels
    pnl.Dispose()
Next

调用Dispose会将控件从其父控件中删除并正确处理。如果仅调用Remove,则不会处理该控件。除非您打算重用控件,否则那是不好的。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。