/// <summary> /// Блокировка ячейки в таблице "Вакансии" /// при завершении редактирования ячейки /// Обновление данных после изменения /// </summary> private void dataGridVacancies_CellEndEdit(object sender, DataGridViewCellEventArgs e) { dataGridVacancies.ReadOnly = true; try { //Преобразование комбобоксов назад в обычное поле после редактирования if (dataGridVacancies.Rows[e.RowIndex].Cells[e.ColumnIndex].GetType() == typeof(DataGridViewComboBoxCell)) { DataGridViewTextBoxCell cell = new DataGridViewTextBoxCell(); cell.Value = dataGridVacancies.Rows[e.RowIndex].Cells[e.ColumnIndex].Value.ToString(); //Данная заплатка используется для того, чтобы избежать бесконечного цикла //Сотрудники компании Microsoft не имеют другого выхода как запускать асинхронно метод this.BeginInvoke(new MethodInvoker(() => { dataGridVacancies.Rows[e.RowIndex].Cells[e.ColumnIndex] = cell; })); } if (e.ColumnIndex == 2) { throw new Exception("Для изменения работодателя воспользуйтесь\nсоответствующей вкладкой"); } ViewVacancy.ChangeVacancy( dataGridVacancies.Rows[e.RowIndex].Cells[2].Value.ToString(), //Имя работодателя (e.ColumnIndex == 0) ? DataBeforeEditing : dataGridVacancies.Rows[e.RowIndex].Cells[0].Value.ToString(), //Старое имя вакансии dataGridVacancies.Rows[e.RowIndex].Cells[1].Value.ToString(), //Специальность dataGridVacancies.Rows[e.RowIndex].Cells[0].Value.ToString(), //Новое имя вакансии Convert.ToUInt32(dataGridVacancies.Rows[e.RowIndex].Cells[3].Value.ToString()), //Новый опыт работы dataGridVacancies.Rows[e.RowIndex].Cells[4].Value.ToString(), //Новый тип занятости Convert.ToUInt32(dataGridVacancies.Rows[e.RowIndex].Cells[5].Value.ToString()), //Новая зарплата dataGridVacancies.Rows[e.RowIndex].Cells[6].Value.ToString()); //Новое описание } catch (Exception err) { MessageBox.Show(err.Message); //MessageBox.Show("Ошибка при изменении данных"); } //Обновить информацию после изменения UpdateVacancies(this.textBoxSearchVacancy.Text); }