#pragma once #include #include #include "WellCommonDef.h" using namespace std; class AFX_EXT_CLASS CTreeBase { public: CTreeBase(); virtual ~CTreeBase(); struct TreeBaseNode { CString strNode; //节点名称 CString strCode; int parent; //父亲节点在数组中的id号,((因为树存储在数组中,通过这个id可以直接找到在数组中的父节点, 注意不是树节点在数据库表中的parentId) int dbParentId; //树节点在数据库表中的parentId,与selfId共同形成层级树 int Treelevel; //树的层次,由高到低,从0开始 std::vector ChildRowsId; //本节点子孙关联的表数据id数据,临时作用 int rowId; //本节点关联的表数据id数据,临时作用 int selfId; //树节点在数据库表中的id int order; // 节点的顺序 CString classStr; //层级字符串,因为有的树的层级是int,有的是字符串 }; void operator =(CTreeBase& tree); //建一个树从一个表,参数:表名称,节点字段名称,父节点字段名称,节点显示名称,className是层次级别名称.(父节点是空字符串表示是直接挂在根结点上) //void MakeTreeFromTable(CString tablName, CString nodeFldName, CString ParentFldName, CString showFldName, CString className = ""); //建一个树从一个表,参数:表名称,节点字段名称,父节点字段名称,节点显示名称,className是层次级别名称.rootNodeName是树跟节点名称(跟节点是空字符串,或"-1") BOOL MakeTreeFromTable(CString& JsonStr, CString nodeFldName, CString ParentFldName, CString showFldName, CString className, CString orderName,CString rootNodeName); BOOL FindNode(CString nodeName, vector& ParentArr, int treeLevel = -1); //查找某个子节点,并返回子节点的祖先串,数组从其父亲节点开始向上延伸。(因为有的树中子节点与父节点的名称相同,因此要增加层级,treeLevel从1开始算) BOOL FindChild(CString nodeName, vector &ChildArr , int treeLevel = -1); BOOL FindClassChildren(CString nodeName, CString classChildName, vector&childNodes, int nodetreeLevel = -1);//查找某一层级的所有子节点 BOOL GetTreeLevelNode(int depId, vector &NodeArr);//返回某个层次的所有树节点。树层次depId从1开始计算 void GetTreeLevelNode(CString className, vector &NodeArr); int GetTreeDepth(); //得到树的深度 CString GetClassName(int id);//树层次depId从1开始计算 //void InItTreeFromCTree(HTREEITEM hItem); CString GetClassCode(int id); int ClassLevelId(CString className); //树层级字符串得到层级的id,从1开始计算 void ClearNodeDataRowID(); const vector& GetClassNames(); TreeBaseNode& GetNode(CString nodeName, int treeLevel = -1); // TreeBaseNode& GetParentNode(CString nodeName , int treeLevel = -1); BOOL GetChildNodes(CString nodeName, vector&childNodes, BOOL bAllDescendants = FALSE, int treeLevel = -1); //获得一个父节点某个层级的所有子节点数组中,某个节点在数组的位置。 void checkNodeInParentPos(CString pnode, CString childnode,CString childclassName, BOOL &bTop,BOOL &bBottom);// posid =0 top, posi=1 bottom, posi =2 top,bottom(即是顶又是底), pos =3,middle; enum cTree{ EMPTYNODE = -10000 }; protected: //从数据表集buffer建立一个树,ShowNameId是树节点显示名称的字段ID,treeid是本身节点的代码字段ID,pid是父节点字段的ID。(treeid和pid是组成树的父子字段ID) void InitTreeFromDbTab(int ShowNameId, int treeid, int pid, int classid,int orderId, CString rootNodeName,StringVectorSet& datas); void GetChildVector(int ParentId, std::vector &childVec); void DeepTreeFromTab(int arrPid, CString PName, int ShowNameId, int treeid, int pid, int classid,int orderId, StringVectorSet& datas, int& deepCount); void CountDepTree(int parentId, int &MaxDep, int& depCount); void treeLevelNodeArr(int depId, int parentId, int& depCount, vector &nodeArr); //CArray m_TreeNodeArr; std::vector m_TreeNodeArr; std::vector m_classNameVec; //层级名称,即树的每个层级的名 std::vector m_classCodeVec; //目前先不使用20250726 std::vector m_bVisitVec; //从一个表建一个树时表示是否该条记录被访问过 TreeBaseNode m_EmptyNode; //一个空节点用来返回 };