Как передать значение из одной формы в другую c
Перейти к содержимому

Как передать значение из одной формы в другую c

Как передать значение из одной формы в другую c

На форме нужно сделать, что то типа того:

Form1.Label1.Text = Form2.Label1.Text;

Так было в Delphi, а как с этим здесь?

Win 10 x64 | VS 2015 | MSSQL 2014
autovestitv.ru

Участник клуба Подтвердите свой е-майл

Регистрация: 14.12.2007

Сообщений: 1,434

Что бы получить доступ к компоненту другой формы нужно сделать этот компонент public.

Открываем исходник дизайнера формы Form1.Designer.cs, ищим строку (у меня кнопка)

private System.Windows.Forms.Button button1;

и меняем на

public System.Windows.Forms.Button button1;
Form1 child = new Form1(); child.button1.Text = "sdgsdg"; child.Show();

Проповедую design patterns, верую в MVC, доверяю eXtrime programming.

Передача значения переменной из одной формы в другую

Функция одной и нескольких переменных

1. Передача значения переменной из одной формы в другую

2.

2
C#
Часто возникает
необходимость передать
определённые параметры
между формами в одном
приложении, например
значения каких либо
переменных, или
запустить какую либо
процедуру или функцию в
другой форме

3.

Первый способ
3
1. Объявить глобальную статическую
переменную;
2. Определить значение переменной;
3. Вторая форма;
4. На второй форме прочитать
перемеренную так
Form1.переменная
5. Выполнять с ней работу.
C#

4.

Первый способ
4
C#

5.

Первый способ
5
1
2
3
C#

6.

Первый способ
6
4
5
C#

7.

8.

9.

10.

Первый способ
10
C#
1. Объявить переменную на 1 форме;
2. Предать переменную 2 форме
Form2 f2 = new Form2(переменная);
f2.Show();
3. Объявить переменную на 2 форме
4. В конструкторе 2 формы определить
переменную от 1 формы
5. Присвоить переменную 2 формы
значение переменной 1 формы, …

Управление одной формой из другой

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

1-й способ. Передача ссылки в public переменную.

Перед открытием формы, передаем ссылку на нужный элемент в переменную public вызываемой формы.

namespace WindowsApplication1 < public partial class Form1 : Form < public Form1() < InitializeComponent(); >private void button1_Click(object sender, EventArgs e) < Form2 frm = new Form2(); frm.but1 = this.button1; // передаем ссылку на кнопку в форму Form2 frm.ShowDialog(); >> >

В форме Form2 переменная, в которую передавали ссылку, будет теперь соответствовать кнопке button1 из формы Form1

namespace WindowsApplication1 < public partial class Form2 : Form < public Button but1; // эта переменная будет содержать ссылку на кнопку button1 из формы Form1 public Form2() < InitializeComponent(); >private void button1_Click(object sender, EventArgs e) < but1.Text = "test"; // меняем текст на кнопке button1 формы Form1 >> >

2-й способ. Передача ссылки в дочернюю форму.

Суть примерна та же, то и в 1-м способе. При открытии формы Form2 передаем в нее ссылку на элемент, который планируем потом менять.

namespace WindowsApplication1 < public partial class Form1 : Form < public Form1() < InitializeComponent(); >private void button1_Click(object sender, EventArgs e) < Form2 frm = new Form2(this.button1); // передаем ссылку на кнопку в форму Form2 frm.ShowDialog(); >> >

Теперь в форме Form2 нужно создать переменную, которая будет содержать ссылку на эту кнопку и через нее будем обращаться к кнопке на Form1 (строки 5,7,9 и 15).

namespace WindowsApplication1 < public partial class Form2 : Form < private Button but1; // эта переменная будет содержать ссылку на кнопку button1 из формы Form1 public Form2(Button but) // получаем ссылку на кнопку в переменную but < but1 = but; // теперь but1 будет ссылкой на кнопку button1 InitializeComponent(); >private void button1_Click(object sender, EventArgs e) < but1.Text = "test"; // меняем текст на кнопке button1 формы Form1 >> >

3-й способ. Доступ ко всей родительской форме.

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

Шаг 1. В файле Program.cs создаем публичную переменную f1 (строка 5).

namespace WindowsApplication1 < static class Program < public static Form1 f1; // переменная, которая будет содержать ссылку на форму Form1 [STAThread] static void Main() < Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new Form1()); >> >

Шаг 2. Открываем Form1.Designer.cs и в нем у элементов, к которым нужно будет обратиться из другой формы, меняем private на public . Например, сделаем доступной для изменений кнопку button1 на форме Form1.

public System.Windows.Forms.Button button1; // заменили private на public

Шаг 3. При создании формы Form1 присваиваем переменной f1 ссылку на эту форму (строка 7)

namespace WindowsApplication1 < public partial class Form1 : Form < public Form1() < Program.f1 = this; // теперь f1 будет ссылкой на форму Form1 InitializeComponent(); >private void button1_Click(object sender, EventArgs e) < Form2 frm = new Form2(); frm.ShowDialog(); >> >

Шаг 4. Теперь из абсолютно любой формы или из любого класса можно обратиться к элементу button1 находящемуся на Form1 так: Program.f1.button1. Например, пусть кнопка в Form2 поменяет текст кнопки на Form1:

namespace WindowsApplication1 < public partial class Form2 : Form < public Form2() < InitializeComponent(); >private void button1_Click(object sender, EventArgs e) < Program.f1.button1.Text = "test"; // Меняем текст на кнопке формы Form1 >> >

С++ передача данных из одной формы в другую

Собственна из темы вытекает такой вопрос, как это сделать? Для примера можно взять переменную типа int.

11 ответов

24 августа 2008 года
163 / / 06.09.2007

А в чем проблема? Формы — это классы. Создается свойство или функция, возвращающая нужные данные, и вызывается из дргой формы.

24 августа 2008 года
68 / / 01.11.2007

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

24 августа 2008 года
1.6K / / 07.06.2005

1_Aposym_1, вы себе не представляете, как нелегко ответить на ваш вопрос, если не знать, что именно у вас не работает. Приведите пример вашего кода, покажите, в каком месте и какая ошибка возникает — и тогда вы сразу выставите себя в лучшем свете, ибо «не решил и не брался решать» хуже, чем «взялся решать, но не разобрался». Недаром на письменных экзаменах по математике просят показать ещё и черновик. Разобраться в неработающем коде всегда легче (и гораздо), чем в абстрактной проблеме передачи даных. Код в студию. 🙂

24 августа 2008 года
163 / / 06.09.2007
вот простой пример использования свойства (на Form1 кнопка, на Form2 TextBox, . — код дизайнера):

public ref class Form2 : public System::Windows::Forms::Form
.
public:

property String^ SampleText
String^ get()

public ref class Form1 : public System::Windows::Forms::Form
.
private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e)

WindowsFormsApp::Form2 ^f = gcnew WindowsFormsApp::Form2();

Но, как верно заметил Sanila_san, лучше приведите код, который не работает.
25 августа 2008 года
68 / / 01.11.2007

К примеру, если брать такую же ситуацию в сибилдере там нужна одна две строчки, чтобы передать данные на другую форму. В данном случае меня интересовало как это делается в VS. Так такового кода у меня нет. Lifs неплохой вариант.
К примеру такая ситуация находимся на 2 форме формируем какие-то данные и их сразу же передаем напряму в переменные которые находятс я на форме 1

26 августа 2008 года
163 / / 06.09.2007

Аналогично, в Form1 надо создать функцию, принимающую соответствующий параметр, или свойство. Когда создается и показывается форма2 и ей передается:

f->ShowDialog(this);

то f->Owner — указатель на form1. Ей можно передавать то, что необходимо.

Если owner не передается, то form1 можно передать в конструкторе.

26 августа 2008 года
874 / / 21.12.2007

Аналогично, в Form1 надо создать функцию, принимающую соответствующий параметр, или свойство. Когда создается и показывается форма2 и ей передается:

f->ShowDialog(this);

то f->Owner — указатель на form1. Ей можно передавать то, что необходимо.

Если owner не передается, то form1 можно передать в конструкторе.

Есть более элегантный способ: события.
В общем, следует спланировать/перепланировать логику так, чтобы можно было с уверенностью сказать, что Form1 — основной объект, а Form2 — ему подчинённый. Подчинённый объект поставляет данные, а основной из обрабатывает — только так. Предоставлять данные можно с помощью свойств, а уведомлять о неактуальности предыдущих — с помощью событий.

26 августа 2008 года
163 / / 06.09.2007
Добавлю, что и поставлять данные можно с помощью событий.
26 августа 2008 года
68 / / 01.11.2007

Der Meister правильно я понял? Есть переменная(свойство класса) в Form2 к примеру int a присвоили какое то значение, закрыли окно.
Потом в Form1
Form2 ^f = gcnew Form2();
f->ShowDialog(this);
После закрытия окна
int b=f->a;
«а уведомлять о неактуальности предыдущих — с помощью событий.» тут мне не понятно.
Как я себе представляю, допустим, есть простейшее форма две кнопки да и нет. При нажатии кнопки «да» окно закрывается и что-то передает, при «нет» данные не передаются и окно закрывается. Как я могу отловить события вот эти на Form1? Надеюсь я правильно понял).

27 августа 2008 года
874 / / 21.12.2007

[QUOTE=1_Aposym_1]Как я себе представляю, допустим, есть простейшее форма две кнопки да и нет. При нажатии кнопки «да» окно закрывается и что-то передает, при «нет» данные не передаются и окно закрывается.[/QUOTE]С этого стоило начать.

Тебе предложили два варианта:
— Form2 используется как диалог,
— содержимое Form1 изменяется в зависимости от действий, производимых с From2. Оба окна остаются открытыми.

Твой случай подходит под первый вариант. Делай открытое (public) свойство в Form2, возвращающее необходимые данные (самый первый вариант, любезно предоставленный lifs). У кнопок есть свойство DialogResult, которое можно выставить в дизайнере. Ставим для кнопки «Да» значение Yes. Метод Form.ShowDialog() возвращает значение перечисляемого типа DialogResult. Если нажали «Да», метод ShowDialog() вернёт DialogResult.Yes. Тогда читаем значение свойства и продолжаем работу, в противном случае значение свойства игнорируем.
Собсна, твой код отражает решение проблемы почти правильно.

Form2 ^f = gcnew Form2();
if (f->ShowDialog(this) == DialogResult.Yes)
int b=f->a;
// делаем что надо
>

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *