Метод выполняется два раза, если я редактирую юнита второй раз?

Это код в котором я редактирую юнитов, почему-то если я изменил первый раз юнита, то он сохраняется правильно, а если второй раз меняю, то messagebox вылазит второй раз и метод EditM повторяется и соответственно юнит сохраняется второй раз?

private void btnEdit_Click(object sender, EventArgs e)
    {
        var userId = this.dgvStudents.SelectedCells[0].RowIndex + 1;
        user = _users.FirstOrDefault(x => x.Id == userId);
        
        EditForm.StudentUpdated += EditM;
    
        string[] arrFaculties = new string[9];
    
        arrFaculties = client.ShowFaculties(ConvertToUsersArr());
    
        EditForm editForm = new EditForm(client, user, arrFaculties);
        if (editForm.ShowDialog(this) == DialogResult.OK)
        {
    
        }
        lblUpdate.Visible = true;
    }
    
    
    private void EditM(ServerUser user, ServerUser newUser)
    {
        _users.Remove(user);
        _users.Add(client.Save(user.Id - 1, newUser.Name, newUser.SecondName, newUser.NameOfFamily, newUser.Faculty, newUser.Age, newUser.Course));
        MessageBox.Show($"student with name {user.Name.ToString()} edited");
        
    }

А это форма в которой я редактирую юнитов:

public partial class EditForm : Form
{

    public delegate void WithParams(ServerUser su, ServerUser newUser);
    ServerUser _user;
    AppServiceClient _client;
    public static event WithParams StudentUpdated;
    string[] _faculties;

    public EditForm(AppServiceClient client, ServerUser serU, string[] faculties)
    {
        _faculties = faculties;
        _user = serU;
        _client = client;
        InitializeComponent();
    }

    private void EditForm_Load(object sender, EventArgs e)
    {
        tbId3.Text = _user.Id.ToString();
        tbName3.Text = _user.Name;
        tbSecName3.Text = _user.SecondName;
        tbNameOfFam3.Text = _user.NameOfFamily;
        cmbFac.DataSource = _faculties;
        cmbFac.SelectedItem = _user.Faculty;
        tbCourse3.Text = _user.Course.ToString();
        tbAge3.Text = _user.Age.ToString();
    }
    ServerUser newUser;
    private void btnEdit_Click(object sender, EventArgs e)
    {
        newUser = new ServerUser();
        newUser.Name = tbName3.Text;
        newUser.SecondName = tbSecName3.Text;
        newUser.NameOfFamily = tbNameOfFam3.Text;
        newUser.Faculty = cmbFac.SelectedItem.ToString();
        newUser.Age = int.Parse(tbAge3.Text);
        newUser.Course = int.Parse(tbCourse3.Text);
        StudentUpdated.Invoke(_user, newUser);
        this.Hide();
    }
}

Подскажите что это может быть?


Ответы (1 шт):

Автор решения: Pavel Popov

При каждом клике btnEdit_Click вы подписываетесь на событие EditForm.StudentUpdated += EditM и ни разу не отписываетесь. Сколько раз нажмете, столько раз и подпишитесь, следовательно столько раз будет вызван обработчик. Где то после окончания редактирования отпишитесь от события EditForm.StudentUpdated -= EditM

→ Ссылка