Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.96/48: Рейтинг темы: голосов - 48, средняя оценка - 4.96
45 / 45 / 5
Регистрация: 04.01.2010
Сообщений: 337

Вызов события в главной форме из другой

10.11.2012, 19:18. Показов 10010. Ответов 18
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Имеется например главная форма Form1

В ней объявляется о побочной, заранее заготовленной форме Form2

C#
1
2
3
4
5
6
7
public Form2 f = new Form2();
 
Далее в кнопке:
button1(... ...)
{
f.Show();
}
Во второй форме Form2 существует кнопка:

C#
1
2
3
4
5
6
7
8
button1(... ...)
{
программный код
 
СОБЫТИЕ
 
this.hide();
}
Необходимо вместо слова "событие" вызвать что-либо из формы 1, например:

C#
1
2
3
4
public void check()
{
код
}
Заранее спасибо.
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
10.11.2012, 19:18
Ответы с готовыми решениями:

Вызов события в главной форме
Всем Привет! Помогите решить проблемку. Имеется программа MDI с множеством дочерних окон, которые в свою очередь вызывают другие...

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

Вызов события в дочерней форме из родительской
Добрый день. Есть две формы: Form1 - родительская и Form2 - дочерняя. Мне нужна нажав кнопку на родительской и выполнить метод...

18
Эксперт .NET
 Аватар для Casper-SC
4434 / 2094 / 404
Регистрация: 27.03.2010
Сообщений: 5,657
Записей в блоге: 1
10.11.2012, 19:32
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
using System.Windows.Forms;
 
namespace WinForms_SeveralForms
{
    public partial class Form1 : Form
    {
        private Form2 _form2;
 
        public Form1()
        {
            InitializeComponent();
 
            _form2 = new Form2(this);
            _form2.Show();
        }
 
        public void RenameTitle(string text) 
        {
            //Просто как пример, можно и напрямую через свойство менять
            Text = text;
        }
    }
}
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
using System;
using System.Windows.Forms;
 
namespace WinForms_SeveralForms
{
    public partial class Form2 : Form
    {
        private Form1 _form1;
 
        public Form2(Form1 form)
        {
            InitializeComponent();
            _form1 = form;
        }
 
        private void button1_Click(object sender, EventArgs e)
        {
            _form1.RenameTitle("Ва-а-а-а-а-у!");
        }
    }
}
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
10.11.2012, 19:34
Лучший ответ Сообщение было отмечено Памирыч как решение

Решение

Вы же сами и ответили на свой вопрос: СОБЫТИЕ.
Создайте в Form2 событие (event), а в Form1 на него подписывайтесь и при его возникновении делайте что вашей душе угодно:
C#
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
class Form2
{
   public event EventHandler ButtonClicked;
 
   private void button1_click(object sender, EventArgs e)
   {
      OnButtonClicked(EventArgs.Empty);
   }
 
   protected void OnButtonClicked(EventArgs e)
   {
      var evt = ButtonClicked;
      if (evt != null) evt(this, e);
   }
}
 
class Form1
{
   public Form1()
   {
      f = new Form2();
      f.ButtonClicked += Form2ButtonClicked;
   }
 
   private void Form2ButtonClicked(object sender, EventArgs e)
   {
      MessageBox.Show("OMFG!!!11");
   }
}
1
45 / 45 / 5
Регистрация: 04.01.2010
Сообщений: 337
10.11.2012, 19:56  [ТС]
Вы проверяли работоспособность своего кода?
(к Casper-SC )
0
Эксперт .NET
 Аватар для Casper-SC
4434 / 2094 / 404
Регистрация: 27.03.2010
Сообщений: 5,657
Записей в блоге: 1
10.11.2012, 19:59
Цитата Сообщение от kolorotur Посмотреть сообщение
Вы проверяли работоспособность своего кода?
(к Casper-SC )
Создал Windows Forms проект, быстренько написал код, скомпилировал, запустился проект, проверил, вижу работает. Копирую весь код на форум, удаляю проект. На Form2 кнопка, у неё в коде Form2 обработчик события Click. Запускается программа, появляются 2 формы, во второй кнопка, жмёшь на неё и заголовок первого окна получает новый текст.
0
45 / 45 / 5
Регистрация: 04.01.2010
Сообщений: 337
10.11.2012, 20:00  [ТС]
Casper-SC, Ошибка 1 "WindowsFormsApplication1.Form2" не содержит конструктор, который принимает аргументы "1"

Если вставить ваш код предназначенный для первой формы.
0
Эксперт .NET
 Аватар для Casper-SC
4434 / 2094 / 404
Регистрация: 27.03.2010
Сообщений: 5,657
Записей в блоге: 1
10.11.2012, 20:02
Если тупо всё скопировать, то ясен фиг работать не будет (namespace не тот, кнопки на форме нет).

Добавлено через 54 секунды
Так скопируй код обоих форм. Не кажется это логичным ?
0
45 / 45 / 5
Регистрация: 04.01.2010
Сообщений: 337
10.11.2012, 20:06  [ТС]
Casper-SC, аналогично.
0
Эксперт .NET
 Аватар для Casper-SC
4434 / 2094 / 404
Регистрация: 27.03.2010
Сообщений: 5,657
Записей в блоге: 1
10.11.2012, 20:09
Цитата Сообщение от yura097 Посмотреть сообщение
Casper-SC, аналогично.
Что аналогично? Подробнее можно в деталях, что и как делал, куда копировал? Какие действия предпринимал? Я сейчас создал новый проект, всё скопировал, всё работает.
0
45 / 45 / 5
Регистрация: 04.01.2010
Сообщений: 337
10.11.2012, 20:14  [ТС]
Вот скриншоты.
Миниатюры
Вызов события в главной форме из другой   Вызов события в главной форме из другой  
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
10.11.2012, 20:19
yura097, ну это же простая задачка на знание синтаксиса:
C#
1
Foo("hello world!");
Вопрос: как будет выглядеть сигнатура метода Foo?
0
45 / 45 / 5
Регистрация: 04.01.2010
Сообщений: 337
10.11.2012, 20:21  [ТС]
kolorotur, Foo();

Casper-SC, скрины на 1 странице темы.
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
10.11.2012, 20:28
yura097, вы, насколько я понял, программировать начали недавно.
Нет, сигнатура будет выглядеть так: Foo(string), потому что в вызов метода передается экземпляр строки. Значит метод должен эту строку принимать.
То же самое в примере выше: в конструктор класса Form2 передается переменная this, которая является ссылкой на экземпляр класса Form1, следовательно конструктор класса Form2 должен иметь сигнатуру Form2(Form1). Что явно видно в примере товарища Casper-CS, но что явно отсутствует в вашем коде, который видно на скриншоте.

Внимательно сравните как выглядит сигнатура вашей формы и формы из примера выше.
Ваша: Form2()
Выше: Form2(Form1 form)
0
45 / 45 / 5
Регистрация: 04.01.2010
Сообщений: 337
10.11.2012, 20:31  [ТС]
kolorotur, дошло, благодарю. Нет относительно давно когда есть настроение и идеи, а интернет ответит как написать всё что хочешь, так что нечто да получается.

Casper-SC, спасибо.
0
Эксперт .NET
 Аватар для Casper-SC
4434 / 2094 / 404
Регистрация: 27.03.2010
Сообщений: 5,657
Записей в блоге: 1
10.11.2012, 20:34
В Form2 у тебя нет конструктора, который принимает ссылку на Form1 в качестве параметра. В том коде, что я выложил ранее всё работает, просто внимательно скопируй всё оттуда на вторую форму.

Добавлено через 29 секунд
Не видел, что столько написали. Ну не суть...
0
45 / 45 / 5
Регистрация: 04.01.2010
Сообщений: 337
10.11.2012, 20:43  [ТС]
о да
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
11.11.2012, 00:22
Правильней передавать callback-делегат, если я правильно понимаю принципы ООП..
0
0 / 0 / 0
Регистрация: 05.11.2023
Сообщений: 1
12.11.2023, 00:28
Добрый день! Воспользовался вашим ответом, немного изменив названия Но почему-то в аналог метода
C#
1
2
3
4
   private void Form2ButtonClicked(object sender, EventArgs e)
   {
      MessageBox.Show("OMFG!!!11");
   }
программа не хочет проваливаться. Помогите пожалуйста

Form1:
C#
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
    private void отладочныйToolStripMenuItem_Click(object sender, EventArgs e)
    {
 
 
 
        string message = "\n Текущее время: " + Convert.ToString(localDate) + "\n Войти в режим разработки?";
        var result = MessageBox.Show(message, "Режим разработчика", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
        if (result == DialogResult.Yes)
        {
            /*отладочныйToolStripMenuItem_Click(sender, e);
            form2.OnConcreteButtonPressed += MessageBox.Show("");
            */
            Form2 form2 = new Form2();
            /*form2.AcceptButton = button1;
            form2.CancelButton = button2;
            form2.Controls.Add(button1);
            form2.Controls.Add(button2);
            */
            form2.ShowDialog();
            
            form2.passwordcorrect += Form2passwordcorrect;
            //res = form2.GetX();
 
        }
 
  private void Form2passwordcorrect(object sender, EventArgs e)
  {
   //code
   }
Form2:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public event EventHandler passwordcorrect;
protected void Onpasswordcorrect(EventArgs e)
{
    var evt = passwordcorrect;
    if (evt != null) evt(this, e);
}
  private void button1_Click(object sender, EventArgs e)
  {
      int y = int.Parse(textBox1.Text);
      if(y ==2250)
      {
 
          Onpasswordcorrect(EventArgs.Empty);
          this.Close();
 
 
      }
        
      
  }
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18292 / 14216 / 5368
Регистрация: 17.03.2014
Сообщений: 28,894
Записей в блоге: 1
12.11.2023, 16:50
Цитата Сообщение от Cuprum1736 Посмотреть сообщение
C#
19
20
21
            form2.ShowDialog();
            
            form2.passwordcorrect += Form2passwordcorrect;
Поменяйте эти две строки местами.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
12.11.2023, 16:50
Помогаю со студенческими работами здесь

Вызов события с другой формы
Хочу вызвать событие из другой формы, но чего то не работает, вроде бы записал все правильно и без ошибок. Форма1 SingUp s = new...

Ожидание события на другой форме
Подскажите как реализовать следующую вещь. Пусть есть 2 открытые формы. На одной из них при загрузке выполняется какой то список действий,...

Как вызвать из подформы события нажатия кнопки в главной форме
Как Вызвать из подчформы событыя нажатия кнопки в главформы

Из события одной формы изменить свойство в другой форме
Из события button_Click первой формы необходимо обратится к свойству tabControl другой формы. Как это вижу я: Form D = new D_Form(); ...

Вызов метода show к одной форме из другой
Добрый день! Есть две формы, вторая запускается из первой, при этом первая скрывается методом Hide(). Вопрос: как по закрытию второй...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
Новые блоги и статьи
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка SDL3 и Box2D из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru