• Thứ Năm, 24/04/2008 11:20 (GMT+7)

    Lập trình 'tree view trong .NET 2005?

    Câu hỏi :
    Cho biết một đoạn mã viết trên nền Windows API trong .NET 2005 mô phỏng ‘tree view’ giống như trong Explore của Windows và cách gán từng thư mục cho mỗi item trong ‘tree view’ ấy.


    Trả lời :

    Trong phần trả lời ở các số báo trước chúng tôi có giới thiệu qui trình xây dựng đối tượng MyDirTree để hiển thị cây thư mục của máy và mã nguồn C++ của đối tượng này. Nếu bạn lập trình bằng ngôn ngữ .Net (C#, VB .Net...), việc xây dựng đối tượng MyDirTree để hiển thị cây thư mục cũng sẽ tương tự. Cụ thể, trên môi trường .Net, bạn có thể dùng 2 class .Net sau đây để duyệt nội dung thư mục và hiển thị kết quả lên màn hình dễ dàng và tin cậy:

     - Class MyFileFind bao đóng 2 hàm API Windows là FindFirstFile & FindNextFile, class này cho phép duyệt thư mục theo cơ chế đệ quy để tìm mọi phần tử con của 1 thư mục xác định.
     - Class TreeView cho phép hiển thị các phần tử thư mục lên màn hình theo dạng cây phân cấp như bạn đã từng thấy trong chương trình Windows Explorer. Hai tác vụ thường dùng nhất là Add() và Expand() trên thành phần Nodes của TreeView.
     Sau đây là qui trình điển hình để viết ứng dụng duyệt cây thư mục đơn giản bằng VC# trên nền .Net:

     1. Chạy Visual Studio 2005 (hay mới hơn), chọn menu File.New.Project để hiển thị cửa sổ "New Project". Trong cây "Project Types", bạn chọn mục Visual C#.Windows, chọn template "Windows Application", chọn vị trí thư mục chứa project, nhập tên project (thí dụ CSharpDirTree) rồi ấn button OK để tạo Project mới quản lý ứng dụng.
     2. Thiết kế trực quan cửa sổ ứng dụng gồm 4 phần tử Label, Textbox, Button và TreeView như hình:
     3. Chọn menu Project.Add Class, nhập tên class mới là MyFileFind. Khi cửa sổ mã nguồn của class MyFileFind hiển thị, bạn viết code cho class này như sau:

     //mã nguồn của class MyFileFind
     using System;
     using System.Collections.Generic;
     using System.Text;
     using System.Runtime.InteropServices;
     
     namespace CSharpDirTree {
     // Declares a class member for structure element.
     [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
     public class FindData {
     public int fileAttributes = 0;
     // creationTime was an embedded FILETIME structure.
     public int creationTime_lowDateTime = 0;
     public int creationTime_highDateTime = 0;
     // lastAccessTime was an embedded FILETIME structure.
     public int lastAccessTime_lowDateTime = 0;
     public int lastAccessTime_highDateTime = 0;
     // lastWriteTime was an embedded FILETIME structure.
     public int lastWriteTime_lowDateTime = 0;
     public int lastWriteTime_highDateTime = 0;
     public int nFileSizeHigh = 0;
     public int nFileSizeLow = 0;
     public int dwReserved0 = 0;
     public int dwReserved1 = 0;
     [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 256)]
     public String fileName = null;
     [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 14)]
     public String alternateFileName = null;
     }
     
     public class MyFileFind {
     // Declares a managed prototype for the unmanaged function.
     [DllImport("Kernel32.dll", CharSet = CharSet.Auto)]
     public static extern IntPtr FindFirstFile(String fileName, [In, Out]
     FindData findFileData);
     [DllImport("Kernel32.dll", CharSet = CharSet.Auto)]
     public static extern Boolean FindNextFile(IntPtr handle, [In, Out]
     FindData findFileData);
     }
     }

     4. Hiển thị lại cửa sổ thiết kế cho Form ứng dụng (bằng cách nhấn đúp chuột vào mục Form1 trong cửa sổ "Solution Explorer"), chọn từng phần tử TextBox, Button, TreeView và đặt tên cho chúng lần lượt là txtStartDir, btnBrowse, DirTree.

     5. Tạo hàm xử lý sự kiện click chuột vào button Browse với tên là btnBrowse_Click() bằng cách chọn button để hiển thị cửa sổ thuộc tính của nó, chọn button Events (), duyệt tìm trong danh sách sự kiện mục "Click", nhấn đúp chuột vào field nội dung ở bên phải của mục này để tạo hàm xử lý sự kiện tương ứng. Viết code của hàm xử lý click chuột như sau:

     //mã nguồn của Form ứng dụng
     using System;
     using System.Collections.Generic;
     using System.ComponentModel;
     using System.Data;
     using System.Drawing;
     using System.Text;
     using System.Windows.Forms;
     
     namespace CSharpDirTree {
     public partial class Form1 : Form {
     public Form1(){
     InitializeComponent();
     }
     //hàm tạo các phần tử miêu tả nội dung của thư mục strDir
     private void ExploreDir(String strDir, TreeNode hParent){
     String strSearchDir;
     String strsubDir;
     strSearchDir = strDir + "\\*";
     FindData fd = new FindData();
     IntPtr hFile = MyFileFind.FindFirstFile(strSearchDir, fd);
     if (hFile == (IntPtr)(-1)) {
     // the directory is empty; just close up and return.
     return;
     }
     
     TreeNode hThisItem;
     String strFileName;
     Boolean bContinue = true;
     while (bContinue) {// thêm từng phần tử trong thư mục hiện hành vào vị trí tương ứng của TreeView
     strFileName = fd.fileName;
     if (strFileName != "." && strFileName != ".."){
     hThisItem = hParent.Nodes.Add(strFileName);
     if ((fd.fileAttributes & 0x10) !=0){
     strsubDir = strDir + "\\" + strFileName;
     ExploreDir(strsubDir, hThisItem);
     }
     }
     bContinue = MyFileFind.FindNextFile(hFile, fd);
     }
     return;
     }
     
     //hàm xử lý click chuột trên button Browse
     private void btnBrowse_Click(object sender, EventArgs e){
     //xóa nội dung cây hiện có
     DirTree.Nodes.Clear();
     //tạo nút gốc tương ứng với thư mục bắt đầu
     TreeNode node = DirTree.Nodes.Add(txtStartDir.Text);
     //duyệt thư mục vào tạo các mục tương ứng trên DirTree
     ExploreDir(txtStartDir.Text, node);
     //hiển thị chi tiết nội dung của thư mục bắt đầu
     node.Expand();
     }
     }
     }
     6. Chọn menu Debug.Start Debugging để dịch và chạy thử ứng dụng. Nếu bạn thực hiện đúng qui trình trên và nhập đúng các lệnh C# thì chương trình sẽ chạy tốt, bạn thử nhập vào textbox đường dẫn của thư mục nào đó rồi nhấn button Browse, bạn sẽ thấy cây thư mục hiển thị trong cửa sổ TreeView. Bạn có thể thao tác mở rộng/thu nhỏ nội dung của từng thư mục trong cây y như bạn đã làm trên Windows Explorer.

    Bạn có thể liên hệ TGVT để copy Project phần mềm C# CSharpDirTree do chúng tôi viết

    Chuyên mục: Cơ sở dữ liệu