Взаимодействие двух форм через событие. WinForms

126
03 декабря 2019, 07:50


Здравствуйте!

Подскажите как создать событие, чтоб оповестить главную форму о том, что в Form2 что-то произошло?

Я накопал вот такой способ:

В Program.cs записываем такое:

public delegate void SendMessageEventHandler(string changed, string input);

В Form2:

    public static event SendMessageEventHandler SendToPlayListFormEvent;
    public PlayListsForm()
    {
        InitializeComponent();
    }
    // Пример вызова
    private void PlayListBox_MouseDoubleClick(object sender, MouseEventArgs e)
    {
        SendToPlayListFormEvent(playList[PlayListBox.SelectedIndex][1]);
    }

В главную форму:

    public MainForm()
    {
        InitializeComponent();
        PlayListsForm.SendToPlayListFormEvent += PlayListsForm_SendToPlayListFormEvent;
    }
    void PlayListsForm_SendToPlayListFormEvent(string message)
    {
        // обработка message
    }

Это всё были примеры, что в итоге у меня:
Это Program.cs:

static class Program
{
    /// <summary>
    /// Главная точка входа для приложения.
    /// </summary>
    public delegate void SendMessageEventHandler(string changed, string input);
    [STAThread]
    static void Main()
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        Application.Run(new Form1());
    }
}

А вот Form2(до главной еще не добрался):

public partial class Form2 : Form
{
    public static event SendMessageEventHandler SendMessageForUpdate;//ошибка здесь - не видит делегат
    WorkPlaceDB table = null;
    public Form2()
    {
        InitializeComponent();
    }
    private void button1_Click(object sender, EventArgs e)
    {
        table.PhoneNumberUpdate(textBox2.Text, textBox1.Text);
        textBox1.Clear();
        textBox2.Clear();
        Close();
    }
    private void Form2_Load(object sender, EventArgs e)
    {
        table = new WorkPlaceDB();
        table.OpenConnection(@"Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename= D:\Lenovo\Documents\Praktika OOP\Praktika\Day4\Database1.mdf;Integrated Security=True");
    }
}

Зачем собственно мне это нужно?
- Чтобы при нажатии на кнопку в Form2, отправленные данные для Updat`а БД были отображены в DataGridView. Тоесть мы оповещаем главную форму о том, что данные отправлены, и главная форма обновляет расположеную на ней DataGridView.

Answer 1

Это делается совсем не так. В форме которая редактирует сущность нужно назначить кнопкам след. значения

//устанавливаем роли для кнопок
this.CancelButton = buttonCancel;
this.AcceptButton = buttonOK;
//кнопка ОК отдает нужный результат
buttonOK.Click += (s, e) => this.DialogResult = DialogResult.OK;

А затем в главной форме делаем так

private void ButtonEdit_Click(object sender, EventArgs e)
    {
        using (var editForm = new EditForm())
        {
            editForm.Owner = this;
            editForm.StartPosition = FormStartPosition.CenterParent;
            //выбранный в таблице чел
            var selectedPerson = _bsPeople.Current as Person;
            //создаем редактируемую копию
            editForm.CurrentPerson = new Person
            {
                Id = selectedPerson.Id,
                FirstName = selectedPerson.FirstName,
                LastName = selectedPerson.LastName
            };
            //отображаем форму и ждем результат
            editForm.Text = $"Редактирование {selectedPerson.FirstName} {selectedPerson.LastName}";
            if (editForm.ShowDialog() == DialogResult.OK)
            {
                //изменяем данные в БД
                Program.Context.UpdatePerson(editForm.CurrentPerson);
                //перезагружаем данные в таблицу
                LoadData();
            }
        }
    }

Пример целиком можно посмотреть здесь.

READ ALSO
Проблема с запуском игры на Unity 5

Проблема с запуском игры на Unity 5

Дело в том что настройки игры, а именно момент когда я хочу сохранить значения PlayerPrefs, и в тестировочном режиме запустить свои наработки, происходит...

113
Как сделать остановку персонажа Unity3D?

Как сделать остановку персонажа Unity3D?

Проект 2DПерсонаж двигается вверх и вниз

117
Контроль окончания видео в unity

Контроль окончания видео в unity

новичок в программировании, пытаюсь сделать интро (видео) в игре и после окончания этого видео должно совершиться определенное действие...

153
Нужно отменить автоисправление { code(); } в Visual Studio

Нужно отменить автоисправление { code(); } в Visual Studio

Когда я пишу код, Visual Studio сам после } исправляет все скобки с переносом на другую строку

124