You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

80 lines
3.9 KiB
C++

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

#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 =3middle;
enum cTree{
EMPTYNODE = -10000
};
protected:
//从数据表集buffer建立一个树ShowNameId是树节点显示名称的字段IDtreeid是本身节点的代码字段IDpid是父节点字段的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; //一个空节点用来返回
};