''' 加入菜单子节点
''' </summary>
''' <param name="tbMenu">菜单表</param>
''' <param name="tvNode">父节点</param>
''' <remarks></remarks>
Private Sub AddNode(ByVal tbMenu As DataTable, ByVal tvNode As TreeNode)
Dim myRow As DataRow() = tbMenuSelect(StringFormat("PRMENUID = '{0}'", tvNodeNodeID), "SORTORDER")‘查询子菜单,按SORTORDER字段排序
Dim strURL As String = StringEmpty‘菜单链接
For Each DataRow In myRow’循环所有子菜单
Dim MainMenuNode As TreeNode = New TreeNode() With {Text = DataRowItem("VALUE"), NodeID = DataRowItem("MENU_ID")}'实例化一个子节点
If DataRowItem("URL")ToStringLength > 0 Then
strURL = StringFormat("{0}menuid={1}", DataRowItem("URL"), DataRowItem("MENUID"))’菜单链接
MainMenuNodeNavigateUrl = strURL
MainMenuNodeIconUrl = "/image/leafgif"‘菜单图标
End If
MainMenuNodeSingleClickExpand = True’设置单击菜单时展开子菜单
MainMenuNodeExpanded = True‘默认展开所有菜单
tvNodeNodesAdd(MainMenuNode)’将子节点添加进父节点
AddNode(tbMenu, MainMenuNode) '利用递归生成树形菜单
Next
End Sub
希望对你有帮助。Antd 提供的 TreeSelect树形选择非常好用,但是有一个问题:节点选择。
场景一:当底层child 节点数为多个时 可以正常选择,但是为1时,会自动选择到父节点上,怎么办?
场景二:当我想要选择2级child节点时,选中的却是3级child节点,该如何解决?
解决这个问题的关键在于 灵活使用一个属性:showCheckedStrategy(默认是子节点)
⚠️注意:这个对象的值是枚举类型
SHOW_ALL: 显示所有选中节点(包括父节点)
SHOW_PARENT: 只显示父节点(当父节点下所有子节点都选中时)
SHOW_CHILD :只显示子节点
个人推荐使用三元运算 灵活改变节点取值,这样能在项目中满足多个不同等级账户的使用需求。我想你这个要实现的所谓的权限应该是,只要用户点击某个节点就查询其是否有该节点的权限吧?如果有权限就展示有权限 *** 作的内容,没有就提示没有权限?我不知道我理解的对不对。
或者是另一种情况,就是当前登录的用户有哪些菜单的权限就在树形图中只展示他有权限的菜单。
前者需要通过ajax去数据库判断,当然如果对无刷新要求不高可以直接跳action去数据库判断;后者在输出树状图的时候就把权限判断好,后面就不需要判断了。首先,需要通过父子节点的ID,将树形关系在页面中关联上。
比如父节点ID: id1
1级子节点ID就可以为:id1_1
2级子节点ID就可以为:id1_1_1
接下来无非就是根据这些有规则的id,使用脚本去 *** 作页面元素了jsp动态树形菜单须用到递归算法,比如在数据库有张表,parent表,parent的字段有id,name,depth,leve,ID自增,depth设置为级数,如这条数据最大,为0,如为字菜单就为1,而leve就指定它父节点的id,给段代码自己可以摸索下 public Vector getModuleTree()
{
Vector pclass = new Vector();
try
{
stmt =concreateStatement();
String sql = "select from Module where parentid = 0";
rs = stmtexecuteQuery(sql);
Module cvo = null;
while(rsnext())
{
cvo = new Module();
cvosetModule_id(rsgetInt("Module_id"));
cvosetModule_name(rsgetString("Module_name"));
cvosetModule_url(rsgetString("Module_url"));
cvosetParentid(rsgetInt("parentid")); cvosetRootid(rsgetInt("rootid")); cvosetDepth(rsgetInt("depth")); pclassadd(cvo);
}
for (int i = 0; i < pclasssize(); i++)
{
Module pcvo = (Module) pclassget(i);
ShowTreeMenu(pcvo);
}
concommit(); } catch (SQLException e)
{
eprintStackTrace();
} finally
{
try
{
if(rs!=null)
{
rsclose();
}
if(stmt!=null)
{
stmtclose();
}
if(con!=null)
{
conclose();
}
}
catch (SQLException e)
{
eprintStackTrace();
}
}
return classList;
}
public void ShowTreeMenu(Module c)
{
Module ccvo = null;
String sql = "select from Module where parentid = " + cgetModule_id();
Vector cclass = new Vector();
try
{
Module cvotemp;
stmt =concreateStatement();
rs = stmtexecuteQuery(sql);
while(rsnext())
{
cvotemp = new Module();
cvotempsetModule_id(rsgetInt("Module_id"));
cvotempsetModule_name(rsgetString("Module_name"));
cvotempsetModule_url(rsgetString("Module_url"));
cvotempsetParentid(rsgetInt("parentid")); cvotempsetRootid(rsgetInt("rootid")); cvotempsetDepth(rsgetInt("depth")); cclassadd(cvotemp);
}
Systemoutprintln(cclasssize()+"(((((((((((((((((((((((((9");
if (cclasssize() > 0)
{
csetHasChild("have");
classListadd(c);
for (int j = 0; j < cclasssize(); j++)
{
ccvo = (Module) cclassget(j);
ShowTreeMenu(ccvo);
} } else
{
classListadd(c);
}
} catch (SQLException e)
{
eprintStackTrace();
}
}/// <summary>
/// 动态绑定TreeView,递归
/// </summary>
/// <param name="tv">要绑定到的TreeView控件名称</param>
/// <param name="dt">准备绑定到TreeView控件的数据DataTable的名称</param>
/// <param name="Filterid">分级条件id,顶级分类ID为0</param>
/// <param name="node">上级TreeNode节点名称,没有上级节点或或全新绑定这里写(TreeNode)null</param>
/// <param name="Node_FLZD">节点的分级条件在数据库中的字段</param>
/// <param name="NodeText_ZD">节点绑定的显示的文本在数据库中的字段</param>
/// <param name="NodeTag_ZD">节点绑定的Tag值在数据库中的字段</param>
public static void bind_treeview(TreeView tv, DataTable dt, int Filterid, TreeNode node,string Node_FLZD,string NodeText_ZD,string NodeTag_ZD)//绑定treeView的方法。
{
DataView subView = dtDefaultView;
subViewRowFilter = Node_FLZD + "=" + Filterid; //获得ID级别为当前ID的
foreach (DataRowView item in subView)
{
//如果上级ID为0就直接加载树下面
if (Filterid == 0)
{
TreeNode treenodel = new TreeNode(); //创建一个节点
treenodelText = item[NodeText_ZD]ToString(); //节点名称
int id = ConvertToInt32(item[NodeTag_ZD]);
treenodelTag = idToString(); //节点值
tvNodesAdd(treenodel); // 如果级别ID为0就直接加到根节点
bind_treeview(tv, dt, id, treenodel, Node_FLZD, NodeText_ZD, NodeTag_ZD); // 递归调用
}
else
{
//不为0就加载传进来的子节点下
TreeNode treenodel = new TreeNode();
treenodelText = item[NodeText_ZD]ToString();
int id = ConvertToInt32(item[NodeTag_ZD]);
treenodelTag = idToString();
treenodelExpandAll();
nodeNodesAdd(treenodel); //把节点加入到当前节点下,
bind_treeview(tv, dt, id, treenodel, Node_FLZD, NodeText_ZD, NodeTag_ZD);
}
}
}
这个很方便了,已经给你写成了方法。你调用然后把值传进去就是了。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)