【问题标题】:Removing Textbox and DateTimePicker in a Panel删除面板中的文本框和 DateTimePicker
【发布时间】:2019-05-15 08:40:40
【问题描述】:

我有一个代码可以删除我在面板中创建的文本框和 datetimepicker...删除代码适用于所有 TEXTBOX,但是当删除 datetimepicker 时它不会删除所有 datetimepicker。 示例:运行代码时有 4 个文本框和 4 个日期时间选择器,面板将删除所有 4 个文本框,但仅删除 2 个日期时间选择器。我真的无法找出问题所在。请帮助我...谢谢!

代码在这里:

 For Each ctrlTxt As TextBox In panelGroupDependent.Controls.OfType(Of TextBox)()            
        ctrlTxt.Dispose()
 Next
For Each ctrlDtp As DateTimePicker In panelGroupDependent.Controls.OfType(Of DateTimePicker)()
        ctrlDtp.Dispose()
 Next

【问题讨论】:

  • 那么实际发生了什么?您是否调试过代码,即设置断点并单步执行以确保实际执行您期望的每一行并且每个值都是您期望的?老实说,我很惊讶该代码完全有效。看起来它正在修改一个集合,同时向我枚举它。尝试在每个 OfType 之后添加一个 ToArray 调用,例如panelGroupDependent.Controls.OfType(Of DateTimePicker)().ToArray(),看看这是否有所作为。
  • @jmcilhinney 在放置 .ToArray() 后它现在可以工作了,谢谢伙计,它是如何工作的?哈哈哈
  • 我已经添加了一个答案,包括完整的解释。

标签: vb.net


【解决方案1】:

就目前而言,您在枚举集合时正在修改集合,这是不允许的。 For Each 循环枚举一个集合,因此您不能在循环中添加或删除项目。当您释放控件时,它会从其父容器中移除,因此您正在修改该父容器的 Controls 集合。

OfType 方法实际上并不会生成新的项目集合,而是枚举它所调用的集合并逐一生成指定类型的项目。因此,枚举OfType的结果意味着同时枚举源集合。

通过调用ToArray,您首先完成了源集合的枚举并使用指定类型的项填充一个数组,然后使用For Each 循环枚举该数组。处理控件对数组没有影响,所以没有问题。

For Each ctrlTxt In panelGroupDependent.Controls.
                                        OfType(Of TextBox)().
                                        ToArray()
    ctrlTxt.Dispose()
Next

For Each ctrlDtp In panelGroupDependent.Controls.
                                        OfType(Of DateTimePicker)().
                                        ToArray()
    ctrlDtp.Dispose()
Next

注意,循环控制变量的类型也不需要声明,因为它可以推断出来。

【讨论】:

    猜你喜欢
    • 2013-09-20
    • 1970-01-01
    • 2011-04-21
    • 2011-09-20
    • 1970-01-01
    • 2019-01-13
    • 1970-01-01
    • 1970-01-01
    • 2011-01-03
    相关资源
    最近更新 更多