Как связать формы в c#. Добавление форм
Последнее обновление: 31.10.2015
Чтобы добавить еще одну форму в проект, нажмем на имя проекта в окне Solution Explorer (Обозреватель решений) правой кнопкой мыши и выберем Add(Добавить)->Windows Form...
Дадим новой форме какое-нибудь имя, например, Form2.cs :
Итак, у нас в проект была добавлена вторая форма. Теперь попробуем осуществить взаимодействие между двумя формами. Допустим, первая форма по нажатию на кнопку будет вызывать вторую форму. Во-первых, добавим на первую форму Form1 кнопку и двойным щелчком по кнопке перейдем в файл кода. Итак, мы попадем в обработчик события нажатия кнопки, который создается по умолчанию после двойного щелчка по кнопке:
Private void button1_Click(object sender, EventArgs e) { }
Теперь добавим в него код вызова второй формы. У нас вторая форма называется Form2, поэтому сначала мы создаем объект данного класса, а потом для его отображения на экране вызываем метод Show:
Private void button1_Click(object sender, EventArgs e) { Form2 newForm = new Form2(); newForm.Show(); }
Теперь сделаем наоборот - чтобы вторая форма воздействовала на первую. Пока вторая форма не знает о существовании первой. Чтобы это исправить, надо второй форме как-то передать сведения о первой форме. Для этого воспользуемся передачей ссылки на форму в конструкторе.
Итак перейдем ко второй форме и перейдем к ее коду - нажмем правой кнопкой мыши на форму и выберем View Code (Просмотр кода). Пока он пустой и содержит только конструктор. Поскольку C# поддерживает перегрузку методов, то мы можем создать несколько методов и конструкторов с разными параметрами и в зависимости от ситуации вызывать один из них. Итак, изменим файл кода второй формы на следующий:
Using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace HelloApp { public partial class Form2: Form { public Form2() { InitializeComponent(); } public Form2(Form1 f) { InitializeComponent(); f.BackColor = Color.Yellow; } } }
Фактически мы только добавили здесь новый конструктор public Form2(Form1 f) , в котором мы получаем первую форму и устанавливаем ее фон в желтый цвет. Теперь перейдем к коду первой формы, где мы вызывали вторую форму и изменим его на следующий:
Private void button1_Click(object sender, EventArgs e) { Form2 newForm = new Form2(this); newForm.Show(); }
Поскольку в данном случае ключевое слово this представляет ссылку на текущий объект - объект Form1, то при создании второй формы она будет получать ее (ссылку) и через нее управлять первой формой.
Теперь после нажатия на кнопку у нас будет создана вторая форма, которая сразу изменит цвет первой формы.
Мы можем также создавать объекты и текущей формы:
Private void button1_Click(object sender, EventArgs e) { Form1 newForm1 = new Form1(); newForm1.Show(); Form2 newForm2 = new Form2(newForm1); newForm2.Show(); }
При работе с несколькими формами надо учитывать, что одна из них является главной - которая запускается первой в файле Program.cs. Если у нас одновременно открыта куча форм, то при закрытии главной закрывается все приложение и вместе с ним все остальные формы.
Если у вас есть длинная форма для нескольких элементов, иногда может потребоваться быстро выполнить детализацию данных, чтобы просмотреть дополнительные сведения об одном из элементов. В Access для этого нужно установить связь между формой для нескольких элементов и формой отдельного элемента. При выборе элемента в форме для нескольких элементов откроется форма отдельного элемента, в которой будут показаны дополнительные сведения.
Примечания:
Создание форм
В большинстве случаев две формы в детализированной конфигурации основаны на одной таблице или запросе. Если у вас уже есть пара форм, необходимых для использования (одна из которых - таблица или форма для нескольких элементов, а другая - форма отдельного элемента или форма сведений), вы можете пропустить этот раздел. В противном случае используйте следующие процедуры для их создания.
Создание формы таблицы или формы с несколькими элементами
В области навигации выберите таблицу или запрос с данными, которые нужно отобразить в табличной форме.
Выберите пункты Создание > Другие формы , а затем - Несколько элементов или Таблица в зависимости от нужного типа формы.
Сохраните и закройте форму.
Дополнительные сведения о формах для нескольких элементов см. в статье Создание формы с использованием инструмента "Несколько элементов" .
Создание формы отдельного элемента или формы сведений
В области навигации щелкните таблицу или запрос с данными, которые нужно отобразить в форме сведений. Скорее всего, это будет та же таблица или тот же запрос, который вы использовали для первой формы.
Выберите пункты Создание > Форма .
Внесите необходимые изменения, сохраните и закройте форму.
Дополнительные сведения см. в статье Создание формы с помощью инструмента "Форма" .
Добавление логики для открытия формы сведений
Теперь рассмотрим, как добавить в форму для нескольких элементов или форму таблицы небольшой макрос, который будет открывать форму сведений и отображать правильный элемент.
Не беспокойтесь, если у вас мало опыта работы с макросами. Вы можете просто скопировать и вставить XML-код из процедуры, указанной в этой статье.
Если вы используете форму таблицы, дважды щелкните ее в области навигации, чтобы открыть ее. В случае формы для нескольких элементов щелкните ее правой кнопкой мыши в области навигации и выберите пункт Режим макета .
Нажмите клавишу F4, чтобы открыть окно свойств, если оно еще не открыто.
Щелкните столбец, в который нужно добавить макрос. Это должен быть столбец, при щелчке которого будет открываться форма сведений после выполнения макроса. На рисунке выше макрос добавлен в столбец frmContactList.
Совет: (СОВЕТ.) Можно добавить макросы в несколько столбцов.
Дополнительные сведения о макросах в базах данных на компьютере см. в статье
Это ясно, что если создать указатель типа <что там>::Form будет работать, но мне нужна уже созданная форма, с кнопками и т.п. (в общем разными контролами), а вручную (т.е. программно) прописывать их на чистой форме мне не хочеЦЦа (много писанины и не факт, что получиЦЦа так как надо). Меня еще смущает вот что....... Когда я добавлял форму к уже созданному проекту, в новом заголовочном файле Form2.h было написано так:
#pragma once
#include "Form1.h"
using namespace System;
using namespace System::Data;
namespace My1 {
///
/// Summary for Form2
public ref class Form2: public System::Windows::Forms::Form
{
public:
Form2(void)
{
InitializeComponent();
}
Protected:
~Form2()
{
if (components)
{
delete components;
}
}
Private:
///
{
this->components = gcnew System::ComponentModel::Container();
this->Size = System::Drawing::Size(300,300);
this->Text = L"Form2";
this->Padding = System::Windows::Forms::Padding(0);
this->
}
#pragma endregion
};
}
хотя в Form1.h написано так:
#pragma once
#include "Form2.h"
namespace My1 {
Using namespace System;
using namespace System::ComponentModel;
using namespace System::Collections;
using namespace System::Windows::Forms;
using namespace System::Data;
using namespace System::Drawing;
///
/// Summary for Form1
/// WARNING: If you change the name of this class, you will need to change the
/// "Resource File Name" property for the managed resource compiler tool
/// associated with all .resx files this class depends on. Otherwise,
/// the designers will not be able to interact properly with localized
/// resources associated with this form.
public ref class Form1: public System::Windows::Forms::Form
{
public:
Form1(void)
{
InitializeComponent();
//TODO: Add the constructor code here
}
Protected:
/// Clean up any resources being used.
~Form1()
{
if (components)
{
delete components;
}
}
private: System::Windows::Forms::Button^ button1;
protected:
Private:
/// Required designer variable.
System::ComponentModel::Container ^components;
#pragma region Windows Form Designer generated code
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
void InitializeComponent(void)
{
this->button1 = (gcnew System::Windows::Forms::Button());
this->SuspendLayout();
// button1
this->button1->Location = System::Drawing::Point(60, 76);
this->button1->Name = L"button1";
this->button1->Size = System::Drawing::Size(75, 23);
this->button1->TabIndex = 0;
this->button1->Text = L"button1";
this->button1->UseVisualStyleBackColor = true;
this->button1->Click += gcnew System::EventHandler(this, &Form1::button1_Click);
// Form1
this->AutoScaleDimensions = System::Drawing::SizeF(6, 13);
this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font;
this->ClientSize = System::Drawing::Size(292, 266);
this->Controls->Add(this->button1);
this->Name = L"Form1";
this->Text = L"Form1";
this->ResumeLayout(false);
}
#pragma endregion
Static System::Windows::Forms::Form ^frm = gcnew System::Windows::Forms::Form();
private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) {
frm->Show();
}
};
}
В РАЗНЫХ МЕСТАХ ПРОПИСАНО ПОДКЛЮЧЕНИЕ ПРОСТРАНСТВА ИМЕН!
Возможно, будет полезно почитать:
- Публичные дома в царской россии ;
- «Вы должны быть уверены, что решение взять ипотеку действительно приоритетно Последние советы раздела «Дом и дача» ;
- На каких документах обязательно нужна печать компании, а когда без нее вполне можно обойтись ;
- Состав проектной и рабочей документации ;
- Проведение экспертизы проектно-сметной документации, анализ исполнения сметы затрат ;
- Делопроизводство от А до Я ;
- Подписи каких должностных лиц какой печатью правильно заверять? ;
- Организационные аспекты контроля исполнения бюджета ;