【发布时间】:2013-05-17 04:55:27
【问题描述】:
下面的“for each”循环只运行一次。为什么?
该项目包含 4 个表单。 Form1 包含 4 个 PictureBox。我正在尝试遍历表单列表(在此示例中,将每个表单的 BG 设置为图片框):
Sub Butt_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Butt.Click
Dim Forms As New List(Of Form)
Dim Pics As New Dictionary(Of Form, PictureBox)
Forms.Add(me)
Forms.Add(form2)
Forms.Add(form3)
Forms.Add(form4)
只执行第一次迭代:
For Each frm As Form In Forms
pics(frm) = Me.Controls("PictureBox" + CStr(i + 1))(0)
'BTW the next line behave the same:
' pics(frm) = CType(Me.Controls("PictureBox" + CStr(i + 1)), PictureBox)
'or this:
' pics(frm) = PictureBox1
'or if the pics is a dictionary(of string):
' pics(frm.name) = PictureBox1
Next
执行所有 4 次迭代:
For Each frm As Form In Forms
msgbox(frm.name)
Next
为什么它不会在第一个循环中完成所有 4 次迭代?
编辑:
“i”不是问题。 显然问题在于将相同的控件分配两次,作为“图片”字典的值......仍在调查中。
编辑 2 - 中间摘要
可行的解决方案(但不是答案)
For x As Integer = 0 To Forms.Count - 1
pics(Forms(x)) = DirectCast(PictureBox1, PictureBox)
Next
你的答案可以归类为
1。字典语法:dict.add(k, v) vs. dict(k) = v
2。正如一些人所建议的那样,exceotion 怪物吃掉了我的异常。
3。正如@Andre Pageot 所建议的那样,需要施放巫术
4。 VB 不喜欢将同一个图片框两次添加到字典中。
(1.) 可能不是问题所在。 dict(k) = v 语法适用于其他任何地方。我什至尝试了 dict.add(k,v) 并且它给出了完全相同的行为,即仍然错误。
(2.) IDE 确实有问题:调试器跳过“Next”语句,并照常继续循环后的下一条指令。 (世界跆拳道联盟) 即使在我设置为在 Alt+Ctrl+E 屏幕中捕获所有异常之后也没关系。 仍然没有捕获到异常。
恕我直言,这是一个严重的错误,即使 redmond 的某个人是故意设计的。同样的“有趣的行为”可能是从 VB6 时代继承下来的,有时代码会无缘无故地“飞走”。 (但至少在那里它正在退出应用程序)。
附言我没有任何“try-catch”子句,也没有“错误时做一些愚蠢的事情”,只是为了清楚:)
(3.) 可能是这样,虽然我不明白,但它没有回答问题 - “为什么原始代码在运行时执行 weewooo”。
参见上面的“工作解决方案”。
坦率地说,我不想再理解它了,因为它让我发疯,为什么,在 Python 中,我只写 dict(k) = y 并且它永远不会中断。我不明白 dict.contains(k,v) 是如何可能的。它没有任何意义。 并且必须有感觉,它是在编程,而不是巫术。
(4.) 我没有任何方法(或意愿)来证明这一点。
谢谢你们。
在这个项目之后我可能再也不会使用 VB 了。有这么多巫毒的事情要处理,不值得头疼。
【问题讨论】:
-
i是在哪里定义的,你要增加它吗? -
引用图片框后您没有增加
i,这是一个错误还是您在其他地方增加了这个? -
为什么重要(关于问题,而不是逻辑)?我添加了一个没有“i”的(注释)示例。
-
您是否在
Next上设置了一个断点以确保它到达那里?我的猜测是它在 for each 内部崩溃并且永远不会到达它一次。 -
它可能会抛出一个被某个地方吞下的错误。单步执行代码以查看发生了什么。另外,您在字典中填充值的代码在哪里?
标签: vb.net