public static void Add(Task task) { Mouse.SetCursor(Cursors.Wait); //DB Context.taskWork.Create_Task(task); //Context.taskWork.Create_TaskToFave(task.ID, GlobalInfo.CurrentUser.ID); //task.IndexNumber = task.ID; //todo indexNumber уже должен быть заполнен if (task.PropValues != null && task.PropValues.Count > 0) { Context.taskWork.Update_Task(task); } //Добавим в избранное //VM TreeNodeFactory factory = new TreeNodeFactory(); // todo на текущий момент TreeNodeFactory имеет интерфейс ITreeNodeFactory, но при этом создаётся здесь и используется без учёта этого факта TreeNode newNode = factory.CreateTreeNode(task); TasksVM.DictionaryFull.Add(task.ID, newNode); // todo интересный момент использования классом самого себя if (task.ParentTaskID != null) { int parentID = (int)task.ParentTaskID; newNode.ParentNode = DictionaryFull[parentID]; DictionaryFull[parentID].AddChild(newNode); } newNode.FullPath = generate_PathForTask(task.ID); Mouse.SetCursor(Cursors.Arrow); }
private static void FillTreeDictionaryByTasks(Dictionary <int, TreeNode> curDictionary, List <Task> tasksBD, bool isFullTree) { //tasksBD = tasksBD.OrderBy(t => t.IndexNumber).ToList(); TreeNodeFactory treeNodeFactory = new TreeNodeFactory(); int indexNumber = 1; foreach (Task taskTmp in tasksBD) { Task task; if (isFullTree) { task = taskTmp; } else { task = DictionaryFull[taskTmp.ID].Task; //todo Настя попробуем хранить ссылку, чтобы избранное обновлялось сразу } int id = task.ID; TreeNode treeNode; if (!curDictionary.ContainsKey(id)) { treeNode = treeNodeFactory.CreateTreeNode(task); treeNode.IndexNumber = indexNumber; curDictionary.Add(id, treeNode); indexNumber++; } else { curDictionary[id].Task = task; treeNode = curDictionary[id]; // todo мне кажется, или эти 2 строчки несогласованы между собой //treeNode = treeNodeFactory.CreateTreeNode(task); // } if (task.ParentTaskID != null) { int parentId = (int)task.ParentTaskID; if (!curDictionary.ContainsKey(parentId)) { var typeID = tasksBD.First(t => t.ID == parentId).TaskTypeID; curDictionary.Add(parentId, treeNodeFactory.CreateTreeNode((TaskTypeEnum)typeID)); } TreeNode parentTreeNode = curDictionary[parentId]; parentTreeNode.AddChild(treeNode); treeNode.ParentNode = parentTreeNode; } } }
public static void AddFave(Task task) { //DB Context.taskWork.Create_TaskToFave(task.ID, GlobalInfo.CurrentUser.ID); task.IndexNumber = task.ID; //VM TreeNodeFactory factory = new TreeNodeFactory(); // todo на текущий момент TreeNodeFactory имеет интерфейс ITreeNodeFactory, но при этом создаётся здесь и используется без учёта этого факта TreeNode newNode = factory.CreateTreeNode(task); TasksVM.Dictionary.Add(task.ID, newNode); // todo интересный момент использования классом самого себя if (task.ParentTaskID != null) { int parentID = (int)task.ParentTaskID; newNode.ParentNode = Dictionary[parentID]; Dictionary[parentID].AddChild(newNode); } newNode.FullPath = generate_PathForTask(task.ID); }
public static void Edit(Task task, bool IsFullTree) //TreeNode { var curDictionary = IsFullTree ? DictionaryFull : Dictionary; //DB if (IsFullTree) { try { Mouse.SetCursor(Cursors.Wait); Context.taskWork.Update_Task(task); Mouse.SetCursor(Cursors.Arrow); } catch (Exception e) { MessageBox.Show(e.Message, "Ошибка"); Mouse.SetCursor(Cursors.Arrow); } } //VM TreeNode oldNode = curDictionary[task.ID]; TreeNodeFactory factory = new TreeNodeFactory(); TreeNode newNode = factory.CreateTreeNode(task); newNode.IndexNumber = oldNode.IndexNumber; //Parent if (newNode.Task.ParentTaskID != null) { newNode.ParentNode = curDictionary[(int)newNode.Task.ParentTaskID]; if (oldNode.ParentNode != newNode.ParentNode) // todo а если родитель не поменялся, значит не надо в нём регистрироваться? Хм увидел позже. Функциональность размазана, из-за этого сложно, код можно написать по-другому, см. пример { newNode.ParentNode.AddChild(newNode); // условие newNode.Task.ParentTaskID != null подразумевает, что внутри блока будет работа полностью с newNode } } if (oldNode.ParentNode != null) { if (oldNode.ParentNode == newNode.ParentNode) { oldNode.ParentNode.TreeNodes[oldNode.ParentNode.TreeNodes.IndexOf(oldNode)] = newNode; } else { oldNode.ParentNode.TreeNodes.Remove(oldNode); } } //// пример реализации //TreeNode oldParent = null; //TreeNode newParent = null; //if (oldNode.Task.ParentTaskID.HasValue) // Dictionary.TryGetValue(oldNode.Task.ParentTaskID.Value, out oldParent); //if (newNode.Task.ParentTaskID.HasValue) // Dictionary.TryGetValue(newNode.Task.ParentTaskID.Value, out newParent); //if (oldParent == newParent) // newParent?.UpdateChild(oldNode, newNode); // придётся дописать //else //{ // oldParent?.RemoveChild(oldNode); // и это тоже // newParent?.AddChild(newNode); //} //Children foreach (var n in oldNode.TreeNodes) { n.ParentNode = newNode; n.FullPath = generate_PathForTask(n.Task.ID); newNode.AddChild(n); } curDictionary[task.ID] = newNode; //DictionaryFull.Remove(task.ID); //DictionaryFull.Add(task.ID, newNode); newNode.FullPath = generate_PathForTask(task.ID); }