Quản lý điều khiển TreeView

Một phần của tài liệu Phát triển ứng dụng cơ sở dữ liệu với c và net framework (Trang 74 - 77)

Chương 8 Ứng dụng Windows với WindowsForm

8.2.2. Quản lý điều khiển TreeView

Trong ứng dụng này, hai điều khiển TreeView hoạt động tương tự nhau, ngoại trừ điều khiển cây bên trái tvwTargetDir có thuộc tính CheckBoxes là true và liệt kê cả tập tin lẫn thư mục, còn cây bên phải là false và chỉ liệt kê thư mục. Mặc nhiên thì điều khiển cây cho phép chọn nhiều mục một lúc, nhưng ta sẽ chỉnh lại sao cho chỉ cây bên trái tvwSource mới được chọn nhiều mục một lúc, bên phải thì không. Ta sẽ tạo ra một hàm đẩy dữ liệu vào cây:

private void FillDirectoryTree (TreeView tvw, bool isSource) Có 2 tham số :

TreeView tvw: điều khiển cây cần đẩy dữ liệu vào

Bool isSource: cờ xác định là dữ liệu đẩy cho cây. Nếu isSource là true thì cây sẽ liệt kê cả tập tin và thư mục, false thì chỉ có tập tin.

FillDirectoryTree (tvwSource, true); FillDirectoryTree (tvwTargetDir, false);

Đối tượng TreeNode

Điều khiển TreeView có một thuộc tính Nodes. thuộc tính này nhận vào một

đối tượng TreeNodeCollection, đối tượng này thực chất là một mảng chứa các đối tượng TreeNode, mỗi một TreeNode là một nút trên cây. Trước tiên ta cần khởi tạo cây về rỗng :

tvw.Nodes.Clear( );

Sau đó ta gọi hàm tĩnh GetLogicalDrives() của đối tượng Enviroment để lấy về tất cả các ổđĩa logic hiện đang có trên máy. Đối tượng Enviroment cung cấp các thông tin như: tên máy tính, phiên bản hệ điều hành, hệ thống thư mục… trên máy tính hiện hành.

string[] strDrives = Environment.GetLogicalDrives( );

strDrives sẽ chứa tên các ổ đĩa logic hiện có trên máy. Sau đó ta sẽ duyệt qua từng ổ đĩa bằng cách dùng lệnh foreach. Với mỗi ổ đĩa logic, ta gọi hàm GetDirectories() của đối tượng DirectoryInfo. Hàm này sẽ trả về danh sách các đối tượng DirectoryInfo, chứa tất cả các tập tin và thư mục trên ổ đĩa logic đó. Nhưng tại đây ta không quan tâm đến kết quả mà nó trả về, mục đích ta gọi hàm này chủ

yếu là để kiểm tra xem các ổ đĩa có hợp lệ hay không, nếu có bất kỳ một lỗi nào trên ổ đĩa thì hàm GetDirectories() sẽ quăng ra một ngoại lệ. Ta sẽ dùng khối bắt lỗi try… catch để bắt lỗi này.

foreach (string rootDirectoryName in strDrives) {

DirectoryInfo dir = new DirectoryInfo(rootDirectoryName); dir.GetDirectories( );

... }

Khi ỗ đĩa hợp lệ, ta sẽ tạo ra một TreeNode ứng với rootDirectoryName ổđĩa

đó, chẳng hạn như: “C:\”, “D:\”… Rồi thêm TreeNode này vào điều khiển cây dùng hàm Add() thông qua thuộc tính Nodes của cây.

TreeNode ndRoot = new TreeNode(rootDirectoryName); tvw.Nodes.Add(ndRoot);

Tiếp theo ta tiến hành duyệt trên mọi thư mục con của đối tượng TreeNode gốc trên, để làm điều này ta gọi hàm GetSubDirectoriesNodes( ), hàm này cần nhận vào các đối số: TreeNode gốc, tên của nó và cờ xác định là có đẩy cả tập tin vào cây hay không.

if (isSource) {

GetSubDirectoryNodes(ndRoot, ndRoot.Text, true); }

else {

GetSubDirectoryNodes(ndRoot, ndRoot.Text, false); }

Duyệt đệ qui trên các thư mục con

Hàm GetSubDirectoryNodes() bắt đầu bằng việc gọi hàm GetDirectories() để

nhận về một danh sách các đối tượng DirectoryInfo:

private void GetSubDirectoryNodes (TreeNode parentNode, string fullName, bool getFileNames)

{

DirectoryInfo dir = new DirectoryInfo(fullName); DirectoryInfo[] dirSubs = dir.GetDirectories( );

Ởđây ta thấy node truyền vào có tên là parentNode (nút cha), nghĩa là những nút sau này sẽđược xem là nút con của nó. Bạn sẽ rõ hơn khi tìm hiểu hết hàm này.

Ta tiến hành duyệt qua danh sách các thư mục con dirSubs, bỏ qua các mục có trạng thái là ẩn (Hidden).

foreach (Directory dirSub in dirSubs) {

if ( (dirSub.Attributes & FileSystemAttributes.Hidden) != 0 ) {

continue; }

FileSystemAttributes là biến có kiểu enum, nó chứa một số giá trị như: Archive, Compressed, Encrypted, Hidden, Normal, ReadOnly… Nếu như mục hiện hành không ở trạng thái ẩn, ta sẽ tạo ra một TreeNode mới với tham số là tên của nó. Sau đó Thêm nó vào nút cha parentNode:

TreeNode subNode = new TreeNode(dirSub.Name); parentNode.Nodes.Add(subNode);

Ta sẽ gọi lại đệ qui hàm GetDirectoriesNodes() để liệt kê hết mọi mục con trên thư nút hiện hành, với ba thông số: nút được chuyển vào như nút cha, tên đường dẫn đầy đủ của mục hiện hành và cờ trạng thái.

GetSubDirectoryNodes (subNode,dirSub.FullName,getFileNames);

Chú ý: Thuộc tính dirSubs.FullName sẽ trả về đường dẫn đầy đủ của mục hiện hành (“C:\dir1\dir2\file1” ), còn thuộc tính dirSubs.Name chỉ trả về tên của mục hiện hành (“file1”). Khi ta tạo ra một nút con subNode, ta chỉ truyền cho nó tên của mục hiện hành, vì ta chỉ muốn hiển thị thị tên của nó trên cây. Còn khi ta gọi đệ qui hàm GetSubDirectoryNodes() thì ta cần truyền cho nó tên đường dẫn

đầyđủ của mục hiện hành, để có thể liệt kê toàn bộ mục con của thực mụcđang xét.

Đến đây chắc bạn đã hiểu được sự phân cấp của cấu trúc cây và tại sao hàm GetSubDirectoryNodes() cần truyền có đối số FullName.

Lấy về các tập tin trong thư mục

Nếu biến cờ getFileNames là True thì ta sẽ tiến hành lấy về tất cả các tập tin thuộc thư mục. Để thực hiện ta gọi hàm GetFiles() của đối tượng DirectoryInfo, hàm này sẽ trả về danh sách các đối tượng FileInfo. Ta sẽ duyệt qua danh sách này

để lấy ra tên của từng tập tin một, sau đó tạo ra một nút TreeNode với tên này, nút này sẽđược thêm vào nút cha parentNode hiện hành.

Một phần của tài liệu Phát triển ứng dụng cơ sở dữ liệu với c và net framework (Trang 74 - 77)

Tải bản đầy đủ (PDF)

(192 trang)