Работа с формами
Основы форм
Внешний вид приложения является нам преимущественно через формы. Формы являются основными строительными блоками. Они предоставляют контейнер для различных элементов управления. А механизм событий позволяет элементам формы отзываться на ввод пользователя, и, таким образом, взаимодействовать с пользователем.
При открытии проекта в Visual Studio в графическом редакторе мы можем увидеть визуальную часть формы — ту часть, которую мы видим после запуска приложения и куда мы переносим элементы с панели управления. Но на самом деле форма скрывает мощный функционал, состоящий из методов, свойств, событий и прочее. Рассмотрим основные свойства форм.
Если мы запустим приложение, то нам отобразится одна пустая форма. Однако даже такой простой проект с пустой формой имеет несколько компонентов:
Несмотря на то, что мы видим только форму, но стартовой точкой входа в графическое приложение является класс Program, расположенный в файле Program.cs:
Сначала программой запускается данный класс, затем с помощью выражения Application.Run(new Form1()) он запускает форму Form1. Если вдруг мы захотим изменить стартовую форму в приложении на какую-нибудь другую, то нам надо изменить в этом выражении Form1 на соответствующий класс формы.
Сама форма сложна по содержанию. Она делится на ряд компонентов. Так, в структуре проекта есть файл Form1.Designer.cs, который выглядит примерно так:
Здесь объявляется частичный класс формы Form1, которая имеет два метода: Dispose() , который выполняет роль деструктора объекта, и InitializeComponent() , который устанавливает начальные значения свойств формы.
При добавлении элементов управления, например, кнопок, их описание также добавляется в этот файл.
Но на практике мы редко будем сталкиваться с этим классом, так как они выполняет в основном дизайнерские функции — установка свойств объектов, установка переменных.
Еще один файл — Form1.resx — хранит ресурсы формы. Как правило, ресурсы используются для создания однообразных форм сразу для нескольких языковых культур.
И более важный файл — Form1.cs, который в структуре проекта называется просто Form1, содержит код или программную логику формы:
Введение в Windows Forms
Для создания графических интерфейсов с помощью платформы .NET применяются разные технологии — Window Forms, WPF, приложения для магазина Windows Store (для ОС Windows 8/8.1/10). Однако наиболее простой и удобной платформой до сих пор остается Window Forms или формы. Данное руководство ставит своей целью дать понимание принципов создания графических интерфейсов с помощью технологии WinForms и работы основных элементов управления.
Создание графического приложения
Для создания графического проекта нам потребуется среда разработки Visual Studio. Поскольку наиболее распространенная пока версия Visual Studio 2013, то для данного руководства я буду использовать бесплатную версию данной среды Visual Studio Community 2013 которую можно найти на странице https://www.visualstudio.com/en-us/products/visual-studio-community-vs.aspx.
После установки среды и всех ее компонентов, запустим Visual Studio и создадим проект графического приложения. Для этого в меню выберем пункт File (Файл) и в подменю выберем New — > Project (Создать — > Проект). После этого перед нами откроется диалоговое окно создания нового проекта:
В левой колонке выберем Windows Desktop , а в центральной части среди типов проектов — тип Windows Forms Application и дадим ему какое-нибудь имя в поле внизу. Например, назовем его HelloApp. После этого нажимаем OK.
После этого Visual Studio откроет наш проект с созданными по умолчанию файлами:
Большую часть пространства Visual Studio занимает графический дизайнер, который содержит форму будущего приложения. Пока она пуста и имеет только заголовок Form1. Справа находится окно файлов решения/проекта — Solution Explorer (Обозреватель решений). Там и находятся все связанные с нашим приложением файлы, в том числе файлы формы Form1.cs.
Внизу справа находится окно свойств — Properties. Так как у меня в данный момент выбрана форма как элемент управления, то в этом поле отображаются свойства, связанные с формой.
Теперь найдем в этом окне свойство формы Text и изменим его значение на любое другое:
Таким образом мы поменяли заголовок формы. Теперь перенесем на поле какой-нибудь элемент управления, например, кнопку. Для этого найдем в левой части Visual Studio вкладку Toolbox (Панель инструментов) . Нажмем на эту вкладку, и у нас откроется панель с элементами, откуда мы можем с помощью мыши перенести на форму любой элемент:
Найдем среди элементов кнопку и, захватив ее указателем мыши, перенесем на форму:
Это визуальная часть. Теперь приступим к самому программированию. Добавим простейший код на языке C#, который бы выводил сообщение по нажатию кнопки. Для этого мы должны перейти в файл кода, который связан с этой формой. Если у нас не открыт файл кода, мы можем нажать на форму правой кнопкой мыши и в появившемся меню выбрать View Code (Посмотреть файл кода):
Однако воспользуемся другим способом, чтобы не писать много лишнего кода. Наведем указатель мыши на кнопку и щелкнем по ней двойным щелчком. Мы автоматически попадаем в файл кода Form1.cs, который выглядит так:
Добавим вывод сообщения по нажатию кнопки, изменив код следующим образом:
Запуск приложения
Чтобы запустить приложение в режиме отладки, нажмем на клавишу F5 или на зеленую стрелочку на панели Visual Studio. После этого запустится наша форма с одинокой кнопкой. И если мы нажмем на кнопку на форме, то нам будет отображено сообщение с приветствием.
После запуска приложения студия компилирует его в файл с расширением exe. Найти данный файл можно, зайдя в папку проекта и далее в каталог bin/Debug или bin/Release
Рассмотрев вкратце создание проекта графического приложения, мы можем перейти к обзору основных компонентов и начнем мы с форм.
System. Windows. Forms. Integration Пространство имен
Содержит классы, предназначенные для поддержки взаимодействия элементов управления Windows Forms и WPF. Contains classes that support interoperation of Windows Forms and WPF controls.
Классы
Предоставляет данные для событий ChildChanged и ChildChanged . Provides data for the ChildChanged and ChildChanged events.
Элемент управления Windows Forms, который может использоваться для размещения элемента Windows Presentation Foundation (WPF). A Windows Forms control that can be used to host a Windows Presentation Foundation (WPF) element.
Предоставляет базовый класс для классов EventArgs, поддерживающих необязательный выброс исключений. Provides a base class for EventArgs classes which support optionally raising exceptions.
Предоставляет данные для события LayoutError. Provides data for the LayoutError event.
Предоставляет способ преобразования значений свойств между элементами Windows Forms controls и Windows Presentation Foundation (WPF). Provides a way to translate property values between Windows Forms controls and Windows Presentation Foundation (WPF) elements.
Предоставляет данные для события PropertyMappingError. Provides data for the PropertyMappingError event.
Элемент, который позволяет размещать элемент управления Windows Forms на странице WPF. An element that allows you to host a Windows Forms control on a WPF page.
Делегаты
Предоставляет функцию преобразования для сопоставляемого свойства родительского элемента управления. Provides a translation function for a mapped property of the host control.
Комментарии
System.Windows.Forms.IntegrationПространство имен содержит классы, обеспечивающие взаимодействие между Windows Forms и технологиями WPF. The System.Windows.Forms.Integration namespace contains classes that enable interoperation between the Windows Forms and WPF technologies. При использовании System.Windows.Forms.Integration классов можно размещать элементы управления Windows Forms на страницах WPF, а элементы WPF — в приложениях на основе Windows Forms. When you use System.Windows.Forms.Integration classes, you can host Windows Forms controls on WPF pages, and WPF elements in Windows Forms-based applications.
Двумя ключевыми классами, реализующими возможности взаимодействия, являются WindowsFormsHost и ElementHost . The two key classes that implement interoperation capabilities are WindowsFormsHost and ElementHost. Используемый класс зависит от реализации элемента управления: Which class you use depends on your control implementation:
Используйте WindowsFormsHost класс, если необходимо использовать элемент управления Windows Forms на странице WPF. Use the WindowsFormsHost class when you must use a Windows Forms control on a WPF page.
Используйте ElementHost класс, если необходимо использовать элемент WPF в приложении на основе Windows Forms. Use the ElementHost class when you must use a WPF element in a Windows Forms-based application.
Ответы на 7 самых частых вопросов по WinForms
Ответы на 7 самых частых вопроса по WinForms
1. Как создать вторую форму
Любая форма представляет из себя класс, унаследованный от Form.
Экземпляр главной формы создается в файле Program.cs по умолчанию.
При этом ShowDialog() блокирует главную форму, т.е. управление вернется в нее, только по закрытию второй формы, а Show() просто отображает вторую форму, т.е. будут доступны обе формы.
2. Как передать данные из одной формы в другую
Часто возникает необходимость передать данные из одной формы в другую, я придумал 7 способов, у каждого свои недостатки и достоинства.
2.1 Изменение модификатора доступа (добавлено 24 июля 2017: лучше воздержаться от применения данного способа)
В Form2 Установить модификатор доступа для контрола/поля public
В любом месте Form1
+ Самый быстрый в реализации и удобный способ
— Противоречит всем основам ООП
— Возможна передача только из более поздней формы в более раннюю
— Форма f показывается только с использованием ShowDialog(), т.е. в первую форму управление вернется только по закрытию второй. Избежать этого можно, сохранив ссылку на вторую форму в поле первой формы
2.2 Использование открытого свойства/метода. Способ очень похож на первый
В классе Form2 определяем свойство (или метод)
+ Противоречит не всем основам ООП
— Минусы те же
2.3 Передача данных в конструктор Form2
Изменяем конструктор Form2
+ Простой в реализации способ
+ Не нарушает ООП
— Возможна передача только из более ранней формы в более позднюю
2.4 Передача ссылки в конструктор
Изменяем конструктор Form2
+ Доступ ко всем открытым полям/функциям первой формы
+ Передача данных возможна в обе стороны
— Нарушает ООП
2.5 Используем свойство ‘родитель’
При создании второй формы устанавливаем владельца
+ Доступ ко всем открытым полям/функциям первой формы
+ Передача данных возможна в обе стороны
+ Не нарушает ООП
2.6 Используем отдельный класс
Создаем отдельный класс, лучше статический, в основном namespace, т.е. например в файле Program.cs
+ Самый удобный способ, когда данные активно используются несколькими формами.
2.7 Использование функций обратного вызова
2.7.1 Передача метода в конструктор
Создаем в основном namespace делегат
Непонятен пункт 2.5 из «Ответы на 7 самых частых вопросов по WinForms»
Вопрос по пункту 2.5 из «Ответы на 7 самых частых вопроса по WinForms». Вот код: // в форме 1.
Ответы на 7 самых частых вопросов по Windows Forms, C++/CLI Edition
Ответы на 7 самых частых вопросов по Windows Forms C++/CLI Edition Эта статья является.
Ответы на 7 самых частых вопросов по Windows Forms, C++/CLI Edition — свой способ передачи данных между формами
Способ с использованием макросов. Средней сложности в реализации и понимании, не знаю, нарушает ли.
Список Ваших вопросов Платону Щукину и его ответы
Данная тема будет предназначана для публикования Ваших вопросов и ответов с службой поддержки.
+ Наиболее гибкий способ передачи данных
— Сложен в реализации и понимании
3. Как получить доступ к контролу из другого потока
С элементами управления можно работать только из того потока в котором они были созданы. При обращении из другого потока будет сгенерировано исключение InvalidOperationException с текстом «Cross-thread operation not valid: Control accessed from a thread other than the thread it was created on.» (Недопустимая операция в нескольких потоках: попытка доступа к элементу управления не из того потока, в котором он был создан.). Возможные решения:
3.1 Простой и неправильный способ
Отменяем проверку, из какого потока используется контрол
Для одного раза может и сработать, но делать так крайне не рекомендуется.
3.2 Использование методов Invoke/BeginInvoke
Эти методы выполняют указанные делегаты в том потоке, в котором контрол был создан.
Invoke вызывает делегат синхронно, BeginInvoke — асинхронно.
Чтобы определить, требуется ли Invoke используйте свойство InvokeRequired.
Например, объявляем делегат
Позволю себе дополнить вопрос по связи и передаче данных двух форм, формы и класса. Подобные темы возникают очень часто, но в данном FAQ нет главного примера — использование событий, которые, как я считаю, являются самым верным способом для передачи к-либо данных.
Итак, вот участки кода. Для лучшего понимания прикрепляю архив с проектом. Имеем:
1.Главная форма, с двумя датагридами и двумя кнопками.
2.Дополнительная форма с тремя текстовыми полями и одной кнопкой.
3.Отдельный класс.
Логика работы: по нажатию на кнопку получения данных из доп.формы, открывается окно второй формы. Заполняем текстовые поля, и по нажатию кнопки форма закрывается, а данные из полей оказываются в гриде 1. По нажатию кнопки получения данных из класса создается объект класса, в конструкторе класса формируется таблица, которая при вызове метода класса передает данные в осн. форму, где они отображаются в гриде 2.
Также уточню, что передачу таблиц я выбрал для наглядности, и передавать таким способом можно все что угодно, используя приведенный шаблон
PS.В моем коде специально не использовались анонимные делегаты и лямбда, для облегчения восприятия новичками.
Код основной формы:
Вложения
FormsCommunicatoinTest.rar (51.7 Кб, 1461 просмотров) |
Комментарий модератора | ||
|
Меню пользователя @ tezaurismosis |
Читать блог |
Найти вероятность того, что студент, выбирая ответы наугад, ответит на 10 вопросов
Машина-экзаменатор содержит 12 вопросов, на каждый из которых предлагается 4 варианта ответа.
Ответы на Комплект вопросов сертиф экз «1С:Бухгалтерия 8» ред. 1.6
У кого есть ответы на «Комплект вопросов сертифицированного экзамена по программе «1С:Бухгалтерия.
на ответы@mail.ru на один из моих вопросов, где я уточнил, что использую ubuntu 10.10 мне сказали, что.
на ответы@mail.ru на один из моих вопросов, где я уточнил, что использую ubuntu 10.10 мне сказали.
Найти два самых больших и самых маленьких элементов массива
Одномерные массивы для обычных массивов и для класса Array. Составить программу нахождения двух.