///////////////////////////////////////
//作者:阿福,[email protected]
//时间:2003-01-26  修改时间:2003-04-17
//版本:V2.03
//名称:TreeView类
//////////////////////////////////////
/*
 *更新记录
 *2003-04-19 修正bug tv.hasChild()*/
function TreeView()
{
////////////////////////////////////////////////////////////////////////////////////////////
//定义图片
var sImgPath="./images/";
var aNodeImage=new Array(16);
/*
aNodeImage[0]=new Image();aNodeImage[0].src=sImgPath+"blank.gif";
aNodeImage[1]=new Image();aNodeImage[1].src=sImgPath+"doc.gif";
aNodeImage[2]=new Image();aNodeImage[2].src=sImgPath+"first_close.gif";
aNodeImage[3]=new Image();aNodeImage[3].src=sImgPath+"first_open.gif";
aNodeImage[4]=new Image();aNodeImage[4].src=sImgPath+"folderclosed.gif";
aNodeImage[5]=new Image();aNodeImage[5].src=sImgPath+"folderopen.gif";
aNodeImage[6]=new Image();aNodeImage[6].src=sImgPath+"last_close.gif";
aNodeImage[7]=new Image();aNodeImage[7].src=sImgPath+"last_open.gif";
aNodeImage[8]=new Image();aNodeImage[8].src=sImgPath+"lastnode.gif";
aNodeImage[9]=new Image();aNodeImage[9].src=sImgPath+"middle_close.gif";
aNodeImage[10]=new Image();aNodeImage[10].src=sImgPath+"middle_open.gif";
aNodeImage[11]=new Image();aNodeImage[11].src=sImgPath+"node.gif";
aNodeImage[12]=new Image();aNodeImage[12].src=sImgPath+"vertline.gif";
aNodeImage[13]=new Image();aNodeImage[13].src=sImgPath+"first_none.gif";
aNodeImage[14]=new Image();aNodeImage[14].src=sImgPath+"one_close.gif";
aNodeImage[15]=new Image();aNodeImage[15].src=sImgPath+"one_open.gif";
*/
aNodeImage[0]=new Image();aNodeImage[0].src=sImgPath+"blank.gif";
aNodeImage[1]=new Image();aNodeImage[1].src=sImgPath+"doc.gif";
aNodeImage[2]=new Image();aNodeImage[2].src=sImgPath+"one_close.gif";
aNodeImage[3]=new Image();aNodeImage[3].src=sImgPath+"one_open.gif";
aNodeImage[4]=new Image();aNodeImage[4].src=sImgPath+"folderclosed.gif";
aNodeImage[5]=new Image();aNodeImage[5].src=sImgPath+"folderopen.gif";
aNodeImage[6]=new Image();aNodeImage[6].src=sImgPath+"one_close.gif";
aNodeImage[7]=new Image();aNodeImage[7].src=sImgPath+"one_open.gif";
aNodeImage[8]=new Image();aNodeImage[8].src=sImgPath+"blank.gif";
aNodeImage[9]=new Image();aNodeImage[9].src=sImgPath+"one_close.gif";
aNodeImage[10]=new Image();aNodeImage[10].src=sImgPath+"one_open.gif";
aNodeImage[11]=new Image();aNodeImage[11].src=sImgPath+"blank.gif";
aNodeImage[12]=new Image();aNodeImage[12].src=sImgPath+"blank.gif";
aNodeImage[13]=new Image();aNodeImage[13].src=sImgPath+"blank.gif";
aNodeImage[14]=new Image();aNodeImage[14].src=sImgPath+"one_close.gif";
aNodeImage[15]=new Image();aNodeImage[15].src=sImgPath+"one_open.gif";
//定义颜色常量
//                                 普通文字颜色        未选中背景颜色     鼠标移上的文本颜色  未选中的文字的大小
var arr_style=new Array("#336598","#000000","#bfd8ef","#ffffff","default","#ff0000","900",    "500");
//                      选中文字颜色         选中背景颜色        文本鼠标            选中的文字大小
////////////////////////////////////////////////////////////////////////////////////////////
//Private
this.id="_"+(new Date().getTime());
var container=CreateTable(this.id);
var data=new Array(new Array(0,0,"默认根节点",0,0,new Array(),false,false,""));
var nodecount=0;
//Public
this.name=this;
var overobj,overid,overtag,selectedid=0;
//////////////////////////////////////////////////////////////////////////////////////////////*********************
//* 方法:add
//* 功能:添加节点
//* 输入:
//* 输出:
//********************
this.add=add;
function add(sRelative,sKey,sText,sImage)
{
//alert(sRelative);
if(getID(sKey)!=-1)  //判断节点是否已经存在
{
alert("节点已经存在!");
return;
}

if(sRelative==0)  //如果在根节点下面添加
{
nodecount++;
data[nodecount]=new Array(0,sKey,sText,1,0,new Array(),false,false,sImage);  //在记录集中加入数据
data[0][5][data[0][4]]=nodecount;  //在父节点的引用中加入ID
data[0][4]++;  //父节点中子节点个数加一
}
else
{
var parentid=getID(sRelative);//首先找到父节点
//alert(parentid);alert(data);
if(parentid==-1)
{
alert("找不到指定的父节点!");
return;
}
var parentobj=data[parentid];//获得节点数组
var level=parentobj[3]+1;

nodecount++;
data[nodecount]=new Array(parentid,sKey,sText,level,0,new Array(),false,false,sImage);//添加节点

parentobj[5][parentobj[4]]=nodecount;//在父节点的子节点列表中注册
parentobj[4]++;   //增加节点个数
}
}

解决方案 »

  1.   

    //*********************
    //* 方法:setSelected
    //* 功能:设置选择状态
    //* 输入:关键字
    //* 输出:下标
    //********************
    this.setSelected=setSelected;
    function setSelected(ID,state)
    {
    if(ID<1||ID>nodecount)
    {
    alert("ID超出节点存在范围setSelected");
    return;
    }
    if(selectedid!=0)
    {
    data[selectedid][6]=false;
    }
    data[ID][6]=state;
    selectedid=ID;
    }//*********************
    //* 方法:getSelectedID
    //* 功能:得到当前选择的节点的ID
    //* 输入:
    //* 输出:下标
    //********************
    this.getSelectedID=getSelectedID;
    function getSelectedID()
    {
    return selectedid;
    }//*********************
    //* 方法:setExpanded
    //* 功能:设置展开状态
    //* 输入:关键字
    //* 输出:下标
    //********************
    this.setExpanded=setExpanded;
    function setExpanded(ID,state)
    {
    if(ID<1||ID>nodecount)
    {
    alert("ID超出节点存在范围setExpanded");
    return;
    }
    data[ID][7]=state;
    }//*********************
    //* 方法:setText
    //* 功能:设置节点文本
    //* 输入:下标,
    //* 输出:
    //********************
    this.setText=setText;
    function setText(ID,text)
    {
    if(ID<1||ID>nodecount)
    {
    alert("ID超出节点存在范围setText");
    return;
    }
    data[ID][2]=text;
    }//*********************
    //* 方法:setImage
    //* 功能:设置节点图片
    //* 输入:关键字
    //* 输出:下标
    //********************
    this.setImage=setImage;
    function setImage(ID,src)
    {
    if(ID<1||ID>nodecount)
    {
    alert("ID超出节点存在范围setImage");
    return;
    }
    data[ID][8]=text;
    }
      

  2.   

    //*********************
    //* 方法:getID
    //* 功能:查找节点
    //* 输入:关键字
    //* 输出:下标
    //********************
    this.getID=getID;
    function getID(sKey)
    {
    var i;
    //alert(data);
    for(i=1;i<=nodecount;i++)
    {
    //alert(data[i][1]);
    if(data[i][1]==sKey)
    {
    return i;
    }
    }
    return -1;
    }//*********************
    //* 方法:getChildCount
    //* 功能:得到一个节点的子节点个数
    //* 输入:下标
    //* 输出:节点个数
    //********************
    this.getChildCount=getChildCount;
    function getChildCount(ID)
    {
    if(ID<0||ID>nodecount)
    {
    alert("ID超出节点存在范围getChildCount");
    return;
    }
    return data[ID][3];
    }//*********************
    //* 方法:getFirstSibling
    //* 功能:得到第一个兄弟节点
    //* 输入:下标
    //* 输出:下标
    //********************
    this.getFirstSibling=getFirstSibling;
    function getFirstSibling(ID)
    {
    if(ID<1||ID>nodecount)
    {
    alert("ID超出节点存在范围getFirstSibling");
    return;
    }
    return data[data[ID][0]][5][0];
    }//*********************
    //* 方法:getImage
    //* 功能:得到节点图象
    //* 输入:下标
    //* 输出:字符串
    //********************
    this.getImage=getImage;
    function getImage(ID)
    {
    if(ID<0||ID>nodecount)
    {
    alert("ID超出节点存在范围getImage");
    return;
    }
    return data[ID][7];
    }//*********************
    //* 方法:getKey
    //* 功能:得到一个节点的关键字
    //* 输入:下标
    //* 输出:字符串
    //********************
    this.getKey=getKey;
    function getKey(ID)
    {
    if(ID<0||ID>nodecount)
    {
    alert("ID超出节点存在范围getKey");
    return;
    }
    return data[ID][1];
    }//*********************
    //* 方法:getLastSibling
    //* 功能:得到最后一个兄弟节点
    //* 输入:下标
    //* 输出:下标
    //********************
    this.getLastSibling=getLastSibling;
    function getLastSibling(ID)
    {
    if(ID<1||ID>nodecount)
    {
    alert("ID超出节点存在范围getLastSibling\n"+ID);
    return;
    }
    var parentobj=data[data[ID][0]];
    return parentobj[5][parentobj[4]-1];
    }//*********************
    //* 方法:getNextSibling
    //* 功能:得到下一个兄弟节点
    //* 输入:下标
    //* 输出:下标
    //********************
    this.getNextSibling=getNextSibling;
    function getNextSibling(ID)
    {
    if(ID<1||ID>nodecount)  //检查参数
    {
    alert("ID超出节点存在范围getNextSibling");
    return;
    }
    //得到父节点
    var parentobj=data[data[ID][0]];
    var nodecount=parentobj[4];
    var i;
    for(i=0;i<nodecount-1;i++)
    {
    if(parentobj[5][i]==ID)
    {
    return parentobj[5][i+1];
    }
    }
    return -1;
    }