TreeView控件用來顯示信息的分級視圖,如同Windows里的資源管理器的目錄。TreeView控件中的各項信息都有一個與之相關的Node對象。TreeView顯示Node對象的分層目錄結構,每個Node對象均由一個Label對象和其相關的位圖組成。在建立TreeView控件后,我們可以展開和折疊、顯示或隱藏其中的節點。TreeView控件一般用來顯示文件和目錄結構、文檔中的類層次、索引中的層次和其他具有分層目錄結構的信息。

下面是一些常用的方法和屬性:
添加節點
TreeNode tn1 = new TreeNode(textBox1.Text.Trim()); tn1.Name = textBox1.Text.Trim(); treeView1.SelectedNode.Nodes.Add(tn1);
編輯選中節點
只有當 TreeView 的 LabelEdit 屬性設置為 true,此方法才生效。 如果 LabelEdit 設置為 false,將引發異常,並且樹節點不會進入可編輯狀態。與之對應的是EndEdit()方法來關閉編輯節點。
treeView1.LabelEdit = true; treeView1.SelectedNode.BeginEdit();
刪除選中節點
treeView1.Nodes.Remove(treeView1.SelectedNode);
展開選中節點
treeView1.SelectedNode.ExpandAll();
折疊選中節點
方法傳遞的布爾參數為 true 則使子節點保持當前狀態;為 false 則折疊子節點。
treeView1.SelectedNode.Collapse(false);
選中節點折疊展開狀態切換
treeView1.SelectedNode.Toggle();
顯示復選框
與之相關聯的是Checked屬性獲取或設置一個值,用以指示樹節點是否處於選中狀態。
treeView1.CheckBoxes = true;
選中節點路徑
treeView1.SelectedNode.FullPath
選中節點樹深度
treeView1.SelectedNode.Level;
樹節點數目
treeView1.GetNodeCount(true);
詳細使用可以參考MSDN:http://msdn.microsoft.com/zh-cn/library/system.windows.forms.treenode(v=vs.100).aspx
實例1.TreeView控件顯示本地磁盤、文件夾

遍歷磁盤代碼:
//來源:http://zxlovenet.cnblogs.com
private void ForeachDisk()
{
DriveInfo[] dr = DriveInfo.GetDrives();
string driveName = "";
foreach (DriveInfo d in dr)
{
switch (d.DriveType)
{
case DriveType.Fixed:
driveName = "本地磁盤(" + d.Name.Substring(0, 2) + ")";
break;
case DriveType.Removable:
driveName = "可移動磁盤(" + d.Name.Substring(0, 2) + ")";
break;
case DriveType.CDRom:
driveName = "DVD驅動器(" + d.Name.Substring(0, 2) + ")";
break;
case DriveType.Network:
driveName = "網絡驅動器(" + d.Name.Substring(0, 2) + ")";
break;
default:
driveName = "未知(" + d.Name + ")";
break;
}
this.treeView1.Nodes.Add(d.Name, driveName);
}
}
顯示文件夾內容:
//來源:http://zxlovenet.cnblogs.com
private void ReadDir(TreeNodeMouseClickEventArgs e)
{
if (e.Node.Nodes.Count > 0)
{
if (e.Node.IsExpanded)
{
e.Node.Collapse();
}
else
{
e.Node.Expand();
}
}
else
{
if (Directory.Exists(e.Node.Name))
{
try
{
string[] allDirectory = Directory.GetDirectories(e.Node.Name);
foreach (string s in allDirectory)
{
e.Node.Nodes.Add(s, s.Remove(0, s.LastIndexOf("//") + 1));
}
listBox1.Items.Clear();
string[] allFiles = Directory.GetFiles(e.Node.Name);
foreach (string sf in allFiles)
{
listBox1.Items.Add(sf.Remove(0, sf.LastIndexOf("//") + 1));
}
}
catch
{
}
}
e.Node.Expand();
}
}
實例2.TreeView實現拖拽操作

后台代碼:
//來源:http://zxlovenet.cnblogs.com
private Point Position = new Point(0, 0);
private void Form1_Load(object sender, EventArgs e)
{
this.treeView1.AllowDrop = true;
this.treeView1.ExpandAll();
}
private void treeView1_ItemDrag(object sender, ItemDragEventArgs e)
{
DoDragDrop(e.Item, DragDropEffects.Move);
}
private void treeView1_DragEnter(object sender, DragEventArgs e)
{
if (e.Data.GetDataPresent(typeof(TreeNode)))
e.Effect = DragDropEffects.Move;
else
e.Effect = DragDropEffects.None;
}
private void treeView1_DragDrop(object sender, DragEventArgs e)
{
TreeNode myNode = null;
if (e.Data.GetDataPresent(typeof(TreeNode)))
{
myNode = (TreeNode)(e.Data.GetData(typeof(TreeNode)));
}
else
{
MessageBox.Show("error");
}
Position.X = e.X;
Position.Y = e.Y;
Position = treeView1.PointToClient(Position);
TreeNode DropNode = this.treeView1.GetNodeAt(Position);
// 1.目標節點不是空。2.目標節點不是被拖拽接點的字節點。3.目標節點不是被拖拽節點本身
if (DropNode != null && DropNode.Parent != myNode && DropNode != myNode)
{
TreeNode DragNode = myNode;
// 將被拖拽節點從原來位置刪除。
myNode.Remove();
// 在目標節點下增加被拖拽節點
DropNode.Nodes.Add(DragNode);
}
// 如果目標節點不存在,即拖拽的位置不存在節點,那么就將被拖拽節點放在根節點之下
if (DropNode == null)
{
TreeNode DragNode = myNode;
myNode.Remove();
treeView1.Nodes.Add(DragNode);
}
}
下載:DEMO
PS:又是好幾天沒有更新了,這周是比較忙的,周六一整天的比賽,晚上堅持更新。
