Следующий цикл «для каждого» выполняется только один раз. Зачем?vb.net «Для каждого» повторяется только один раз над списком
Проект содержит 4 формы. Form1 содержит 4 PictureBox. Я пытаюсь перебирать список форм (в данном примере, чтобы установить BG каждой формы на PictureBox):
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 итерации в первом цикле?
Edit:
"я" не является проблемой. Очевидно, проблема заключается в том, что дважды назначается один и тот же элемент управления, как значение для словаря «pics» ... все еще исследуется.
Edit 2 - промежуточное резюме
рабочий раствор (но не ответ)
For x As Integer = 0 To Forms.Count - 1
pics(Forms(x)) = DirectCast(PictureBox1, PictureBox)
Next
Ваши ответы могут быть сгруппированы в синтаксисе
1. Словарь: dict.add (к , v) vs. dict (k) = v
2. exceotion монстр ест мое исключение, как это предложено некоторыми.
3. литье вуду необходимости, как это было предложено @Andre Pageot
4. VB не хотел бы добавить один и тот же PictureBox дважды в словарь.
(1.), вероятно, не является проблемой. Синтаксис dict (k) = v работает везде. Я даже попробовал dict.add (k, v), и он дал EXCATLY такое же поведение, то есть все еще ошибку.
(2.) В среде IDE действительно что-то не так: отладчик пропускает оператор «Следующий» и продолжает, как обычно, следующую инструкцию после цикла. (WTF) Это не имело значения даже после того, как я решил уловить все исключения на экране Alt + Ctrl + E. Исключение все еще не обнаружено.
Это ИМХО серьезная ошибка, даже если кто-то из redmond сделал это по дизайну. Такое же «забавное поведение», вероятно, унаследовано от дней VB6, иногда код «улетал» без всякой причины. (Но, по крайней мере, он отказался от приложения).
p.s. У меня нет каких-либо предложений «try-catch», а «ошибка не делает что-то глупое», просто чтобы быть ясным :)
(3.) Возможно, это, хотя я не понимаю, и это не так. «Ответ на вопрос -« почему исходный код делает weewooo во время выполнения ».
См. Выше «рабочий раствор».
FRANKLY Я НЕ ХОТИМ, ЧТОБЫ ПОНИМАТЬ ЭТО, ПОТОМУ ЧТО ЭТО ДВИЖИТ МЕНЯ, ЧТО, В ПИТОНЕ, Я ТОЛЬКО ПИСЬМАЮТ dict (k) = y И НИКОГДА НЕ БЕРЕТ. Я НЕ ПОНИМАЮ, КАК ЕГО ВОЗМОЖНО, чтобы dict.contains (k, v). ЭТО НЕ ДЕЛАЕТ ЛЮБОЙ СМЫСЛ. И ЭТО ДОЛЖНО БЫТЬ СОВЕРШЕННО, ЭТО ПРОГРАММИРОВАНИЕ, а не вуду.
(4.) У меня нет способа (или будет), чтобы это доказать.
Спасибо, ребята.
Я, вероятно, никогда не буду использовать VB после этого проекта. Есть так много вещей вуду, с которыми нужно иметь дело, это не стоит головных болей.
Где находится 'i' и вы его увеличиваете? – jonhopkins
Вы не увеличиваете 'i' после ссылки на изображение, это ошибка или вы увеличиваете это в другом месте? – bendataclear
Почему это имеет значение (в отношении ВОПРОСА, а не логики)?Я добавил пример (commented), где нет «i». –