Перейти к содержимому

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

  • автор:

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

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

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 >> >

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

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