Вызвать метод формы из другого класса
Хочу обновить текст в лейбле из другого класса, но не знаю как это сделать. Запускаю поток в соседнем классе:
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; >
Как вызвать метод из другой формы 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. Если у нас одновременно открыта куча форм, то при закрытии главной закрывается все приложение и вместе с ним все остальные формы.
Управление одной формой из другой
Иногда бывает нужно обратиться к элементам какой-то формы из другой в процессе выполнения программы. Например, есть форма 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 >> >