Các bài tập Microsoft .NET 146 cũng tạm được, nhưng có thể khiến cho user bực mình. Control ErrorProvider cung cấp một cách đơn giản và thân thiện để cho user biết Textbox nào có dữ kiện bất hợp lệ. Control ErrorProvider cho các controls trên cùng form một property mới gọi là Error on ErrorProvider1 ( giả dụ là control ErrorProvider mang tên ErrorProvider1). Trong lúc chương trình chạy, nếu kiểm thấy một Textbox có lỗi ta assign một TextString vào property Error on ErrorProvider1 của Textbox ấy. Lúc bấy giờ một icon đỏ hình dấu chấm than trắng sẽ hiển thị bên phải Textbox có Error. Nếu user để mouse cursor lên trên icon ấy thì chương trình sẽ hiển thị một Tooltip với trị số TextString của property Error on ErrorProvider1 giống như trong hình dưới đây: Công việc assign một TextString vào property Error on ErrorProvider1 của một Textbox có thể được coded như sau: Private Sub BtnOK_Click( ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnOK.Click ' Set error if TextBox txtName is blank If txtName.Text = "" Then ' Assign error ToolTip message to Textbox txtName ErrorProvider1.SetError(txtName, "You must supply a name!") End If End Sub Các bài tập Microsoft .NET 147 Trên đây ta dùng Event Click của button BtnOK để kiểm tra dữ kiện trong mọi Textbox. Có một Event của các controls mà ta cũng có thể dùng trong công tác kiểm tra dữ kiện của một TextBox. Đó là Event Validating. Để gây ra Event Validating ta cần phải dùng property CauseValidation của các controls. Thông thường, property CauseValidation của các controls được set thành True. TextBox txtName chỉ tạo ra Event Validating khi chính property CauseValidation của nó là True và khi focus được di chuyển đến một control khác có property CauseValidation là True. Xin lưu ý là không nhất thiết Event Validating được tạo ra khi txtName mất focus. Khi txtName mất focus thì Textbox txtAge được focus (giả dụ txtAge có trị số TabOrder ngay sau txtName) , nhưng nếu property CauseValidation của txtAge không phải là True thì phải đợi đến khi focus đáp lên một control có property CauseValidation là True txtName mới gây ra Event Validating. Ta có thể code cho Sub txtName_Validating như sau: Private Sub txtName_Validating( ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs) _ Handles txtName.Validating ' Set error if TextBox txtName is blank If txtName.Text = "" Then ' Assign error ToolTip message to Textbox txtName ErrorProvider1.SetError(txtName, "You must supply a name!") Else ' Clear the error ToolTip message for Textbox txtName and make error Icon invisible ErrorProvider1.SetError(txtName, "") End If End Sub Cái icon đỏ hình dấu chấm than trắng là default icon của ErrorProvider. Muốn dùng một icon khác ta chỉ cần assign icon ấy vào property Icon của ErrorProvider. Menus Các bài tập Microsoft .NET 148 Mặc dầu Menu Editor của VB6 cung cấp đầy đủ các phương tiện để làm Menu và tương đối dễ dùng, VB.NET cho ta một giao diện càng thân thiện và tự nhiên hơn để thiết kế Menu. Menu được thêm vào form dưới dạng một control. Tuy Menu control nằm trong một mâm components phía dưới, nhưng trong lúc thiết kế, Menu hiện ra trong form y như lúc Runtime và bạn chỉ cần điền vào các menuitems cần thiết. Có hai loại menus: Main Menu (Menu dùng thông thường) và Context Menu (dùng cho Pop-Up). Menus Main Menu là Menu căn bản mà bạn thấy nó dính vào cạnh trên của một form. Để dễ giải thích, ta sẽ dùng một thí dụ tạo ra một Editor thật đơn giản bằng VB.NET. Bạn hãy khởi động một Windows Application mới và thêm một Textbox vào trong form chính. Set property MultiLine của Textbox thành True để nó có thể hiển thị nhiều hàng, đồng thời Stretch (kéo dãn ra) cái Textbox cho lớn ra làm nơi ta có thể đánh vào một bài text. Kế đó, thêm một Main Menu vào form. Cái menu Designer sẽ kích động và bạn chỉ cần đánh vào chi tiết các menuItems và dùng cửa sổ Properties để set các parameters. Khi nào bạn select control Main Menu trong mâm components là bạn có thể edit các MenuItems. Muốn làm việc với MenuItem nào thì select MenuItem đó. Những chỗ có chữ Type Here là đề nghị cho bạn đánh thêm vào một MenuItem (Type Here nằm phía dưới) , một MenuCommand mới (Type Here nằm bên phải một MenuCommand) hay một MenuSubItem (Type Here nằm bên phải một MenuItem). Các bài tập Microsoft .NET 149 Muốn insert một lằn ngang giữa MenuItem Paste và MenuItem Clear All, bạn select MenuItem Clear All rồi right click và chọn Insert Separator trong Pop-Up Menu. Muốn chỉ định Shortcut cho một MenuItem, bạn select MenuItem ấy rồi vào cửa sổ Properties để chọn trị số cho property Shortcut. Tương tự như vậy cho property Checked để làm một checkmark hiện ra bên trái (phía trước) Text của MenuItem. Các bài tập Microsoft .NET 150 Thêm vào các dòng code sau đây cho chương trình. Khi doubleClick lên MenuItem copyMenuItem cửa sổ mã nguồn sẽ mở ra cho bạn đánh code cho Private Sub copyMenuItem_Click: Private Sub copyMenuItem_Click( ByVal sender As System.Object, ByVal e As System.EventArgs) Handles copyMenuItem.Click ' Copy the selected text to the Clipboard Textbox1.Copy() End Sub Private Sub pasteMenuItem_Click( ByVal sender As System.Object, ByVal e As System.EventArgs) Handles pasteMenuItem.Click 'Paste the Clipboard text into Textbox1 Textbox1.Paste() End Sub Private Sub clearAllMenuItem_Click( ByVal sender As System.Object, ByVal e As System.EventArgs) Handles clearAllMenuItem.Click ' Clear everything in Textbox1 Textbox1.Text = "" End Sub . Các bài tập Microsoft .NET 146 cũng tạm được, nhưng có thể khiến cho user bực mình. Control ErrorProvider. txtName ErrorProvider1.SetError(txtName, "You must supply a name!") End If End Sub Các bài tập Microsoft .NET 147 Trên đây ta dùng Event Click của button BtnOK để kiểm tra dữ kiện trong. ErrorProvider. Muốn dùng một icon khác ta chỉ cần assign icon ấy vào property Icon của ErrorProvider. Menus Các bài tập Microsoft .NET 148 Mặc dầu Menu Editor của VB6 cung cấp đầy đủ các phương tiện để làm Menu