Thông tin
  • Đánh dấu xác nhận câu hỏi đã được giải quyết để giúp diễn đàn nâng cao chất lượng [cách sử dụng]
  • Vui lòng đọc nội qui diễn đàn để tránh bị xóa bài viết [nội qui]
  • Tìm kiếm trước khi đặt câu hỏi

[C#]Sử dụng TreeView để hiển thị danh sách ổ đĩa & thư mục

Các bài viết hướng dẫn về Visual Basic .NET và C#

Các điều hành viên: QUANITGROBEST, tungcan5diop

[C#]Sử dụng TreeView để hiển thị danh sách ổ đĩa & thư mục

Gửi bàigửi bởi QuanGL » Thứ 7 03/05/2008 10:52 am

Tên bài viết: [C#]Sử dụng TreeView để hiển thị danh sách ổ đĩa & thư mục
Tác giả: QuanGL
Cấp độ bài viết: Cơ bản về sử dụng TreeView
Tóm tắt: Bài này sẽ hướng dẫn giả lập cây thư mục giống của Windows Explorer bằng cách sử dụng điều khiển TreeView


Bạn cần hiển thị một cây thư mục trong TreeView. Tuy nhiên, việc lấp đầy cấu trúc cây thư mục khi khởi động tốn quá nhiều thời gian.
Ngoài ra, bạn có thể sử dụng kỹ thuật đệ quy để xây dựng toàn bộ cây thư mục. Tuy nhiên, việc quét hệ thống file theo cách này có thể chậm, đặc biệt đối với các ổ đĩa lớn. Vì lý do này, các phần mềm quản lý file chuyên nghiệp (bao gồm Windows Explorer) sử dụng một kỹ thuật khác: chỉ hiển thị những thông tin nào người dùng cần đến.
TreeView rất thích hợp với cách tiếp cận này vì nó cung cấp sự kiện BeforeExpand (sự kiện này phát sinh trước khi một cấp mới được hiển thị). Bạn có thể sử dụng một placeholder (như dấu hoa thị hay nút rỗng) trong tất cả các nhánh chưa được thêm vào. Điều này cho phép bạn thêm vào các phần của cây thư mục khi chúng được hiển thị.
Để sử dụng kiểu giáp pháp này, yêu cầu bạn cần có một số khái niệm sau:
+ Cơ bản về mảng
+ Cơ bản về lớp System.IO
+ Cơ bản về lập trình win form với C# (hay trên nền .Net)
+ Cơ bản cách làm việc với TreeView.

Bài 101: Thêm điều khiển TreeView lên form và thiết lập mã lệnh cho nó:
+ Tạo một project Visual C# - Windows Application mới, đặt tên tùy ý (ở đây mình đặt là SExplorer101)
+ Thêm control TreeView vào Form1, tên mặc định: treeView1. Đặt thuộc tính: Dock: Fill để có thể co giãn TreeView theo Form1 (chỉ để dễ theo dõi kết quả hiển thị).
+ Trong phần code của Form1 thêm using System.IO; vào bên dưới danh sách using để có thể sử dụng các lớp liên quan.
+ Sự kiện:
- Form1_Load (bắt đầu load form đồng thời khởi tạo các ổ đĩa có trong máy lên TreeView)
. Code:
Mã: Chọn tất cả
  1.        private void Form1_Load(object sender, EventArgs e)
  2.         {
  3.             String[] drives = Directory.GetLogicalDrives(); //Lấy tất cả ổ đĩa và lưu vào mảng drives
  4.             for (int i = 0; i < drives.Length; i++) //Thêm các ổ đĩa vào TreeView đồng thời tạo các nút con "giả" (*) cho nó
  5.             {
  6.                 TreeNode tn = new TreeNode(drives[i]);
  7.                 treeView1.Nodes.Add(tn); // Ổ đĩa
  8.                 tn.Nodes.Add(new TreeNode("*")); // Nút con "giả"
  9.             }
  10.         }

- treeView1_BeforeExpand (trước khi người dùng mở các nút cha thì đồng thời thêm vào danh sách thư mục thật bên trong nhánh cha đó)
. Có 1 điểm lưu ý thế này: Nếu như thư mục đó không có thư mục con thì không thêm nút con "giả" vào cho nó.
. Xóa nút con "giả" đã tạo trước đó
. Sắp xếp danh sánh thư mục con cho rõ ràng và chuyên nghiệp
. Thêm WaitCursor và bỏ WaitCursor đi khi đã thực hiện xong
. Bẫy lỗi (nếu có).
. Code:
Mã: Chọn tất cả
  1.        private void treeView1_BeforeExpand(object sender, TreeViewCancelEventArgs e)
  2.         {
  3.             Form1.ActiveForm.Cursor = System.Windows.Forms.Cursors.WaitCursor;
  4.             if (e.Node.Nodes.Count != 0)
  5.                 e.Node.Nodes.RemoveAt(0); //Xóa nút con "giả"
  6.             String[] dirs;
  7.             try
  8.             {
  9.  
  10.                 dirs = Directory.GetDirectories(e.Node.FullPath); //Lấy danh sách thư mục
  11.                 Array.Sort(dirs); //và sắp xếp chúng
  12.             }
  13.             catch (Exception pe) //Bẫy lỗi
  14.             {
  15.                 MessageBox.Show(pe.Message, "Error!");
  16.                 goto err;
  17.             }
  18.             for (int i = 0; i < dirs.Length; i++) //thêm danh sách thư mục vào nút con đó
  19.             {
  20.                 String dirName = dirs[i];
  21.                 TreeNode tn = new TreeNode(Path.GetFileName(dirName));
  22.                 e.Node.Nodes.Add(tn);
  23.                 String[] subdirs;
  24.                 try
  25.                 {
  26.                     subdirs = Directory.GetDirectories(dirs[i]); // kiểm tra xem thư mục mới vừa thêm có thư mục con hay không. Nếu có thì thêm một nút con "giả" vào.
  27.                     if (subdirs.Length > 0)
  28.                         tn.Nodes.Add("temp");
  29.                 }
  30.                 catch
  31.                 { goto err; }
  32.  
  33.             }
  34.         err:
  35.             Form1.ActiveForm.Cursor = System.Windows.Forms.Cursors.Default;
  36.         }

- treeView1_BeforeSelect (khi người dùng chọn một nút bất kỳ nào đó, xử lý để nhận biết thông tin)
. Code:
Mã: Chọn tất cả
  1.        private void treeView1_BeforeSelect(object sender, TreeViewCancelEventArgs e)
  2.         {
  3.             Form1.ActiveForm.Text = e.Node.FullPath;
  4.         }

Tới đây coi như đã hoàn tất, bạn có thể biên dịch và chạy thử, kết quả đạt được sẽ như sau:
h1.JPG

Bài sau chúng ta sẽ tiếp tục thêm biểu tượng cho thư mục và lấy các thư mục đặc biệt: Desktop, My Document, ...
Đánh giá chủ đề: Evaluations: 0, 0.00 on the average.Evaluations: 0, 0.00 on the average.Evaluations: 0, 0.00 on the average.Evaluations: 0, 0.00 on the average.Evaluations: 0, 0.00 on the average.Evaluations: 0, 0.00 on the average.
Thanks QuanGL for your sharing!
Tập tin đính kèm
SExplorer101.rar
(29.75 KiB) Đã tải về 3778 lần
I'm in the mood for love
Hình đại diện của thành viên
QuanGL
VIP
VIP
 
Bài viết: 76
Ngày tham gia: Thứ 5 04/01/2007 7:37 pm
Đến từ: Hành tinh thứ tư tính từ Mặt Trời ^^!
Đã cảm ơn: 0 lần
Được cảm ơn: 4 lần

Re: [C#]Sử dụng TreeView để hiển thị danh sách ổ đĩa & thư mục

Gửi bàigửi bởi anhtuyenbk » Thứ 7 03/05/2008 11:02 am

Bài này trông quen quá nhỉ :D :D.
If anything you can't solve, i will solve it :))
Hình đại diện của thành viên
anhtuyenbk
Guru
Guru
 
Bài viết: 1311
Ngày tham gia: Thứ 5 22/09/2005 4:12 pm
Đến từ: Một nơi chừa từng biết, chưa từng nghe, chưa từng thấy
Đã cảm ơn: 0 lần
Được cảm ơn: 34 lần

Re: [C#]Sử dụng TreeView để hiển thị danh sách ổ đĩa & thư mục

Gửi bàigửi bởi nhtera » Thứ 5 25/02/2010 6:47 pm

Bác ơi phần tiếp theo của bài viết ở đâu thế .
nhtera
 
Bài viết: 1
Ngày tham gia: Thứ 5 25/02/2010 6:43 pm
Đã cảm ơn: 0 lần
Được cảm ơn: 0 lần

Re: [C#]Sử dụng TreeView để hiển thị danh sách ổ đĩa & thư m

Gửi bàigửi bởi poke288 » Thứ 7 03/04/2010 7:22 pm

Cảm ơn bác! Bài viết rất có ích! Next chapter đi bác :d
Hình đại diện của thành viên
poke288
 
Bài viết: 8
Ngày tham gia: Thứ 7 24/10/2009 9:14 am
Đã cảm ơn: 0 lần
Được cảm ơn: 0 lần

Re: [C#]Sử dụng TreeView để hiển thị danh sách ổ đĩa & thư m

Gửi bàigửi bởi zorotq » Thứ 3 06/04/2010 11:50 pm

pro ơi bên máy mình không access đc một số thư mục trong ổ C như windows ,program ... ,mình xài windows7 và tắt cái UAC rùi mà kô đc
zorotq
 
Bài viết: 1
Ngày tham gia: Thứ 5 30/04/2009 9:45 pm
Đã cảm ơn: 0 lần
Được cảm ơn: 0 lần

Re: [C#]Sử dụng TreeView để hiển thị danh sách ổ đĩa & thư m

Gửi bàigửi bởi KKeither » Thứ 6 05/11/2010 1:32 pm

code trên hình như có vấn đề rồi
mình click vào ổ C nó chỉ ra có 2 thư mục
sau đó mình đóng C và mở lại ra 2 thư mục cũ và 2 thư mục mới (mà 2 thư mục mới y chang 2 thư mục cũ)

vd: C:\abc, xyz
đóng lại rồi mở ra thành C:\abc, xyz, abc, xyz
KKeither
Thành viên chính thức
Thành viên chính thức
 
Bài viết: 20
Ngày tham gia: Chủ nhật 05/07/2009 11:17 pm
Đã cảm ơn: 0 lần
Được cảm ơn: 0 lần

Re: [C#]Sử dụng TreeView để hiển thị danh sách ổ đĩa & thư m

Gửi bàigửi bởi NovaFooc » Chủ nhật 14/11/2010 7:45 am

xoá line thứ 31 thì xem đc Program Files, Windows... ngay
{ goto err; }

thêm cái này vào sự kiện BeforeCollapse để fix lỗi trùng thư mục
Syntax: [ Download ] [ Hide ]
Using vb.net Syntax Highlighting
  1. e.Node.Nodes.Clear()
  2. e.Node.Nodes.Add("temp")
Parsed in 0.000 seconds, using GeSHi 1.0.8.11
NovaFooc
Thành viên tâm huyết
Thành viên tâm huyết
 
Bài viết: 308
Ngày tham gia: Thứ 3 11/08/2009 3:27 pm
Đã cảm ơn: 0 lần
Được cảm ơn: 0 lần

Re: [C#]Sử dụng TreeView để hiển thị danh sách ổ đĩa & thư m

Gửi bàigửi bởi inc90 » Thứ 5 23/08/2012 3:47 pm

Thank Bác rất nhiều!!!!
inc90
 
Bài viết: 2
Ngày tham gia: Thứ 7 18/08/2012 7:43 pm
Đã cảm ơn: 0 lần
Được cảm ơn: 0 lần


Quay về [.NET] Bài viết hướng dẫn

Ai đang trực tuyến?

Đang xem chuyên mục này: Không có thành viên nào đang trực tuyến2 khách