Форум программистов, компьютерный форум, киберфорум
Visual Basic .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
6 / 6 / 1
Регистрация: 09.02.2016
Сообщений: 296

При выполнении Show() создается новая форма

31.07.2017, 00:28. Показов 1332. Ответов 15
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте.
Возникла такая проблема. В проекте имеется две формы с TextBox-ами. При заполнении TextBox в первой форме нужно перейти во вторую. Во второй форме есть кнопка назад, которая возвращает нас к первой форме, если понадобилось что-то исправить.
Проблема в том, что при возврате в первую форму она полностью обнуляется и в полях только пустота. При возврате опять во вторую форму она тоже оказывается чистой.
Как можно исправить такое поведение?
Переключение по формам осуществляется проще некуда:

VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
'в первой форме:
Private Sub FirstFormNextStepButton_Click(sender As Object, e As EventArgs) Handles FirstFormNextStepButton.Click
 
       Me.Hide()
       SecondStep.Show()
 
    End Sub
 
'во второй:
Private Sub SecondFormNextStepButton_Click(sender As Object, e As EventArgs) Handles SecondFormNextStepButton.Click
 
        Me.Hide()
        FirstStep.Show()
 
    End Sub
При этом, если при вызове другой формы не скрывать текущую, то видно, что программа не переключается на форму, а создает новую...

P.S. Работаю в Visual Studio 2015
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
31.07.2017, 00:28
Ответы с готовыми решениями:

Метод UserForm.Show при повторном выполнении .Show
При первом выполнении этого метода поисходит событие Activate_UserForm Как сделать, чтобы при повторном выполнении .Show (без закрытия...

При нажатие Enter строка в коде меняется, но новая не создается
Помогите,пожалуйста. Нажал на какую ту кнопочку(возможно), теперь при нажатие энтера строка меняется, но новая не создается(происходит...

Почему при переходе на новую страницу создается новая сессия?
При переходе на новую страницу сессия не сохранняетса а создаетса новая сессия проверял по id сессии

15
 Аватар для ViterAlex
8951 / 4863 / 1886
Регистрация: 11.02.2013
Сообщений: 10,246
31.07.2017, 08:59
ну тут всё просто. Откуда вторая форма знает, что FirstStep — это тот экземпляр первой формы, из которого она была вызвана? Как это поле инициализируется?
0
141 / 119 / 29
Регистрация: 12.02.2017
Сообщений: 308
31.07.2017, 15:47
Объявите обе формы в глобальных переменных и не забудьте инициализировать их.
0
 Аватар для ViterAlex
8951 / 4863 / 1886
Регистрация: 11.02.2013
Сообщений: 10,246
31.07.2017, 16:30
Homarty, никаких глобальных переменных не существует. Существуют поля и свойства, область видимости которых определяется модификатором доступа и пространством имён.
Самый лучший вариант в данном случае — перед вызовом второй формы подписаться на её событие Closed, и там показать первую форму и отписаться от этого события. Пишу с телефона, так что код набрать затруднительно. Может позже, если никто не напишет
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18295 / 14219 / 5368
Регистрация: 17.03.2014
Сообщений: 28,896
Записей в блоге: 1
31.07.2017, 17:12
a13428711, приведенный код должен работать и содержимое форм должно сохраняться. Возможно в коде делается что-то еще. Например каждая форма создается в отдельном потоке или есть обработчик события Activated который сбрасывает значения полей или что-то еще.
0
 Аватар для ViterAlex
8951 / 4863 / 1886
Регистрация: 11.02.2013
Сообщений: 10,246
31.07.2017, 19:40
Как обещал:
Первая форма:
VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Public Class Form1
    Private f2 As New Form2
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Hide() 'Скрываем первую форму
        'подписываемся на событие изменения видимости второй формы
        AddHandler f2.VisibleChanged, AddressOf f2_visibleChanged
        'Показываем вторую форму
        f2.Show()
    End Sub
 
    Private Sub f2_visibleChanged(sender As Object, e As EventArgs)
        'Если вторая форма стала видимой, то ничего не делаем
        If f2.Visible Then Exit Sub
        'Показываем первую форму
        Show()
        'отписываемся от события изменения видимости второй формы
        RemoveHandler f2.VisibleChanged, AddressOf f2_visibleChanged
    End Sub
End Class
Вторая форма только прячет себя:
VB.NET
1
2
3
4
5
Public Class Form2
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Hide()
    End Sub
End Class
Весь пример во вложении
Вложения
Тип файла: zip TwoForms.zip (19.5 Кб, 1 просмотров)
3
6 / 6 / 1
Регистрация: 09.02.2016
Сообщений: 296
31.07.2017, 20:45  [ТС]
У меня предполагается несколько форм (около 5) и при таком подходе, если я правильно понимаю, будет очень "хорошее" ветвление...
Неужели нет способа просто обратиться к существующей форме, не создавая ее копию? Если убрать Hide() со всех обработчиков нажатия кнопки, то когда мы переключаемся на вторую форму первая остается неизменной, но при повторном обращении к первой форме фокус не переводится на нее, а создается новый пустой проинициализированный экземпляр...
0
 Аватар для ViterAlex
8951 / 4863 / 1886
Регистрация: 11.02.2013
Сообщений: 10,246
31.07.2017, 21:02
Цитата Сообщение от a13428711 Посмотреть сообщение
У меня предполагается несколько форм (около 5) и при таком подходе, если я правильно понимаю, будет очень "хорошее" ветвление...
Какое ветвление? Одна форма открывает другую, сама прячется и ждёт, когда спрячется вызванная.
Цитата Сообщение от a13428711 Посмотреть сообщение
просто обратиться к существующей форме, не создавая ее копию?
Есть коллекция OpenForms, которая содержит все открытые формы приложения. Можно использовать её. Но я бы писал свой менеджер окон, на который бы и возложил работу по переходу между формами.
0
6 / 6 / 1
Регистрация: 09.02.2016
Сообщений: 296
31.07.2017, 21:26  [ТС]
А чем плох OpenForms?
0
 Аватар для ViterAlex
8951 / 4863 / 1886
Регистрация: 11.02.2013
Сообщений: 10,246
31.07.2017, 21:30
Всем хорош, если его достаточно.
0
6 / 6 / 1
Регистрация: 09.02.2016
Сообщений: 296
31.07.2017, 22:19  [ТС]
Проблему решил, устранив фактор собственной криворукости
Понаставлял таких штуковин в каждой форме в которой происходит обращение к другим формам:
VB.NET
1
2
3
4
5
Dim FirstStep As New FirstStep
.............
Dim SecondStep As New SecondStep
.............
Dim ThirdStep As New ThirdStep
вот у меня форма каждый раз и создавалась новая.

На этой почве другой вопрос: я ведь не просто так их понавтыкал.
Есть у меня такой класс:
VB.NET
1
2
3
4
5
6
7
8
9
10
11
Public Class ThemesOfRequests
 
    Friend Sub ThemesOfRequests()
        sThemeOfRequest(1, 1) = "В связи с проведением инвентаризации и выявлением имущества итд итп......."
        sThemeOfRequest(1, 2) = "Администрация"
 
        ' и весь массив (размером 20*2) таким же образом заполняется дальше в этой функции
 
    End Sub
 
End Class
При этом, чтоб обратиться из формы к переменной этого класса, нужно обязательно написать:
VB.NET
1
Dim ThemesOfRequests As New ThemesOfRequests
Я уже понял, что я делаю что-то не так, но не пойму как нужно правильно...
Ну и чтоб обратиться к функции другого класса нужно каждый раз создавать новый экземпляр класса? А если у меня функция вызывается 500 раз, то я вообще всю память компа завалю этими функциями. Или они потом сами выгружаются из памяти при выходе из класса?
P.S. На Си было как-то проще
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18295 / 14219 / 5368
Регистрация: 17.03.2014
Сообщений: 28,896
Записей в блоге: 1
31.07.2017, 22:30
Цитата Сообщение от a13428711 Посмотреть сообщение
Проблему решил, устранив фактор собственной криворукости
Понаставлял таких штуковин в каждой форме в которой происходит обращение к другим формам:
Семён Семёныч

Цитата Сообщение от a13428711 Посмотреть сообщение
Я уже понял, что я делаю что-то не так, но не пойму как нужно правильно...
Открой для себя модули и shared переменные
0
6 / 6 / 1
Регистрация: 09.02.2016
Сообщений: 296
31.07.2017, 22:49  [ТС]
Я представляю поверхностно что такое модули. Нужно просто вникнуть в суть. Если бы кто-нибудь указал на мои ошибки в примере выше, то это бы значительно ускорило процесс понимания...
0
 Аватар для Winney
307 / 248 / 40
Регистрация: 28.09.2013
Сообщений: 600
01.08.2017, 00:30
Цитата Сообщение от a13428711 Посмотреть сообщение
Нужно просто вникнуть в суть.
Вы клепаете что-то типа мастера? К черту формы) Берите одну и втыкайте в нее TabControl)
1
6 / 6 / 1
Регистрация: 09.02.2016
Сообщений: 296
01.08.2017, 20:04  [ТС]
Цитата Сообщение от Winney Посмотреть сообщение
Берите одну и втыкайте в нее TabControl)
Интересная фича, на знал раньше. Спасибо за наводку, но у меня там все-равно формы нужны, так как человек должен ОБЯЗАТЕЛЬНО пройтись и заполнить ВСЕ поля, а вкладку могут и пропустить. Хотя если поставить галочки в каждой вкладке и не активировать финальную кнопку пока все галочки не будут выставлены, то можно тоже использовать.
Только цитата моя уже относилась не к формам, а к принципам программирования в общем .
0
 Аватар для Winney
307 / 248 / 40
Регистрация: 28.09.2013
Сообщений: 600
01.08.2017, 21:49
Все верно. Кнопка далее должна активироваться после валидации. Если речь идет об общих вопросах программирования, то посмотрите в сторону создания специального класса, содержащего все настройки, и таскайте его из формы в форму как открытое поле. Например)
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
01.08.2017, 21:49
Помогаю со студенческими работами здесь

Создается ли новый делегат при выполнении над ним операций += или -+
A) Да, только для операции -= B) Да, только для операции += C) Нет D) Да

Delphi XE3 при нажатии Enter не создается новая строка в редакторе кода
Delphi XE3 при нажатии Enter не создается новая строка в редакторе кода. При нажатии на клавиатуре курсор просто переносится на следующую...

DbCtrlGrid: при скролле до конца автоматически создается новая пустая запись. Как этого избежать?
Уважаемые форумчане! Столкнулся с проблемой при работе с DBCtrlGrid: при скролле до конца автоматически создается новая пустая запись. как...

При нажатие на любую ссылку или область окна браузера создается новая вкладка с рекламой
Здравствуйте, все началось с того что хотел скачать игру и скачал файл торрент запустил и тут все началось оказывается что данный файл...

Подготовить bat-файл, при выполнении которого в текущем каталоге создается его копия под новым именем
Подготовить bat-файл, при выполнении которого в текущем каталоге создается его копия под новым именем (имя указывается при запуске...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Новые блоги и статьи
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru