#vb.net #forms #panel
#vb.net #Формы #Панель
Вопрос:
У меня проблема, которая действительно начинает беспокоить меня… В моем приложении есть элемент управления ListView, который заполнен элементами. При двойном щелчке по элементу создается новый экземпляр формы. Затем он создает новую панель и добавляет форму на панель. Однако, хоть убейте, я не могу понять, как закрыть форму внутри панели.
Внутри моего события двойного щелчка:
Dim frm As New frmStorePage(_store.Code, _store.Name)
'Create a new panel with the store page
Dim pnl As New Panel
pnl.Name = _store.Code
pnl.BackColor = SystemColors.Control
pnl.Size = New Size(1522, 892)
pnl.Location = New Point(3, 3)
frm.TopLevel = False
frm.Name = _store.Code
pnl.Controls.Add(frm)
frm.Show()
pnlStores.Controls.Add(pnl)
pnl.BringToFront()
...
Внутри моего события закрытия:
Dim panel As Panel = CType(pnlStores.Controls.Find(lsvOpenStoreList.SelectedItems(0).Name, False)(0), Windows.Forms.Panel)
For Each control As Control In panel.Controls
If TypeOf control Is Windows.Forms.Form And control.Name = panel.Name Then
control.Dispose()
End If
Next
pnlStores.Controls.Remove(panel)
panel.Dispose()
pnlStoreList.BringToFront()
...
Я также пытался объявить свою форму как глобальную переменную, но, похоже, все еще не могу ее закрыть.
Форма имеет ряд событий таймера, которые останавливаются при закрытии формы, однако, даже если панель закрывается, события таймера все еще выполняются. Кажется, что форма все еще активна в фоновом режиме.
Любая помощь будет оценена.
Комментарии:
1. За 16 лет программирования на VB я понятия не имел, что можно добавить форму на панель! Но вы пробовали вызывать метод ‘ctype (control, form).close’ перед удалением? Я бы подумал, что dispose сделает это, но, очевидно, в данном случае это не так.
2. Спасибо, Стив, но нет — к сожалению, не отсортировал. Я могу сказать, что эта форма все еще работает, потому что у меня есть таймер. Остановить события, связанные с методом закрытия формы. Один из этих таймеров выдает мне ошибку каждый раз, когда он выполняется, и когда я закрываю панель / форму, я все еще получаю это всплывающее окно с ошибкой от таймера.
3. Я не могу воспроизвести вашу проблему. Я сделал некоторый код, чтобы поместить форму (с таймером, который запускается при загрузке и останавливается при закрытии) на панель, и пока форма отображается, она запускает мой таймер, и когда я говорю форме закрыть, она прекращает ее запуск. Я использовал большую часть вашего кода, который вы предоставили, так что это должно быть что-то еще, чего здесь нет.
4. Вы когда-нибудь решали эту проблему? <br/> Я бы поставил точку останова для каждого оператора, посмотрел, что такое тип и имя каждого элемента управления, а затем сравнил это с вашим оператором If, чтобы увидеть, совпадает ли оно. Я полагаю, что ошибка кроется где-то в этой логике. Если вы хотите прислать мне свой источник, я был бы более чем счастлив ознакомиться с ним. Для каждого элемента управления как элемента управления на панели. Управляет, если тип элемента управления — Windows. Формы. Форма и элемент управления. Имя = панель. Назовите затем элемент управления. Dispose() Завершается, если следующий
5. @Riples Сделайте это ответом и отметьте его ответом, чтобы его можно было закрыть. Спасибо
Ответ №1:
Из-за глупой оплошности я не увидел, что код, который я использовал для удаления всех элементов управления и закрытия формы, был не в событии FormClosing, а на самом деле под командной кнопкой Close . Таким образом, мои процедуры закрытия никогда не вызывались, и, таким образом, таймеры оставались активными.
Спасибо