You are on page 1of 17

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:

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
không

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 run-
time, 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[]);

You might also like