web上的一棵树  treeview  ,其中页面初始化时,各个节点的是否选中状态由数据库中的表
中记录来确定,具体生成过程如下:
private TreeNode ShowAllTree(string role_id , int ddd , OleDbConnection  oleDbConnection1,Microsoft.Web.UI.WebControls.TreeNode node)
{ string sqlSelect =
"SELECT tree_id ,tree_id_c,tree_name ,tree_end_flag , tree_navigateurl FROM asp_tree  where tree_id  = '"+ddd+"'"  ;
OleDbDataAdapter da = new  OleDbDataAdapter( sqlSelect ,  oleDbConnection1 );
DataTable dt=new DataTable() ;
da.Fill(dt) ;
    
for(int i=0;i<dt.Rows.Count;i++)           
{
TreeNode newNode = new TreeNode() ;
DataRow dr=dt.Rows[i];
    
                
newNode.Text= dr["tree_name"].ToString(); if( dr["tree_end_flag"].ToString().Equals("0") )
{ //为父节点 添加属性
newNode.ImageUrl="treeimages/ico_xp11.gif";
newNode.ExpandedImageUrl = "treeimages/ico_xp13.gif";
newNode.CheckBox = true;
// newNode.Checked = true;
newNode.Expanded = true;
newNode.NodeData = dr["tree_id_c"].ToString();
}
else
{
//为子节点 添加属性
newNode.ID    = dr["tree_id_c"].ToString();
newNode.NodeData=dr["tree_id_c"].ToString();
newNode.CheckBox = true ;
// newNode.Checked = true ;
newNode.Expanded = true ;
}
         
int newID ;
//以后要加以判断 如果有该 权限 才能显示  
string sqlstr = " select user_flag from sys_role_tree_node where role_id ='" + role_id  +"' and tree_node_id ='" + newNode.NodeData + "'";
OleDbDataAdapter ls_da = new  OleDbDataAdapter( sqlstr , oleDbConnection1 );
DataTable ls_dt=new DataTable();
ls_da.Fill( ls_dt );
if ( ls_dt.Rows.Count > 0)
{
DataRow ls_dr = ls_dt.Rows[0];
if (  ls_dr["user_flag"].ToString().Equals("Y")  )
newNode.Checked = true;
ls_dt.Dispose();
ls_da.Dispose();
} node.Nodes.Add( newNode  ); newID = Convert.ToInt32 (dt.Rows[i][1]); ShowAllTree( role_id ,newID,this.oleDbConnection1 ,newNode); //递归调用,将子结点ID当做下一当前结点ID
} dt.Dispose();
return node;
}当采用如上方法来生成完树treeview后,运行的javascript就有问题,
即当选中 父节点时 ,子节点要全部选中
  当取消 父节点时 , 子节点要取消   
这个功能就有问题, javascript 具体代码如下:
<script language="javascript">
<!--
var strFuncs = ""; //功能节点ID字符串
var strSepa = ","; //功能节点ID字符串的分隔符

//单击"取消"按钮
function ddl1_SelectedIndexChanged()
{
Reponse.Write( ddl1.value );
}
function btnCancel_Click()
{
self.close();
}

//单击"确定"按钮,得到所选择的所有功能选项
function btnOK_Click()
{
var tvwFunc1 = document.getElementById("TreeView1");

var strFunc = "";
var allRootNodes = new Array();
allRootNodes = tvwFunc1.getChildren();

strFunc = getCheckedNodeID(allRootNodes);
window.parent.returnValue = strFunc; //向父页面返回功能节点ID
self.close();
}

//遍历所有节点,获取所有选中节点的 ID 号
function getCheckedNodeID(NodeArray)
{
if(parseInt(NodeArray.length) == 0)
{
return;
}
else
{
for(var i = 0; i < NodeArray.length; i++)
{
var cNode;
cNode = NodeArray[i];
if(cNode.getAttribute("Checked") == true)
{
strFuncs = strFuncs + cNode.getAttribute("ID") + strSepa;
}

if(cNode.getChildren().length != 0)
{
//第归调用
getCheckedNodeID(cNode.getChildren());
}
}
}

var iPos = strFuncs.lastIndexOf(",");

if(iPos != 0)
{
return strFuncs.substring(0,iPos);
}
else
{
return strFuncs;
}
}

//初始化选中节点
function initCheckedNode()
{
var trids = window.dialogArguments;
var arrCheckedId = new Array();
var arrUncheckedId = new Array();
if(trids != null)
{
arrCheckedId = trids.split(",");
var tvwFunc = document.getElementById("TreeView1");
var arrAllRootNode = new Array();
arrAllRootNode = tvwFunc.getChildren();

try
{
for(var i = 0; i < arrCheckedId.length; i++)
{
FindOriFuncNode(arrAllRootNode,arrCheckedId[i]);
}
}
catch(e)
{
alert(e);
}

}
}


//第归调用遍历所有树形节点
function FindOriFuncNode(NodeArray,nodeID)
{
if(parseInt(NodeArray.length) == 0)
{
return;
}
else
{
for(var i = 0; i < NodeArray.length; i++)
{
var cNode = NodeArray[i];
if(cNode.getAttribute("ID") == nodeID)
{
cNode.setAttribute("Checked","true");
break;
}

if(parseInt(cNode.getChildren().length) != 0)
{
FindOriFuncNode(cNode.getChildren(),nodeID);
}
}
}
}

//oncheck事件
function tree_oncheck(tree)
{
var node = tree.getTreeNode( tree.clickedNodeIndex );
var blChecked = node.getAttribute( "Checked" );

//设置子节点选中
setCheck(node,blChecked);

//设置父节点选中
setParentNode(node);

document.all.checkedNodes.value = "";
document.all.uncheckedNodes.value = "";

FindCheckedFromNode( document.getElementById("TreeView1")  );
}

//设置子节点状态
function setCheck(node,blChecked)
{
var childNodes = new Array();
childNodes = node.getChildren();

if(parseInt(childNodes.length) == 0)
{
return;
}
else
{
for(var i = 0; i < childNodes.length; i++)
{
var cNode = childNodes[i];
if(parseInt(cNode.getChildren().length) != 0)
{
//递归调用
setCheck(cNode,blChecked);
}
cNode.setAttribute("Checked",blChecked);
}
}
}

//设置父节点状态,
function setParentNode(node)
{
if(node.getAttribute("Checked"))
{
//如果节点选中,则设置所有父节点选中
var parentNode = node.getParent();
while(parentNode != null)
{
parentNode.setAttribute("Checked","true");
parentNode = parentNode.getParent();
}
}
else
{
    var blChecked = false;
var parentNode = node.getParent();
if(parentNode != null)
{
var arrBrotherNode = parentNode.getChildren();
for(var i = 0; i < arrBrotherNode.length; i++)
{
var bNode = arrBrotherNode[i];
if(bNode.getAttribute("Checked"))
{
blChecked = true;
break;
}
}

// 如果所有子节点CheckBox为假,则设置父节点为假
if(blChecked == false)
{
parentNode.setAttribute("Checked","false");
}
}
}
}



//获取所有节点状态
function FindCheckedFromNode(tree)
{
var allNodes = new Array();
allNodes = tree.getChildren();

for(var i = 0; i < allNodes.length; i++)
{
var cNode;
cNode = allNodes[i];
if(cNode.getAttribute("Checked"))
{
addCheckedNode(cNode);
}
else
{
addUncheckedNode(cNode);
}

if(cNode.getChildren().length != 0)
{
//递归调用
FindCheckedFromNode(cNode);
}
}
}

//添加选中节点
function addCheckedNode(node)
{
document.all.checkedNodes.value += node.getAttribute("NodeData");
document.all.checkedNodes.value += ',';
}


//添加未选中节点
function addUncheckedNode(node)
{
document.all.uncheckedNodes.value += node.getAttribute("NodeData");
document.all.uncheckedNodes.value += ',';
}
//-->
</script>大家帮忙,看看 代码有什么问题!!!!!!

解决方案 »

  1.   

    现在的问题是 当 树的节点 的checked状态是由程序给赋值时即
    newNode.Checked = true ;后,生成的树,运行上面的
    javascript就达不到“选中父节点则选中子节点,取消父节点则取消子节点”功能当checked状态不是由程序赋值生成时(即在属性设计器中设计好了之后),生成的页面
    则javascript就可达到这个目的我真是不明白啊,大家指点指点。
      

  2.   

    急寻 老大: morality(业精于勤,行成于思!) ,请快快帮帮忙!