web下treeview,运行一段javascript (这段javascript代码主要是执行:当取消父节点时,子节点全部取消;当选中子节点时,父节点选中)。
当树的Nodes是在属性设计器中静态添加时,javascript代码就可以执行;
但是当treeview中的数据是由数据库表递归生成时,javascript就不起作用?我在递归生成 treeview前作了做了删除操作:TreeView1.Nodes.Clear();
然后再添加所有的节点信息,页面运行完成后,在树节点上做 选中、点击操作,不起作用。怎么回事?是不是动态添加节点Nodes时有的属性需要设置?
大家帮帮忙???
谢谢了

解决方案 »

  1.   

    我想是不是因为以下的原因:
    静态添加的时候在你的html页里面有,属于客户端代码,递归生成时属于服务器端代码,这样js可能就不执行了。我猜的
      

  2.   

    Page_Load中代码如下
    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;
    }
      

  3.   

    是不是在 node节点的那个属性还需要设置??
      

  4.   

    给一段代码参考:
    <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>
      

  5.   

    *.cs 文件中,从数据库中读取数据:using System;
    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;
    }
    }
    }
      

  6.   

    我也遇到过了,你试试将:newNode.Expanded = true;加入代码中看看
      

  7.   

    morality(业精于勤,行成于思!) -------------------------------------------------------我的javascript用的就是你的这段代码,  但是.cs文件中树的生成过程和你的有些差别,会不会是 树的 生成过程导致的原因?
      

  8.   

    newNode.Expanded = true;
    试了,还是不行
      

  9.   

    而且页面脚本上会有错误
    错误代码document.all.checkedNodes.value = "";
    为空域 或 不是 对象 。
      

  10.   

    呵呵,当然你的网页上要有两个名称和ID为 checkedNodes 和 uncheckedNodes 的两个HTMLTextBox文本框。如下:<INPUT type="hidden" id="checkedNodes" name="checkedNodes">&nbsp;
    <INPUT id="btnOK" onclick="btnOK_Click()" type="button" value="确 定" name="btnOK"><FONT face="宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</FONT>
    <INPUT id="btnCancel" onclick="btnCancel_Click()" type="button" value="取 消" name="btnCancel">&nbsp;
    <INPUT id="uncheckedNodes" type="hidden" name="uncheckedNodes">
      

  11.   

    上面我给出的代码在 VS.NET2003下调试通过,没有问题。要不把你的代码贴出来让大家看看!
      

  12.   

    又得麻烦  morality(业精于勤,行成于思!) 了
    父结点、字节点选中的问题解决了,
    但是,web上的树的节点在我选中、取消操作后,
    点击 web上的一个button写函数将其节点信息保存,但是发现节点的选中、取消信息还是
    在鼠标点击操作之前的初始信息;同时,点击完button后整棵树的节点选中状态又是初始的,而不是我点击操作后的,怎么回事?