Две формы windows forms

WinForms две формы

Есть две формы.
На первой и на второй есть одна кнопка и текстбокс. Нужно что бы при нажатии кнопки на 1й форме появлялась 2я форма, а при нажатии кнопки на второй форме, она записывала какой-то текст в текстбокс 1й формы.

По-идее реализуется след. кодом:
На 1й форме:
private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) <
form2 ^myobj1=gcnew form2;
myobj1->Show();
>
На 2й форме:
private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) <

Form1 ^frm1;
frm1=this->Owner;
frm1->textBox1->Text =»321″;
>

Но возникают ошибки, т.к. первая форма незнает что такое form2, а вторая форма незнает что такое form1.
По-идее в каждой форме нужно подключить файл другой, т.е.
в первой:
#include «form2.h»

во второй
#include «form1.h»

Но в таком случае возникает окуча ошибок, по всей видимости из-за двойного определения.
#ifndef
#pragma once
не помогают

Подскажите, пожалуйста, как реализовать данную задачу. Задача по своей сути элементарна, но как сделать — хз

14 ответов

Касаемо того, что по-умолчанию у объектом облсть видимости private — я знаю. Ее переделал в public.

Значит создано 2 формы, соответственно первая Form1 и вторая Form2

На первой создаем текстбокс и кнопку, которой задаем код, который бы показывал нам 2ю форму. Вот собственно код:
private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) <
Form2 ^frm2 = gcnew Form2();
frm2->Show();
>

Пытаемся запустить. Бац — ошибка
1>d:\programs\2forms\Form1.h(98) : error C2065: ‘Form2’ : undeclared identifier
1>d:\programs\2forms\Form1.h(98) : error C2065: ‘frm2’ : undeclared identifier
1>d:\programs\2forms\Form1.h(98) : error C2061: syntax error : identifier ‘Form2’
1>d:\programs\2forms\Form1.h(99) : error C2227: left of ‘->Show’ must point to class/struct/union/generic type

Естественно мы понимаем, что компилятор, читая код в файле Form1.h понятия не имеет, что есть еще класс Form2.h Ну мы исправляем это досадное недоразумение, путем записи в файл Form1.h следующей строчки:
#include «Form2.h»

Запускаем. Вуаля!! У нас на экране появляется форма. При нажатии на кнопку у нас появляется наша 2я форма. Казалось бы, с половиной задачи мы справились. Теперь нам нужно, что бы при нажатии кнопки во второй форме у нас появлялся какой-то текст в окне первой.
Идем на 2ю форму, создаем на ней кнопку, задаем кнопке код:

private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) <
Form1 ^frm1=this->Owner;
frm1->textBox1->Text =»123″;
>

Попутно не забываем в файле Form1.h сделать доступ public для нашего текстбокса, т.е. public: System::Windows::Forms::TextBox^ textBox1;

Пробуем запустить.
Опа. получаем целую кучу ошибок:
1>Compiling.
1>Form2.cpp
1>d:\programs\2forms\Form2.h(97) : error C2065: ‘Form1’ : undeclared identifier
1>d:\programs\2forms\Form2.h(97) : error C2065: ‘frm1’ : undeclared identifier
1>d:\programs\2forms\Form2.h(98) : error C2227: left of ‘->textBox1’ must point to class/struct/union/generic type
1> type is »unknown-type»
1>d:\programs\2forms\Form2.h(98) : error C2227: left of ‘->Text’ must point to class/struct/union/generic type
1>2forms.cpp
1>d:\programs\2forms\Form2.h(97) : error C2065: ‘Form1’ : undeclared identifier
1>d:\programs\2forms\Form2.h(97) : error C2065: ‘frm1’ : undeclared identifier
1>d:\programs\2forms\Form2.h(98) : error C2227: left of ‘->textBox1’ must point to class/struct/union/generic type
1> type is »unknown-type»
1>d:\programs\2forms\Form2.h(98) : error C2227: left of ‘->Text’ must point to class/struct/union/generic type

Опять же логично. Компилятор просматривая файл Form2.h понятия не имеет что такое Form1, а тем более, что такое Form1->textBox1->Text. Т.к. с такой проблемой мы уже сталкивались немного выше, пробуем решить ее аналогично. Добавляем в код файла Form2.h

#ifndef Form1
#include «Form1.h»
#endif

Запускаем. И что мы видим. Мы видим те 4 ошибки, которые появились еще когда мы не сделали #include в файле Form1.h, а так же все ошибки, которые мы получили до #include в файл Form2.h. Да плюс еще притесалась ошибка:

1>d:\programs\2forms\Form2.h(102) : error C2440: ‘initializing’ : cannot convert from ‘System::Windows::Forms::Form ^’ to ‘My2forms::Form1 ^’
1> No user-defined-conversion operator available, or
1> Cast from base to derived requires safe_cast or static_cast

В общем вот такие пироги. Как все-таки сделать возможным доступ из Form2 в Form1 я — хз.

Как связать две формы?

Хочу работать с двумя и более формами в C#. Для начала было бы интересно знать как связать две формы, чтобы из одной можно было бы обращаться к элементам другой.

5 ответов 5

из Form1:
Form2 frm = new Form2(); frm.label1.Text = «hello»; frm.Show();

Так как после закрытия формы Form2 она уничтожается, то я переопределяю метод для закрытия — OnClosing. Нужно зайти в конструктор формы Form2. В свойствах формы найти значок с молнией. В списке найти FormClosing и кликнуть дважды на пустое поле справаот него. В редакторе кода появится новый метод, в котором я пишу следующее:

Далее другой пример, который касается взаимодействия дочерней формы и родительской. Form1.cs:

В результате должен появиться мессаджбокс с сообщением «Parent Function Called». Если нужно обратиться к элементу формы, не забываем указывать видимость, так как по умолчанию она Private, то есть элемент не доступен извне. В конструкторе у свойства элемента устанавливаем Modifiers -> Public.

Читайте также:  Как установить вместо андроид линукс

На самом деле довольно просто. Экземпляр формы — это экземпляр класса, поэтому если нужен доступ снаружи к чему-то внутри формы, просто сделайте соответствующее public свойство (или поле, или метод — как вам больше нравится).

ну и самое главное, что бы экземпляры форм были в области видимости друг у друга.

ну а как обращаться, я думаю, понятно и без объяснений, правда?

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

Когда форма принадлежит другой форме, она закрывается или скрывается с формой владелицей. Например, рассмотрим форму Form2, которая принадлежит форме Form1. Если Form1 закрывается или сворачивается, Form2 также закрывается или сворачивается. Дочерние формы также никогда не отображаются сзади формы-владельца.

*Операции выполняются внутри тела класса родительской формы к котрой присоединяется дочерняя. Производный класс userForm унаследованный от класса Form, должен быть предварительно объявлен(здесь это опущено).

Теперь, в зависимости от потребностей вы можете

    Доверить процесс удаления дочернего окна сборщику мусора. В данном случае оно будет удалено после закрытия главного окна (если программистом не предусмотрено другого)

Выполнить контролируемое удаление дочернего окна, после наступления необходимого вам события, для этого в теле необходимого вам метода, обрабатывающего наступление какого либо нужного вам события, нужно указать:

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

Как вывести на экран вторую форму Form2 ?

Создал на C# две формы (Form1 и Form2), причем Form1 – главная форма, она выводится на экран по умолчанию. А вот как мне вывести на экран вторую форму Form2 ?

Добавлено через 15 часов 52 минуты
уже разобрался сам. дошло

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

Вывести выбранный текст из ComboBox во вторую форму
Подскажите кто либо, у меня на Form1 в comboBox выбираются несколько значений и каждое значение.

Как открыть форму form1 из формы form2?
Что нужно написать на кнопке button1 (находится на форме Form2), чтобы открылась и исправно.

В одной форме несколько TexBox сложить и результат вывести во вторую форму
Как 5 texbox сложить и результат вывести в другую форму через одну кнопку.

создать экземпляр второй формы с помощью оператора new. Указать ей, например, первую форму родительской (св-во Parent). Ну и далее Show у второй формы вызвать или установить Visible = true или еще как. много способов есть.

зы: приписку, что разобрался только сейчас увидел =) но оставлю ответ на вский пожарный, вдруг кому еще пригодится ) Хотя он и не очень содержательный

А я вот сегодня столкнулась с проблемой вызова второй формы, перелопатила все книжки, которые у меня есть, копалась в теме System.Windows.Forms и так и не поняла как же вызвать вторую форму. То, что описывает Dr.Acula, я так понимаю, это создается дочернее окно в окне-контейнере. А мне вот что нужно:

В главном окне есть меню, выбираю пункт меню, во второй форме в textBox1 должно загружаться содержимое xml-файла и, естественно, вторая форма должна появиться. Как это сделать?

Я добавила в проект вторую форму посредством меню Проект/Добавить форму, в проекте она есть, я на нее могу элементы управления класть, она видна в дереве проекта, но как из модуля первой формы обратиться ко второй — для меня до сих пор остается загадкой. В Дельфи было все просто элементарно — подключаешь в модуль первой формы модуль второй и пользуешься на здоровье второй формой!

Я так поняла, что компоненты второй формы защищены, может из-за этого я не могу обратиться к textBox1, принадлежащему форме 2? Если это так, то как можно это изменить?

И существует ли какой-нибудь стандартный способ подключения других форм? Ведь это довольно часто используется.

В какую сторону вообще копать? Подскажите, пожалуйста!

Работа с двумя формами.

Работа с двумя формами
Доброго времени суток, уважаемы знатоки подскажите пожалуйста, я создал 2 формы: 1 форма основное.

Работа с двумя формами (ContextMenuStrip)
Подскажите как реализовать!? Имею две формы: 1. Main_Form; 2. Info_Form. На Main_Form.

Работа с двумя формами; передача данных между ними
Form1: public List lP1 = new List (); public List lP2 =.

Взаимодействие между двумя формами
Подскажите пожалуйста! Как можно ВСЕ массивы и структуры первой формы использовать во второй.

Читайте также:  Как удалить spotify с mac os

Вложения

WindowsFormsApplication3.rar (40.2 Кб, 92 просмотров)

Вложения

WindowsFormsApplication1.rar (47.1 Кб, 21 просмотров)

Да проблема в том, что данные надо передать из второй в первую, по нажатию на кнопку. Если обрабатывать код в конструкторе, то все хорошо.

Добавлено через 15 минут
Вроде чтото получилось)

в коде второй формы ничего пистаь не надо

Подскажите более оптимальный вариант))

Тематические курсы и обучение профессиям онлайн
Профессия‌ С#-разработчик‌ (Skillbox)
Архитектор ПО (Skillbox)
Профессия Тестировщик (Skillbox)

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

Переход между двумя формами
Добрый день! Скажите пожалуйста.,как можно осуществить переход между двумя формами через comboBox?

Взаимодействие между двумя формами
Подскажите, пожалуйста. У меня есть две формы. На первой есть кнопка вызова второй формы и пикчер.

Обмен данными между двумя формами
У меня есть две формы и нужно передать данные от одной формы к другой. Вот код: /* Форма 1 */.

Создать матричный калькулятор с двумя формами
Помогите. В курсаче надо создать матричный калькулятор, который будет сумировать, вычитать.

Как создавать дочерние формы MDI How to: Create MDI child forms

Дочерние MDI-формы являются ключевым элементом приложений с интерфейсом MDI, так как эти формы являются центром взаимодействия с пользователем. MDI child forms are an essential element of Multiple-Document Interface (MDI) applications, as these forms are the center of user interaction.

В следующей процедуре Visual Studio используется для создания дочерней MDI-формы, отображающей RichTextBox элемент управления, аналогично большинству приложений для обработки текстов. In the following procedure, you’ll use Visual Studio to create an MDI child form that displays a RichTextBox control, similar to most word-processing applications. Подставив System.Windows.Forms элемент управления другими элементами управления, такими как DataGridView элемент управления или сочетанием элементов управления, можно создавать дочерние MDI-окна (и, по расширениям, приложения MDI) с различными возможностями. By substituting the System.Windows.Forms control with other controls, such as the DataGridView control, or a mixture of controls, you can create MDI child windows (and, by extension, MDI applications) with diverse possibilities.

Создание дочерних форм MDI Create MDI child forms

Создание нового проекта Windows Forms приложения в Visual Studio. Create a new Windows Forms application project in Visual Studio. В окне свойств формы установите для свойства значение, а для свойства — значение IsMdiContainer true WindowsState Maximized . In the Properties window for the form, set its IsMdiContainer property to true and its WindowsState property to Maximized .

При этом форма назначается в качестве MDI-контейнера для дочерних окон. This designates the form as an MDI container for child windows.

Из Toolbox перетащите элемент управления MenuStrip в форму. From the Toolbox , drag a MenuStrip control to the form. Присвойте Text свойству значение File. Set its Text property to File.

Нажмите кнопку с многоточием (. ) рядом со свойством Items и нажмите кнопку Добавить , чтобы добавить два дочерних пункта меню. Click the ellipsis (…) next to the Items property, and click Add to add two child tool strip menu items. Установите для Text этих элементов свойство » новое » и » окно«. Set the Text property for these items to New and Window.

В обозревателе решений щелкните проект правой кнопкой мыши и выберите пункты Добавить > Новый элемент. In Solution Explorer, right-click the project, and then select Add > New Item.

В диалоговом окне Добавление нового элемента выберите Windows Form (в Visual Basic или в Visual C#) или Windows Forms приложение (.NET) (в Visual C++) в области шаблоны . In the Add New Item dialog box, select Windows Form (in Visual Basic or in Visual C#) or Windows Forms Application (.NET) (in Visual C++) from the Templates pane. В поле имя введите имя формы Form2. In the Name box, name the form Form2. Нажмите кнопку Открыть , чтобы добавить форму в проект. Select Open to add the form to the project.

Дочерняя форма MDI, созданная на этом этапе, является стандартной формой Windows Forms. The MDI child form you created in this step is a standard Windows Form. Таким образом, у нее есть свойство Opacity, которое позволяет управлять прозрачностью формы. As such, it has an Opacity property, which enables you to control the transparency of the form. Однако свойство Opacity предназначено для окон верхнего уровня. However, the Opacity property was designed for top-level windows. Его не следует использовать в дочерних формах MDI, иначе могут возникнуть проблемы с рисованием. Do not use it with MDI child forms, as painting problems can occur.

Эта форма будет шаблоном для дочерних форм MDI. This form will be the template for your MDI child forms.

Читайте также:  Косынка для компьютера windows

Откроется конструктор Windows Forms , отображающий Form2. The Windows Forms Designer opens, displaying Form2.

Перетащите элемент управления RichTextBox из панели элементов в форму. From the Toolbox, drag a RichTextBox control to the form.

В окне Свойства задайте Anchor для свойства значение сверху, слева и Dock свойство для заполнения. In the Properties window, set the Anchor property to Top, Left and the Dock property to Fill.

В результате элемент управления RichTextBox будет целиком заполнять область дочерней формы MDI, даже если ее размеры изменятся. This causes the RichTextBox control to completely fill the area of the MDI child form, even when the form is resized.

Дважды щелкните Новый элемент меню, чтобы создать Click для него обработчик событий. Double click the New menu item to create a Click event handler for it.

Вставьте код, аналогичный приведенному ниже, чтобы создать новую дочернюю форму MDI, когда пользователь щелкнет Новый элемент меню. Insert code similar to the following to create a new MDI child form when the user clicks the New menu item.

В примере ниже обработчик событий обрабатывает событие Click для MenuItem2 . In the following example, the event handler handles the Click event for MenuItem2 . Имейте в виду, что в зависимости от особенностей архитектуры приложения Новый пункт меню может не быть MenuItem2 . Be aware that, depending on the specifics of your application architecture, your New menu item may not be MenuItem2 .

В C++ добавьте следующую #include директиву в верхней части Form1. h: In C++, add the following #include directive at the top of Form1.h:

В раскрывающемся списке в верхней части окна Свойства выберите полосу меню, соответствующую полосе меню файл , и задайте MdiWindowListItem для свойства значение окно ToolStripMenuItem . In the drop-down list at the top of the Properties window, select the menu strip that corresponds to the File menu strip and set the MdiWindowListItem property to the Window ToolStripMenuItem.

Это позволяет меню » окно » поддерживать список открытых дочерних окон MDI с галочкой рядом с активным дочерним окном. This enables the Window menu to maintain a list of open MDI child windows with a check mark next to the active child window.

Нажмите клавишу F5 для запуска приложения. Press F5 to run the application. Выбрав пункт создать в меню файл , можно создать дочерние MDI-формы, которые будут храниться в пункте меню окно . By selecting New from the File menu, you can create new MDI child forms, which are kept track of in the Window menu item.

Когда в дочерней форме MDI есть компонент MainMenu (обычно обладающий структурой пунктов меню) и он открыт внутри родительской формы MDI, также имеющей компонент MainMenu (обычно обладающий структурой пунктов меню), пункты меню будут объединены автоматически, если задано свойство MergeType (и, возможно, свойство MergeOrder). When an MDI child form has a MainMenu component (with, usually, a menu structure of menu items) and it is opened within an MDI parent form that has a MainMenu component (with, usually, a menu structure of menu items), the menu items will merge automatically if you have set the MergeType property (and optionally, the MergeOrder property). Установите для свойства MergeType обоих компонентов MainMenu и всех пунктов меню дочерней формы значение MergeItems. Set the MergeType property of both MainMenu components and all of the menu items of the child form to MergeItems. Кроме того, установите свойство MergeOrder таким образом, чтобы пункты обоих меню приводились в нужном порядке. Additionally, set the MergeOrder property so that the menu items from both menus appear in the desired order. Необходимо помнить, что при закрытии родительской формы MDI каждая из дочерних форм MDI создает событие Closing до создания события Closing для родительской формы MDI. Moreover, keep in mind that when you close an MDI parent form, each of the MDI child forms raises a Closing event before the Closing event for the MDI parent is raised. Отмена события Closing дочерней формы MDI не отменяет событие Closing родительской формы MDI. Однако для аргумента CancelEventArgs для события Closing родительской формы MDI будет установлено значение true . Canceling an MDI child’s Closing event will not prevent the MDI parent’s Closing event from being raised; however, the CancelEventArgs argument for the MDI parent’s Closing event will now be set to true . Чтобы принудительно закрыть родительскую и все дочерние формы MDI, задайте для аргумента CancelEventArgs значение false . You can force the MDI parent and all MDI child forms to close by setting the CancelEventArgs argument to false .

Оцените статью