采用treeview控件,从数据库填写3级节点,我采用TreeNodePopulate方法,treeview各级节点前面显示checkbox,已经实现;
此外,程序要求根据两个dropdownlist(ddl_ProductMode和ddl_ViewMode)的变化,动态更新树的显示内容,当改变其中一个dropdownlist的SelectedIndexChanged的时候,存在先前树的展开节点不刷新的问题;为此,我每次更新树的显示内容之前首先用tree.Nodes.Clear()方法,清空树,然后从RootNode开始,用程序重新添加所有节点;至此,树的显示已经没有问题。现在的问题是:在每次页面加载之后,单击叶节点,不能触发SelectedNodeChanged函数,同时所有节点收缩到RootNode;但是第二次单击时,能够触发,第三次不能触发,然后依次循环。选中节点前面的checkbox(使用了javascript在客户端实现父子节点级联选中)时,也是这种现象,第一次页面加载时,客户端选中,但服务器端没有选中,页面刷新了一次后(如,单击页面的一个按钮或改变其中一个dropdownlist的selectindex),就好使了,然后又不好使-好使循环。我现在认为,主要的原因是treeview在客户端激发的事件没有发送服务器端处理,请问如何解决这个问题?还请知道的指点一下!!

解决方案 »

  1.   

    这是动态生成树的部分代码TreeView tv_ViewProduct = new TreeView();
        public void Page_Load(object sender, EventArgs e)
        {
              this.PlaceHolder1.Controls.Add(tv_ViewProduct);
            //---------------显示树之前首先清空树上的历史节点----------------------//
            tv_ViewProduct.Nodes.Clear();
              
            //---------------显示树之前首先清空树上的历史节点-------------------//
            this.tv_ViewProduct.ID = "tv_ViewProduct";
            this.tv_ViewProduct.Attributes.Add("OnTreeNodeCheckChanged", "tv_ViewProduct_TreeNodeCheckChanged");
            this.tv_ViewProduct.Attributes.Add("runat", "server");
            this.tv_ViewProduct.ShowLines = true;
            this.tv_ViewProduct.Attributes.Add("ImageSet", "Simple");
            this.tv_ViewProduct.Attributes.Add("MaxDataBindDepth", "3");
            this.tv_ViewProduct.Attributes.Add("RootNodeStyle-Font-Size", "11pt");
            this.tv_ViewProduct.Attributes.Add("NodeStyle-imageUrl", "~/pic5555/treenode.png");
              TreeNode RootNode = new TreeNode("成件", "成件");
            RootNode.PopulateOnDemand = true;
            RootNode.ImageUrl = "~/pic/root_treenode.png";
            RootNode.ShowCheckBox = true;
            RootNode.SelectAction = TreeNodeSelectAction.Expand;
             RootNode.Checked = true;
            tv_ViewProduct.Nodes.Add(RootNode);
            tv_ViewProduct.TreeNodePopulate += new TreeNodeEventHandler(tv_ViewProduct_TreeNodePopulate);//展开成件树
           
            tv_ViewProduct .SelectedNodeChanged +=new EventHandler(tv_ViewProduct_SelectedNodeChanged); //触发单击叶节点事件
            this.tv_ViewProduct.Attributes.Add("onclick", "CheckEvent()");//操作成件树的复选框}
      

  2.   

    ASP.NEt中动态添加控件,通常会又很多意想不到的麻烦,你要先了解页面生存周期,选择要好时机添加控件,否则很麻烦,
    最好在页面中声名不知道你的具体处理,放到 Page_Init 里面试试吧
      

  3.   

    To Jinglecat(晓风残月) :
    试了放到Page_Init
    但是每次页面刷新之后,都多出一棵树
      

  4.   

    To codeangel:
    如果按照if(!IsPostBack)loadtree()处理
    每次改变dropdownlist之后,页面刷新就不能显示tree了!因为现在执行SelectedNodeChanged的时候,症状很有规律,隔一次点击就好使,会不会是某个属性的设置问题?或者是缓存的原因?
      

  5.   

    把treeview初始化的部分放在if(!ispostback)里面
    public void Page_Load(object sender, EventArgs e)
    {
    this.PlaceHolder1.Controls.Add(tv_ViewProduct);
    //---------------显示树之前首先清空树上的历史节点-------------------//
    this.tv_ViewProduct.ID = "tv_ViewProduct";
    if(!IsPostBack)
    {
    tv_ViewProduct.Nodes.Clear();
    this.tv_ViewProduct.Attributes.Add("OnTreeNodeCheckChanged", "tv_ViewProduct_TreeNodeCheckChanged");
    this.tv_ViewProduct.Attributes.Add("runat", "server");
    this.tv_ViewProduct.ShowLines = true;
    this.tv_ViewProduct.Attributes.Add("ImageSet", "Simple");
    this.tv_ViewProduct.Attributes.Add("MaxDataBindDepth", "3");
    this.tv_ViewProduct.Attributes.Add("RootNodeStyle-Font-Size", "11pt");
    this.tv_ViewProduct.Attributes.Add("NodeStyle-imageUrl", "~/pic5555/treenode.png");
    TreeNode RootNode = new TreeNode("成件", "成件");
    RootNode.PopulateOnDemand = true;
    RootNode.ImageUrl = "~/pic/root_treenode.png";
    RootNode.ShowCheckBox = true;
    RootNode.SelectAction = TreeNodeSelectAction.Expand;
    RootNode.Checked = true;
    tv_ViewProduct.Nodes.Add(RootNode);
    tv_ViewProduct.TreeNodePopulate += new TreeNodeEventHandler(tv_ViewProduct_TreeNodePopulate);//展开成件树tv_ViewProduct .SelectedNodeChanged +=new EventHandler(tv_ViewProduct_SelectedNodeChanged); //触发单击叶节点事件
    this.tv_ViewProduct.Attributes.Add("onclick", "CheckEvent()");//操作成件树的复选框
    }
    }
      

  6.   

    请你参考我的一篇文章:http://blog.csdn.net/javaprogramers/archive/2007/01/22/1490331.aspx
    有什么问题再问撒
      

  7.   

    To babyrockxray(紫色阴影):
    这样改变dropdownlist选择不同的浏览模式后,已经展开的树节点不会更新
    root
    a
    - 2
    -- x
    - 3
    -- y
    b
    - 2
    -- z
    - 3
    -- z
    改变后的预期效果
    root
    2
    - a
    -- x
    - b
    -- z
    3
    - a
    -- y
    - b
    -- z
      

  8.   

    To JavaProgramers(Java程序员) :
    不知道如何从数据库读取,下面这个函数看不明白,
    看到好多人引了这篇文章,但都没有注释啊protected  void LoadChildNode(TreeNode node)
        {        DirectoryInfo directory;
            directory = new DirectoryInfo(node.Value);        foreach (DirectoryInfo sub in directory.GetDirectories())
            {            TreeNode subNode = new TreeNode(sub.Name);
                subNode.Value = sub.FullName;            try
                {
                    if (sub.GetDirectories().Length > 0 || sub.GetFiles().Length > 0)
                    {
                        subNode.SelectAction = TreeNodeSelectAction.SelectExpand;
                        subNode.PopulateOnDemand = true;
                        subNode.NavigateUrl = "#";
                    }
                }
                catch { subNode.ImageUrl = "WebResource.axd?a=s&r=TreeView_XP_Explorer_ParentNode.gif&t=632242003305625000"; }
                node.ChildNodes.Add(subNode);        }        foreach (FileInfo fi in directory.GetFiles())
            {
                TreeNode subNode = new TreeNode(fi.Name);
                node.ChildNodes.Add(subNode);
            }
        }
      

  9.   

    涓嶇敤clear
    鐢╮emoveat涓嶈涔