//получить подузлы public List <DataProvider> GetNodes() { if (bWasGetNodes) { return(ChildProviders); } bWasGetNodes = true; ChildProviders = new List <DataProvider>(); SetNodes(); if (Childs == null) { return(ChildProviders); } bool bDbSetType = false; if (this is StandartNode) { StandartNode SN = (StandartNode)this; bDbSetType = SN.bDbSetType; } IEnumerator enumerator; if (bDbSetType) { MethodInfo MI = Childs.GetType().GetMethod("AsQueryable"); if (MI == null) { return(ChildProviders); } IQueryable Collection = (IQueryable)MI.Invoke(Childs, null); enumerator = Collection.GetEnumerator(); } else { MethodInfo MI = Childs.GetType().GetMethod("GetEnumerator"); if (MI == null) { return(ChildProviders); } enumerator = (IEnumerator)MI.Invoke(Childs, null); } if (enumerator != null) { while (enumerator.MoveNext()) { DataProvider Child = (DataProvider)enumerator.Current; Child.ParentNode = this; ChildProviders.Add(Child); } } return(ChildProviders); }
//метод для установки Childs и ChildType public override void SetNodes() { StandartNode CheckingNode = new StandartNode(TreeViewNodeType.Checking, null, null); StandartNode SettingNode = new StandartNode(TreeViewNodeType.Setting, null, null); Childs = new List <DataProvider> { CheckingNode, SettingNode }; ChildType = typeof(DataProvider); }
//получить все узлы дерева public TreeViewNode GetTreeViewNode() { //корневой узел Клиенты StandartNode ClientsNode = new StandartNode(TreeViewNodeType.Clients, db.DB_Clients, typeof(DB_Client), true); TreeViewNode MainNode = ClientsNode.GetNode(++nodeId); //рекурсивное добавление подузлов AddTreeViewNodes(MainNode, ClientsNode.GetNodes()); return(MainNode); }
//метод для установки Childs и ChildType public override void SetNodes() { StandartNode TemplatesNode = new StandartNode(TreeViewNodeType.Templates, DB_Templates, typeof(DB_Template)); StandartNode FilesNode = new StandartNode(TreeViewNodeType.Files, DB_Files, typeof(DB_File)); Childs = new List <DataProvider> { TemplatesNode, FilesNode }; ChildType = typeof(DataProvider); }
//модификация базы данных public virtual bool Modify(ApplicationContext db, TableData_Server newTD) { if (NodeType == TreeViewNodeType.Checking || NodeType == TreeViewNodeType.Setting) { return(ModifyForPluginParameters(db, newTD)); } bool bDbSetType = false; if (this is StandartNode) { StandartNode SN = (StandartNode)this; bDbSetType = SN.bDbSetType; } //если в новой таблице нет строк if (newTD.RowContainers.Count == 0 && !bDbSetType) { //удалить все строки MethodInfo MI = Childs.GetType().GetMethod("Clear"); MI.Invoke(Childs, null); } else { foreach (RowContainer RC in newTD.RowContainers) { DataProvider changeChild = GetNodes().FirstOrDefault(q => q.Id == RC.Id); //добавление нового объекта для строки в коллекцию if (changeChild == null) { DataProvider newChild = (DataProvider)Activator.CreateInstance(ChildType); newChild.SetDataForModify(db, RC, this); MethodInfo MI = Childs.GetType().GetMethod("Add"); MI.Invoke(Childs, new object[] { newChild }); } else//изменение строки таблицы { changeChild.SetDataForModify(db, RC, this); db.Entry(changeChild).State = EntityState.Modified; } } //удаление строк IEnumerable <DataProvider> delChilds = GetNodes().Where(q => !newTD.RowContainers .Any(w => w.Id == q.Id)); foreach (DataProvider delChild in delChilds) { MethodInfo MI = Childs.GetType().GetMethod("Remove"); MI.Invoke(Childs, new object[] { delChild }); } } //если после удаления шаблона остался файл с пустым шаблоном, //то удалить этот файл из таблицы шаблонов if (NodeType == TreeViewNodeType.Templates) { foreach (DB_File File in db.DB_Files.Where(q => q.DB_Template == null)) { db.DB_Files.Remove(File); } } return(true); }