C# 樹形圖(TreeView)控件的使用 - 陸陸無為而治者 - 部落格園
一、簡介
treeview 是非常重要的控件,樹形結構常用的功能如下
1、增、删
2、事件點選
3、層級結構
二、TreeView 的基本用法
1、添加根節點
private void AddRootBtn_Click(object sender, EventArgs e)
{
if(string.IsNullOrEmpty(textBox1.Text.Trim()))
{
MessageBox.Show("這個節點的名字不能為空");
return;
}
// 開始添加root 節點
treeView1.Nodes.Add(textBox1.Text.Trim());
textBox1.Text = "";
treeView1.Show();
}
2、添加子節點
/// <summary>
/// 增加子節點 ,先判斷有沒有父節點,
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void AddChildBtn_Click(object sender, EventArgs e)
{
if (string.IsNullOrEmpty(textBox1.Text.Trim()))
{
MessageBox.Show("這個節點的名字不能為空");
return;
}
// 判斷 選擇的父節點是不是選中了
if(treeView1.SelectedNode==null)
{
MessageBox.Show("請選擇要添加的節點在那個父點下!");
return;
}
else
{
treeView1.SelectedNode.Nodes.Add(textBox1.Text.Trim());
textBox1.Text = "";
treeView1.Show();
}
}
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIyZuBnL3QDZ0cjZ4MGZ5IGNmdDZiZGZ0QzM3UmN5cDZ3UGNklzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
3、删除選中的節點,下面的例子是極其簡單的
/// <summary>
/// 删除其中的選擇的節點
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void DelChoosedBtn_Click(object sender, EventArgs e)
{
// 先看節點是不是已經被選中了
if (treeView1.SelectedNode == null)
{
MessageBox.Show("請選擇要删除的節點!");
return;
}
else
{
treeView1.SelectedNode.Remove();
}
}
4、樹形圖 添加圖示
構造函數
TreeNode() | 初始化 TreeNode 類的新執行個體。 |
TreeNode(SerializationInfo, StreamingContext) | 使用指定的序列化資訊和上下文初始化 TreeNode 類的新執行個體。 |
TreeNode(String) | 用指定的标簽文本初始化 TreeNode 類的新執行個體。 |
TreeNode(String, Int32, Int32) | 用指定的标簽文本以及樹節點處于標明和未標明狀态時所顯示的圖像來初始化 TreeNode 類的新執行個體。 |
TreeNode(String, Int32, Int32, TreeNode[]) | 用指定的标簽文本、子樹節點以及樹節點處于標明和未標明狀态時所顯示的圖像來初始化 TreeNode 類的新執行個體。 |
TreeNode(String, TreeNode[]) | 用指定的标簽文本和子樹節點初始化 TreeNode 類的新執行個體。 |
屬性
BackColor | 擷取或設定樹節點的背景色。 |
Bounds | 擷取樹節點的界限。 |
Checked | 擷取或設定一個值,用以訓示樹節點是否處于選中狀态。 |
ContextMenu | 擷取與此樹節點關聯的快捷菜單。 |
ContextMenuStrip | 擷取或設定與此樹節點關聯的快捷菜單。 |
FirstNode | 擷取樹節點集合中的第一個子樹節點。 |
ForeColor | 擷取或設定樹節點的前景色。 |
FullPath | 設定從根樹節點到目前樹節點的路徑。 |
Handle | 擷取樹節點的句柄。 |
ImageIndex | 擷取或設定當樹節點處于未標明狀态時所顯示圖像的圖像清單索引值。 |
ImageKey | 擷取或設定此樹節點處于未選中狀态時與其關聯的圖像的鍵。 |
Index | 擷取樹節點在樹節點集合中的位置。 |
IsEditing | 擷取一個值,用以訓示樹節點是否處于可編輯狀态。 |
IsExpanded | 擷取一個值,用以訓示樹節點是否處于可展開狀态。 |
IsSelected | 擷取一個值,用以訓示樹節點是否處于標明狀态。 |
IsVisible | 擷取一個值,用以訓示樹節點是否是完全可見或部分可見。 |
LastNode | 擷取最後一個子樹節點。 |
Level | 擷取 TreeView 控件中的樹視圖的深度(從零開始)。 |
Name | 擷取或設定樹節點的名稱。 |
NextNode | 擷取下一個同級樹節點。 |
NextVisibleNode | 擷取下一個可見樹節點。 |
NodeFont | 擷取或設定用于顯示樹節點标簽文本的字型。 |
Nodes | 擷取配置設定給目前樹節點的 TreeNode 對象的集合。 |
Parent | 擷取目前樹節點的父樹節點。 |
PrevNode | 擷取上一個同級樹節點。 |
PrevVisibleNode | 擷取上一個可見樹節點。 |
SelectedImageIndex | 擷取或設定當樹節點處于標明狀态時所顯示的圖像的圖像清單索引值。 |
SelectedImageKey | 擷取或設定當樹節點處于選中狀态時顯示在該節點中的圖像的鍵。 |
StateImageIndex | 擷取或設定圖像的索引,該圖像用于在父 TreeNode 的 TreeView 屬性設定為 時,訓示 CheckBoxes 的狀态。 |
StateImageKey | 擷取或設定圖像的鍵,該圖像用于在父 TreeNode 的 TreeView 屬性設定為 時,訓示 CheckBoxes 的狀态。 |
Tag | 擷取或設定包含樹節點有關資料的對象。 |
Text | 擷取或設定在樹節點标簽中顯示的文本。 |
ToolTipText | 擷取或設定當滑鼠指針懸停于 TreeNode 之上時顯示的文本。 |
TreeView | 擷取樹節點配置設定到的父樹視圖。 |
方法
BeginEdit() | 開始編輯樹節點标簽。 |
Clone() | 複制樹節點和以此樹節點為根的整個子樹。 |
Collapse() | 折疊樹節點。 |
Collapse(Boolean) | 折疊 TreeNode,并可選擇折疊其子節點。 |
CreateObjRef(Type) | 建立一個對象,該對象包含生成用于與遠端對象進行通信的代理所需的全部相關資訊。 (繼承自 MarshalByRefObject) |
Deserialize(SerializationInfo, StreamingContext) | 從指定的 TreeNode 加載 SerializationInfo 的狀态。 |
EndEdit(Boolean) | 終止編輯樹節點标簽。 |
EnsureVisible() | 確定樹節點可見,并在必要時展開樹節點和滾動樹視圖控件。 |
Equals(Object) | 确定指定對象是否等于目前對象。 (繼承自 Object) |
Expand() | 展開樹節點。 |
ExpandAll() | 展開所有子樹節點。 |
FromHandle(TreeView, IntPtr) | 傳回帶有指定句柄并配置設定給指定樹視圖控件的樹節點。 |
GetHashCode() | 作為預設哈希函數。 (繼承自 Object) |
GetLifetimeService() | 檢索控制此執行個體的生存期政策的目前生存期服務對象。 (繼承自 MarshalByRefObject) |
GetNodeCount(Boolean) | 傳回子樹節點的數目。 |
GetType() | 擷取目前執行個體的 Type。 (繼承自 Object) |
InitializeLifetimeService() | 擷取生存期服務對象來控制此執行個體的生存期政策。 (繼承自 MarshalByRefObject) |
MemberwiseClone() | 建立目前 Object 的淺表副本。 (繼承自 Object) |
MemberwiseClone(Boolean) | 建立目前 MarshalByRefObject 對象的淺表副本。 (繼承自 MarshalByRefObject) |
Remove() | 從樹視圖控件中移除目前樹節點。 |
Serialize(SerializationInfo, StreamingContext) | 将 TreeNode 的狀态儲存到指定的 SerializationInfo。 |
Toggle() | 将樹節點切換為展開或折疊狀态。 |
ToString() | 傳回表示目前對象的字元串。 |
三、點選事件
在treeview 中添加一個treeView1_MouseDown 的事件
//
private void treeView1_MouseDown(object sender, MouseEventArgs e)
{
if(e.Button==MouseButtons.Right)
{
MessageBox.Show("滑鼠右擊了");
}
}
// 綁定添加的實踐
private void treeView1_MouseDown(object sender, MouseEventArgs e)
{
// 判斷是不是右擊了
if(e.Button==MouseButtons.Right)
{
Point clickPoint=new Point(e.X, e.Y);
int x = e.X;
int y = e.Y;
// 獲得選擇的Node,通過點選點的位置來過得
TreeNode currTreeNode = treeView1.GetNodeAt(clickPoint);
if (currTreeNode is TreeNode) // 判斷目前的是不是一個節點
{
// 如果是 ,則 添加
treeView1.SelectedNode = currTreeNode;
// 就是這一步将 右擊事件練習起來的
currTreeNode.ContextMenuStrip = this.contextMenuStrip1;
contextMenuStrip1.Show(MousePosition);
}
}
}
四、代碼:
From1 :
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace TreeView控件
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
/// <summary>
/// 添加根節點
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void AddRootBtn_Click(object sender, EventArgs e)
{
if(string.IsNullOrEmpty(textBox1.Text.Trim()))
{
MessageBox.Show("這個節點的名字不能為空");
return;
}
// 開始添加root 節點
treeView1.Nodes.Add(textBox1.Text.Trim());
textBox1.Text = "";
treeView1.Show();
}
/// <summary>
/// 增加子節點 ,先判斷有沒有父節點,
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void AddChildBtn_Click(object sender, EventArgs e)
{
if (string.IsNullOrEmpty(textBox1.Text.Trim()))
{
MessageBox.Show("這個節點的名字不能為空");
return;
}
// 判斷 選擇的父節點是不是選中了
if(treeView1.SelectedNode==null)
{
MessageBox.Show("請選擇要添加的節點在那個父點下!");
return;
}
else
{
treeView1.SelectedNode.Nodes.Add(textBox1.Text.Trim());
textBox1.Text = "";
treeView1.Show();
}
}
/// <summary>
/// 删除其中的選擇的節點
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void DelChoosedBtn_Click(object sender, EventArgs e)
{
// 先看節點是不是已經被選中了
if (treeView1.SelectedNode == null)
{
MessageBox.Show("請選擇要删除的節點!");
return;
}
else
{
treeView1.SelectedNode.Remove();
}
}
private void loadTreeView()
{
for (int i = 0; i < 5; i++)
{
TreeNode treeNode_1 = new TreeNode(); //添加根節點
treeNode_1.Text = "根節點" + i;
treeView1.Nodes.Add(treeNode_1);
//添加子節點
for (int j = 0; j < 5; j++) //添加二級節點
{
TreeNode treeNode_2 = new TreeNode();
treeNode_2.Text = i + ":二級節點" + j;
treeNode_1.Nodes.Add(treeNode_2);
}
}
}
private void Form1_Load(object sender, EventArgs e)
{
loadTreeView();
}
// 通過 treeview的右擊來添加子節點
private void toolStripMenuItem1_Click(object sender, EventArgs e)
{
FormAdd f5 = new FormAdd();
if (f5.ShowDialog() == DialogResult.OK)
{
treeView1.SelectedNode.Nodes.Add(f5.nodeName);
}
}
// 通過 treeview的右擊删除所有的節點
private void toolStripMenuItem2_Click(object sender, EventArgs e)
{
treeView1.SelectedNode.Remove();
}
// 綁定添加的實踐
private void treeView1_MouseDown(object sender, MouseEventArgs e)
{
// 判斷是不是右擊了
if(e.Button==MouseButtons.Right)
{
Point clickPoint=new Point(e.X, e.Y);
int x = e.X;
int y = e.Y;
// 獲得選擇的Node,通過點選點的位置來過得
TreeNode currTreeNode = treeView1.GetNodeAt(clickPoint);
if (currTreeNode is TreeNode) // 判斷目前的是不是一個節點
{
// 如果是 ,則 添加
treeView1.SelectedNode = currTreeNode;
// 就是這一步将 右擊事件練習起來的
currTreeNode.ContextMenuStrip = this.contextMenuStrip1;
contextMenuStrip1.Show(MousePosition);
}
}
}
}
}
F2:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace TreeView控件
{
public partial class FormAdd : Form
{
public FormAdd()
{
InitializeComponent();
}
// 提供一個get 方法
public string nodeName
{
get { return textBox1.Text.Trim(); }
}
private void btnCancel_Click(object sender, EventArgs e)
{
DialogResult = DialogResult.Cancel;
}
private void btnConfirm_Click(object sender, EventArgs e)
{
if (string.IsNullOrEmpty(textBox1.Text.Trim()))
{
MessageBox.Show("請填寫節點名稱!");
return;
}
DialogResult = DialogResult.OK;
}
}
}