|
При загрузке данных из БД возникает исключение 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).

