Kiểu dữ liệu Hashtable Bài viết giúp bạn hiểu về kiểu dữ liệu HastTable trong nền tảng .NET (ngôn ngữ C#).
Kiểu dữ liệu Hashtable(Bảng băm) Hashtable là một kiểu từ điển ( kiểu tập hợp trong đó có 2 thành phần chính liên hệ với nhau là khóa và giá trị) được tối ưu cho việc truy cập nhanh. Khi chúng ta truy cập một giá trị trong hashtable thì phải cấp một khóa. Khóa trong hashtable có thể là kiểu dữ liệu được xây dựng sẵn hay cũng có thể là thể hiện của kiểu dữ liệu do người dùng tạo ra. Một số thuộc tính và phương thức quan trọng của hashtable Thuộc tính: Count: trả về số thành phần có trong hashtable Keys: trả về một ICollection chứa những khóa trong hashtable. Values: trả về một ICollection chứa những giá trị trong hashtable Phương thức: Add() : Thêm một thành phần mới với khóa và giá trị xác định. Clear() : Xóa tất cả đối tượng có trong Hashtable(bao gồm cả khóa và giá trị). Item(): Chỉ mục cho Hashtable Clone() : Tạo ra một bản sao. Contains(): Xác định xem một thành phần có trong hashtable. ContainsKey(): Xác định xem một Hashtable có chứa một khóa xác định CopyTo() : GetEnumerator() Trả về một enumerator cho hashtable. Remove() Xóa một thành phần với khóa xác định Để sử dụng Hashtable bạn phải khai báo lớp colections Using System.Collections; Cú pháp khai báo một Hashtable: Hashtable HashtableName = new Hashtable(); Hashtable là một từ điển, nó thực thi giao diện Idictionary. Giao diện Idictionary cung cấp một thuộc tính public là thuộc tính Item. Thuộc tính này được thực thi trong ngôn ngữ C# thông qua toán tử chỉ mục([]). Do đó chúng ta có thể truy cập đến các item trong bất cứ đối tượng từ điển bằng cú pháp giống như truy cập mảng. Ví dụ sử dụng một Hashtable đơn giản using System; using System.Collections; public class Simple_Hashtable { static void Main() { Hashtable myhashTable = new Hashtable();
MyhashTable.Add(“key1”,”value 1”); MyhashTable.Add(“key2”,”value 2”); MyhashTable.Add(“key3”,”value 3”); Console.WriteLine(“Myhashtable[\”key1\”]:{0}”, MyhashTable[“key1”]); } } Kết quả: Myhashtable[“key1”]: value 1.
Kiểu dữ liệu Arraylist(danh sách mảng). Là một kiểu dữ liệu trong C# giống như kiểu mảng nhưng kích thước có thể thay đổi động theo yêu cầu. Bài viết nói về ưu điểm và mô tả các thuộc tính quan trọng của ArrayList.
Ưu điểm của Arraylist là gì?
Do kích thước danh sách mảng có thể tự thay đổi nên bạn không cần phải xác định trước các phần tử của mảng. Việc xác định trước số lượng phần tử trong mảng rất bất tiên. Nếu khai báo kích thước mảng quá nhỏ thì sẽ dẫn đến thiếu bộ nhớ nhưng nếu khai báo quá lớn thì lại lãng phí bộ nhớ. Hơn nữa nhiều khi chương trình của chúng ta có thể hỏi người dùng về kích thước hoặc thu những input từ trong một website ,tuy nhiên việc xác định số lượng đối tượng trong những session khác nhau là không thích hợp.Sử dụng Array list sẽ giúp bạn giải quyết vấn đề này. Các thuộc tính và phương thức quan trọng của Arraylist.
Thuộc tính:
không
Capacity: dùng để get hay set số thành phần có trong array list Count: dùng để xác định số phần tử có trong array list IsFixedSize: thuộc tính kiểm tra xem kích thước của array list có cố định hay
Phương thức: Item(): thiết lập hay truy cập thành phần trong array list tại vị trí xác định Add(): thêm một đối tượng vào array list Clear(): xóa tất cả các thành phần của arraylist Clone(): tạo một bản copy Contains(): kiểm tra xem mọt thành phần nào đó có thuộc array list hay không
CopyTo(): phương thức nạp chồng dung để sao chép một array list đến một mảng một chiều. IndexOf(): TRả về chỉ mục của vị trí đầu tiên xuất hiện giá trị. Insert(): chèn một thành phần vào arraylist. Sort(): sắp xếp Arraylist
ToArray(): sao chép những thành phần của ArrayList đến một mảng mới. Khai báo và sử dụng ArrayList
Để sử dụng danh sách mảng trước hết bạn phải khai báo lớp Collections. Using System. Collections; Cấu trúc định nghĩa một Array list ArrayList ArraylistName= new ArrayList(); bạn không cần khai báo trước kích thước của ArrayList. Vi dụ:
Khai bao và sử dụng một Arraylist có tên là myAL
Using System; Using System.Collections; public class Simple_ArrayList { public static void Main() { ArrayList myAL = new ArrayList(); //thêm phần tử vào arraylist for (int i=1;i<5;i++) { myAL.Add(i); } // in các phần tử của arraylist for(int i = 0; i < myAL.Count; i++) { Console.Write(“{0} ”,myAL[i].ToString()); } Console.WriteLine(“\n”); Console.WriteLine(“myAL.Count: {0}”, myAL.Count); Console.WriteLine(“myAL.Capacity: {0}”, myAL.Capacity); }
}
kết quả: 1 2 3 4 5 myAL.Count: 5 myAL.Capacity: 16 Mặc định Capacity của 1 Arraylist là 16 nếu ta ta thêm vào một số lượng phần tử lớn hơn 16 thì Capacity của Arraylist sẽ tự gấp đôi lên 32. Bài 1: Sử dụng Control BrowseForFolderDialog
Điều khiển FolderBrowserDialog: Giới thiệu: Microsoft Windows cung cấp một hộp thoại đặc biệt cho phép người dùng có thể chọn
một thư mục nếu ứng dụng yêu cầu. Khi được gọi, hộp thoại này thể hiện trông giống như sau:
Khi hộp thoại này xuất hiện, nó để Desktop ở trên cùng như một nút gốc, các thư mục và ổ đĩa khác được gắn vào đó. Khi sử dụng thì người dùng có thể chọn một thư mục và chọn OK. Nếu thư mục đó tồn tại nhưng không được thể hiện thì người dùng có thể bấm vào các nút cộng (+) để bung các nhánh ra và tìm đến thư mục mình cần. Nếu thư mục đó không tồn tại và người dùng cần tạo 1 thư mục mới thì họ có thể chọn nút Make New Folder. Hộp thoại này cũng cho phép duyệt các thư mục trên mạng. Thêm một BrowseForFolderDialog vào ứng dụng Hộp thoại này được thêm vào ứng dụng thông qua lớp FolderBrowserDialog được thừa kế từ lớp CommonDialog. Tại thời điểm thiết kế, bạn kéo thả điều khiển này từ ToolBox vào ứng dụng. Nếu bạn muốn tạo điều khiển này tại run-time thì khai báo như sau: Code:
FolderBrowserDialog fbd; public Form1() { // // Required for Windows Form Designer support // InitializeComponent(); fbd = new FolderBrowserDialog(); } Như hình trên, bạn có thể thấy rằng hộp thoại này không cho ta biết nó được dùng làm gì. Bạn để ý thấy có 1 khoảng trống giữa tiêu đề của hộp thoại và treeview bên dưới. Đó chính là chỗ hộp thoại dành riêng để mô tả về chức năng của nó. Ta có thể thay đổi thông qua thuộc tính Description. Nếu bạn cung cấp 1 chuỗi cho thuộc tính này, nó sẽ được thể hiện trong phần trống đó. Để thay đổi thuộc tính này lúc runtime, ta có thể xem đoạn mã: Code:
private void Form1_DoubleClick(object sender, System.EventArgs e) { fbd.Description = "Select the directory where your future configuration will be installed"; fbd.ShowDialog(); }
Thông thường, mục Desktop được chọn mặc định. Nếu muốn, bạn có thể thay đổi thư mục mặc định khác bằng cách thay đổi thuộc tính RootFolder. Giá trị của RootFolder phải nằm trong tập hợp SpecialFolder của lớp Environment. Ví dụ, để chọn thư mục My Document's làm mặc định, bạn khai báo: Code:
private void Form1_DoubleClick(object sender, System.EventArgs e) { fbd.Description = "Select the directory where your future configuration will be installed"; fbd.RootFolder = Environment.SpecialFolder.Personal; fbd.ShowDialog(); } Điều thuận lợi khi sử dụng những thư mục trong SpecialFolder là những thư mục này máy tính nào cũng có (tất nhiên máy tính đó phải cài HDH Windows). Nếu bạn biết chắc một thư mục nào đó có trên máy người dùng, bạn có thể dùng thuộc tính SelectedPath để chỉ định một thư mục bất kỳ được dùng làm mặc định. (lưu ý: đường dẫn sử dụng dấu \\ như trong C/C++ thay vì \). Code:
.... fbd.SelectedPath = "C:\\CSharpControls"; fbd.ShowDialog(); ....
Bạn không nên chỉ đinh cả RootFolder và SelectedPath cùng lúc. Bạn có thể cho/không cho người dùng tạo thư mục mới bằng cách ẩn/hiện nút Make New Folder. Ta quy đinh điều này bằng cách sử dụng thuộc tính ShowNewFolderButton của hộp thoại (true = hiện, false = ẩn).
Sau khi người dùng chọn 1 thư mục và bấm OK, ta sử dụng thuộc tính SelectedPath để lấy về đường dẫn thư mục mà người dùng chỉ đinh. Bài 2: Sử dụng điều khiển MonthCalendar
Điều khiển MonthCalendar Giới thiệu: .NET Framework cung cấp điều khiển MonthCalendar cho phép ta chọn ngày tháng một cách trực quan như đang chọn trên một tờ lich vậy:
Ngày tháng và cách hiển thị của MonthCalendar phụ thuộc vào Regional Settings trong Control Panel. Nó cũng có thể phu thuộc vào cả HDH. Trên thanh tiêu đề của điều khiển có 2 nút bấm và 2 label cho phép ta xem tháng, năm hiện thời cũng như duyệt qua các tháng trước đó hay các tháng kế tiếp. Thông thường, điều khiển chỉ thể hiện tháng hiện tại nhưng ta có thể cấu hình cho phép điều khiển thể hiện nhiều hơn 1 tháng. Đây là 1 ví dụ khi điều khiển thể hiện 2 tháng cùng lúc:
Để chọn 1 tháng bất kỳ trong năm, ta có thể bấm chuột vào label hiển thi tháng trên điều khiển đó. Để chọn năm, ta bấm vào label thể hiện năm, khi đó nó biến thành một spin button.
Bên dưới thanh tiêu đề thể hiện thứ của các ngày trong tháng. Ở Mỹ, ngày đầu tiên trong tuần là CN nên điều khiển chọn CN là thứ đầu tiên được thể hiện. Còn tôi, tôi nhớ có câu: "Thứ 2 là ngày đầu tuần" nên tôi có thể không muốn CN được hiển thị đầu tiên mà là thứ 2, tôi có thể thay đổi thuộc tính FirstDayOfWeek lúc desgin thành Monday hay lúc run-time bằng cách: Code:
monthCalendar1.FirstDayOfWeek = System.Windows.Forms.Day.Monday;
Trong phần chính phía dưới, các ngày trong tháng được thể hiện bằng số màu đen trên 1 nền trằng. Mặc định, ngày hiện tại sẽ được thể hiện trong 1 đường cong màu đỏ. Bạn có thể thay đổi các thể hiện khác nhau của điều khiển thông qua các thuộc tính : ForeColor, BackColor, ShowToday, ShowTodayCircle, TitleBackColor, TitleForeColor... Mặc đinh, điều khiển chỉ thể hiện tháng hiện tại. Nếu muốn hiển thị nhiều tháng hơn, bạn có thể thay đổi kích thước của điều khiển (199x155) để có thể thể hiện nhiều tháng hơn. Chú ý là bạn không thể thay đổi kích thước trực tiếp bằng cách dùng chuột mà phải gõ vào thuộc tính Size một con số là bội số của 199 (theo chiều ngang) hay 155 (theo chiều dọc). Để chọn 1 ngày, bạn bấm chuột vào ngày đó. Để chọn nhiều hơn 1 ngày, bạn có thể bấm và kéo rê chuột theo chiều ngang hay chiều dọc. Số ngày được chọn cùng lúc tối đa được quy định trong thuộc tính MaxSelectionCout, mặc định là 7. Ngày đầu tiên trong dãy ngày được chọn được lưu trong thuộc tính SelectionStart và ngày cuối cùng được lưu trong SelectionEnd. Cả hai thuộc tính đều có kiểu dữ liệu là DateTime. Mảng ngày được chọn được lưu trong thuộc tính BoldDates. Bài 3: Sử dụng điều khiển TreeView _ Phần 1
Điều khiển TreeView Giới thiệu: Ta có thể hình dung về điều khiển TreeView như 1 cái cây mọc ngược, gốc ở trên và các nhánh nằm phía dưới. Điều khiển TreeView thường được dùng để thể hiện
những danh sách đối tượng có tính chất phân tầng (hierarchical). Trong một ứng dụng, một TreeView được tạo bởi những nhánh, mỗi nhánh được gọi là 1 node. Giữa các node có 1 mối liên hệ làm cho chúng không hoàn toàn độc lập. Nếu ta cắt 1 cành cây thì tất cả những nhánh và lá gắn với cành đó cũng biến mất. Điều này cũng đúng đối với điều khiển TreeView. Thông thường, 1 cây chỉ có 1 gốc (root) nhưng 1 cây trong 1 ứng dụng có thể có nhiều gốc. Tạo một cây: Để tạo một TreeView trong ứng dụng, bạn có thể kéo thả điều khiển này từ ToolBox vào ứng dụng lúc design hay khai báo lúc run-time một con trỏ đến TreeView sử dụng toán tử new và thêm nó vào danh sách của container thông qua phương thức Controls.Add(). Ví dụ: Code:
privatevoid btnCreate_Click(object sender, System.EventArgs e) { TreeView tvwCountries = new TreeView(); tvwCountries.Location = new Point(10, 50); tvwCountries.Width = 220; tvwCountries.Height = 260; Controls.Add(tvwCountries); } [hình 1] Khai báo như trên ta chỉ tạo được 1 TreeView là một hình chữ nhật trống rỗng. Bước tiếp theo là ta thêm gốc và các nhánh vào TreeView. Ở đây tôi không trình bày các bước thêm TreeView và các Node vào ứng dụng lúc desgin (phần này dành cho các bạn tìm hiểu). Trong phần tiếp theo, tôi sẽ trình bày các bước thao tác với TreeView tại thời điểm run-time. Một nhánh của TreeView được lưu trong thuộc tính Nodes. Thuộc tính Nodes là một đối tượng dựa trên lớp TreeNodeCollection. Thuộc tính Nodes lưu giữ tất cả các nhánh của 1 TreeView. Điều này có nghĩa là Nodes thực tế là một tập hợp. Mỗi thành phần của tập hợp này được gọi là 1 node và là 1 đối tượng dựa trên lớp TreeNode. Để tạo 1 node mới, ta gọi phương thức TreeNodeCollection.Add(). Phương thức này có 2 phiên bản: Code:
1. public virtual TreeNode Add(string text); 2. public virtual int Add(TreeNode node); Phương thức thứ nhất nhận tham số là 1 chuỗi mà node đó sẽ hiển thị. Phương thức này cũng được dùng để tạo một node gốc: Code:
private void btnCreate_Click(object sender, System.EventArgs e) { TreeView tvwCountries = new TreeView(); tvwCountries.Location = new Point(10, 50); tvwCountries.Width = 220; tvwCountries.Height = 260; Controls.Add(tvwCountries); tvwCountries.Nodes.Add("Thế giới"); } [hình 2] Phương thức thứ 2 nhận tham số là một đối tượng TreeNode. Điều này có nghĩa là nó mong đợi 1 nhánh hoàn chỉnh hay bán hoàn chỉnh đã được đinh nghĩa trước đó. Lớp TreeNode có rất nhiều hàm khởi tạo. Phương thức khởi tạo mặc định của nó cho phép bạn tạo 1 node mà không phải cung cấp thông tin gì về node đó. Phương thức khởi tạo thứ 2 có dạng: Code:
public TreeNode(string text);
Phương thức này nhận tham số là 1 chuối mà node mới tạo ra sẽ hiển thị. Ví dụ sau đây sử dụng phương thức này và tạo một node mới gắn vào TreeView: Code:
private void btnCreate_Click(object sender, System.EventArgs e) { TreeView tvwCountries = new TreeView(): tvwCountries.Location = new Point(10, 50); tvwCountries.Width = 220; tvwCountries.Height = 260; Controls.Add(tvwCountries); TreeNode nodElement = new TreeNode("Thế giới"); tvwCountries.Nodes.Add(nodElement); } Thuộc tính chính của một node là chuỗi mà nó hiển thị. Chuỗi này được lưu trong thuộc tính Text của lớp TreeNode. Thuộc tính này giúp ta lấy hoặc thay đổi chuỗi hiển thị khi cần. Ví dụ: Code:
private void btnCreate_Click(object sender, System.EventArgs e)
{ TreeView tvwCountries = new TreeView(): tvwCountries.Location = new Point(10, 50); tvwCountries.Width = 220; tvwCountries.Height = 260; Controls.Add(tvwCountries); TreeNode nodElement = new TreeNode(); nodElement.Text = "Thế giới"; tvwCountries.Nodes.Add(nodElement); } Chúng ta có thể gọi lại nhiều lần phương thức TreeNodeCollection.Add() để tạo các nhánh. Ví dụ: Code:
pivate void btnCreate_Click(object sender, System.EventArgs e) { TreeView tvwCountries= new TreeView(); tvwCountries.Location = new Point(10, 50): tvwCountries.Width = 220; tvwCountries.Height = 260; Controls.Add(tvwContries); tvwCountries.Nodes.Add("Châu Á"); tvwCountries.Nodes.Add("Châu Âu"); tvwCountries.Nodes.Add("Châu Mỹ"); } Bài 4: TreeView (tiếp theo)
(tiếp theo) Thay vì phải gọi nhiều lần phương thức TreeNodeCollection.Add() như trên, ta có thê làm theo cách khác. Đầu tiên, bạn khái báo các node cần thêm như là một mảng các TreeNode, sau đó gọi phương thức TreeNodeCollection.AddRange(). Cú pháp như sau: Code:
public virtual void AddRange(TreeNode[] nodes);
Phương thức này nhân tham số là 1 mảng TreeNode. Ví dụ: Code:
private void btnCreate_Click(object sender, System.EventArgs e) { TreeView tvwCountries = new TreeView();
tvwCountries.Location = new Point(10, 50); tvwCountries.Width = 220; tvwCountries.Height = 260; Controls.Add(tvwCountries); TreeNode[] nodCountries = {new TreeNode("Việt Nam"), new TreeNode("Lào"), new TreeNode("Campuchia")}; tvwCountries.Nodes.AddRange(nodCountries); } Tạo một Node con: Lúc design, bạn có thể dùng TreeNode Editor để thêm các Node con vào Node cha. Tại thời điểm run-time, để tạo một node con, bạn phải lấy được tham chiếu tới 1 node khác được dùng làm node cha. Ta có thể dùng phương thức TreeNodeCollection.Add(string text) vì phương thức này trả về một TreeNode. Chúng ta cũng có thể dùng một phương thức khởi tạo khác của lớp TreeNode: Code:
public TreeNode(string text, TreeNode[] children);
Tham số đầu tiên trong phương thức trên là chuỗi sẽ hiển thị trên Node mới mà phương thức này tạo ra, đây là Node cha, và các node trong mảng TreeNode[] của tham số thứ 2 sẽ là các Node con của Node này. Dùng phương thức này ta có thể vừa tạo được Node cha và Node con. Sau đó ta dùng phương thứ TreeNodeCollection.Add() để gắn Node cha này vào. Ví dụ: Code:
private void btnCreate_Click(object sender, System.EventArgs e) { .............. TreeNode[] nodCountries = { new TreeNode("Việt Nam"), new TreeNode("Lào"), new TreeNode("Campuchia")}; TreeNode nodParent = new TreeNode("Bán đảo Đông Dương", nodCountries); tvwCountries.Nodes.Add(nodParent); } [hình 4] Làm tương tự, bạn có thể tạo bao nhiêu nhánh và bao nhiêu node con tùy thích. Ví dụ, xem đoạn mã sau đây: Code:
private void btnCreate_Click(object sender, System.EventArgs e) {
................... TreeNode[] nodKhoi10 = {new TreeNode("Lớp 10A1"), new TreeNode("Lớp 10A2"), new TreeNode("Lớp 10A3")}; TreeNode[] nodKhoi11 = {new TreeNode("Lớp 11A1"), new TreeNode("Lớp 11A2"), new TreeNode("Lớp 11A3")}; TreeNode[] nodKhoi12 = {new TreeNode("Lớp 12A1"), new TreeNode("Lớp 12A2"), new TreeNode("Lớp 12A3")}; TreeNode Khoi10 = new TreeNode("Khối 10", nodKhoi10); TreeNode Khoi11 = new TreeNode("Khối 11", nodKhoi11); TreeNode Khoi12 = new TreeNode("Khối 12", nodKhoi12); TreeNode[] nodTruongCap3 = {Khoi10, Khoi11, Khoi12}; TreeNode TruongCap3 = new TreeNode("Trường Cấp 3", nodTruongCap3); tvwSchool.Nodes.Add(TruongCap3); } [hình 5] Tổng só các node trong 1 cây được lưu trong TreeNodeCollection.Count. Để lấy được số node của cây hiện thời, bạn dùng phương thức TreeView.GetNodeCount(). Phương thức này có dạng như sau: Code:
public int GetNodeCount (bool includeSubTree);
Nhìn tham số truyền vào chắc bạn đã đoán được ý nghĩa của nó nên tôi không giải thích, để cho các bạn tự thử nghiệm. Lựa chọn một Node: Sau khi tạo được 1 treeview thì điều tiếp theo là người dùng sẽ chọn 1 node trên treeview đó. Để lựa chọn 1 node, người dùng đơn giản chỉ cần bấm chuột vào node đó. Đối với lập trình viên, để lựa chọn 1 node, ta có thể gán tham chiếu của node đó đến thuộc tính TreeView.SelectedNode. Ví dụ: Code:
tvwSchool.SelectedNode = Khoi11; [hình 6] Node được chọn sẽ được tô sáng. Để tìm ra node nào đang được chọn, ta có thể lấy giá trị Boolean của thuộc tính TreeView.SelectedNode. Nếu không có Node nào được chọn, thuộc tính này là null. Bạn cũng có thể kiểm tra xem 1 node có được chọn hay không bằng cách dùng phương thức TreeNode.IsSelected.
Bài 5: TreeView (tiếp theo và hết)
Chỉnh sửa 1 node: Sau khi chọn 1 node, người dùng có thể muốn đổi chuỗi hiển thị của nó. Để thay đổi chuỗi hiển thị của 1 node, node đó phải được đặt trong trạng thái edit. Để đưa 1 node vào trạng thái edit, bạn gọi phương thức TreeNode.BeginEdit() có cú pháp: Code:
public void BeginEdit();
Khi 1 node đang ở trọng trạng thái edit, chuỗi hiển thị của node đó được đặt trong 1 editbox và người dùng chỉ việc gõ vào 1 chuỗi mới để thay thế chuỗi hiện thới. Sau khi nhập xong 1 chuỗi mới, người dùng có thê bấm Enter hay bấm chuột vào 1 chỗ nào đó. Và vấn đề của bạn là bạn phải nhận ra người dùng đã hoàn tất thao tác này. Khi đó bạn gọi phương thức: Code:
public void EndEdit (bool cancel);
Trước khi gọi phương thức này, bạn có thể kiểm tra nội dung của chuỗi đã được thay đổi. Điều này cho phép bạn chấp nhận hay từ chối thay đổi. Tham số cancel của phương thức EndEdit() cho phép bạn xác nhận hay từ chối thay đổi. Định vị một Node: Như đã nói ở các phần trước, các node của một TreeView được lưu giữ trong tập hợp TreeNodeCollection. Mỗi khi bạn tạo một node mới, nó cần một chỗ để gắn vào cây. Mỗi node được đại diện bởi chỉ số của Item (Item indexed) của tập hợp. Node đầu tiên trong cây có chỉ số bằng 0. Khi bạn gọi phương thức TreeNodeCollection.Add() để thêm một node, một nhánh mới được gắn thêm vào cuối danh sách những node ngang hàng với nó (những node có chung node cha). Nếu muốn, bạn có thể thêm một node mới vào bất cứ đâu trong cây. Bạn dùng phương thức TreeNodeCollection.Insert() có cú pháp như sau: Code:
public virtual void Insert (int index, TreeNode node);
Tham số đầu tiên là chỉ mục mà bạn muốn chèn 1 node vào. Tham số thứ 2 là tham chiếu đến node cần thêm. Ví dụ: Code:
private vodi btnCreate_Click (object sender, System.EventArgs e) {
TreeView tvwCountries = new TreeView(); tvwCountries.Location = new Point(10, 50); tvwCountries.Width = 220; tvwCountries.Height = 260; Controls.Add(tvwCountries); TreeNode[] nodCountries = { new TreeNode("Việt nam"), new TreeNode("Lào"),
}
new TreeNode("Campuchia")}; TreeNode nodAsia = new TreeView("Châu Á", nodCountries); tvwCountries.Nodes.Add(nodAsia); tvwCountries.Nodes.Insert(1, new TreeNode("Châu Âu"));
Bạn có thể sử dụng 1 kỹ thuất khác để định vị một node thông qua tọa độ. Dùng phương thức TreeView.GetNodeAt(), được quá tải thành 2 phiên bản có cú pháp: Code:
public TreeNode GetNodeAt (Point pt); public TreeNode GetNodeAt (int x, int y);
Để dùng được phương thức này, bạn phải biết điểm định vị hay tọa độ của Node đó. Nếu bạn cung cấp một đối số hợp lệ cho phương thức, nó sẽ trả về tham chiếu đến node tại tọa độ đó. Ví dụ: Code:
private void btnCreate_Click (object sender, Sysytem.EventArgs e) { TreeView tvwCountries = new TreeView(); tvwCountries.Location = new Point(10, 50); tvwCountries.Width = 220; tvwCountries.Height = 260; Controls.Add(tvwCountries); TreeNode[] nodCountries = { new TreeNode("Việt nam"), new TreeNode("Lào"), new TreeNode("Campuchia")}; TreeNode nodAsia = new TreeNode("Châu Á", nodCountries); tvwCountries.Nodes.Add(nodAsia); tvwCountries.ExpandAll(); TreeNode nodBranch = tvwCountries.GetNodeAt (22, 48); Text = nodBranch.Text(); }
Sau khi tạo được 1 cây, để lấy tham chiếu tới node con đầu tiên, bạn có thể dùng thuộc tính TreeNode.FirstNode. Ví dụ:
Code:
private void btnCreate_Click (object sender, Sysytem.EventArgs e) { TreeView tvwCountries = new TreeView(); tvwCountries.Location = new Point(10, 50); tvwCountries.Width = 220; tvwCountries.Height = 260; Controls.Add(tvwCountries); TreeNode[] nodCountries = { new TreeNode("Việt nam"), new TreeNode("Lào"), new TreeNode("Campuchia")}; TreeNode nodAsia = new TreeNode("Châu Á", nodCountries); tvwCountries.Nodes.Add(nodAsia); tvwCountries.ExpandAll(); TreeNode nodFirst = tvwCountries.Nodes[0].FirstNode; Text = nodBranch.Text(); }
Để tham chiếu tới node con cuối cùng, bạn dùng thuộc tính TreeNode.LastNode. Ví dụ: Code:
TreeNode nodLast = tvwCountries.Node[0].LastNode(); Text = nodLast.Text; Để lấy tham chiếu tới node kế bên trên node hiện tại, nếu có, dùng thuộc tính TreeNode.PrevNode. Để lấy tham chiếu tới node ngay bên dưới nó, dùng thuộc tính TreeNode.NextNode. Để xác định xem 1 cây có chứa một node nào đó không, bạn có thể dùng phương thức TreeNodeCollection.Contains() có cú pháp là: Code:
public bool Contains (TreeNode node);
Phương thức này có đối số là tham chiếu đến node cần tìm. Nếu cây có chứa node này, phương thức trả về true, ngược lại, nó trả về false. Đường dẫn tới 1 node: Sau khi một node được thêm vào cây, nó giữ 1 vị trí có liên hệ tới node cha của mình và sự tồn tại của node đó phụ thuộc và node cha này. Để lưu giữ những "tiền bối" của mình, mỗi node có 1 đường dẫn có thể được dùng để nhận diên node cha và trên nữa (cha của cha...) nếu có. Để biết đường dẫn từ 1 node tới node gốc, bạn có thể dùng thuộc tính TreeNode.FullPath. Thuộc tính này là 1 chuỗi bao gồm những phần ngăn cách với nhau bởi 1 ký tự đặc biệt được quy định trong TreeView.PathSeparator. Mặc định, ký tự này là dấu backslash (\). Nếu bạn muốn đổi thành ký tự khác, bạn thay đổi thuộc tính PathSeparator.
Xóa một node: Đôi khi vì 1 lý do nào đó mà người dùng muốn xóa 1 hay 1 vài node trên cây. Để xóa 1 node, bạn dùng phương thức TreeNodeCollection.Remove() có cú pháp như sau: Code:
public void Remove (TreeNode node);
cách thứ 2 là bạn có thể dùng phương thức TreeNodeCollection.RemoveAt() có cú pháp như sau: Code:
public virtual void RemoveAt (int index);
trong đó index là chỉ số của node cần xóa. Nếu bạn đang ở tại node muốn xóa, bạn chỉ cần gọi phương thức: Code:
public void Remove();
Một trong những đặc điểm của 1 cây trong thực tế là nếu bạn cắt 1 nhánh, tất cả những nhánh gắn với nhánh đó cũng xem như bị cắt khỏi cây. Tương tự như vậy, nếu bạn gọi phương thức Remove() hay RemoveAt() để xóa một node, các node con của nó, nếu có, cũng bị xóa theo. Để xóa tất cả các node của một cây, bạn dùng phương thức TreeNodeCollection.Clear() có cú pháp như sau: Code:
public virtual void Clear();
Một vài chi tiết khác về TreeView: Hot Tracking: Nếu bạn muốn khi di chuyển chuột lên 1 node thì có 1 đường gạch chân ở dưới node đó, gán cho thuộc tính TreeView.HotTracking là true, mặc định là false. Ví dụ: Code:
private void btnCreate_Click (object sender, System.EventArgs e) {
TreeView tvwCountries = new TreeView(): tvwCountries.Location = new Point (10, 50); tvwCountries.Width = 220; tvwCountries.Height = 260; tvwCountries.HotTracking = true; Controls.Add(tvwCountries); }
Đường nối giữa các node có liên quan đến nhau: Mặc đinh, giữa các node con và node cha có 1 đường nối để thể hiện mối quan hệ cha-con. Nếu không muốn hiện đường nối này, bạn đổi thuộc tính TreeView.ShowLines thành false. Tương tự, nếu có nhiều node gốc thì giữa những node gốc này cũng có một đường nối. Bạn có thể không cho hiển thị đường nối này bằng cách gán cho thuộc tính TreeView.ShowRootLines thành false.
Dấu + và dấu Thông thường, bạn thấy trên TreeView, bên cạnh các node có dấu + và dầu -. Dấu + biểu thị node đó có ít nhất 1 node con và chưa được bung ra. Nếu là dấu - thì node đó đã bị bung ra rồi. Bạn có thể cho/không cho hiển thị dấu +/- này bằng cách thay đổi thuộc tính TreeView.ShowPlusMinus thành false, mặc định là true. TreeNode và Checkbox: Nếu bạn muốn hiển thị một Checkbox bên cạnh 1 node (cho phép người dùng có thể chọn nhiều node cùng 1 lúc), bạn gán cho thuộc tính TreeView.CheckBoxes là true.
TreeNode và Icon: Đồ họa vẫn luôn là một thứ hấp dẫn vì nó trực quan hơn. Tứ đầu đến giờ tất cả những node của ta đều chỉ là những dòng text. Bạn có thể tăng thêm tính trực quan cho node bằng cách cho hiển thị một icon kế bên dòng text. Để làm được điều này, trước tiên bạn phải tạo một điều khiển ImageList và gán nó vào thuộc tính TreeView.ImageList. Khi tạo một node, nếu bạn định hiển thị một icon bên cạnh, bạn có thể dùng hàm khởi tạo của lớp TreeNode như sau: Code:
public TreeNode (String text, int imageIndex, int selectImageIndex);
Phương thức này cho phép bạn xác định chuỗi hiển thị của 1 node, vị trí của icon trong ImageList và vị trí của icon sẽ hiển thị khi node đó được chọn. Nếu bạn tạo một node có những node con, sử dụng hàm khởi tạo sau của lớp TreeNode: Code:
public TreeNode (String text, int imageIndex, int selectImageIndex, TreeNode children[]);