File Explorer [Bài tập C#]

Khai báo splitter container và treeview:

public partial class FrmHome : Form
    {
        //MainMenu mainMenu;
        TreeView fileTree;
        ListView listView;
        SplitContainer splitContainer;

Splitter container

 void initContainer()
        {
            this.splitContainer = new SplitContainer();
            this.splitContainer.Dock = DockStyle.Fill;

           
            this.fileTree = new TreeView();
            this.listView = new ListView();


            initTreeView();


            this.splitContainer.Panel1.Controls.AddRange(new Control[]{ this.fileTree});
            this.splitContainer.Panel2.Controls.Add(this.listView);
            this.Controls.Add(this.splitContainer);
            this.listView.Dock = DockStyle.Fill;

            initListView();


        }

Để gắn icon cho mỗi node trên treeview ta sẽ sử dụng 1 imagelist để lưu trữ hình ảnh liên quan. Khai báo các thuộc tính sau thuộc về form:

string folderImagekey = "folder";
string computerImageKey = "computer";
ImageList treeImages = new ImageList();

Thêm các dòng sau để thêm hình ảnh vào imagelist tại hàm khởi tạo của form: (chú ý cần tạo thư mực images trong folder chứa file .exe chứa các hình ảnh tương ứng trước):

public FrmHome()
        {
            treeImages.Images.Add(computerImageKey, Image.FromFile("./images/computer.png"));
            treeImages.Images.Add(folderImagekey, Image.FromFile("./images/folder.png"));
            initMainMenu();
            initContainer();
            InitializeComponent();
        }

Treeview

void initTreeView()
        {
            
            this.fileTree.Dock = DockStyle.Fill;
            this.fileTree.ImageList = treeImages;
            var drives = DriveInfo.GetDrives();
            TreeNode computer = new TreeNode("Computer");
            computer.ImageKey = computerImageKey;
            computer.SelectedImageKey = computerImageKey;
            computer.Expand();
            this.fileTree.Nodes.Add(computer);
            foreach (var d in drives)
            {
                if (d.DriveType == DriveType.Fixed)
                {
                    computer.Nodes.Add(d.Name, d.Name, folderImagekey, folderImagekey);
                }
            }
            
        }

Xử lý sự kiện khi một node được chọn thì sẽ load folder con của node đó vào treeview:

Viết function tìm folder con của node hiện tại:

  bool expandNode(TreeNode selected) {
            try
            {
                foreach (var child in Directory.GetDirectories(selected.FullPath.Remove(0, this.fileTree.Nodes[0].Text.Length + 1)))
                {
                    var info = new DirectoryInfo(child);
                    if( (info.Attributes&FileAttributes.System)!=FileAttributes.System)
                        selected.Nodes.Add(info.Name, info.Name, folderImagekey, folderImagekey);

                    
                }
                selected.Expand();
                return true;
            }
            catch (Exception e) {
                MessageBox.Show(e.Message, "Error",MessageBoxButtons.OK,MessageBoxIcon.Error,MessageBoxDefaultButton.Button1);
                return false;
            }
        }

Gọi function expandNode trong sự kiện chọn node của treeview:

void initTreeView()
        {
            
            this.fileTree.Dock = DockStyle.Fill;
            this.fileTree.ImageList = treeImages;
            var drives = DriveInfo.GetDrives();
            TreeNode computer = new TreeNode("Computer");
            computer.ImageKey = computerImageKey;
            computer.SelectedImageKey = computerImageKey;
            computer.Expand();
            this.fileTree.Nodes.Add(computer);
            foreach (var d in drives)
            {
                if (d.DriveType == DriveType.Fixed)
                {
                    computer.Nodes.Add(d.Name, d.Name, folderImagekey, folderImagekey);
                }
            }
            this.fileTree.AfterSelect += (s, e) => {
                if (e.Node != null && e.Node != this.fileTree.Nodes[0])
                {
                    expandNode(e.Node);
                }
            };
        }

Kết quả hiện tại:

Hiển thị thông tin chi tiết ở listview:

Thêm đối tượng listview vào form:

ListView listView;

Xây dựng hàm cài đặt thông số cho listview:

        void initListView() {

            this.listView.SmallImageList = this.treeImages;
            this.listView.LargeImageList = this.treeImages;
            this.listView.Columns.Add("Name",100);
            this.listView.Columns.Add("Type",50);
            this.listView.Columns.Add("Modified Date",50);
            this.listView.View = View.Details;
            
        }

Cấp phát vùng nhớ và gắn listview vào splittercontainer:

void initContainer()
        {
            this.splitContainer = new SplitContainer();
            this.splitContainer.Dock = DockStyle.Fill;

           
            this.fileTree = new TreeView();
            this.listView = new ListView();


            initTreeView();


            this.splitContainer.Panel1.Controls.AddRange(new Control[]{ this.fileTree});
            this.splitContainer.Panel2.Controls.Add(this.listView);
            this.Controls.Add(this.splitContainer);
            this.listView.Dock = DockStyle.Fill;

            initListView();


        }

Kết quả:

Xử lý sự kiện đổ dữ liệu vào listview khi chọn node bên treeview:

Viết hàm thêm thông tin vào listview như sau:

void expandListview(TreeNode selected) {
            String path = selected.FullPath.Remove(0, this.fileTree.Nodes[0].Text.Length + 1);
            try
            {
                foreach (var child in Directory.GetDirectories(selected.FullPath.Remove(0, this.fileTree.Nodes[0].Text.Length + 1)))
                {
                    var info = new DirectoryInfo(child);
                    if ((info.Attributes & FileAttributes.System) != FileAttributes.System)
                    {
                        bool isFolder = (info.Attributes & FileAttributes.Directory) == FileAttributes.Directory;
                        this.listView.Items.Add(new ListViewItem(new string[] { info.Name,
                           isFolder ? "Folder" : info.Extension, info.LastWriteTime.ToLongTimeString() }, isFolder?folderImagekey:computerImageKey));
                    }
                }
                selected.Expand();
            }
            catch (Exception e)
            {
                MessageBox.Show(e.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error, MessageBoxDefaultButton.Button1);
            }
        }

Gọi hàm expandListview trong xử lý sự kiện chọn node:

this.fileTree.AfterSelect += (s, e) => {
                if (e.Node != null && e.Node != this.fileTree.Nodes[0])
                {

                    if (expandNode(e.Node)) {
                        this.listView.Items.Clear();
                        expandListview(e.Node);
                    }
                }
            };