public Task EditCommand(object selectedItem, ref bool IsErrorTask) { // получаем выделенный объект Task selectedtask = selectedItem as Task; Task task = selectedtask; Task oldtask = new Task() { Id_Task = selectedtask.Id_Task, Name_Task = selectedtask.Name_Task, Description_Task = selectedtask.Description_Task, Performers_Task = selectedtask.Performers_Task, Date_of_registration_Task = selectedtask.Date_of_registration_Task, Status_Task = selectedtask.Status_Task, Planned_time_Task = selectedtask.Planned_time_Task, Actual_time_Task = selectedtask.Actual_time_Task, Date_of_completion_Task = selectedtask.Date_of_completion_Task, SubTasks = selectedtask.SubTasks }; TaskWindow taskWindow = new TaskWindow(oldtask); if (taskWindow.ShowDialog() == true) { // получаем измененный объект task = db.Tasks.Find(taskWindow.Task.Id_Task); //запоминаем первоначальные данные int old_Actual_time_Task = task.Actual_time_Task; //запоминаем первоначальные данные int old_Planned_time_Task = task.Planned_time_Task; //запоминаем статус задачи string old_status_task = task.Status_Task; if (old_status_task != taskWindow.Task.Status_Task) { if (old_status_task == "Назначена" && taskWindow.Task.Status_Task == "Завершена") { MessageBox.Show(Resource1.Status_Assigned_СompletedError, Resource1.HeadingError); IsErrorTask = true; return(task); } else if (taskWindow.Task.Status_Task == "Завершена") { if (CanChangeStatus(selectedtask)) { ChangeStatus(selectedtask); } else { MessageBox.Show(Resource1.SubTasksStatusError, Resource1.HeadingError); IsErrorTask = true; return(task); } } } task.Name_Task = taskWindow.Task.Name_Task; task.Description_Task = taskWindow.Task.Description_Task; task.Performers_Task = taskWindow.Task.Performers_Task; task.Date_of_registration_Task = taskWindow.Task.Date_of_registration_Task; task.Status_Task = taskWindow.Task.Status_Task; task.Planned_time_Task = taskWindow.Task.Planned_time_Task; task.Actual_time_Task = taskWindow.Task.Actual_time_Task; task.Date_of_completion_Task = taskWindow.Task.Date_of_completion_Task; task.All_Actual_time_Task += task.Actual_time_Task - old_Actual_time_Task; task.All_Planned_time_Task += task.Planned_time_Task - old_Planned_time_Task; //флаг нужен для работы цикла bool flag = true; //получаем нашу подзадачу для инициализации полей его родителя int change_Actual_time_Task = task.Actual_time_Task - old_Actual_time_Task; int change_Planned_time_Task = task.Planned_time_Task - old_Planned_time_Task; Task children_task = task; // создаем переменную родитель, для того, чтобы изменить у родителя поля Actual_time_Task и All_Planned_time_Task Task parent_task = new Task(); //бесконечно обращаемся в цикле, чтобы изменить у каждого родители поля Actual_time_Task и All_Planned_time_Task, так как возможно вложенность подзадач while (flag == true) { if (children_task.Ref_Task != 0) { // получаем объект родитель parent_task = db.Tasks.Where(c => c.Id_Task == children_task.Ref_Task).FirstOrDefault(); // изменяем у него вычисляемые поля parent_task.All_Actual_time_Task += change_Actual_time_Task; parent_task.All_Planned_time_Task += change_Planned_time_Task; // необоходимо для того, чтобы узнать есть ли вложенность подзадач, чтобы дальше по дереву изменить у всех вычисляемые поля children_task = parent_task; } // как только родитель и ребенок это один тот же объект, прекращаем цикл. else if (children_task.Id_Task == parent_task.Id_Task) { flag = false; } else if (children_task.Ref_Task == 0) { flag = false; } } db.Entry(task).State = EntityState.Modified; db.SaveChanges(); IsErrorTask = false; return(task); } IsErrorTask = true; return(task); }
public Task AddSubCommand(object selectedItem, ref bool IsErrorTask) { // получаем выделенный объект Task task = selectedItem as Task; if (selectedItem == null) { MessageBox.Show(Resource1.SelectItemNull, Resource1.HeadingError); IsErrorTask = true; return(task); } TaskWindow window = new TaskWindow(new Task()); window.Task.Status_Task = "Назначена"; if (window.ShowDialog() == true) { Task subtask = window.Task; if (subtask.Status_Task == "Завершена") { MessageBox.Show(Resource1.Status_Assigned_СompletedError, Resource1.HeadingError); IsErrorTask = true; return(task); } if (subtask.Date_of_registration_Task == null) { MessageBox.Show(Resource1.ButtonClickError, Resource1.HeadingError); IsErrorTask = true; return(task); } subtask.All_Actual_time_Task = subtask.Actual_time_Task; subtask.All_Planned_time_Task = subtask.Planned_time_Task; subtask.Ref_Task = task.Id_Task; task.SubTasks.Add(subtask); //флаг нужен для работы цикла bool flag = true; //получаем нашу подзадачу для инициализации полей его родителя Task children_task = subtask; // создаем переменную родитель, для того, чтобы изменить у родителя поля Actual_time_Task и All_Planned_time_Task Task parent_task = new Task(); //бесконечно обращаемся в цикле, чтобы изменить у каждого родители поля Actual_time_Task и All_Planned_time_Task, так как возможно вложенность подзадач while (flag == true) { if (children_task.Ref_Task != 0) { // получаем объект родитель parent_task = db.Tasks.Where(c => c.Id_Task == children_task.Ref_Task).FirstOrDefault(); // изменяем у него вычисляемые поля parent_task.All_Actual_time_Task += subtask.Actual_time_Task; parent_task.All_Planned_time_Task += subtask.Planned_time_Task; // необоходимо для того, чтобы узнать есть ли вложенность подзадач, чтобы дальше по дереву изменить у всех вычисляемые поля children_task = parent_task; } // как только родитель и ребенок это один тот же объект, прекращаем цикл. else if (children_task.Id_Task == parent_task.Id_Task) { flag = false; } } db.Tasks.Add(subtask); db.SaveChanges(); IsErrorTask = false; return(subtask); } IsErrorTask = true; return(task); }