Опубликован: 08.07.2011 | Уровень: для всех | Доступ: платный
Лекция 8:

Разработка многофункциональных бизнес-приложений

Формирование данных по новому сотруднику будем выполнять с использованием созданного ранее дочернего окна 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).

Добавление нового сотрудника

увеличить изображение
Рис. 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).

Удаление данных по сотруднику

увеличить изображение
Рис. 10.37. Удаление данных по сотруднику
Александр Петров
Александр Петров

При загрузке данных из БД возникает исключение InvalidOperationException с сообщением: Элемент коллекции должен быть пустым перед использованием ItemsSource. Знаю, что для заполнения DataGrid можно использовать коллекции Items или ItemsSource, но одновременно их использовать нельзя: если задано значение для свойства ItemsSource и в коде C# добавляется элемент в Items, возникает исключение. 
Вопрос, как отследить и отключить добавление элемента в Items?

Максим Спиридонов
Максим Спиридонов

В пятой лекции на второй странице в компиляторе выскакивает ошибка в строчке :

ObjectQuery<Employee> employees = DataEntitiesEmployee.Employees;

Ошибка CS0029

Не удается неявно преобразовать тип "System.Data.Entity.DbSet<WpfApplProject.Employee>" в "System.Data.Entity.Core.Objects.ObjectQuery<WpfApplProject.Employee>".

в using прописал все как положено, здесь похоже именно с преобразованием типов проблемы

Igor Chelyadinski
Igor Chelyadinski
Беларусь, Минск, №54, 2013
Валентина Алешина
Валентина Алешина
Россия