При загрузке данных из БД возникает исключение InvalidOperationException с сообщением: Элемент коллекции должен быть пустым перед использованием ItemsSource. Знаю, что для заполнения DataGrid можно использовать коллекции Items или ItemsSource, но одновременно их использовать нельзя: если задано значение для свойства ItemsSource и в коде C# добавляется элемент в Items, возникает исключение. |
Разработка многофункциональных бизнес-приложений
Формирование данных по новому сотруднику будем выполнять с использованием созданного ранее дочернего окна EditEmployeeChildWindow. Для того, чтобы в коде можно было различать режимы в котором находится дочернее окно будем использовать свойство Tag окна. Так при формировании окна в режиме редактирования свойству Tag присвоим значение edit, а при добавлении нового сотрудника – new.
private void buttonNew_Click(object sender, RoutedEventArgs e) { Employee newEmployee= new Employee(); newEmployee.Role= "guest"; newEmployee.LastName= "не задано"; newEmployee.FirstName = "не задано"; newEmployee.SecondName = "не задано"; newEmployee.Email = "a@my.com"; newEmployee.Phone = "(999) 999-9999"; newEmployee.Inn = "999999999999"; newEmployee.TitleID = 1; newEmployee.FirstDate = DateTime.Now; EmployeeChildWindow winEmpEdit = new EmployeeChildWindow(newEmployee); winEmpEdit.Title = "Регистрация нового сотрудника"; winEmpEdit.Tag = "new"; winEmpEdit.Closed += new EventHandler(winEmpEdit_Closed); winEmpEdit.Show(); }
В методе buttonNew_Click() создается экземпляр класса Employee, задаются его поля, затем по аналогии с режимом редактирования данных, создается экземпляр дочернего окна EmployeeChildWindow, задаются его свойства, включается прослушивание события закрытия окна и оно выводится на экран.
Обработчик события закрытия окна изменен для использования его и для редактирования, и для создания новой записи.
void winEmpEdit_Closed(object sender, EventArgs e) { EmployeeChildWindow emp = (EmployeeChildWindow)sender; switch (emp.Tag.ToString()) { case "edit": if (emp.Employee != null) { if (emp.DialogResult == true) { employeeDomainDataSource.SubmitChanges(); } else { employeeDomainDataSource.RejectChanges(); } } break; case "new": if (emp.Employee != null) { if (emp.DialogResult == true) { EmployeeDomainContext employeeDomain = (employeeDomainDataSource.DomainContext) as EmployeeDomainContext; employeeDomain.Employees.Add(emp.Employee); employeeDomainDataSource.SubmitChanges(); } } break; } }
При создании новой записи по сотруднику используется метод Add сущности контекста домена службы DomainService и изменения в источнике данных фиксируются методом SubmitChanges().
При работе приложения и нажатии кнопки Новый сотрудник выводится окно Добавление нового сотрудника ( рис. 10.36).
В окне Добавление нового сотрудника можно изменять все поля, осуществляя действия аналогичные тем, которые проводят в режиме редактирования данных.
Удаление записей по сотруднику реализуются в приложении методом buttonDelete_Click(), который является обработчиком события Click кнопки buttonDelete.
private void buttonDelete_Click(object sender, RoutedEventArgs e) { Employee emp = (Employee)(employeeDataGrid.SelectedItem); if (emp != null) { MessageBoxResult result = MessageBox.Show("Удалить сотрудника: \n" + emp.LastName+" " + emp.FirstName + " "+ emp.SecondName, "Предупреждение", MessageBoxButton.OKCancel); if (result == MessageBoxResult.OK) { EmployeeDomainContext employeeDomain = (employeeDomainDataSource.DomainContext) as EmployeeDomainContext; employeeDomain.Employees.Remove(emp); employeeDomainDataSource.SubmitChanges(); } } }
Удаление данных из источника реализуется методом Remove(), которому в качестве параметра задается удаляемый объект. При удалении данных на экран выводится предупреждение ( рис. 10.37).