事情是这样滴我做了一个类似资源管理器的东东,树填充代码如下:
private void FillTree()
{
this.treeView1.Nodes.Clear();
TreeNode RootNode = new TreeNode("我的电脑",0,0);//建立根节点
TreeNode DriveNode;
string[] strDrivers = Environment.GetLogicalDrives();//获取逻辑盘符
foreach (string DriverName in strDrivers)
{
DriveNode = new TreeNode(DriverName);
DriveNode.Text = DriverName;
myTree(DriverName,DriveNode);
RootNode.Nodes.Add(DriveNode);
}
this.treeView1.Nodes.Add(RootNode);
}
private void myTree(string Path,TreeNode RootNode)
{
DirectoryInfo dir = new DirectoryInfo(Path);//建立目录对象
if (!dir.Exists)//判断目录是否存在
{
return;
}
DirectoryInfo[] subDirs = dir.GetDirectories();//获取目录文件信息
foreach(DirectoryInfo s in subDirs)
{
TreeNode NodeTemp=new TreeNode(s.Name);
NodeTemp.Text = s.Name;
RootNode.Nodes.Add(NodeTemp);
myTree( Path + s.Name + @"\",NodeTemp);
}
}但是这样有个问题,就是每次程序一加载就会把整个硬盘遍历一遍,速度很慢啊,我想能不能每次展开一层就遍历一层,这样速度就会快很多,于是我就用了AfterExpand展开事件,但是我每次展开都是点击的目录前面那个小“+”号,但是我不知道怎么得到被点击“+”号的节点信息。
问题是:如何才能得到该节点信息呢
或者有什么更经典的方法实现不是很耗费时间的树加载方案。
----------------------------------------------
除了BS本人的以外全部有分!
胡说八道的也有分,但是我会在给分帖注明谁在胡说八道。

解决方案 »

  1.   

    没有听明白
    e.Node 不就是你要取得的节点?
      

  2.   

    用BeforeExpand事件
    if(e.Node != null)
    MessageBox.Show(e.Node.Text);
      

  3.   

    如何才能得到该节点信息呢
    ---------------------------------
    private void treeView_AfterExpand(object sender, System.Windows.Forms.TreeViewEventArgs e)
    {
       // e.node为当前的节点
    )更经典的方法实现不是很耗费时间的树加载方案
    --------------------------------------------
    每次展开的时候只获得目录下的子目录和文件。
    不知道算不算胡说八道,请lz指正
      

  4.   

    protected override void OnAfterSelect(TreeViewEventArgs e)
        {
            if (e.Action != TreeViewAction.Unknown)
            {
                if (e.Node.IsExpanded) 
                {
                    e.Node.Name;
                }
            }
        }
      

  5.   

    winform:
    public const string RootPath = "E:\\Game";
            private void button1_Click(object sender, EventArgs e)
            {
                DirectoryInfo dir = new DirectoryInfo(RootPath);
                foreach (FileInfo file in dir.GetFiles())
                {
                    TreeNode fNode = new TreeNode(file.Name);
                    fNode.BackColor = Color.Blue;
                    treeView1.Nodes.Add(fNode);
                }
                foreach (DirectoryInfo subdir in dir.GetDirectories())
                {
                    TreeNode dNode = new TreeNode(subdir.Name);
                    dNode.ToolTipText = subdir.FullName;
                    dNode.BackColor = Color.Red;
                    treeView1.Nodes.Add(dNode);
                }
            }        void CreateNodes(TreeNode node, string path)
            {
                DirectoryInfo dir = new DirectoryInfo(path);
                foreach (FileInfo file in dir.GetFiles())
                {
                    TreeNode fNode = new TreeNode(file.Name);
                    fNode.BackColor = Color.Blue;
                    node.Nodes.Add(fNode);
                }
                foreach (DirectoryInfo subdir in dir.GetDirectories())
                {
                    TreeNode dNode = new TreeNode(subdir.Name);
                    dNode.ToolTipText = subdir.FullName;
                    dNode.BackColor = Color.Red;
                    node.Nodes.Add(dNode);
                }
            }        private void treeView1_AfterSelect(object sender, TreeViewEventArgs e)
            {
                if (treeView1.SelectedNode.BackColor == Color.Red && treeView1.SelectedNode.Nodes.Count == 0)
                {
                    CreateNodes(treeView1.SelectedNode, treeView1.SelectedNode.ToolTipText);
                    treeView1.SelectedNode.Expand();
                }
            }
      

  6.   

    試試PonTree_MouseDown事件
    private void PonTree_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e)
    {
    TreeNode TempNode = PonTree.GetNodeAt( e.X , e.Y );
    if ( TempNode != null )
    {
    PonTree.SelectedNode = TempNode;//得到所選的節點的信息
    }
    else
    {
    MessageBox.Show( "error");
    }

    }
      

  7.   

    主要是Expand事件
    TreeView 控件属性→ 自动提交(AutoPostBack) → True
    TreeView 控件属性→ 事件 → 双击展开(Expand)
    private void Page_Load(object sender, System.EventArgs e)
    {
    if(!IsPostBack)
    {
    this.AddSingleNode(null,"0"); //找出根节点
    }
    this.TreeView1.SelectedNodeIndex=""; //不选中任何节点

    /// 
    /// 展开节点时,触发的事件
    /// 
    /// TreeView 控件
    /// 
    private void TreeView1_Expand(object sender, Microsoft.Web.UI.WebControls.TreeViewClickEventArgs e)
    {
    TreeNode nd = this.TreeView1.GetNodeFromIndex(e.Node); //找到触发事件的节点,即正在展开的节点
    if(nd.Nodes[0].NodeData=="") //第一次加载,即只有“正在加载……”这一项
    {
    this.AddSingleNode(nd,nd.NodeData); //加载子节点
    }
    }
    /// 
    /// 只查找、添加单个节点下的子节点
    /// 
    /// 需要添加子节点的 TreeNode
    /// 该节点的 NodeID 
    private void AddSingleNode(TreeNode node,string id)
    {
    if(node!=null && id!="0")
    {
    node.Nodes.Clear();//清空节点,主要是把“正在加载……”这一项移除
    }
    DBSystem.ExecuteSQL tmp = new DBSystem.ExecuteSQL("T");
    DataTable dt = tmp.GetDataTable("select * from TreeView where ParentID="+id);//从数据库抓出数据 foreach(DataRow dr in dt.Rows) //历遍所有子节点
    {
    TreeNode nd = new TreeNode();
    nd.NavigateUrl=dr["URL"].ToString(); //设置浏览的网址
    nd.NodeData=dr["NodeID"].ToString(); //存放节点 ID
    nd.Text=dr["NodeName"].ToString(); //设置节点名称
    TreeNode child = new TreeNode(); //此节点只作为“nd”展开的依据,并无它意
    child.Text="正在加载……";
    nd.Nodes.Add(child);
    if(node==null|| id=="0")
    {
    this.TreeView1.Nodes.Add(nd); //添加至根节点
    }
    else
    {
    node.Nodes.Add(nd); //添加子节点
    }
    }
    }
      

  8.   

    其实就是 e.node就可以了,我傻了