事情是这样滴我做了一个类似资源管理器的东东,树填充代码如下:
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本人的以外全部有分!
胡说八道的也有分,但是我会在给分帖注明谁在胡说八道。
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本人的以外全部有分!
胡说八道的也有分,但是我会在给分帖注明谁在胡说八道。
解决方案 »
- 求救!GridView调用数据库数据后可以对其中一列进行编辑修改,怎么弄?急急急急!!!!!!!!!!!!!!!!!!!!
- jQuery的jstee怎么与后台cs代码交互?
- 如何在容器中自动创建TEXTBOX并排列成M*N形式
- SQL中money类型,赋值给一个text,如何格式化?
- C#的一个很简单的问题。。请高手帮忙。小弟无尽感激
- 关于委托
- 我想用c#做一个结构力学计算的程序,请指点一下怎么做,谢谢
- 做了个画娃娃的控件(.NET自定义控件),怎样插入。。。 。。。
- 这儿人气旺,我是否应该从VB。NET跑到C#来?
- C# 如何取消控件的选中状态?
- System.IO.FileLoadException: 找到的名为“System.Data.OracleClient”的程序集清单定义与程序集引用不匹配。
- 在DOTNET 2003中怎么建立WINFORM用户自定义控件
e.Node 不就是你要取得的节点?
if(e.Node != null)
MessageBox.Show(e.Node.Text);
---------------------------------
private void treeView_AfterExpand(object sender, System.Windows.Forms.TreeViewEventArgs e)
{
// e.node为当前的节点
)更经典的方法实现不是很耗费时间的树加载方案
--------------------------------------------
每次展开的时候只获得目录下的子目录和文件。
不知道算不算胡说八道,请lz指正
{
if (e.Action != TreeViewAction.Unknown)
{
if (e.Node.IsExpanded)
{
e.Node.Name;
}
}
}
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();
}
}
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");
}
}
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); //添加子节点
}
}
}