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

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

  • автор:

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

Чтобы добавить еще одну форму в проект, нажмем на имя проекта в окне 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)

Теперь сделаем наоборот — чтобы вторая форма воздействовала на первую. Пока вторая форма не знает о существовании первой. Чтобы это исправить, надо второй форме как-то передать сведения о первой форме. Для этого воспользуемся передачей ссылки на форму в конструкторе.

Итак перейдем ко второй форме и перейдем к ее коду — нажмем правой кнопкой мыши на форму и выберем 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)

Поскольку в данном случае ключевое слово this представляет ссылку на текущий объект — объект Form1, то при создании второй формы она будет получать ее (ссылку) и через нее управлять первой формой.

Теперь после нажатия на кнопку у нас будет создана вторая форма, которая сразу изменит цвет первой формы.

Мы можем также создавать объекты и текущей формы:

private void button1_Click(object sender, EventArgs e)

При работе с несколькими формами надо учитывать, что одна из них является главной — которая запускается первой в файле Program.cs. Если у нас одновременно открыта куча форм, то при закрытии главной закрывается все приложение и вместе с ним все остальные формы.

Вызвать метод формы из другого класса

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

private void Form1_Load(object sender, EventArgs e) < Thread thread = new Thread(delegate() < Auth.CheckAuth(); >); thread.Start(); > 
class Auth < public static void CheckAuth() < while (true) < //тут нужно обновлять информацию в форме Form1.label1.Invoke((MethodInvoker)(delegate() < Form1.label1.Text = "INFO"; >)); Thread.Sleep(7000); > > > 

Пытался делегатами, но тщетно. Если через методы — тоже не пойму, что ему нужно.

public void update_Label1(string text)
Form1.update_Label1("INFO"); 

И вызываю в том же месте в классе. Ругается на статику, но если прописать, то всплывает еще порядка 50 ошибок. Помогите сделать так, чтобы можно было без проблем осуществить задуманное?

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

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

Сообщений: 66

C# Как обратиться к методу из другой формы?

Подскажите, как обратиться к методу из другой формы? Есть тестовый метод test() на FORM1, который меняет текст в label1. Его я вызываю из Form2 таким образом Form1 form1 = new Form1(); form1.test(); он срабатывает, но никаких изменений в label1 не происходит. Поменял в дизайнере первой формы private свойства на publice у label, но по прежнему при вызове этого метода со второй формы текст в label1 не меняется.

using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; namespace WindowsFormsApplication15 < public partial class Form1 : Form < public void test() < label1.Text = "Example text"; >public Form1() < InitializeComponent(); >private void button1_Click(object sender, EventArgs e) < Form2 form2 = new Form2(); form2.Show(); >> >
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; namespace WindowsFormsApplication15 < public partial class Form2 : Form < public Form2() < InitializeComponent(); >private void Form2_Load(object sender, EventArgs e) < Form1 form1 = new Form1(); form1.test(); >> >

Дизайнер Form1

 namespace WindowsFormsApplication15 < partial class Form1 < /// /// Required designer variable. /// private System.ComponentModel.IContainer components = null; /// /// Clean up any resources being used. /// /// true if managed resources should be disposed; otherwise, false. protected override void Dispose(bool disposing) < if (disposing && (components != null)) < components.Dispose(); >base.Dispose(disposing); > #region Windows Form Designer generated code /// /// Required method for Designer support - do not modify /// the contents of this method with the code editor. /// private void InitializeComponent() < this.button1 = new System.Windows.Forms.Button(); this.label1 = new System.Windows.Forms.Label(); this.SuspendLayout(); // // button1 // this.button1.Location = new System.Drawing.Point(380, 140); this.button1.Name = "button1"; this.button1.Size = new System.Drawing.Size(100, 45); this.button1.TabIndex = 0; this.button1.Text = "button1"; this.button1.UseVisualStyleBackColor = true; this.button1.Click += new System.EventHandler(this.button1_Click); // // label1 // this.label1.AutoSize = true; this.label1.Location = new System.Drawing.Point(380, 63); this.label1.Name = "label1"; this.label1.Size = new System.Drawing.Size(35, 13); this.label1.TabIndex = 1; this.label1.Text = "label1"; // // Form1 // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.ClientSize = new System.Drawing.Size(593, 344); this.Controls.Add(this.label1); this.Controls.Add(this.button1); this.Name = "Form1"; this.Text = "Form1"; this.ResumeLayout(false); this.PerformLayout(); >#endregion public System.Windows.Forms.Button button1; public System.Windows.Forms.Label label1; >

Вызов метода формы из другой формы

Иногда у разработчика возникает необходимость вызывать какой-либо метод, определенный в форме из другой формы. Начинающих типа меня такая задача ставит в ступор. Прочитал много методов решения в том числе Ответы на 7 самых частых вопроса по WinForms

Но что если Форма2 уже создана и показана пользователю и нужно сразу вызвать метод Формы1? Или возникает ситуация: Форма1 показывает Форму2, Форма2 показывает Форму3 и т.д., нужно вызвать из последней формы произвольный метод 1й формы?

У одного хорошего человека подсмотрел еще один гибкий и как мне показалось наиболее удобный метод, итак
Определяем статическое свойство в классе формы, метод которой будем вызывать, и инициализируем его в конструкторе:

1 2 3 4 5 6 7
public static Form1 SelfRef{get; set;} public Form1() { SelfRef = this; InitializeComponent(); }

Все, в нужной форме (допустим Form3) выполняем нужный метод:

1 2 3 4
if(Form1.SelfRef != null) { Form1.SelfRef.MyMethod(); }

94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
Ответы с готовыми решениями:

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

Вызов метода из экземпляра другой формы
Выручайте. Начал разбираться с c#. Проект расположен на двух формах. На первой форме при нажатии.

Вызов процедуры формы из другой формы
Здравствуйте! Есть процедура, обновляющая данные в гриде. Подключается к бд и выводит данные. Нужно.

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

911 / 815 / 332
Регистрация: 03.02.2015
Сообщений: 5,253
Записей в блоге: 9

ЦитатаСообщение от rams Посмотреть сообщение

Иногда у разработчика возникает необходимость вызывать какой-либо метод, определенный в форме из другой формы.

Формы ничего не должны определять — они призваны отображать. Что Вы хотите сделать?
Регистрация: 24.01.2014
Сообщений: 92
делегаты вам в помощь
Регистрация: 04.04.2012
Сообщений: 107

ЦитатаСообщение от Sanya_sa Посмотреть сообщение

Формы ничего не должны определять — они призваны отображать. Что Вы хотите сделать?

Мне надо было обновить данные в двух формах из третьей. Ситуация стандартная вызов формы настроек, после выбора настроек скачивается файл данных в формате json, данные в класс и заполнить соответствующие label,check, textbox в первых двух формах понятно что не закрывая их иначе и проблемы бы не было, все. Да данных примерно 7к строк, нужны две трети и еще программа постоянно висит в трее, сделано полноценное окно, которое отображается при наведении мыши ну и скрывается, там все должно обновляться в реал тайм.

А вы бы как сделали?

911 / 815 / 332
Регистрация: 03.02.2015
Сообщений: 5,253
Записей в блоге: 9

Если формы постоянно открыты (те в которые нужно передать) — то использовал бы события;
Если формы открываются (те в которые нужно передать) по мере необходимости просмотреть информацию — то передавал бы в конструктор.

911 / 815 / 332
Регистрация: 03.02.2015
Сообщений: 5,253
Записей в блоге: 9

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
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 Inheritance { public partial class MainForm : Form { Liststring> _Data = new Liststring>(); public MainForm() { InitializeComponent(); } private void buttonData_Click(object sender, EventArgs e) { _Data.Clear(); foreach (var it in richTextBoxContentData.Text.Split('\n')) { _Data.Add(it); } } private void buttonF1_Click(object sender, EventArgs e) { FormOne f = new FormOne(_Data); f.Show(); } private void buttonF2_Click(object sender, EventArgs e) { FormTwo f = new FormTwo(_Data); f.Show(); } } }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
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 Inheritance { public partial class FormOne : Form { public FormOne(Liststring> data) { InitializeComponent(); foreach (var it in data) { richTextBox1.Text += it + "\n"; } } } }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
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 Inheritance { public partial class FormTwo : Form { public FormTwo(Liststring> data) { InitializeComponent(); foreach (var it in data) { richTextBox1.Text += it + "\n"; } } } }

784 / 615 / 273
Регистрация: 04.08.2015
Сообщений: 1,707

ЦитатаСообщение от rams Посмотреть сообщение

Ситуация стандартная вызов формы настроек

Хранить настройки в статическом классе, к которому можно обратиться из любой формы. Я бы еще добавил сохранение/извлечение настроек в/из файл(а), если есть вероятность, что некоторые данные неизменные.

Регистрация: 04.04.2012
Сообщений: 107

ЦитатаСообщение от Sanya_sa Посмотреть сообщение

Если формы постоянно открыты (те в которые нужно передать) — то использовал бы события;

Вот здесь у меня туман не разобрался еще, за примеры спасибо конечно, но они все же для второго варианта, а мне то нужен первый «типа динамического обновления открытой формы 1,2,3 по щелчку кнопки в форме 4» вот в чем проблема, описал так сказать абстрактно

911 / 815 / 332
Регистрация: 03.02.2015
Сообщений: 5,253
Записей в блоге: 9

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
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 Inheritance { public partial class FormOne : Form { public FormOne(MainForm f) { InitializeComponent(); f.EveDataCh += f_EveDataCh; } void f_EveDataCh(object sender, Liststring> e) { foreach (var it in e) { richTextBox1.Text += it + "\n"; } } } }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51
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 Inheritance { public partial class MainForm : Form { public event EventHandlerListstring>> EveDataCh; Liststring> _Data = new Liststring>(); FormOne f1; FormOne f2; public MainForm() { InitializeComponent(); FormOne f1 = new FormOne(this); FormTwo f2 = new FormTwo(this); f1.Show(); f2.Show(); } private void buttonData_Click(object sender, EventArgs e) { _Data.Clear(); foreach (var it in richTextBoxContentData.Text.Split('\n')) { _Data.Add(it); } } private void buttonF1_Click(object sender, EventArgs e) { if (EveDataCh != null) { EveDataCh(this, _Data); } } private void buttonF2_Click(object sender, EventArgs e) { if (EveDataCh != null) { EveDataCh(this, _Data); } } } }

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

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