marginnote3怎么将一个子节点对应两个父节点

marginnote3怎么将一个子节点对应两个父节点,第1张

可以使用递归用代码曾设置他的另一个父级的选中状态。

在勾选一个父节点下的子节点时,至多可以选两个子节点,当选第三个子节点时,前两个中有一个的选择被取消。

父结点在数据库管理中的数据模型中,早期阶段的层次模型和网状模型中,一个属性如果有上一级,则称这个上一级是它的父节点。

从你的数据上来分析,ParentID 为0的应该就是一级名称,ParentID不为0的就是二级名称

最终结果如下

SELECT ClassName

FROM [Class]

WHERE ParentID = 0

UNION ALL

SELECT [Class2]ClassName+''+[Class]ClassName

FROM [Class] INNER JOIN

[Class] AS [Class2] ON [Class]ParentID = [Class2]ClassID

ORDER BY ClassName

如果是取ClassID显示的话,就把ClassName换成ClassID,这是个自表关联的问题,你把它想象成两个表就好理解了

别名为[Class2]的是父级表,数据表实际是还是[Class]

从你的数据表中读出父子节点表到DataTable中,然后按上下级关系一个个添加就可以。添加父子节点只需另写一个功能很数据表中加就行,比较简单。

给你一个示例,大概是这样子。

private void ShowTree()

{

thisSystemTreeNodesClear();

TreeNode rootNode = new TreeNode();

rootNodeText = "XXXXXXXX";

rootNodeValue = "";

int status = 0;

rootNodeNavigateUrl = "javascript:SelectNode('root',' '," + ConvertToString(nodeid++) + "," + status + ")";

thisSystemTreeNodesAdd(rootNode);

SubsystemManagement subSystem = new SubsystemManagement();

DataTable dt = new DataTable();

dt = subSystemGetAllsubsystemInfo(); //显示子系统名称

foreach (DataRow dr in dtRows)

{

TreeNode subNode = new TreeNode();

string subSysName = dr["CFunName"]ToString();

subNodeText = subSysName;

string subSysId = dr["CFunctionID"]ToString();

subNodeValue = subSysId;

status = 1;

subNodeNavigateUrl = "javascript:SelectNode('subsys','" + subSysId + "'," + ConvertToString((nodeid++)) + "," + status + ")";

rootNodeChildNodesAdd(subNode);

rootNodeExpanded = true;

DataTable sdt = new DataTable();

sdt = subSystemGetModulesBySubSysId(subSysId); //显示模块名称

foreach (DataRow sdr in sdtRows)

{

TreeNode sNode = new TreeNode();

string moduleName = sdr["CFunName"]ToString();

sNodeText = moduleName;

string moduleId = sdr["CFunctionId"]ToString();

sNodeValue = moduleId;

status = 1;

sNodeNavigateUrl = "javascript:SelectNode('module','" + moduleId + "'," + ConvertToString((nodeid++)) + "," + status + ")";

subNodeChildNodesAdd(sNode);

subNodeExpanded = true;

DataTable fdt = new DataTable();

fdt = subSystemGetFunctionsByModuleId(moduleId); //显示功能名称

foreach (DataRow fdr in fdtRows)

{

TreeNode fNode = new TreeNode();

fNodeText = fdr["CFunName"]ToString();

fNodeValue = fdr["CFunctionId"]ToString();

status = 2;

fNodeNavigateUrl = "javascript:SelectNode('function','" + fdr["CFunctionId"]ToString() + "'," + ConvertToString((nodeid++)) + "," + status + ")";

sNodeChildNodesAdd(fNode);

sNodeExpanded = false;

}

}

}

}

主要是分层查询,sql脚本如下:

CREATE TABLE TEST_A (ID NUMBER,PID NUMBER)

INSERT INTO TEST_A

VALUES(1,0);

COMMIT;

INSERT INTO TEST_A

VALUES(2,1);

COMMIT;

INSERT INTO TEST_A

VALUES(3,1);

COMMIT;

INSERT INTO TEST_A

VALUES(4,2);

COMMIT;

INSERT INTO TEST_A

VALUES(5,2);

COMMIT;

INSERT INTO TEST_A

VALUES(6,3);

COMMIT;

INSERT INTO TEST_A

VALUES(7,4);

COMMIT;

INSERT INTO TEST_A

VALUES(8,5);

COMMIT;

SELECT

FROM TEST_A A

START WITH APID = 0

CONNECT BY PRIOR AID = APID

ORDER BY APID;

希望能帮到你。

层次化查询,即树型结构查询,是SQL中经常用到的功能之一,通常由根节点,父节点,子节点,叶节点组成,其语法如下:

SELECT [LEVEL] ,column,expression,

FROM table_name

[WHERE where_clause]

[[START WITH start_condition] [CONNECT BY PRIOR prior_condition]];

LEVEL:伪列,用于表示树的层次

start_condition:层次化查询的起始条件,指定阶层的根。

prior_condition:定义父节点和子节点之间的关系,PRIOR指定父节点。作为运算符,PRIOR和加(+)减(-)运算的优先级相同。condition PRIOR expr = expr 或者 expr = PRIOR expr

例:

CONNECT BY last_name != 'King' AND PRIOR employee_id = manager_id

CONNECT BY PRIOR employee_id = manager_id and PRIOR account_mgr_id = customer_idSYS_CONNECT_BY_PATH

SYS_CONNECT_BY_PATH这个函数是oracle9i才新提出来的!

它一定要和connect by子句合用!

第一个参数是形成树形式的字段,第二个参数是父级和其子级分隔显示用的分隔符!

大类:

编号 类名

ID1 XX类

ID2 XX类

ID3 XX类

小类:

大类ID XX小类

大类ID XX小类

查询的时候写多表查询就可以了!

以上就是关于marginnote3怎么将一个子节点对应两个父节点全部的内容,包括:marginnote3怎么将一个子节点对应两个父节点、数据库查询问题select、如何在c# treeview控件动态绑定数据库,实现2级目录,添加父节点并在父节点下添加子节点等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/sjk/10101240.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-05
下一篇2023-05-05

发表评论

登录后才能评论

评论列表(0条)

    保存