Как передать значение из одной формы в другую 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;
// делаем что надо
>