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>大家帮忙,看看 代码有什么问题!!!!!!
中记录来确定,具体生成过程如下:
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>大家帮忙,看看 代码有什么问题!!!!!!
newNode.Checked = true ;后,生成的树,运行上面的
javascript就达不到“选中父节点则选中子节点,取消父节点则取消子节点”功能当checked状态不是由程序赋值生成时(即在属性设计器中设计好了之后),生成的页面
则javascript就可达到这个目的我真是不明白啊,大家指点指点。