Как вызвать метод из другой формы 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. Если у нас одновременно открыта куча форм, то при закрытии главной закрывается все приложение и вместе с ним все остальные формы.
Вызов функции Windows Forms вне класса Формы?
Существует необходимость отображения текста на форме из потока программы, находящимся в другом класса, но насколько я знаю функции формы доступны только из класса формы, как это обойти, подскажите пожалуйста.
- Вопрос задан более трёх лет назад
- 831 просмотр
Комментировать
Решения вопроса 0
Ответы на вопрос 3

Griboks @Griboks Куратор тега C#
Ответ написан более трёх лет назад
Комментировать
Нравится Комментировать

Самый лучший программист
Это ведь ваш класс наследник от Form, в нем вы можете написать любые свои методы и задать их как public.
Остается только передать в интересующий вас класс указатель на инстанс класса формы.
Ответ написан более трёх лет назад
Комментировать
Нравится Комментировать
было бы большой ошибкой думать
Вот здесь ваша проблема подробно описана.
Вкратце: для вызова метода формы из другого потока, необходимо вызывать её через механизм Invoke. Вот пример оттуда:
public static void InvokeIfRequired(this ISynchronizeInvoke obj, MethodInvoker action) < if (obj.InvokeRequired) < var args = new object[0]; obj.Invoke(action, args); >else < action(); >>
где action() — ваш метод
Ответ написан более трёх лет назад
Комментировать
Нравится Комментировать
Ваш ответ на вопрос
Войдите, чтобы написать ответ

- C#
- +1 ещё
Что делать, если объект проваливается, когда я пытаюсь его поставить туда куда смотрю?
- 1 подписчик
- 3 часа назад
- 19 просмотров
Form. Activate Метод
Некоторые сведения относятся к предварительной версии продукта, в которую до выпуска могут быть внесены существенные изменения. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.
Активирует форму и перемещает на нее фокус.
public: void Activate();
public void Activate ();
member this.Activate : unit -> unit
Public Sub Activate ()
Примеры
В следующем примере показано, как использовать члены SetDesktopLocation, Load и Activate . Чтобы выполнить пример, вставьте следующий код в форму с именем Form1 , содержащую кнопку с именем Button1 и два Label элемента управления с именем Label1 и Label2 .
static int x = 200; static int y = 200; void Button1_Click( System::Object^ sender, System::EventArgs^ e ) < // Create a new Form1 and set its Visible property to true. Form1^ form2 = gcnew Form1; form2->Visible = true; // Set the new form's desktop location so it // appears below and to the right of the current form. form2->SetDesktopLocation( x, y ); x += 30; y += 30; // Keep the current form active by calling the Activate // method. this->Activate(); this->Button1->Enabled = false; > // Updates the label text to reflect the current values of x // and y, which was were incremented in the Button1 control's // click event. void Form1_Activated( Object^ sender, System::EventArgs^ e ) < Label1->Text = String::Format( "x: y: ", x, y ); Label2->Text = String::Format( "Number of forms currently open: ", count ); > static int count = 0; void Form1_Closed( Object^ sender, System::EventArgs^ e ) < count -= 1; >void Form1_Load( Object^ sender, System::EventArgs^ e )
static int x = 200; static int y = 200; private void Button1_Click(System.Object sender, System.EventArgs e) < // Create a new Form1 and set its Visible property to true. Form1 form2 = new Form1(); form2.Visible = true; // Set the new form's desktop location so it // appears below and to the right of the current form. form2.SetDesktopLocation(x, y); x += 30; y += 30; // Keep the current form active by calling the Activate // method. this.Activate(); this.Button1.Enabled = false; >// Updates the label text to reflect the current values of x // and y, which was were incremented in the Button1 control's // click event. private void Form1_Activated(object sender, System.EventArgs e) < Label1.Text = "x: "+x+" y: "+y; Label2.Text = "Number of forms currently open: "+count; >static int count = 0; private void Form1_Closed(object sender, System.EventArgs e) < count -= 1; >private void Form1_Load(object sender, System.EventArgs e)
Shared x As Integer = 200 Shared y As Integer = 200 Private Sub Button1_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles Button1.Click ' Create a new Form1 and set its Visible property to true. Dim form2 As New Form1 form2.Visible = True ' Set the new form's desktop location so it appears below and ' to the right of the current form. form2.SetDesktopLocation(x, y) x += 30 y += 30 ' Keep the current form active by calling the Activate method. Me.Activate() Me.Button1.Enabled = False End Sub ' Updates the label text to reflect the current values of x and y, ' which was were incremented in the Button1 control's click event. Private Sub Form1_Activated(ByVal sender As Object, _ ByVal e As System.EventArgs) Handles MyBase.Activated Label1.Text = "x: " & x & " y: " & y Label2.Text = "Number of forms currently open: " & count End Sub Shared count As Integer = 0 Private Sub Form1_Closed(ByVal sender As Object, _ ByVal e As System.EventArgs) Handles MyBase.Closed count -= 1 End Sub Private Sub Form1_Load(ByVal sender As Object, _ ByVal e As System.EventArgs) Handles MyBase.Load count += 1 End Sub
Комментарии
Активация формы выводит ее на передний план, если это активное приложение, или она мигает окно подпись, если это не активное приложение. Форма должна быть видимой, чтобы этот метод был каким-либо эффектом. Чтобы определить активную форму в приложении, используйте ActiveForm свойство или свойство , ActiveMdiChild если формы находятся в приложении MDI.
Вызвать метод формы из другого класса
Хочу обновить текст в лейбле из другого класса, но не знаю как это сделать. Запускаю поток в соседнем классе:
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 ошибок. Помогите сделать так, чтобы можно было без проблем осуществить задуманное?