数据库中的一张表是树形结构,然后把所有节点在页面上以textbox来显示出来,然后希望显中某级的时候某级及其下所有子节点全部被选中,我现在的问题是假设我有四级,第二级有3个节点,其下各有N个节点,然后我点中第二级的其中一个节点,结果发现第二级其他两个节点没有被选中,但是这两个没有点中的节点的下面的所有子节点居然全是选中状态,大家以为可能是什么原因导致的?我一直在弄可能有点思维定势,希望大家畅所欲言,给点启发,谢谢

解决方案 »

  1.   

    可能你在sql或程序中只判断了节点的深度是否在2级以下,而没有判断该节点是否是你选中的那个节点的下级节点。参考下,
      

  2.   

    数据库中的一张表是树形结构,然后把所有节点在页面上以textbox来显示出来这里,应该是checkbox在output的形式吧?
    贴代码上来看看。
      

  3.   


    public class DirectoryView { private Log log = LogFactory.getLog(DirectoryView.class);
        private Map<Integer, Boolean> map = new HashMap<Integer, Boolean>();
        private StringBuffer menuview = new StringBuffer();
        private Directory rootdirectory = null;
        private int layer = 1;
    private static String tableName = "circuit";
    private static String id_field = "circuit_id";
    private static String parent_id_field = "p_id";
    private static String where = null;
    private String contextPath;
    private int j=0,k=0;
    public DirectoryView(String id){
    rootdirectory = new Directory(tableName, id_field, parent_id_field, where).find(id);
    }
        public String listTree(String contextPath){
         if(rootdirectory==null)
         return "";
         this.contextPath = contextPath;
         synchronized(map){
         layer = StringUtil.toInt(rootdirectory.getValue("grade"));
         layer = layer<=0?1:layer;
         //menuview.append("<div id=\"right_scrolling\">");
         listTree1(rootdirectory, 0,1,1);
         //menuview.append("</div>");
         log.info("成功获取树形列表"+rootdirectory.getAllDirectory().size());
         System.out.println(menuview);
         return menuview.toString();
        }
        }
        @SuppressWarnings("unchecked")
    private synchronized void listTree1(Directory directory,int index,int size,int layer){
         String circuit_id = directory.getValue("circuit_id");
         map.put(layer, (index==size-1));
         j=1;
         printDirectory(directory, index,size,layer);
        List children = directory.getAllDirectory();//s(module_code);
        size = children.size();
        if(size == 0)
            return;
        menuview.append("<div id='childoftable" + circuit_id + "' class='tbg1' width='100%' align=center style='border:hidden;display:"+(layer==1?"":"none")+";'>\n");
        for(int i=0; i<size;i++ ){
         j++;
    Directory dir = (Directory)children.get(i);
    listTree1(dir,i,size,layer+1);
        }
        menuview.append("</div>\n");
    }
        private synchronized void printDirectory(Directory directory,int index,int size,int layer){
         String circuit_id = directory.getValue("circuit_id");
         if(circuit_id==null)
         return;
         String circuit_name = directory.getValue("circuit_name");
         int grade = Integer.parseInt(directory.getValue("grade"));
            String tableid = "table" + circuit_id;
            menuview.append(" <table style='border:hidden; solid black;border-collapse:collapse; ' class='tbg1' cellspacing=0 cellpadding=0 width='100%' align=center onMouseOver=\"this.className='tbg1sel'\" onMouseOut=\"this.className='tbg1'\" border=0>\n");
            menuview.append(" <tr>\n");
            menuview.append(" <td width='85%' height='13' align=left nowrap style='border:1px;'>\n");
            
            for (int i=this.layer;i<layer; i++) {
             boolean b = false;
             for (int j=i;j<layer; j++) {
             Boolean bol = map.get(j);
             if(bol!=null&&!bol&&i==j){
            menuview.append(" <img src="+contextPath+"/images/i_plus-2.gif align='absmiddle'/>\n");
            b = true;
            break;
    }
    }
             if(!b){
            menuview.append("&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;");
             }
    }
    menuview.append("\n");
         if(rootdirectory.getValue(id_field).equals(circuit_id)){//如果是根目录
         menuview.append(" <img onClick=\"ShowChild(this, '"+tableid+"')\" src='"+contextPath+"/images/i_puls-root.gif' align='absmiddle'/>\n");
         }else{
         /*div显示
            if(index==size-1){//如果是最后一个
         if(directory.isNextDirectory()){//如果有下级目录
                 menuview.append(" <img onClick=\"ShowChild(this, '" + tableid + "')\" src='"+contextPath+"/images/i_plus2-2.gif' align='absmiddle'>\n");
         }else {
                 menuview.append(" <img src='"+contextPath+"/images/i_plus-2-3.gif' align='absmiddle'>\n");
    }
         }else {//如果不是最后一个
         if(directory.isNextDirectory()){//如果有下级目录
                menuview.append(" <img onClick=\"ShowChild(this, '" + tableid + "')\" id='img"+tableid+"' src='"+contextPath+"/images/i_plus2-1.gif' align='absmiddle'>\n");
         }else {
                menuview.append(" <img src='"+contextPath+"/images/i_plus-2-2.gif' align='absmiddle'>\n");
    }
    }*/
         //div隐藏
         if(index==size-1){//如果是最后一个
         if(directory.isNextDirectory()){//如果有下级目录
                 menuview.append(" <img onClick=\"ShowChild(this, '" + tableid + "')\" src='"+contextPath+"/images/i_plus-1-1.gif' align='absmiddle'/>\n");
         }else {
                 menuview.append(" <img src='"+contextPath+"/images/i_plus-2-3.gif' align='absmiddle'/>\n");
    }
         }else {//如果不是最后一个
         if(directory.isNextDirectory()){//如果有下级目录
                menuview.append(" <img onClick=\"ShowChild(this, '" + tableid + "')\" id='img"+tableid+"' src='"+contextPath+"/images/i_plus-1.gif' align='absmiddle'/>\n");
         }else {
                menuview.append(" <img src='"+contextPath+"/images/i_plus-2-2.gif' align='absmiddle'/>\n");
    }
    }
    }
         k++;
    menuview.append(" <input type='checkbox' name='circuit_id' id='layer"+grade+(k)+"' value='"+circuit_id+"' onclick=\"selectCircuit_id("+(grade)+","+(k)+",this.checked);\"/>"+circuit_name);
            menuview.append(" </td>\n");
            menuview.append(" </tr>\n");
            menuview.append(" </table>\n");
        }
    }