Topic: 实现一个菜单树形结构

  Print this page

1.实现一个菜单树形结构 Copy to clipboard
Posted by: wz_gu
Posted on: 2004-12-06 16:55

实现一个菜单树形结构,大家知道,树形分根,枝,叶,叶子就是下面没有了任何元素,而枝就是下面可能有枝或叶。
1 首先,菜单的层次不清楚,也就是说,多少层不知道。
2 数据存放在数据库中,要从数据库中读取出数据后,在页面中以树形显示出来
3 在数据库中,菜单编码如下:顶级001,然后下一级001001,然后是001002,顶级002,下一级002001,下一级002002,如果002002下面还有,就是002002001,在一条记录中,除了自己的菜单号,还有自己上一级的菜单号。例如:如果是002002001,那它的上一级菜单的ID就是002002。
请各位给一个思路:我已经将所有的菜单遍历出来,但是就是不能以树形显示出来,这个树形应该如何实现?

hibernate 2.1.6,win2000,eclipse,sqlserver2000

2.Re:实现一个菜单树形结构 [Re: wz_gu] Copy to clipboard
Posted by: 256456
Posted on: 2004-12-07 09:02

不要通过编码方式确定树型结构,通过父子列的关系建立树型结构,而且只需要有父子关系就可以建立,为了以后使用的方便,也可以再加上层次和是否是leaf的字段!!

3.Re:实现一个菜单树形结构 [Re: 256456] Copy to clipboard
Posted by: wz_gu
Posted on: 2004-12-07 16:21

请大家不要说什么重新设计,改良什么的,我现在就是这个问题,设计已经完成了,又不是我说了算,况且如果重新来,谁也没有时间。所以就事论事,这个问题如何解决?

4.Re:实现一个菜单树形结构 [Re: wz_gu] Copy to clipboard
Posted by: wz_gu
Posted on: 2004-12-08 13:56

树形问题已解决,心中真的是无比愉快!这大概就是编程的快乐吧!

5.Re:实现一个菜单树形结构 [Re: wz_gu] Copy to clipboard
Posted by: jsp168
Posted on: 2004-12-09 12:46

请问wz_gu你是如何解决的?是用什么思路?
分享下你的快乐。。。。

6.Re:实现一个菜单树形结构 [Re: wz_gu] Copy to clipboard
Posted by: jsp168
Posted on: 2004-12-09 12:48

我现在这样的思路:
是根据菜单编码的长度而生成树形

7.Re:实现一个菜单树形结构 [Re: wz_gu] Copy to clipboard
Posted by: wz_gu
Posted on: 2004-12-09 13:09

用递归,然后对每层进行编排,形成树形就好了。

8.Re:实现一个菜单树形结构 [Re: wz_gu] Copy to clipboard
Posted by: supertom
Posted on: 2004-12-14 11:23

这种问题应该形成一种通用的解决方案,比如说,给你一个Model(形成Layout用的), 再给你一个树型结构的Data Manager,你就可以根据需要,对每一个节点定制最终的Layout,用Compiste解决这类问题应该是比较理想的解决方案,我这里有一些sample code,希望能起到抛砖引玉的效果:
private boolean buildTableRows(TableCellModel model, TableDataManager data, Node node)
{
  
  Vector rows = null;
  // set current node in global data manager
  setCurrentNodeInGlobalDataManager(node);
  
  // set current tabular row data, for more detail, please refer to TableDataManager.
  String[] curRowData = (String[])data.getTabularData(node,false).get(0);
  setCurrentTabularRowData(curRowData);
  
  int curLevel = data.getCurrentLevel(node);
  if(data.isLeafNode(node))
  {
    return processLeafNode(model, data, node);
  }
  else
  {
   if(data.isRootNode(node))
   {
   rows = model.getHeaderRows();
   addRows(rows);
   }
   else
   {
   rows = model.getBreakRows(curLevel);
   addRows(rows);
   }

    //If all children is handled, then the parent is handled.
    Node firstChild = node.getFirstChild();
    Node tempNode = firstChild;
    buildTableRows(model, data, tempNode);
    while((tempNode = tempNode.getNextSibling()) != null)
    {
     buildTableRows(model, data, tempNode);
    }
   addSummaryRows(node);
  }
  return true;
}

private boolean processLeafNode(TableCellModel model, TableDataManager data, Node node)
{
  int curLevel = data.getCurrentLevel(node);
  
  TabularData tabular = (TabularData)data.getTabularData(node, true);
  // set current row
  setCurrentTabularRowData((String[])tabular.get(0));
  /** getRows(level,detailOnly) - return rows whose break level’s absolute value
   * equal to the first parameter.
   */
  Vector rows = model.getRows( curLevel, false);
  
  // vTableRows - final table rows of layout manager.
  addRows( rows );
  
  for(int i = 1 ; i < tabular.getRowCount() ; i++)
  {
   setCurrentTabularRowData((String[])tabular.getLight Bulb);
    rows = model.getRows( curLevel, true);
    addRows( rows );
  }

  addSummaryRows(node);
  return true;
}

大概情况是这样,等过一段时间有空,确实可以考虑一下将它形成具体的解决方案。

9.Re:实现一个菜单树形结构 [Re: supertom] Copy to clipboard
Posted by: wz_gu
Posted on: 2004-12-14 14:06

to:supertom
一看你就是高手,懂design pattern的一定不是菜鸟,我也听说过,Compiste是做树形最好的模式,谢谢指点!


   Powered by Jute Powerful Forum® Version Jute 1.5.6 Ent
Copyright © 2002-2021 Cjsdn Team. All Righits Reserved. 闽ICP备05005120号-1
客服电话 18559299278    客服信箱 714923@qq.com    客服QQ 714923