web下treeview,运行一段javascript (这段javascript代码主要是执行:当取消父节点时,子节点全部取消;当选中子节点时,父节点选中)。
当树的Nodes是在属性设计器中静态添加时,javascript代码就可以执行;
但是当treeview中的数据是由数据库表递归生成时,javascript就不起作用?我在递归生成 treeview前作了做了删除操作:TreeView1.Nodes.Clear();
然后再添加所有的节点信息,页面运行完成后,在树节点上做 选中、点击操作,不起作用。怎么回事?是不是动态添加节点Nodes时有的属性需要设置?
大家帮帮忙???
谢谢了
当树的Nodes是在属性设计器中静态添加时,javascript代码就可以执行;
但是当treeview中的数据是由数据库表递归生成时,javascript就不起作用?我在递归生成 treeview前作了做了删除操作:TreeView1.Nodes.Clear();
然后再添加所有的节点信息,页面运行完成后,在树节点上做 选中、点击操作,不起作用。怎么回事?是不是动态添加节点Nodes时有的属性需要设置?
大家帮帮忙???
谢谢了
静态添加的时候在你的html页里面有,属于客户端代码,递归生成时属于服务器端代码,这样js可能就不执行了。我猜的
if (!Page.IsPostBack)
{
this.oleDbConnection1=new OleDbConnection( ConfigurationSettings.AppSettings.GetValues(0)[0]); oleDbConnection1.Open ();
TreeNode node=new TreeNode(); TreeView1.Nodes.Add(ShowAllTree(0, oleDbConnection1,node)); //根节是以PID为0标志的
}
函数如下:private TreeNode ShowAllTree(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;
}
else
{
// newNode.Target = "mainFrame";
newNode.ID = dr["tree_id_c"].ToString();
// newNode.NavigateUrl=dr["tree_navigateurl"].ToString();
newNode.CheckBox = true ;
newNode.Checked = true ;
}
node.Nodes.Add( newNode ); int newID = Convert.ToInt32 (dt.Rows[i][1]);; ShowAllTree(newID,this.oleDbConnection1 ,newNode); //递归调用,将子结点ID当做下一当前结点ID
}
dt.Dispose();
return node;
}
<script language="javascript">
<!--
var strFuncs = ""; //功能节点ID字符串
var strSepa = ","; //功能节点ID字符串的分隔符
//单击"取消"按钮
function btnCancel_Click()
{
self.close();
}
//单击"确定"按钮,得到所选择的所有功能选项
function btnOK_Click()
{
var tvwFunc1 = document.getElementById("tvwFunc");
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("tvwFunc");
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("tvwFunc"));
}
//设置子节点状态
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>
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Web;
using System.Web.SessionState;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;
using System.Data.SqlClient;
using System.Configuration;
using Microsoft.Web.UI.WebControls;namespace NCMT
{
/// <summary>
/// SelectFunc 的摘要说明。
/// </summary>
public class SelectFunc : System.Web.UI.Page
{
protected Microsoft.Web.UI.WebControls.TreeView tvwFunc;
protected System.Web.UI.WebControls.Panel panItem;
protected string sSql = null;
protected SqlConnection conn;
protected SqlDataAdapter apt;
protected DataSet ds;
//private static string strTypeID = ""; private void Page_Load(object sender, System.EventArgs e)
{
// 在此处放置用户代码以初始化页面
if(!Page.IsPostBack)
{
string sConn = ConfigurationSettings.AppSettings["NCMT"];
conn = new SqlConnection(sConn);
CreateDataSet();
InitFuncTree(tvwFunc.Nodes,"0");
//注册客户端 oncheck 事件
tvwFunc.Attributes.Add("oncheck","tree_oncheck(document.getElementById('tvwFunc'))");
}
} //创建数据集
private DataSet CreateDataSet()
{
//sSql = "Select * From T_Navigation Where F_OutOrIn = 'InNavi' Order By ID,F_NodeName";
sSql = "Select * From T_Function Order By ID,F_NodeName";
apt = new SqlDataAdapter(sSql,conn);
ds = new DataSet();
apt.Fill(ds,"dtFunc");
return ds;
}
//初始化科目树,并通过递归调用显示子树
private void InitFuncTree(TreeNodeCollection tncCurrent,string sParentID)
{
DataView dvwFunc = new DataView();
TreeNode nodTemp;
dvwFunc.Table = ds.Tables["dtFunc"];
dvwFunc.RowFilter = "F_ParentID = '" + sParentID + "'";
foreach(DataRowView drvFunc in dvwFunc)
{
nodTemp = new TreeNode();
nodTemp.CheckBox = true;
nodTemp.ID = drvFunc["F_NodeID"].ToString();
nodTemp.Text = drvFunc["F_NodeName"].ToString();
nodTemp.NodeData = drvFunc["F_NodeID"].ToString(); tncCurrent.Add(nodTemp);
//递归调用显示子树
InitFuncTree(nodTemp.Nodes,nodTemp.ID);
}
}
#region Web 窗体设计器生成的代码
override protected void OnInit(EventArgs e)
{
//
// CODEGEN: 该调用是 ASP.NET Web 窗体设计器所必需的。
//
InitializeComponent();
base.OnInit(e);
}
/// <summary>
/// 设计器支持所需的方法 - 不要使用代码编辑器修改
/// 此方法的内容。
/// </summary>
private void InitializeComponent()
{
this.tvwFunc.Check += new Microsoft.Web.UI.WebControls.ClickEventHandler(this.tvwFunc_Check);
this.Load += new System.EventHandler(this.Page_Load); }
#endregion private void tvwFunc_Check(object sender, Microsoft.Web.UI.WebControls.TreeViewClickEventArgs e)
{
tvwFunc.GetNodeFromIndex(tvwFunc.SelectedNodeIndex).Checked = true;
}
}
}
试了,还是不行
错误代码document.all.checkedNodes.value = "";
为空域 或 不是 对象 。
<INPUT id="btnOK" onclick="btnOK_Click()" type="button" value="确 定" name="btnOK"><FONT face="宋体"> </FONT>
<INPUT id="btnCancel" onclick="btnCancel_Click()" type="button" value="取 消" name="btnCancel">
<INPUT id="uncheckedNodes" type="hidden" name="uncheckedNodes">
父结点、字节点选中的问题解决了,
但是,web上的树的节点在我选中、取消操作后,
点击 web上的一个button写函数将其节点信息保存,但是发现节点的选中、取消信息还是
在鼠标点击操作之前的初始信息;同时,点击完button后整棵树的节点选中状态又是初始的,而不是我点击操作后的,怎么回事?