TREEVIEW

1.     Giới thiệu TreeView trong C#

TreeView là điu khin dùng đ hin th danh sách các đi tưng dưi dng phân cp.

Đi tưng trong TreeView thưng đưc gi là Node và cu trúc phân cp ca TreeView đưc biu din bi lTreeNode. Mi mt Node trong TreeView có th cha các Node khác.

Node cha mt Node khác gi là Node cha (RootNode) và Node đưc cha goi là Node con (ChildNode).

Vic s dng điu khin TreeView đ hin th rt hu ích, vì trình bày theo dng phân cp giúp vic hin th đưc rõ ràng và có h thông hơn.

winforms bai9 04 PNG

Hình 2.54. Điều khiển TreeView

2.     Thuộc tính, phương thức và sự kiện của TreeView

Bảng 2.25. Một số thuộc tính thường dùng của TreeView

Thuộc tính

Mô tả

Node

Trả về một đối tượng thuộc lớp TreeNode

SelectedNode

Trả về Node đang được chọn trong TreeView

ShowPlusMinus

Hiển thị dấu + và - trước mỗi TreeNode

ShowRootLines

Hiển thị đường thằng nối giữa các RootNode trong một TreeView

ImageList

Hiển thị hình trước mỗi Node trong TreeView.

*Lưu ý: phải sử dụng thêm điều khiển ImageList và gán tên đối tượng của điều khiển ImageList cho thuộc tính ImageList của TreeView

ImageIndex

Giá trị của thuộc tính ImageIndex là chỉ số của hình trong điều khiển ImageList. Khi gán chỉ số cho thuộc tính ImageIndex thì hình hiển thị trước mỗi Node sẽ là hình có chỉ số tương ứng.

*Lưu ý: Phải sử dụng thuộc tính ImageList trước

SelectedImageIndex

Giá trị của thuộc tính SelectedImageIndex là chỉ số của hình trong điều khiển ImageList. Khi người dùng chọn Node nào thì Node đó sẽ có hình tương ứng như thuộc tính SelectedImageIndex chỉ định

Bảng 2.26. Một số phương thức thường dùng của TreeView

Phương thức

Mô tả

GetNodeCount()

Đến số Node trong một TreeView

ExpandAll()

Hiển thị tất cả các Node trên TreeView

CollapseAll()

Thu gọn tất cả các Node trên TreeView

GetNodeAt(x, y)

Lấy một Node tại một vị trí có tọa độ (x, y) trên màn hình.

*Lưu ý: Thương sử dụng sự kiện MouseDown hoặc NodeMouseClick

Bảng 2.27. Một số sự kiện thường dùng của TreeView

Sự kiện

Mô tả

AfterCollapse

Phát sinh khi thu gọn một TreeNode

AfterExpand

Phát sinh khi hiển thị các Node trong TreeNode

AfterSelect

Phát sinh khi chọn một TreeNode

NodeMouseClick

Phát sinh khi chọn một Node

Thuộc tính và phương thức của TreeNode

Bảng 2.28. Một số thuộc tính thương dùng của TreeNode

Thuộc tính

Mô tả

Nodes

Trả về tập các Node

Text

Đọc/gán chuỗi ký tự người dùng sẽ nhìn thấy ở mỗi Node

FirstNode

Trả về Node đầu tiên

LastNode

Trả về Node cuối cùng

NextNode

Chuyển đến Node tiếp theo

PrevNode

Lùi lại Node trước đó

Parent

Trả về Node cha của Node hiện tại

Index

Trả về chỉ số của Node

Bảng 2.29. Một số phương thức thường dùng của TreeNode

Phương thức

Mô tả

Nodes.Add

Thêm một Node

Nodes.Remove

Xóa một Node

Nodes.Insert

Chèn vào một Node

Nodes.Clear

Xóa tất cả các Node con và Node hiện tại

3.     Sử dụng TreeView trong C#

Trong ví d này s thc hin mt chương trình theo giao din Form như dưi đây, vi mt s chc năng.

winforms bai9 01 PNG

Hình 2.55. Giao diện có sử dụng TreeView

To h thng cây TreeView gm:

·       Button "Thêm Node gc": Thêm mt Node gc.

·       Button "Thêm Node con": Thêm mt Node con.

·       Button "Xóa tt c các Node": Hy tt c các Node trong TreeView.

·       Butotn "Xóa Node đưc chn": Xóa Node đưc chn khi TreeView.

·       Button "-": Thu hp li v trí chn - thu hp li các Node là con ca Node.

·       Button "+": M rng ti v trí chn - m rng các Node là con ca Node.

·       Button "Đếm tng Node TreeView": Đếm tng Node có trên TreeView.

Vic đu tin chúng ta s thiết kế giao din tương t như Form mu, bao gm:

·       1 TextBox đ nhp tiêu đ cho Node.

·       7 Button vi các chc năng tương ng.

·       1 TreeView đ hin th danh sách các Node.

Sau khi to giao din cho Form, ta bt đu thc hin ln lưt các chc năng trên các nút Button.

c 1: x lý s kin trên Button "Thêm Node gc", vi chc năng khi ngưi dùng Click vào nút thì ni dung trong ô TextBox s đưc thêm vào Node gc trong TreeView.

Ta s dng string.IsNullOrEmpty() đ xét điu kin nếu như trong ô TextBox rng mà ngưi dùng nhn vào Button thì thông báo cho ngưi dùng biết.

Tiếp đến ta s dng string.Equals() đ so sánh ni dung trong ô TextBox vi các Node trong TreeView, nếu bng nhau thì thông báo cho ngưi dùng biết đã tn ti Node trong TreeView.

Sau khi xét xong điu kin, bây gi ta ch cn s dng Node.Add() đ thêm ni dung t TextBox vào Node. Khi thêm xong ta s xóa ni dung trong ô TextBox bng phương thc Clear().

private void btnThemnodegoc_Click(object sender, EventArgs e)

   {

       bool t = false;

       if (!string.IsNullOrEmpty(txtNode.Text))

       {

           TreeNode Node = new TreeNode();

           Node.Text = txtNode.Text;

           foreach(TreeNode nodex in treeView1.Nodes)

           {

               if(string.Equals(Node.Text,nodex.Text))

               {

                    MessageBox.Show("Node đã tồn tại");

                    t = true;

               }

           }

           if (t == false) treeView1.Nodes.Add(Node);

           txtNode.Clear();

           txtNode.Focus();

        }

        else

            MessageBox.Show("Node không được để trống");

    }

Kết qu: Sau khi thêm các Node gc và các Node con.

winforms bai9 02 PNG

Hình 2.56. Thêm các Node vào TreeView

c 2: X lý s kin trên Button "Thêm Node con", vi chc năng khi ngưi dùng nhâp chut vào Button thì ni dung trong ô TextBox s đưc thêm nào Node con ca Node đưc chn trong TreeView.

Tương t như Button "Thêm Node gc", ta cũng s dng string.IsNullOrEmpty() đ thêm điu kin cho nút. Sau đó s dng SelectedNode.Nodes.Add() đ thêm Node con vào Node đưc chn.

private void btnThemnodecon_Click(object sender, EventArgs e)

    {

       if (!string.IsNullOrEmpty(txtNode.Text))

       {

          if (treeView1.SelectedNode != null)

          {

              TreeNode Subnode = new TreeNode();

              Subnode.Text = txtNode.Text;

              treeView1.SelectedNode.Nodes.Add(Subnode);

              txtNode.Clear();

              txtNode.Focus();

           }

           else

              MessageBox.Show("Bạn chưa chọn vị trí tạo Node con");

        }

        else

            MessageBox.Show("Node không được để trống");

    }

c 3: X lý s kin trên Button "Xóa tt c các Node", vi chc năng khi ngưi dùng nhn vào thì tt c các Node s đưc xóa.

Đơn gin ta ch cn s dng phương thc Clear() có trong Nodes đ xóa tt c các Node.

private void btnXoaallNode_Click(object sender, EventArgs e)

    {

       treeView1.Nodes.Clear();

    }

c 4: X lý s kin trên Button "Xóa Node đưc chn", vi chc năng xóa Node mà ngưi dùng chn khi TreeView.

Ta s s dng SelectedNode.Remove() đ xóa Node đang đưc chn khi TreeView.

private void btnXoaNodechon_Click(object sender, EventArgs e)

    {

       if(treeView1.SelectedNode !=null)

       treeView1.SelectedNode.Remove();

    }

c 5: X lý s kin trên hai Button "-" và "+", vi chc năng thu hp và m rng các Node trong TreeView.

Trong TreeView có hai s kin h tr cho vic này đó chính là ExpandAll() và CollapseAll().

private void btnShow_Click(object sender, EventArgs e)

    {

       treeView1.ExpandAll();

    }

 

private void btnAn_Click(object sender, EventArgs e)

    {

       treeView1.CollapseAll();

    }

c 6: X lý s kin trên Button "Đếm tng Node TreeView", vi chc năng đếm tt c các Node có trong TreeView.

Ta s s dng GetNodeCount() đ đếm tng s Node trong TreeView().

1

2

3

4

5

private void btnTong_Click(object sender, EventArgs e)

    {

       int n = treeView1.GetNodeCount(true);

       MessageBox.Show("Tổng số Node của TreeView : "+n);

    }

Kết qu: khi nhn vào Button "Đếm tng Node TreeView".

winforms bai9 03 PNG

Hình 2.57. Kết quả sử dụng TreeView

Full Code:

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 cau4

{

    public partial class Form1 : Form

    {

        public Form1()

        {

            InitializeComponent();

        }

        private void btnThemnodegoc_Click(object sender, EventArgs e)

        {

            bool t = false;

            if (!string.IsNullOrEmpty(txtNode.Text))

            {

                TreeNode Node = new TreeNode();

                Node.Text = txtNode.Text;

                foreach(TreeNode nodex in treeView1.Nodes)

                {

                    if(string.Equals(Node.Text,nodex.Text))

                    {

                        MessageBox.Show("Node đã tồn tại");

                        t = true;

                    }

                }

                if (t == false) treeView1.Nodes.Add(Node);

                txtNode.Clear();

                txtNode.Focus();

            }

            else

                MessageBox.Show("Node không được để trống");

        }

        private void btnThemnodecon_Click(object sender, EventArgs e)

        {

            if (!string.IsNullOrEmpty(txtNode.Text))

            {

                if (treeView1.SelectedNode != null)

                {

                    TreeNode Subnode = new TreeNode();

                    Subnode.Text = txtNode.Text;

                    treeView1.SelectedNode.Nodes.Add(Subnode);

                    txtNode.Clear();

                    txtNode.Focus();

                }

                else

                    MessageBox.Show("Bạn chưa chọn vị trí tạo Node con");

            }

            else

                MessageBox.Show("Node không được để trống");

        }

        private void btnShow_Click(object sender, EventArgs e)

        {

            treeView1.ExpandAll();

        }

        private void btnAn_Click(object sender, EventArgs e)

        {

            treeView1.CollapseAll();

        }

        private void btnXoaallNode_Click(object sender, EventArgs e)

        {

            treeView1.Nodes.Clear();

        }

        private void btnXoaNodechon_Click(object sender, EventArgs e)

        {

            if(treeView1.SelectedNode !=null)

            treeView1.SelectedNode.Remove();

        }

        private void btnTong_Click(object sender, EventArgs e)

        {

            int n = treeView1.GetNodeCount(true);

            MessageBox.Show("Tổng số Node của TreeView : "+n);

        }

        private void Form1_Load(object sender, EventArgs e)

        {

        }

    }

}

4.     Bài tập

Tương t ListView, TreeView là mt điu khin đưc s dng rt nhiu, vì vy cn luyn tp tht nhiu đ thành tho.