/// <summary>
 /// Обработчик события нажатия клавиши мыши на кнопку,
 /// который производит отмену последнего добавления/редактирования
 /// </summary>
 private void btn_Cancel_Click(object sender, EventArgs e)
 {
     if (_formMode != FormMode.None)
     {
         var result = MessageBox.Show("Изменения не будут сохранены! Продолжить?", "Отмена изменений",
                                      MessageBoxButtons.YesNo, MessageBoxIcon.Asterisk);
         if (result == DialogResult.Yes)
         {
             try
             {
                 if (_formMode == FormMode.Edit)
                 {
                     int indexOfElement = SoftTypes.IndexOf(CurrentSoftType);
                     CurrentSoftType           = _ctx.CancelChanges(CurrentSoftType);
                     SoftTypes[indexOfElement] = CurrentSoftType;
                 }
                 else
                 {
                     SoftTypes.CancelNew(SoftTypes.IndexOf(CurrentSoftType));
                 }
                 EnDisFields(false);
                 _formMode = FormMode.None;
             }
             catch
             {
                 MessageBox.Show("Произошла ошибка при отмене изменений!", "Ошибка", MessageBoxButtons.OK,
                                 MessageBoxIcon.Error);
             }
         }
     }
 }
 /// <summary>
 /// Обработчик события нажатия клавиши мыши на кнопку,
 /// который совершает добавление нового типа программного обеспечения
 /// </summary>
 private void button2_Click(object sender, EventArgs e)
 {
     SoftTypes.AddNew();
     softTypeBindingSource.MoveLast();
     EnDisFields(true);
     _formMode = FormMode.Add;
 }
        /// <summary>
        /// Обработчик события нажатия клавиши мыши на кнопку,
        /// который выполняет сохранение изменений
        /// </summary>
        private async void btn_Save_Click(object sender, EventArgs e)
        {
            if (_formMode != FormMode.None)
            {
                try
                {
                    if (string.IsNullOrWhiteSpace(CurrentSoftType.Name))
                    {
                        MessageBox.Show("Введите наименование типа программного обеспечения!", "Предупреждение", MessageBoxButtons.OK,
                                        MessageBoxIcon.Exclamation);
                        return;
                    }

                    bool existed = false;

                    switch (_formMode)
                    {
                    case FormMode.Add:
                        existed = await _ctx.CheckSoftTypeForDublicate(CurrentSoftType.Name);

                        break;

                    case FormMode.Edit:
                        existed = await _ctx.CheckSoftTypeForDublicate(CurrentSoftType.Name) && !CurrentSoftType.Name.Equals(_softwareTypeNameBeforeEditing);

                        break;
                    }

                    if (existed)
                    {
                        MessageBox.Show("Тип программного обеспечения с таким наименованием уже существует!", "Ошибка",
                                        MessageBoxButtons.OK, MessageBoxIcon.Error);
                        return;
                    }

                    if (_formMode == FormMode.Add)
                    {
                        SoftTypes.EndNew(SoftTypes.IndexOf(CurrentSoftType));
                    }
                    _ctx.SaveChanges();
                    EnDisFields(false);
                    Edited       = true;
                    _formMode    = FormMode.None;
                    DialogResult = DialogResult.OK;
                    MessageBox.Show("Изменения успешно сохранены!", "Информация", MessageBoxButtons.OK,
                                    MessageBoxIcon.Information);
                }
                catch
                {
                    MessageBox.Show("Изменения не удалось сохранить!", "Ошибка", MessageBoxButtons.OK,
                                    MessageBoxIcon.Error);
                }
            }
        }
        /// <summary>
        /// Обработчик события нажатия клавиши мыши на графический объект,
        /// который производит поиск программного обеспечения по наименованию
        /// </summary>
        private void picBtn_FindByCondition_Click(object sender, EventArgs e)
        {
            if (string.IsNullOrWhiteSpace(textBox_ConditionToFind.Text))
            {
                MessageBox.Show("Введите условие для поиска программного обеспечения!", "Предупреждение", MessageBoxButtons.OK,
                                MessageBoxIcon.Exclamation);
                return;
            }

            var firstFoundedElement = SoftTypes.FirstOrDefault(x => x.Name.ToUpper().Contains(textBox_ConditionToFind.Text.ToUpper()));

            if (firstFoundedElement != null)
            {
                softTypeBindingSource.Position = SoftTypes.IndexOf(firstFoundedElement);
            }
            else
            {
                MessageBox.Show("Не удалось найти программное обеспечение по указанному условию!", "Информация",
                                MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
        }