|
|
#pragma once
|
|
|
#include <vector>
|
|
|
#include <string>
|
|
|
#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<int> 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<CString>& ParentArr, int treeLevel = -1); //查找某个子节点,并返回子节点的祖先串,数组从其父亲节点开始向上延伸。(因为有的树中子节点与父节点的名称相同,因此要增加层级,treeLevel从1开始算)
|
|
|
BOOL FindChild(CString nodeName, vector<CString> &ChildArr , int treeLevel = -1);
|
|
|
BOOL FindClassChildren(CString nodeName, CString classChildName, vector<TreeBaseNode*>&childNodes, int nodetreeLevel = -1);//查找某一层级的所有子节点
|
|
|
|
|
|
BOOL GetTreeLevelNode(int depId, vector<CString> &NodeArr);//返回某个层次的所有树节点。树层次depId从1开始计算
|
|
|
void GetTreeLevelNode(CString className, vector<CString> &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<CString>& GetClassNames();
|
|
|
TreeBaseNode& GetNode(CString nodeName, int treeLevel = -1); //
|
|
|
TreeBaseNode& GetParentNode(CString nodeName , int treeLevel = -1);
|
|
|
BOOL GetChildNodes(CString nodeName, vector<TreeBaseNode*>&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<int> &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<CString> &nodeArr);
|
|
|
|
|
|
//CArray <TreeBaseNode,TreeBaseNode> m_TreeNodeArr;
|
|
|
std::vector<TreeBaseNode> m_TreeNodeArr;
|
|
|
std::vector<CString> m_classNameVec; //层级名称,即树的每个层级的名
|
|
|
std::vector<CString> m_classCodeVec; //目前先不使用20250726
|
|
|
std::vector<BOOL> m_bVisitVec; //从一个表建一个树时表示是否该条记录被访问过
|
|
|
|
|
|
TreeBaseNode m_EmptyNode; //一个空节点用来返回
|
|
|
}; |