具体情况是这样地:
动态填充树,当点击树的节点时填充该节点的下级节点
当我每次点击一个节点后,数据是填充进去了,但是整棵树的可操作界面马上跳回到根节点
这样我每次选中一个节点还要把滚动条往下拉才能继续操作,很麻烦
各位有什么好的办法解决不

解决方案 »

  1.   

    在Page_load()事件下绑定Treeview
     TreeView1.DataBind();
    试下~
      

  2.   


    我这个是先在Page_load()中绑定一级节点
    再点击一级节点的时候填充二级节点的
      

  3.   

    试下,在页面上<%@ Page MaintainScrollPositionOnPostback="true" Language="C#" AutoEventWireup="true" Codebehind="WebForm6.aspx.cs" Inherits="WebApplication3.NewFolder1.WebForm6"  %>
      

  4.   

    TreeView1.DataSource=ds.Tables[0];
    TreeView1.DataBind(); 

    呵呵,大家看对吗
      

  5.   

    protected void TreeView1_SelectedNodeChanged(object sender, EventArgs e)
            {
                    //下级节点没有则填充
                    if (TreeView1.SelectedNode.ChildNodes.Count == 0)
                        BindCauseNextLevel(Convert.ToDecimal(TreeView1.SelectedNode.Target), TreeView1.SelectedNode);
            }
    private void BindCauseNextLevel(decimal parentID, TreeNode node)
            {
                DataSet ds = LoadCauseByParentID(parentID);
                TreeNode nodeLeaf;            if (ds != null && ds.Tables.Count != 0)
                {
                    for (int i = 0; i < ds.Tables[0].Rows.Count; i++)
                    {
                        nodeLeaf = new TreeNode();
                        nodeLeaf.Text = ds.Tables[0].Rows[i]["cause_name"].ToString();
                        nodeLeaf.Target = ds.Tables[0].Rows[i]["cause_id"].ToString();                    node.ChildNodes.Add(nodeLeaf);
                    }                node.Expanded = true;
                }
            }
      

  6.   

    ""当我每次点击一个节点后,数据是填充进去了,但是整棵树的可操作界面马上跳回到根节点 ""
    LZ能再清楚一点说明这意思吗?"马上跳回到根节点"是指哪个根节点嘞?
    比如,根节点A,B,C,A下又有a,b,c三个子节点,然后当你点A根节点时,"a,b,c"节点是生成了,可是可操作界面马上又跳回到A根节点了,是吗?
    如果是这样理解,那这样是正常的呀.你要求是要可操作状态应该在哪里呢?在子节点C还是哪里? TreeView1.ExpandDepth = 2;(是否是像这样要指明展开的节点的级别数呀~)
      

  7.   


    如你所说的   当C下面有d,e,f,当我点击C时生成了"d,e,f",但是界面跳回A了
      

  8.   

    你试过不行?我试了可以啊。
    你可以源文件里有没有自动生成这句window.onload = WebForm_RestoreScrollPosition;
    在一段JS里
      

  9.   

    可以记录下,你上次是点的那个节点。呈现的时候再选中可行不?都不知道你说的是winform还webform。
      

  10.   

    顺便说下:我的这个树不是一个单独页面
    而是在一个框架页面中的,
    可能单独页面的话用PageMaintainScrollPositionOnPostback可行
      

  11.   

    框架页面?frameset?母版页?都没问题啊,我都试了
      

  12.   


    <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm4.aspx.cs" MaintainScrollPositionOnPostback="true" Inherits="WebApplication3.NewFolder1.WebForm4" %><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml" >
    <head id="Head1" runat="server">
        <title>Untitled Page</title>
        
    </head>
    <body>
        <form id="form1" runat="server">
                <asp:TreeView ID="TreeView1" runat="server" OnSelectedNodeChanged="TreeView1_SelectedNodeChanged">
            </asp:TreeView>
        </form>
    </body>
    </html>
      

  13.   

    代码随便写的,没有控制多次添加节点
    using System;
    using System.Data;
    using System.Configuration;
    using System.Collections;
    using System.Web;
    using System.Web.Security;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.Web.UI.WebControls.WebParts;
    using System.Web.UI.HtmlControls;namespace WebApplication3.NewFolder1
    {
        public partial class WebForm4 : System.Web.UI.Page
        {
            protected void Page_Load(object sender, EventArgs e)
            {
                TextBox t = new TextBox();
                TextBox t1 = t.
                TreeView1.ShowCheckBoxes = TreeNodeTypes.All;
                if (!Page.IsPostBack)
                {
                    TreeNode t = new TreeNode("aa");
                    t.Checked = true;                TreeView1.Nodes.Add(t);
                    t = new TreeNode("bb");
                    t.Checked = true;
                    TreeView1.Nodes.Add(t);                t = new TreeNode("bb1");
                    t.Checked = true;
                    TreeView1.Nodes.Add(t);
                    t = new TreeNode("bb2");
                    t.Checked = true;
                    TreeView1.Nodes.Add(t);
                    t = new TreeNode("bb3");
                    t.Checked = true;
                    TreeView1.Nodes.Add(t);
                    t = new TreeNode("bb4");
                    t.Checked = true;
                    TreeView1.Nodes.Add(t);
                                }
            }
            
            
            protected void TreeView1_SelectedNodeChanged(object sender, EventArgs e)
            {
                //下级节点没有则填充 
                if (TreeView1.SelectedNode.ChildNodes.Count == 0)
                    BindCauseNextLevel(TreeView1.SelectedNode);
            }
            private void BindCauseNextLevel( TreeNode node)
            {
                //DataSet ds = LoadCauseByParentID(parentID);
                //TreeNode nodeLeaf;            //if (ds != null && ds.Tables.Count != 0)
                //{
                    for (int i = 0; i < 5; i++)
                    {
                        TreeNode nodeLeaf = new TreeNode();
                        nodeLeaf.Text = i.ToString();
                        nodeLeaf.Target = i.ToString();                    node.ChildNodes.Add(nodeLeaf);
                    }                node.Expanded = true;
                //}
            }
        }
    }
      

  14.   

    发现原因所在,我的那个treeview是放在一个div里面的
    刷新的时候用MaintainScrollPositionOnPostback没有效果
    根据你的思路用JS在div添加onscroll事件保存滚动条位置
    在page load时读入保存的位置,搞定
    谢谢各位
    结帐