- Практическое руководство. Сокрытие элемента управления во время выполнения How to: Make Your Control Invisible at Run Time
- Как сделать элемент управления невидимым во время выполнения To make your control invisible at run time
- Как открыть и закрыть форму из другой формы в C# (правильное решение)
- C# Как грамотно закрыть Form?
- 3 ответа 3
- Практическое руководство. Сокрытие элемента управления во время выполнения How to: Make Your Control Invisible at Run Time
- Как сделать элемент управления невидимым во время выполнения To make your control invisible at run time
- Скрытие формы и отображение другой при нажатии кнопки в приложении Windows Forms
- 6 ответов:
Практическое руководство. Сокрытие элемента управления во время выполнения How to: Make Your Control Invisible at Run Time
Иногда может потребоваться создать пользовательский элемент управления, невидимый во время выполнения. There are times when you might want to create a user control that is invisible at run time. Например, элемент управления, который является будильником, может быть невидимым, за исключением случаев, когда был вызван звуковой сигнал. For example, a control that is an alarm clock might be invisible except when the alarm was sounding. Это легко достигается путем установки Visible Свойства. This is easily accomplished by setting the Visible property. Если Visible свойство имеет значение true , элемент управления будет отображаться как нормальный. If the Visible property is true , your control will appear as normal. Если значение false равно, ваш элемент управления будет скрыт. If false , your control will be hidden. Хотя код в элементе управления по-прежнему может выполняться, пока невидимый, вы не сможете взаимодействовать с этим элементом управления через пользовательский интерфейс. Although code in your control may still run while invisible, you will not be able to interact with the control through the user interface. Если вы хотите создать невидимый элемент управления, который по-прежнему отвечает на ввод данных пользователем (например, нажатие кнопки мыши), следует создать прозрачный элемент управления. If you want to create an invisible control that still responds to user input (for example, mouse clicks), you should create a transparent control. Дополнительные сведения см. в разделе предоставление элементу управления прозрачного фона. For more information, see Giving Your Control a Transparent Background.
Как сделать элемент управления невидимым во время выполнения To make your control invisible at run time
Задайте для свойства Visible значение false . Set the Visible property to false .
Как открыть и закрыть форму из другой формы в C# (правильное решение)
C# изучаю не так давно и встала передо мной недавно задача:
— открыть Form2 при нажатии на кнопку в Form1;
— спрятать Form1;
— открыть Form1 при закрытии Form2.
На первый взгляд задача показалась элементарной, но… возникли нюансы — при закрытии приложения оно не выгружалось и в диспетчере задач мы наблюдали его работу, хотя визуально оно как бы закрылось.
В чём же причина такого поведения? Об этом расскажу дальше. Рассмотрим открытие и закрытие форм на примерах.
Открываем и закрываем форму из другой формы
У нас в приложении есть две формы Form1 — главная, которая открывается сразу при запуске приложения и Form2, которую открываем по нажатию на кнопку.
Чтобы открыть Form2 нам необходим следующий код, который будет срабатывать при нажатии на кнопку:
Теперь у нас открылась Form2 и спряталась Form1. Поработав с Form2 мы её закрываем и при этом нам надо после этого отобразить Form1. Многие начинающие, включая меня начинают писать следующий код, который помещаем в событие, которое происходит после закрытия Form2:
Вроде всё логично: Form2 закрылась, Form1 открылась. Однако используя этот метод, мы можем заметить, что после того как мы закрываем приложение оно продолжает висеть в памяти. Многие, не зная почему это происходит дописывают в метод «Form1_FormClosed» дописывают принудительное закрытие приложения:
Это работает, однако правильно ли это? Решать вам.
А теперь ответим на вопрос «почему приложение висит в памяти» и рассмотрим простое и правильное решение.
Первая часть кода: мы отображаем Form2 и скрываем Form1. Не закрываем, а именно скрываем, т.е. экземпляр Form1 продолжает существовать.
Закрыть Form1 вместо скрытия не получится, так как это главная форма приложения и при её закрытии мы закроем всё приложение.
Вторая часть кода: строкой «Form ifrm = new Form1();» мы создаём второй экземпляр Form1 и далее его и отображаем, а первый экземпляр Form1 продолжает жить в памяти. И когда мы закрываем приложение (Form1), то первый экземпляр при этом не закрываем он так и «сидит» в памяти, поэтому приложение не выгружается из памяти. В связи с этим многие и закрывают принудительно приложение при закрытии главной формы (Form1).
Сейчас мы с вами рассмотрим правильный код, который не будет создавать второй экземпляр Form1 и отображать его, а будет отображать скрытую до этого Form1.
OpenForms — получает коллекцию открытых форм приложения. В нашем случае мы сразу обратились к главной форме приложения (OpenForms[0]).
Теперь при закрытии Form2 у нас будет вызываться и отображаться та форма, которая породила закрывающуюся.
Учитываем координаты форм при открытии
Представьте ситуацию. Открыта Form1 вы её перемещаете в правый верхний угол экрана. Потом нажимаете на кнопку и… Form2 открывается по центру экрана или в другом месте, но не в том месте, где была Form1. Многие улыбнуться и скажут, что в свойствах Form2 надо прописать/указать следующее «StartPosition -> CenterParent» и открывать Form2 следующим методом:
Form ifrm = new Form2();
ifrm.ShowDialog();
Это правильное решение, которое всегда будет открывать Form2 поверх Form1 и всегда по центру Form1. Однако этот код не применим, если вам надо скрывать Form1, так как Form1 не будет скрываться.
Сейчас приведу полное решение, которое позволит открывать Form1 и Form2 в той же точке, где находилась до этого форма, вызывающая другую форму. Код включает всё вышеописанное. В свойствах форм надо прописать следующее (прямо в студии выбираете эти значения):
— свойство Form1: «StartPosition -> CenterScreen»
— свойство Form2: «StartPosition -> Manual»
Теперь вы не создаёте второго экземпляра Form1 и приложение всегда будет закрываться, не оставаясь в памяти.
Открываем форму поверх другой формы, как модальное окно
Чтобы открыть Form2 поверх Form1, как модальное окно, не скрывая Form1, вам хватит этого кода:
В итоге Form2 будет открыта поверх Form1. В этом случае пользователь не сможет переключиться на Form1 не закрыв Form2.
C# Как грамотно закрыть Form?
Здравствуйте, коллеги! Не думал, что будут проблемы с такими вот вещами, но тем не менее. Вот в чем суть проблемы. Разрабатываю программу, в которой из главной Form1, при нажатии на копку я открываю Form2.
Далее уже на Form2 я выполняю код, который заполняет таблицу на Form1, при этом я вывожу данные в таблицу, а затем мне нужно закрыть Form2 сразу.
Так вот в чем проблема: Form2 она то вроде закрывается, но по факту только скрывается. По долгу своей работы, мое приложение должно работать сутками в фоне и получается, что очередной раз пользователь открывает Form2, нажимает там на кнопку, таблица на Form1 заполняется, но Form2 не закрывается, а сворачивается. И так у меня плодятся окна Form1 и Form2 до бесконечности. Как можно это грамотно обыграть? P.s. Пробовал и Form2.ActiveForm.Close() и this.Close() ничего не помогает. Может логическая ошибка где? Помогите, пожалуйста!
3 ответа 3
Пример обработчика события по нажатию кнопки в Form2 с изменением свойств объектов формы Form1.
Пример более правильного вызова/создания дочерней формы.
Настоятельно рекомендую иметь ввиду контроль наличия (существования) окна, если вы используете окно без привязки к основному. Т.е. если дочерние окна можно убрать в фон или на задний план, то вы обязательно его потеряете.
Имена форм для Application.OpenForms[«AnyFormName»]; находятся в свойствах самих форм в переменной Name . Изменить (переопределять не стоит) можно в классе *.Designer.cs .
Если вам необходим доступ к методам формы, то необходимо создавать для них делегаты методов перед использованием.
Практическое руководство. Сокрытие элемента управления во время выполнения How to: Make Your Control Invisible at Run Time
Иногда может потребоваться создать пользовательский элемент управления, невидимый во время выполнения. There are times when you might want to create a user control that is invisible at run time. Например, элемент управления, который является будильником, может быть невидимым, за исключением случаев, когда был вызван звуковой сигнал. For example, a control that is an alarm clock might be invisible except when the alarm was sounding. Это легко достигается путем установки Visible Свойства. This is easily accomplished by setting the Visible property. Если Visible свойство имеет значение true , элемент управления будет отображаться как нормальный. If the Visible property is true , your control will appear as normal. Если значение false равно, ваш элемент управления будет скрыт. If false , your control will be hidden. Хотя код в элементе управления по-прежнему может выполняться, пока невидимый, вы не сможете взаимодействовать с этим элементом управления через пользовательский интерфейс. Although code in your control may still run while invisible, you will not be able to interact with the control through the user interface. Если вы хотите создать невидимый элемент управления, который по-прежнему отвечает на ввод данных пользователем (например, нажатие кнопки мыши), следует создать прозрачный элемент управления. If you want to create an invisible control that still responds to user input (for example, mouse clicks), you should create a transparent control. Дополнительные сведения см. в разделе предоставление элементу управления прозрачного фона. For more information, see Giving Your Control a Transparent Background.
Как сделать элемент управления невидимым во время выполнения To make your control invisible at run time
Задайте для свойства Visible значение false . Set the Visible property to false .
Скрытие формы и отображение другой при нажатии кнопки в приложении Windows Forms
Я делаю приложение приложение Windows Form. Сначала появляется определенная форма, и после того, как пользователь нажимает следующую кнопку, эта форма должна быть скрыта и показана другая форма.
Я пытался сделать это. Мне удалось скрыть текущую форму, но следующая не появится.
Вот моя попытка:
Это обработчик событий кнопки
Это основная функция:
6 ответов:
Оператор While не будет выполняться до тех пор, пока form1 не будет закрыт — поскольку он находится вне основного цикла сообщений.
Удалите его и измените Первый БИТ кода на:
Однако это не лучший способ достичь того, что вы хотите сделать. Вместо этого рассмотрим шаблон проектированияWizard .
В качестве альтернативы можно реализовать пользовательский ApplicationContext, который обрабатывает время жизни обеих форм. Пример реализации заставки здесь, которая должна установить вы на правильном пути.
A) основной поток графического интерфейса будет работать бесконечно при вызове приложения.Бегите, так что ваш цикл while никогда не будет достигнут
B) вы никогда не захотите иметь бесконечный цикл, подобный этому (цикл while(true)) — он просто заморозит поток. Не совсем понимаю, чего вы там добиваетесь.
Я бы создал и показал «основную» (начальную) форму в методе Main (как это делает для вас Visual Studio по умолчанию). Затем в обработчике кнопок создайте другую форму и также покажите ее как скрыть основную форму (не закрывая ее). Затем убедитесь, что основная форма отображается снова, когда эта форма закрывается через событие. Пример:
Что-нибудь после применения.Run () будет выполняться только при закрытии основной формы.
То, что вы можете сделать, это обработать событие VisibleChanged следующим образом: