You are on page 1of 55

Nhấn phím Enter thì kích hoạt phím TAB

Trong vb.net 2003, trên 1 form,trong khi bạn design, các điều khiển nhập
liệu sẽ được quy định theo thứ tự tạo trước sau, khi bạn thực thi, mặc nhiên
khi bạn nhấn phím TAB, cursor sẽ tự động nhảy đến đối tượng được tạo tiếp
theo. Còn bạn nhấn enter thì không được, nếu muốn điều đó, bạn có thể làm
như sau:
khai báo thuộc tính KeyPreview của form = TRUE.
Sau đó trong sự kiện KeyDown của form:
'giả sử tên của form đó là frmViDu

Private Sub frmViDu_KeyUp(ByVal sender As Object, ByVal e As


System.Windows.Forms.KeyEventArgs) Handles MyBase.KeyUp
If e.KeyCode = Keys.Enter Then
SendKeys.Send("{TAB}")
End If
End Sub

Tạo hộp About động trong VB.net


Bạn muốn thu lấy thông tin phiên bản lúc thực thi với mục đích hiển thị
trong hộp About.
Thu lấy một tham chiếu đến assembly hiện hành bằng Assembly.
GetExecutingAssembly, và thu lấy AssemblyName của nó (có kèm thông tin
phiên bản trong đó).
Đối với một ứng dụng, thật quan trọng khi nói đúng phiên bản của nó (và
đôi lúc có thêm các thông tin như tên file và bản địa) mà không cần phải viết
mã cứng cho dữ liệu này. Cơ chế phản chiếu cung cấp một giải pháp lý
tưởng vì nó cho phép thu lấy các chi tiết này một cách trực tiếp từ siêu dữ
liệu của assembly.
Đoạn mã dưới đây hiển thị vài mẩu thông tin về assembly hiện hành bằng cơ
chế phản chiếu. Nó cũng trình bày cách thu lấy những thông tin đó một cách
gián tiếp từ lớp System.Windows.Forms.Application (bất chấp kiểu ứng
dụng là gì).
Public Module TestReflection
Public Sub Main()
Dim ExecutingApp As System.Reflection.Assembly
ExecutingApp = System.Reflection.Assembly.GetExecutingAssembly()
Dim Name As System.Reflection.AssemblyName
Name = ExecutingApp.GetName()
' Hiển thị thông tin siêu dữ liệu.
Console.WriteLine("Application: " & Name.Name)
Console.WriteLine("Version: " & Name.Version.ToString())
Console.WriteLine("Code Base: " & Name.CodeBase)
Console.WriteLine("Culture: " & Name.CultureInfo.DisplayName)
Console.WriteLine("Culture Code: " & Name.CultureInfo.ToString())
' (Nếu assembly đã được ký, bạn có thể sử dụng Name.KeyPair
' để thu lấy khóa công khai.)
' Một số thông tin được lấy từ lớp Application.
' Thông tin phiên bản là giống hệt.
Console.WriteLine("Assembly File: " & _
System.Windows.Forms.Application.ExecutablePath)
Console.WriteLine("Version: " & _
System.Windows.Forms.Application.ProductVersion)
' Thông tin Company và Product được thiết lập thông qua
' đặc tính AssemblyCompany và AssemblyProduct (thường
' nằm trong file AssemblyInfo.vb).
Console.WriteLine("Company: " & _
System.Windows.Forms.Application.CompanyName)
Console.WriteLine("Product: " & _
System.Windows.Forms.Application.ProductName)
' Thông tin bản địa là bản địa hiện hành
' (trong trường hợp này là en-US), trong khi
' cơ chế phản chiếu thu lấy bản địa được chỉ định
' trong assembly (trong trường hợp này là không có).
Console.WriteLine("Culture: " & _
System.Windows.Forms.Application.CurrentCulture.ToString())
Console.WriteLine("Culture Code: " & _
System.Windows.Forms.Application.CurrentCulture.DisplayName)
Console.ReadLine()
End Sub
End Module
Chú ý rằng GetExecutingAssembly luôn trả về một tham chiếu đến
assembly mà mã lệnh đang thực thi ở đó. Nói cách khác, nếu bạn chạy một
ứng dụng Windows (assembly A) có sử dụng một thành phần độc lập
(assembly B), và thành phần đó cho gọi GetExecutingAssembly, nó sẽ nhận
được một tham chiếu đến assembly B. Bạn cũng có thể sử dụng
GetCallingAssembly (thu lấy assembly mà lệnh gọi được định vị ở đó) hoặc
GetEntryAssembly (trả về assembly có thể thực thi đối với miền ứng dụng
hiện hành).
Assembly là một từ khóa dành riêng trong Microsoft Visual≅ Basic .NET.
Do đó, nếu muốn tham chiếu kiểu System.Reflection.Assembly, bạn phải sử
dụng tham chiếu dạng đầy đủ hoặc bạn phải đặt từ Assembly trong dấu
ngoặc vuông.
' Lệnh này làm việc.
Dim Asm As System.Reflection.Assembly

' Lệnh này cũng làm việc,


' giả sử bạn đã nhập không gian tên System.Reflection.
Dim Asm As [Assembly]

' Lệnh này sinh ra lỗi biên dịch,


' vì Assembly là từ khóa dành riêng.
Dim Asm As Assembly

Tạo form với hiệu ứng DropShadow


rất đơn giản,bạn chỉ cần khai báo tham số CS_DROPSHADOW và với nó
bạn có thể làm cho bất cứ Window nào cũng sẽ có một cái bóng như dưới
đây bằng trao cho lớp của nó tham số trên:

[vb]Protected Overrides ReadOnly Property CreateParams() As


System.Windows.Forms.CreateParams
Get
Dim parameters As CreateParams = MyBase.CreateParams
parameters.ClassStyle = parameters.ClassStyle Or CS_DROPSHADOW
Return parameters
End Get
End Property[/vb]

Lấy khoảng thời gian giữa thời điểm (bắt đầu làm gì đó) và thời điểm kết
thúc :
Private Function GetDuration(ByVal timeStart As DateTime) As String

Dim timeElapsed As New TimeSpan(0)


Dim timeEnd As DateTime
Dim timeDifference As New TimeSpan

timeEnd = DateTime.Now()
timeDifference = timeEnd.Subtract(timeStart)
timeElapsed = timeElapsed.Add(timeDifference)
Return timeElapsed.ToString()
End Function

'Lấy time thực hiện một số câu lệnh

Implementation

Dim timeStart As DateTime

timeStart = DateTime.Now()

' các câu lệnh làm chuyện gì đó

Me.lblDuration.Text = GetDuration(timeStart)

và lấy kiểu ngày không có gắn giờ


Dim _date As Date = DateTime.Now.Date

SubClass trong .NET


Trính: “…Windows gửi thông điệp là một hằng số tới các form và các
control của VB để báo cho chúng biết vị trí chuột ở đâu, khi nào thì cần vẽ
lại, phím nào đang được nhấn và nhiều thông điệp khác. Kỹ thuật
subclassing là để xử lý chặn những thông điệp này trước khi chúng đến
được các form và control. Bằng cách chặn các thông điệp này và xử lý ''vài
thứ'' trước khi chúng đến đích, chúng ta có thể có các tính năng riêng (như
tự vẽ lại các control theo ý riêng).
Subclassing là một kỹ thuật tinh vi, chỉ cần một lỗi nhỏ (ví dụ như : do bạn
giải phóng tài nguyên không tốt dẫn đến việc thất thoát tài nguyên của hệ
thống) là có thể dẫn đến việc hệ thống của bạn bị thiếu tài nguyên làm cho
hệ thống hoạt động không còn tốt nữa (chậm đi), nặng hơn là VB bị shut
down, thậm chí treo máy. Tuy nhiên nói điều này là để bạn ý thức được vấn
đề chứ bạn cũng không nên quá lo ngại về nó. Và thêm 1 chú ý là bạn cũng
không nên bấm nút stop của VB khi chương trình đang chạy mà bạn nên
đóng form 1 cách thông thường (bấm nút close) để thực hiện tốt việc giải
phóng tài nguyên…”
Trong VB6 bạn có thể dùng Kỹ thuật này bằng cách tạo ra một Lớp và dùng
các hàm API như : SetWindowLong,CallWindowProc,hay Sendmessage và
một số tin nhắn. Còn trong .NET bạn có thể bắt tin nhắn và xứ lí chúng bằng
cách dùng phương thức WndProc trong Form như sau:
[vb]Protected Overrides Sub WndProc(ByRef m As
System.Windows.Forms.Message)
Select Case m.Msg
Case WM_MOUSEMOVE
'xử lí tin nhắn ở đây
End Select
End Sub[/vb]
Nhưng cách dùng trên có một vài nhược điểm như một số Control không có
phương thức này và giống như lí do mà trong VB6 bạn phải tạo một lớp
riêng để SubClass.Vì vậy việc SubClass trong .NET sẽ dễ dàng hơn khi
dùng Lớp NativeWindow.Bạn có thể tạo bằng cách tạo một lớp mới và thừa
hưởng lại từ Lớp NativeWindow.

[vb]Imports System.Runtime.InteropServices
Imports System.Drawing
Imports System.Drawing.Drawing2D

Public Class Class1 : Inherits NativeWindow

Protected Overrides Sub WndProc(ByRef m As


System.Windows.Forms.Message)
Select Case m.Msg
Case WM_NCACTIVATE
'Sứ lí tin nhắn ở đây
End Select
MyBase.WndProc(m)
End Sub
End Class[/vb]
Cách dùng lớp này như sau:
Trong NativeWindow có 3 phương thức mà bạn dùng để bắt đầu với kỹ thuật
SubClass trong .NET
1. AssignHandle( handle as IntPtr):
Gán một đối tượng vào handle của cửa sổ và bắt đầu Subclass.
2. ReleaseHandle( handle as IntPtr):
Huỷ bỏ Subclass và đưa giá trị của handle về già trị 0.
[vb]
Private s As New Class1
Private Sub Form1_Load(ByVal sender As Object, ByVal e As
System.EventArgs) Handles MyBase.Load
s.AssignHandle(Me.Handle)
End Sub
Private Sub Form1_Closed(ByVal sender As Object, ByVal e As
System.EventArgs) Handles MyBase.Closed
s.ReleaseHandle()
End Sub[/vb]
Ok!

Cách truy vần dữ liệu trực tiếp trong dataset


Về lớp không kết nối Dataset.
Mình muốn hỏi các bạn là có cách nào để truy vấn trực tiếp thông tin trong
dataset không.
Ví dụ mình có một bảng tên là Mathang với 3 cột :
MaHang,TenHang,GiaBan.
Trong chương trình của mình khi user thay đổi mã hàng thì mình sẽ tìm các
thông tin còn lại bằng câu lệnh SQL sau: Select * from MatHang Where
Mahang like "mahang*"
thì tất nhiên nó sẽ cho ra kết quả. Nhưng nếu vậy thì mỗi lần đổi mã hàng là
mỗi lần connect đến server, sau đó select dữ liệu rồi trả về biến dataset, rồi
lại đưa vào datagrid. Như vậy sẽ rất lâu và không tối ưu.
Ý tưởng của mình là trước khi vào Form thì mình sẽ Select hết thông tin
trong bảng Mathang lưu vào biến toàn cục dataset. Sau đó chương trình sẽ
chỉ select trên dataset này mà thôi và không cần kết nối lại server nữa như
vậy sẽ rất là nhanh, các bạn có đồn ý với mình không?
Nhưng vấn đề là làm sao có thể làm cho dataset hiểu được câu lệnh SQL mà
trả về thông tin minh cần và đưa vào datagrid sau đó show cho user xem??

Về vấn đề này, bạn có thể dùng một mảng datarow để lọc những dòng thỏa
điều kiện, bạn làm như vầy:
Dim dr as datarow()
dr=ds.Tables("Mathang").Select("Mahang like '" & mahang & "*'")

Cách cài đặt 1 ứng dụng VB2005.NET trên mạng LAN như thế nào
Tôi có 1 ứng dụng viết bằng VB.NET. Khi chạy ứng dụng trên máy cài đặt
chương trình thì nó hoạt động bình thường. Tôi có tạo một shortcut đến
chương trình từ một máy tính khác trong mạng LAN và chạy chương trình
từ shortcut này thì xuất hiện thông báo lỗi như sau:

Application attempted to perform an operation not allowed by the


Security policy. To grant this application the required permission, contact
Your system administrator, or use the Microsoft .NET Framework
Configuration tool.

If you click Continue, the application will ignore this error and attempt to
Continue. If you click Quit, the application will close immediately.

Request for the permission of type


‘System.Data.OleDb.OleDbPermission, System.Data, Version=2.0.0.0,
Culture=neutral, PulicKeyToken=b77a5c561934e089’ failed.

Tôi biết rằng lỗi trên là do chương trình có sử dụng cơ sở dữ liệu Access và
không biết cách khác phục như thế nào. Nhờ các chuyên gia về VB.NET
hướng dẫn tôi cài đặt chương trình như thế nào để mọi máy trong mạng
LAN đều có thể sử dụng chung chương trình được cài trên 1 máy.
Cấu hình mặc định của net framwork không cho phép chạy các net APP trên
network vì nó được cho là untrust, muốn các net APP triển khai được trên
các untrust location như maped network cần làm theo bước sau :
Vào settings - ... Control Panel... Administrative tools... Microsoft .NET
Framework Configuration... nhắp phải vào Runtime Security Policy...
chọn Adjust Security... rùi nhấn next... chỉnh Local Intranet sang "Full
Trust"... rùi NEXT... Vậy là ok........

Dynamic Menu Class coding

Option Explicit
Private Declare Function GetLastError Lib "kernel32.dll" () As Long
' Exposed Enumeration
Public Enum mceItemStates
mceDisabled = 1
mceGrayed = 2
End Enum

' Property variables


Private psCaption As String ' Caption of menu item (with the arrow >) if this is submenu
Private piHwnd As Long ' Handle to Menu

' Supporting API code


Private Const GW_CHILD = 5
Private Const GW_HWNDNEXT = 2
Private Const GW_HWNDFIRST = 0
Private Const MF_BYCOMMAND = &H0&
Private Const MF_BYPOSITION = &H400
Private Const MF_CHECKED = &H8&
Private Const MF_DISABLED = &H2&
Private Const MF_GRAYED = &H1&
Private Const MF_MENUBARBREAK = &H20&
Private Const MF_MENUBREAK = &H40&
Private Const MF_POPUP = &H10&
Private Const MF_SEPARATOR = &H800&
Private Const MF_STRING = &H0&
Private Const MIIM_ID = &H2
Private Const MIIM_SUBMENU = &H4
Private Const MIIM_TYPE = &H10
Private Const TPM_LEFTALIGN = &H0&
Private Const TPM_RETURNCMD = &H100&
Private Const TPM_RIGHTBUTTON = &H2

Private Type POINT


X As Long
Y As Long
End Type
Private Type RECT
Left As Long
Top As Long
Right As Long
Bottom As Long
End Type
Private Type MENUITEMINFO
cbSize As Long
fMask As Long
fType As Long
fState As Long
wID As Long
hSubMenu As Long
hbmpChecked As Long
hbmpUnchecked As Long
dwItemData As Long
dwTypeData As String
cch As Long
End Type
Private Declare Function AppendMenu Lib "user32" Alias "AppendMenuA" (ByVal hMenu As
Long, ByVal wFlags As Long, ByVal wIDNewItem As Long, lpNewItem As String) As Long
Private Declare Function DestroyMenu Lib "user32" (ByVal hMenu As Long) As Long
Private Declare Function DeleteMenu Lib "user32" (ByVal hMenu As Long, ByVal nPosition As
Long, ByVal uFlags As Long) As Long
Private Declare Function CreatePopupMenu Lib "user32" () As Long
Private Declare Function EnableMenuItem Lib "user32" (ByVal hMenu As Long, ByVal
wIDEnableItem As Long, ByVal wEnable As Long) As Long
Private Declare Function GetCursorPos Lib "user32" (lpPoint As POINT) As Long
Private Declare Function GetDesktopWindow Lib "user32" () As Long
Private Declare Function GetWindow Lib "user32" (ByVal Hwnd As Long, ByVal wCmd As Long)
As Long
Private Declare Function GetWindowThreadProcessId Lib "user32" (ByVal Hwnd As Long,
lpdwProcessId As Long) As Long
Private Declare Function GetCurrentProcessId Lib "kernel32" () As Long
Private Declare Function GetWindowRect Lib "user32" (ByVal Hwnd As Long, lpRect As RECT)
As Long
Private Declare Function GetMenuItemInfo Lib "user32" Alias "GetMenuItemInfoA" (ByVal
hMenu As Long, ByVal un As Long, ByVal b As Boolean, lpMenuItemInfo As MENUITEMINFO)
As Boolean
Private Declare Function GetFocus Lib "user32" () As Long
Private Declare Function GetForegroundWindow Lib "user32" () As Long
Private Declare Function SetMenuDefaultItem Lib "user32" (ByVal hMenu As Long, ByVal uItem
As Long, ByVal fByPos As Long) As Long
Private Declare Function TrackPopupMenuEx Lib "user32" (ByVal hMenu As Long, ByVal wFlags
As Long, ByVal X As Long, ByVal Y As Long, ByVal Hwnd As Long, ByVal lptpm As Any) As Long
Private Declare Function SetMenuItemBitmaps Lib "user32" (ByVal hMenu As Long, ByVal
nPosition As Long, ByVal wFlags As Long, ByVal hBitmapUnchecked As Long, ByVal
hBitmapChecked As Long) As Long
Private Declare Function WindowFromPoint Lib "user32" (ByVal xPoint As Long, ByVal yPoint As
Long) As Long
Public Property Let Caption(ByVal sCaption As String)

psCaption = sCaption

End Property

Public Property Get Caption() As String

Caption = psCaption

End Property

Public Sub Remove(ByVal iMenuPosition As Long)

DeleteMenu piHwnd, iMenuPosition, MF_BYPOSITION

End Sub

Private Sub Class_Initialize()


piHwnd = CreatePopupMenu()
End Sub

Private Sub Class_Terminate()


DestroyMenu piHwnd
End Sub

Public Property Get Hwnd() As Long

Hwnd = piHwnd

End Property

Public Sub Add(ByVal iMenuID As Long, vMenuItem As Variant, Optional bDefault As Boolean
= False, Optional bChecked As Boolean = False, Optional eItemState As mceItemStates,
Optional ByVal imgUnchecked As Long = 0, Optional ByVal imgChecked As Long = 0)

' Check to see if it's a menu item (a string) or a submenu (a class).


If TypeName(vMenuItem) = "String" Then

If vMenuItem = "-" Then ' Make a seperator


AppendMenu piHwnd, MF_STRING Or MF_SEPARATOR, iMenuID, ByVal vbNullString
Else
AppendMenu piHwnd, MF_STRING Or -bChecked * MF_CHECKED, iMenuID, ByVal
vMenuItem
End If

' Menu Icons


If imgChecked = 0 Then imgChecked = imgChecked ' Need a value for both
SetMenuItemBitmaps piHwnd, iMenuID, MF_BYCOMMAND, imgUnchecked, imgChecked
' Default item
If bDefault Then SetMenuDefaultItem piHwnd, iMenuID, 0

' Disabled (Regular color text)


If eItemState = mceDisabled Then EnableMenuItem piHwnd, iMenuID, MF_BYCOMMAND
Or MF_DISABLED
' Disabled (disabled color text)
If eItemState = mceGrayed Then EnableMenuItem piHwnd, iMenuID, MF_BYCOMMAND
Or MF_GRAYED

' Add a submenu


ElseIf TypeOf vMenuItem Is mcPopupMenu Then
Dim oSubmenu As mcPopupMenu: Set oSubmenu = vMenuItem
AppendMenu piHwnd, MF_STRING Or MF_POPUP, oSubmenu.Hwnd, ByVal
oSubmenu.Caption
Set oSubmenu = Nothing
End If

End Sub

Public Function Show(Optional ByVal iFormHwnd As Long = -1, Optional ByVal X As Long = -1,
Optional ByVal Y As Long = -1, Optional ByVal iControlHwnd As Long = -1) As Long
Dim iHwnd As Long, iX As Long, iY As Long

' If no form is passed, use the current window


If iFormHwnd = -1 Or iFormHwnd = 0 Then

Dim iDesktopHwnd As Long, iChildHwnd As Long, iCurrentID As Long, iChildID As Long

iDesktopHwnd = GetDesktopWindow()
iChildHwnd = GetWindow(iDesktopHwnd, GW_CHILD)
iCurrentID = GetCurrentProcessId()
Do While iChildHwnd
GetWindowThreadProcessId iChildHwnd, iChildID
If iChildID = iCurrentID Then Exit Do ' Snagged
iChildHwnd = GetWindow(iChildHwnd, GW_HWNDNEXT)
Loop

If iChildHwnd = 0 Then ' Can't resolve a form handle. Bail out.


Show = -1
Exit Function
End If
iHwnd = iChildHwnd
Else
iHwnd = iFormHwnd
End If

' If passed a control handle, left-bottom orient to the control.


If iControlHwnd <> -1 Then
Dim rt As RECT
GetWindowRect iControlHwnd, rt
iX = rt.Left
iY = rt.Bottom
Else
Dim pt As POINT
GetCursorPos pt
If X = -1 Then iX = pt.X Else: iX = X
If Y = -1 Then iY = pt.Y Else: iY = Y
End If
Show = TrackPopupMenuEx(piHwnd, TPM_RETURNCMD Or TPM_RIGHTBUTTON, iX, iY,
iHwnd, ByVal 0&)

End Function

Dynamic Menu Form coding

Option Explicit

Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)

lblLabel.BackColor = vbButtonFace
lblLabel.ForeColor = vbWindowText

End Sub

Private Sub lblLabel_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)

lblLabel.BackColor = vbHighlight
lblLabel.ForeColor = vbHighlightText

End Sub

Private Sub lblLabel_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single)

Dim oMenu As mcPopupMenu: Set oMenu = New mcPopupMenu


Dim oSubmenu1 As mcPopupMenu: Set oSubmenu1 = New mcPopupMenu
Dim oSubmenu2 As mcPopupMenu: Set oSubmenu2 = New mcPopupMenu
Dim oSubmenu3 As mcPopupMenu: Set oSubmenu3 = New mcPopupMenu
Dim x1 As Single, y1 As Single, Ret As Long

' Labels don't have a handle, set x,y manually


x1 = (Me.Left + 45 + lblLabel.Left) / 15 ' 15 twips per pixel
y1 = (Me.Top + 525 + lblLabel.Height) / 15

' Add a few of the main menu items


oMenu.Add 1, "Item 1"
oMenu.Add 2, "Item 2", True, , , imglstImages.ListImages(1).Picture
oMenu.Add 3, "Item 3", , , mceGrayed

oMenu.Add 4, "-" ' Seperator

' Build our submenus when needed


oSubmenu1.Caption = "Submenu 1"
oSubmenu1.Add 20, "Submenu 1 Item 1", , , mceGrayed,
imglstImages.ListImages(2).Picture
oSubmenu1.Add 21, "Submenu 1 Item 2", , , , imglstImages.ListImages(3).Picture
oSubmenu1.Add 22, "Submenu 1 Item 3", , , , imglstImages.ListImages(4).Picture

' Submenu of the first submenu


oSubmenu2.Caption = "Submenu 2"
oSubmenu2.Add 30, "Submenu 2 Item 1"
oSubmenu2.Add 31, "Submenu 2 Item 2"
oSubmenu2.Add 32, "Submenu 2 Item 3"

' Add second submenu to first


oSubmenu1.Add 33, oSubmenu2

' Add first submenu to main.


oMenu.Add 5, oSubmenu1

oMenu.Add 6, "-" ' Another seperator

' Build third submenu


oSubmenu3.Caption = "Submenu 3"
oSubmenu3.Add 40, "Submenu 2 Item 1", , , , imglstImages.ListImages(2).Picture
oSubmenu3.Add 41, "Submenu 3 Item 2", , , , imglstImages.ListImages(3).Picture
oSubmenu3.Add 42, "Submenu 3 Item 3", , , , imglstImages.ListImages(4).Picture

oMenu.Add 7, oSubmenu3

oMenu.Add 8, "-" ' Yet another

' The remaining items in the main menu


oMenu.Add 9, "Item 4", , True
oMenu.Add 10, "Item 5", , , , imglstImages.ListImages(4).Picture
oMenu.Add 11, "Item 6", , True, mceGrayed

' Show popup


Ret = oMenu.Show(Me.Hwnd, x1, y1)

' Release objects


Set oSubmenu1 = Nothing: Set oSubmenu2 = Nothing: Set oSubmenu3 = Nothing: Set
oMenu = Nothing

MsgBox "You chose menu ID " & Ret

Select Case Ret

' Lights, camera, action!

End Select

End Sub

.NET System Information Class Demo


This class encapsulates the .NET system information class, which allows you to easily get information about
the system your process is running on. It only uses a subset of the SystemInformation class; you can look in
help or use intellisense (SystemInformation.) to get an idea of what else this it can do. To quickly see what
information you can get from the class presented here, run the following in the IDE:

Dim objSysInfo As New clsSystemInfo()


With objSysInfo
Debug.WriteLine("Boot Mode: " & .BootMode)
Debug.WriteLine("Computer Name: " & .ComputerName)
Debug.WriteLine("Double Byte Character Set Enabled: " _
& .DBCSEnabled)
Debug.WriteLine("Network Connection Present: " &
.isConnectedToNetwork)
Debug.WriteLine("Menu Font Name: " & .MenuFontName)
Debug.WriteLine("Menu Font Name: " & .MenuFontSize)
Debug.WriteLine("Menu Height: " & .MenuHeight)
Debug.WriteLine("Hebrew and Arabic supported: " &
.MidEastEnabled)
Debug.WriteLine("# of attached monitors: " & .MonitorCount)
Debug.WriteLine("Is mouse present: " & .MousePresent)
Debug.WriteLine("Is mouse wheel present: " &
.MouseWheelPresent)
Debug.WriteLine("# of mouse buttons: " & .MouseButtons)
Debug.WriteLine("Is Pen Windows Supported: " & .PenWindows)
Debug.WriteLine("Primary Monitor Size: " & .PrimaryMonitorSize)
Debug.WriteLine("Is OS Security Present:" & .Secure)
Debug.WriteLine("Domain Name: " & .UserDomainName)
Debug.WriteLine("User Name: " & .UserName)
Debug.WriteLine("Current process running in user interactive
mode:" & .UserInteractive)
Debug.WriteLine("Working Area: " & .WorkingArea)
Code
Public Class clsSystemInfo
Public Function BootMode() As String
' Normal: The computer started in the standard mode
'FailSafe: The computer started with only the basic
'files and drivers to run locally
'FailSafeWithNetwork: The computer started with the
'basic files, drivers, etc to run on network

Return SystemInformation.BootMode.ToString

End Function
Public Function ComputerName() As String
'the computername
Return SystemInformation.ComputerName

End Function
Public Function DBCSEnabled() As Boolean
'returns true if system is capable of
'handling double-byte character set (DBCS) characters.
Return SystemInformation.DbcsEnabled

End Function
Public Function MenuFontName() As String
'operating system font name for menus
Return SystemInformation.MenuFont.FontFamily.Name
End Function
Public Function MenuFontSize() As Integer
'operating system font name for menus
Return SystemInformation.MenuFont.Size

End Function
Public Function MenuHeight() As Integer
'height of one menu line in pixel
Return SystemInformation.MenuHeight

End Function

Public Function MidEastEnabled() As Boolean


'true if system supports Hebrew and Arabic languages.
Return SystemInformation.MidEastEnabled
End Function
Public Function MonitorCount() As Integer
'How many monitors
Return SystemInformation.MonitorCount
End Function

Public Function MouseButtons() As Integer


'How many mouse buttons
Return SystemInformation.MouseButtons
End Function

Public Function MousePresent() As Boolean


'is mouse present
Return SystemInformation.MousePresent
End Function
Public Function MouseWheelPresent() As Boolean
'is mouse with mouse wheel present
Return SystemInformation.MouseWheelPresent
End Function
Public Function isConnectedToNetwork() As Boolean
'connection to network present?
Return SystemInformation.Network
End Function
Public Function PenWindows() As Boolean
'Are Microsoft Windows for Pen Computing extensions installed
Return SystemInformation.PenWindows

End Function
Public Function PrimaryMonitorSize() As String
'Size of primary monitor
Return SystemInformation.PrimaryMonitorSize.ToString

End Function
Public Function Secure() As Boolean
'is security present on operating system
Return SystemInformation.Secure

End Function
Public Function UserDomainName() As String
'the domain name for the current user
Return SystemInformation.UserDomainName
End Function
Public Function UserInteractive() As Boolean
'is current process running in user-interactive mode.
Return SystemInformation.UserInteractive
End Function
Public Function UserName() As String
'user name
Return SystemInformation.UserName
End Function
Public Function WorkingArea() As String
Return SystemInformation.WorkingArea.ToString

End Function
End Class
SQL Data Provider VB.NET Class - The Class

The Class

This class is for simplifying and accelerating working with SQL, using this class is very simple;
there is a sample below for this class, which I hope is useful. You can report bugs, opinions
and suggestions to me.

Imports System
Imports System.IO
Imports System.Text
Imports System.Data
Imports System.Data.SqlClient

Namespace SqlDataProvider

''' <summary>
''' This class provides a fast and universal method for accessing SQL Server
database.This class cannot be inherited.
''' </summary>
Public NotInheritable Class SqlDatabase

#Region " Local Property Declarations "

Dim _connectionString As String

#End Region

#Region " Constructor "

''' <summary>
''' Initializes a new instance of the ADO.SqlDatabase class.
''' </summary>
''' <param name="connectionString">The connection used to open the SQL Server
database.</param>
Public Sub New(ByVal connectionString As String)
_connectionString = connectionString
End Sub

#End Region

#Region " Public Properties "

''' <summary>
''' Gets or sets the string used to open a SQL Server database.
''' </summary>
''' <returns>The connection string that includes the source database name, and
other parameters needed to establish the initial connection.</returns>
Public Property ConnectionString() As String
Get
Return _connectionString
End Get
Set(ByVal value As String)
_connectionString = value
End Set
End Property

#End Region

#Region " Private Methods "

Private Sub AssignParameters(ByVal cmd As SqlCommand, ByVal cmdParameters() As


SqlParameter)
If (cmdParameters Is Nothing) Then Exit Sub
For Each p As SqlParameter In cmdParameters
cmd.Parameters.Add(p)
Next
End Sub

Private Sub AssignParameters(ByVal cmd As SqlCommand, ByVal parameterValues() As


Object)
If Not (cmd.Parameters.Count - 1 = parameterValues.Length) Then Throw New
ApplicationException("Stored procedure's parameters and parameter values does not match.")
Dim i As Integer
For Each param As SqlParameter In cmd.Parameters
If Not (param.Direction = ParameterDirection.Output) AndAlso Not
(param.Direction = ParameterDirection.ReturnValue) Then
param.Value = parameterValues(i)
i += 1
End If
Next
End Sub

#End Region

#Region " ExecuteNonQuery "

''' <summary>
''' Executes a Transact-SQL statement against the connection and returns the
number of rows affected.
''' </summary>
''' <param name="cmd">The Transact-SQL statement or stored procedure to execute
at the data source.</param>
''' <param name="cmdType">A value indicating how the
System.Data.SqlClient.SqlCommand.CommandText property is to be interpreted.</param>
''' <param name="parameters">The parameters of the Transact-SQL statement or
stored procedure.</param>
''' <returns>The number of rows affected.</returns>
Public Function ExecuteNonQuery(ByVal cmd As String, ByVal cmdType As
CommandType, Optional ByVal parameters() As SqlParameter = Nothing) As Integer
Dim connection As SqlConnection = Nothing
Dim transaction As SqlTransaction = Nothing
Dim command As SqlCommand = Nothing
Dim res As Integer = -1
Try
connection = New SqlConnection(_connectionString)
command = New SqlCommand(cmd, connection)
command.CommandType = cmdType
Me.AssignParameters(command, parameters)
connection.Open()
transaction = connection.BeginTransaction()
command.Transaction = transaction
res = command.ExecuteNonQuery()
transaction.Commit()
Catch ex As Exception
If Not (transaction Is Nothing) Then
transaction.Rollback()
End If
Throw New SqlDatabaseException(ex.Message, ex.InnerException)
Finally
If Not (connection Is Nothing) AndAlso (connection.State =
ConnectionState.Open) Then connection.Close()
If Not (command Is Nothing) Then command.Dispose()
If Not (transaction Is Nothing) Then transaction.Dispose()
End Try
Return res
End Function

''' <summary>
''' Executes a Transact-SQL statement against the connection and returns the
number of rows affected.
''' </summary>
''' <param name="spname">The stored procedure to execute at the data
source.</param>
''' <param name="returnValue">The returned value from stored procedure.</param>
''' <param name="parameterValues">The parameter values of the stored
procedure.</param>
''' <returns>The number of rows affected.</returns>
Public Function ExecuteNonQuery(ByVal spname As String, ByRef returnValue As
Integer, ByVal ParamArray parameterValues() As Object) As Integer
Dim connection As SqlConnection = Nothing
Dim transaction As SqlTransaction = Nothing
Dim command As SqlCommand = Nothing
Dim res As Integer = -1
Try
connection = New SqlConnection(_connectionString)
command = New SqlCommand(spname, connection)
command.CommandType = CommandType.StoredProcedure
connection.Open()
SqlCommandBuilder.DeriveParameters(command)
Me.AssignParameters(command, parameterValues)
transaction = connection.BeginTransaction()
command.Transaction = transaction
res = command.ExecuteNonQuery()
returnValue = command.Parameters(0).Value
transaction.Commit()
Catch ex As Exception
If Not (transaction Is Nothing) Then
transaction.Rollback()
End If
Throw New SqlDatabaseException(ex.Message, ex.InnerException)
Finally
If Not (connection Is Nothing) AndAlso (connection.State =
ConnectionState.Open) Then connection.Close()
If Not (command Is Nothing) Then command.Dispose()
If Not (transaction Is Nothing) Then transaction.Dispose()
End Try
Return res
End Function

#End Region

#Region " ExecuteScalar "

''' <summary>
''' Executes the query, and returns the first column of the first row in the
result set returned by the query. Additional columns or rows are ignored.
''' </summary>
''' <param name="cmd">The Transact-SQL statement or stored procedure to execute
at the data source.</param>
''' <param name="cmdType">A value indicating how the
System.Data.SqlClient.SqlCommand.CommandText property is to be interpreted.</param>
''' <param name="parameters">The parameters of the Transact-SQL statement or
stored procedure.</param>
''' <returns>The first column of the first row in the result set, or a null
reference if the result set is empty.</returns>
Public Function ExecuteScalar(ByVal cmd As String, ByVal cmdType As CommandType,
Optional ByVal parameters() As SqlParameter = Nothing) As Object
Dim connection As SqlConnection = Nothing
Dim transaction As SqlTransaction = Nothing
Dim command As SqlCommand = Nothing
Dim res As Object = Nothing
Try
connection = New SqlConnection(_connectionString)
command = New SqlCommand(cmd, connection)
command.CommandType = cmdType
Me.AssignParameters(command, parameters)
connection.Open()
transaction = connection.BeginTransaction()
command.Transaction = transaction
res = command.ExecuteScalar()
transaction.Commit()
Catch ex As Exception
If Not (transaction Is Nothing) Then
transaction.Rollback()
End If
Throw New SqlDatabaseException(ex.Message, ex.InnerException)
Finally
If Not (connection Is Nothing) AndAlso (connection.State =
ConnectionState.Open) Then connection.Close()
If Not (command Is Nothing) Then command.Dispose()
If Not (transaction Is Nothing) Then transaction.Dispose()
End Try
Return res
End Function

''' <summary>
''' Executes the query, and returns the first column of the first row in the
result set returned by the query. Additional columns or rows are ignored.
''' </summary>
''' <param name="spname">The stored procedure to execute at the data
source.</param>
''' <param name="returnValue">The returned value from stored procedure.</param>
''' <param name="parameterValues">The parameter values of the stored
procedure.</param>
''' <returns>The first column of the first row in the result set, or a null
reference if the result set is empty.</returns>
Public Function ExecuteScalar(ByVal spname As String, ByRef returnValue As
Integer, ByVal ParamArray parameterValues() As Object) As Object
Dim connection As SqlConnection = Nothing
Dim transaction As SqlTransaction = Nothing
Dim command As SqlCommand = Nothing
Dim res As Object = Nothing
Try
connection = New SqlConnection(_connectionString)
command = New SqlCommand(spname, connection)
command.CommandType = CommandType.StoredProcedure
connection.Open()
SqlCommandBuilder.DeriveParameters(command)
Me.AssignParameters(command, parameterValues)
transaction = connection.BeginTransaction()
command.Transaction = transaction
res = command.ExecuteScalar()
returnValue = command.Parameters(0).Value
transaction.Commit()
Catch ex As Exception
If Not (transaction Is Nothing) Then
transaction.Rollback()
End If
Throw New SqlDatabaseException(ex.Message, ex.InnerException)
Finally
If Not (connection Is Nothing) AndAlso (connection.State =
ConnectionState.Open) Then connection.Close()
If Not (command Is Nothing) Then command.Dispose()
If Not (transaction Is Nothing) Then transaction.Dispose()
End Try
Return res
End Function

#End Region

#Region " ExecuteReader "

''' <summary>
''' Sends the System.Data.SqlClient.SqlCommand.CommandText to the
System.Data.SqlClient.SqlCommand.Connection, and builds a
System.Data.SqlClient.SqlDataReader using one of the System.Data.CommandBehavior values.
''' </summary>
''' <param name="cmd">The Transact-SQL statement or stored procedure to execute
at the data source.</param>
''' <param name="cmdType">A value indicating how the
System.Data.SqlClient.SqlCommand.CommandText property is to be interpreted.</param>
''' <param name="parameters">The parameters of the Transact-SQL statement or
stored procedure.</param>
''' <returns>A System.Data.SqlClient.SqlDataReader object.</returns>
Public Function ExecuteReader(ByVal cmd As String, ByVal cmdType As CommandType,
Optional ByVal parameters() As SqlParameter = Nothing) As IDataReader
Dim connection As SqlConnection = Nothing
Dim command As SqlCommand = Nothing
Dim res As SqlDataReader = Nothing
Try
connection = New SqlConnection(_connectionString)
command = New SqlCommand(cmd, connection)
command.CommandType = cmdType
Me.AssignParameters(command, parameters)
connection.Open()
res = command.ExecuteReader(CommandBehavior.CloseConnection)
Catch ex As Exception
Throw New SqlDatabaseException(ex.Message, ex.InnerException)
End Try
Return CType(res, IDataReader)
End Function

''' <summary>
''' Sends the System.Data.SqlClient.SqlCommand.CommandText to the
System.Data.SqlClient.SqlCommand.Connection, and builds a
System.Data.SqlClient.SqlDataReader using one of the System.Data.CommandBehavior values.
''' </summary>
''' <param name="spname">The stored procedure to execute at the data
source.</param>
''' <param name="returnValue">The returned value from stored procedure.</param>
''' <param name="parameterValues">The parameter values of the stored
procedure.</param>
''' <returns>A System.Data.SqlClient.SqlDataReader object.</returns>
Public Function ExecuteReader(ByVal spname As String, ByRef returnValue As
Integer, ByVal ParamArray parameterValues() As Object) As IDataReader
Dim connection As SqlConnection = Nothing
Dim command As SqlCommand = Nothing
Dim res As SqlDataReader = Nothing
Try
connection = New SqlConnection(ConnectionString)
command = New SqlCommand(spname, connection)
command.CommandType = CommandType.StoredProcedure
connection.Open()
SqlCommandBuilder.DeriveParameters(command)
Me.AssignParameters(command, parameterValues)
res = command.ExecuteReader(CommandBehavior.CloseConnection)
returnValue = command.Parameters(0).Value
Catch ex As Exception
Throw New SqlDatabaseException(ex.Message, ex.InnerException)
End Try
Return CType(res, IDataReader)
End Function

#End Region

#Region " FillDataset "

''' <summary>
''' Adds or refreshes rows in the System.Data.DataSet to match those in the data
source using the System.Data.DataSet name, and creates a System.Data.DataTable named
"Table."
''' </summary>
''' <param name="cmd">The Transact-SQL statement or stored procedure to execute
at the data source.</param>
''' <param name="cmdType">A value indicating how the
System.Data.SqlClient.SqlCommand.CommandText property is to be interpreted.</param>
''' <param name="parameters">The parameters of the Transact-SQL statement or
stored procedure.</param>
''' <returns>A System.Data.Dataset object.</returns>
Public Function FillDataset(ByVal cmd As String, ByVal cmdType As CommandType,
Optional ByVal parameters() As SqlParameter = Nothing) As DataSet
Dim connection As SqlConnection = Nothing
Dim command As SqlCommand = Nothing
Dim sqlda As SqlDataAdapter = Nothing
Dim res As New DataSet
Try
connection = New SqlConnection(_connectionString)
command = New SqlCommand(cmd, connection)
command.CommandType = cmdType
AssignParameters(command, parameters)
sqlda = New SqlDataAdapter(command)
sqlda.Fill(res)
Catch ex As Exception
Throw New SqlDatabaseException(ex.Message, ex.InnerException)
Finally
If Not (connection Is Nothing) Then connection.Dispose()
If Not (command Is Nothing) Then command.Dispose()
If Not (sqlda Is Nothing) Then sqlda.Dispose()
End Try
Return res
End Function

#End Region
#Region " ExecuteDataset "

''' <summary>
''' Calls the respective INSERT, UPDATE, or DELETE statements for each inserted,
updated, or deleted row in the System.Data.DataSet with the specified
System.Data.DataTable name.
''' </summary>
''' <param name="insertCmd">A command used to insert new records into the data
source.</param>
''' <param name="updateCmd">A command used to update records in the data
source.</param>
''' <param name="deleteCmd">A command for deleting records from the data
set.</param>
''' <param name="ds">The System.Data.DataSet to use to update the data source.
</param>
''' <param name="srcTable">The name of the source table to use for table
mapping.</param>
''' <returns>The number of rows successfully updated from the
System.Data.DataSet.</returns>
Public Function ExecuteDataset(ByVal insertCmd As SqlCommand, ByVal updateCmd As
SqlCommand, ByVal deleteCmd As SqlCommand, ByVal ds As DataSet, ByVal srcTable As String)
As Integer
Dim connection As SqlConnection = Nothing
Dim sqlda As SqlDataAdapter = Nothing
Dim res As Integer = 0
Try
connection = New SqlConnection(_connectionString)
sqlda = New SqlDataAdapter
If Not (insertCmd Is Nothing) Then insertCmd.Connection = connection :
sqlda.InsertCommand = insertCmd
If Not (updateCmd Is Nothing) Then updateCmd.Connection = connection :
sqlda.UpdateCommand = updateCmd
If Not (deleteCmd Is Nothing) Then deleteCmd.Connection = connection :
sqlda.DeleteCommand = deleteCmd
res = sqlda.Update(ds, srcTable)
Catch ex As Exception
Throw New SqlDatabaseException(ex.Message, ex.InnerException)
Finally
If Not (connection Is Nothing) Then connection.Dispose()
If Not (insertCmd Is Nothing) Then insertCmd.Dispose()
If Not (updateCmd Is Nothing) Then updateCmd.Dispose()
If Not (deleteCmd Is Nothing) Then deleteCmd.Dispose()
If Not (sqlda Is Nothing) Then sqlda.Dispose()
End Try
Return res
End Function

#End Region

#Region " ExecuteScript "

''' <summary>
''' Executes a SQL query file against the connection.
''' </summary>
''' <param name="filename">SQL query file name.</param>
''' <param name="parameters">The parameters of the SQL query file.</param>
Public Sub ExecuteScript(ByVal filename As String, Optional ByVal parameters() As
SqlParameter = Nothing)
Dim fStream As FileStream = Nothing
Dim sReader As StreamReader = Nothing
Dim connection As SqlConnection = Nothing
Dim command As SqlCommand = Nothing
Try
fStream = New FileStream(filename, FileMode.Open, FileAccess.Read)
sReader = New StreamReader(fStream)
connection = New SqlConnection(ConnectionString)
command = connection.CreateCommand()
connection.Open()
While (Not sReader.EndOfStream)
Dim sb As New StringBuilder
While (Not sReader.EndOfStream)
Dim s As String = sReader.ReadLine
If (Not String.IsNullOrEmpty(s)) AndAlso (s.ToUpper.Trim = "GO")
Then
Exit While
End If
sb.AppendLine(s)
End While
command.CommandText = sb.ToString
command.CommandType = CommandType.Text
AssignParameters(command, parameters)
command.ExecuteNonQuery()
End While
Catch ex As Exception
Throw New SqlDatabaseException(ex.Message, ex.InnerException)
Finally
If (Not IsNothing(connection)) AndAlso (connection.State =
ConnectionState.Open) Then connection.Close()
If (Not IsNothing(command)) Then command.Dispose()
If (Not IsNothing(sReader)) Then sReader.Close()
If (Not IsNothing(fStream)) Then fStream.Close()
End Try
End Sub

#End Region

End Class

End Namespace

SQLDataProvider Class Documentation

This class provides a fast and universal method for accessing SQL Server database.

Create Instance

At first you create an instance of SqlDatabase class.


Dim sqldb As New SqlDatabase("Data Source=(local); Initial Catalog= ;
UId = ; Pwd = ;")

For more information about connection strings, visit ConnectionStrings.com.

ExecuteNonQuery Method

Executes a Transact-SQL statement against the connection and returns the number of
rows affected.
Dim params(0 To 1) As SqlParameter
params(0) = New SqlParameter("@Firstname", SqlDbType.NVarChar, 120)
params(0).Value = "Stefan"
params(1) = New SqlParameter("@Lastname", SqlDbType.NVarChar, 120)
params(1).Value = "Cameron"
sqldb.ExecuteNonQuery("Insert Into dbo.Users(Firstname, LastName)
Values(@FirstName, @LastName)", CommandType.Text, params)

If you are using stored procedure,you can execute that without declaring parameters
such as following code:
sqldb.ExecuteNonQuery("dbo.CreateUser", Nothing, "Stefan", "Cameron")

ExecuteScalar Method
Executes the query, and returns the first column of the first row in the result set returned
by the query. Additional columns or rows are ignored.
Dim count As Integer = sqldb.ExecuteScalar("Select Count(*) From
dbo.Users", CommandType.Text)
MsgBox("Number of row(s): " & count)

ExecuteReader Method

Sends the CommandText to the Connection and builds a SqlDataReader.


Dim FirstName As String = String.Empty
Dim LastName As String = String.Empty

Dim params(0) As SqlParameter


params(0) = New SqlParameter("@Id", SqlDbType.Int)
params(0).Value = 1

Dim dr As IDataReader = sqldb.ExecuteReader("Select * From dbo.Users


Where (Id = @Id)", CommandType.Text, params)
While dr.Read()
FirstName = dr("Firstname")
LastName = dr("Lastname")
End While
dr.Close()

MsgBox(FirstName & " " & LastName, MsgBoxStyle.Information)

There is a sample for using stored procedure:


Create Procedure [dbo].[GetUserInfo]
(
@Id int
)
As
Begin
Select * From dbo.Users Where (Id = @Id)
End

Dim FirstName As String = String.Empty


Dim LastName As String = String.Empty

Dim dr As IDataReader = sqldb.ExecuteReader("dbo.GetUserInfo", Nothing,


1)
While dr.Read()
FirstName = dr("Firstname")
LastName = dr("Lastname")
End While
dr.Close()

MsgBox(FirstName & " " & LastName, MsgBoxStyle.Information)

Using Return Value Parameter

If you are using stored procedure,you can get the value of 'return value parameter'.
Create Procedure dbo.UserExists
(
@Firstname nvarchar(120),
@Lastname nvarchar(120)
)
As
Begin
If Exists(Select * From dbo.Users Where (Firstname = @Firstname)
And (Lastname = @Lastname))
Return 1
End

Dim retval As Integer


sqldb.ExecuteNonQuery("dbo.UserExists", retval, "Stefan", "Cameron")
MsgBox("User Exists: " & IIf(retval = 1, "Yes", "No"))

FillDataset Method

Adds or refreshes rows in the System.Data.DataSet to match those in the data source
using the System.Data.DataSet name, and creates a System.Data.DataTable named
"Table."

Binding a DataGridView with FillDataset method.


DataGridView1.DataSource = sqldb.FillDataset("Select * From dbo.Users",
CommandType.Text).Tables(0)

ExecuteDataset Method

Calls the respective INSERT, UPDATE, or DELETE statements for each inserted, updated,
or deleted row in the System.Data.DataSet with the specified System.Data.DataTable
name.
' Getting the System.Data.DataSet.
Dim ds As DataSet = CType(DataGridView1.DataSource, DataTable).DataSet

' Declaring insert command object


Dim inscmd As New SqlCommand("Insert Into dbo.Users(Firstname,
Lastname) Values(@Firstname, @Lastname)")
With inscmd
.CommandType = CommandType.Text
.Parameters.Add(New SqlParameter("@Firstname", SqlDbType.NVarChar,
120)).SourceColumn = "Firstname"
.Parameters.Add(New SqlParameter("@Lastname", SqlDbType.NVarChar,
120)).SourceColumn = "Lastname"
End With

' Declaring update command object


Dim updcmd As New SqlCommand("Update dbo.Users Set Firstname =
@Firstname, Lastname = @Lastname Where (Id = @Id)")
With updcmd
.CommandType = CommandType.Text
.Parameters.Add(New SqlParameter("@Id",
SqlDbType.Int)).SourceColumn = "Id"
.Parameters.Add(New SqlParameter("@Firstname", SqlDbType.NVarChar,
120)).SourceColumn = "Firstname"
.Parameters.Add(New SqlParameter("@Lastname", SqlDbType.NVarChar,
120)).SourceColumn = "Lastname"
End With
' Declaring delete command object
Dim delcmd As New SqlCommand("Delete From dbo.Users Where (Id = @Id)")
With delcmd
.CommandType = CommandType.Text
.Parameters.Add(New SqlParameter("@Id",
SqlDbType.Int)).SourceColumn = "Id"
End With

' Updating data source


sqldb.ExecuteDataset(inscmd, updcmd, delcmd, ds, ds.Tables(0).TableName)
This code will put in a TAB CHARACTER into any TEXT STRING such as
a MenuItems Caption, a MsgBox, etc.. For Example if you've defined your
own KeyDown Events in Private Sub Form_KeyDown(KeyCode As Integer,
Shift As Integer) you wouldn't want to use VB's Menu Editor Shortcuts
option for every MenuItem (since you already have the shortcuts defined).
So now all you have to do is let the user know what menuitem has what
shortcut. But you want the Shortcuts to be displayed one tab character after
the Title Caption of the MenuItem. To do this successfully we use:
Chr$(vbKeyTab)
The Chr$() function is a built in function that gets an integer value passed
into the parameter. However to put in the Tab Characters integer (9), it
would return the number 9 and not the Tab Character. So we pass vbKeyTab
to this parameter and voila.
'Example using a MenuItem and a MsgBox
'The MenuItem is Named mnuFileOpen
'The MenuItems Caption property will get put into the
'Form's Load Event

Private Sub Form_Load()


mnuFileOpen.Caption = "Open" & Chr$(vbKeyTab) & "Ctrl+O"
End Sub

'Define the KeyCode and Shift Integers for mnuFileOpen


Private Sub Form_KeyDown(KeyCode As Integer, _
Shift As Integer)
Select Case Shift
Case 2 'If the Ctrl Key is pressed
If KeyCode = vbKeyO Then 'If the "o" Key is pressed
Call mnuFileOpen_Click
End If
End Select
End Sub
'Define the mnuFileOpen_Click() event
Private Sub mnuFileOpen_Click()
'Actions to perform when the File/Open MenuItem
'is Clicked
'Example
MsgBox "Here is a Message Box using the Tab Character" & vbCrLf &
Chr$(vbKeyTab) & "What's up Doc!"
End Sub

Opening a Form by Type or Name


http://vbcity.com/forums/faq.asp?tid=33930
Seen this question a couple of times: how to create an instance of a form if it is not know in
advance which formtype has to be opened.

If you want to skip the chitchat: the .NET code example is at the end of this post

First the symantics: when we create a new form, this form has a name. If we refer to that
name, we actually refer to the name of the type of object that is just created.

When to use
Of course when reading the subject you might think: why not just pass the form to a
parameter that takes a form (or control/object)?

The answer is: you don't when it is not sure, when or if a new instance of the object has to be
created or, as mentioned, when the procedure is called it is not known which class has to be
created.

You could of course hold a bunch of created objects, but that would be a shameless misuse of
memory.

Imagine the following scenario (seen something like this in a post, but can't find it anymore):

You have a class that is able to trap an event, say the doubleclick of a textbox, and has to
open a form when it occurs. If it's always the same form, that's easy, but what if you want it
to be determined during runtime? This is a quite common story: doubleclick on article opens
the detail form of that article, doubleclick on supllier opens that particular form. If you use a
form variable, how do you say to the class which form should be opened? This will not work

Code:
Dim FormToOpen as Form 'you don't want to open it right away, you want to know when the
time comes what form to open
FormToOpen = Form1

You could say FormToOpen = new Form1, but then 1. an instance would be immediately
created, even if it never will be used: memory leak. 2. you can never close the form, you'll
always have to use the same instance created when setting the form. Consequently, you can
never open more than 1 instance using this way.

The solution: use the type. If you know the type, the Activator class will enable you to open
(and return) an instance of that form at any time and as much times as you like. (The
Activotor class exposes the function CreateInstance which returns an instance of the specified
object)
The following code creates an instance of the type form1 and shows it.

Code:
CType(Activator.CreateInstance(GetType(Form1)), Form).Show()
Or for better readability, the same code split up:
Code:

Dim FormToOpen As Type


FormToOpen = GetType(Form1)
Dim frm As Form = CType(Activator.CreateInstance(FormToOpen), Form)
frm.Show()

Looking back: VB6


In vb6 we could add a form with:

Code:
'VB6
Dim FormName as String
How To Print a Form
http://vbcity.com/forums/faq.asp?tid=28614
Difficulty Level : Intermediate

This is how you can take a picture of the form and print it.

First thing you have to do is add a PrintDocument component to the form. You can get that
from the Toolbox (way down the list).

Then you need to add a PrintDialog to the form as well. Also a button that says "Print" is
probably a good idea...

Code:
'We declare this here, cause were going to take the picture befor we show the print dialog
'I tried to take the picture in the PrintPage sub but it didnt work, would print the dialogs, etc.
'So we take the picture when the user presses the button, then show the dialog.
Private Print_Image As Image

'This is used to take the picture


Declare Auto Function BitBlt Lib "GDI32.DLL" ( _
ByVal hdcDest As IntPtr, _
ByVal nXDest As Integer, _
ByVal nYDest As Integer, _
ByVal nWidth As Integer, _
ByVal nHeight As Integer, _
ByVal hdcSrc As IntPtr, _
ByVal nXSrc As Integer, _
ByVal nYSrc As Integer, _
ByVal dwRop As Int32) As Boolean

Private Sub btnPrint_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)


Handles btnPrint.Click

'We make the form look pretty before its picture


Application.DoEvents()
Me.Refresh()
Application.DoEvents()

'Get a Graphics Object from the form


Dim FormG As Graphics = Me.CreateGraphics

'Create a bitmap from that graphics


Dim i As New Bitmap(Me.Width, Me.Height, FormG)

'Create a Graphics object in memory from that bitmap


Dim memG As Graphics = Graphics.FromImage(i)

'get the IntPtr's of the graphics


Dim HDC1 As IntPtr = FormG.GetHdc
Dim HDC2 As IntPtr = memG.GetHdc

'get the picture


BitBlt(HDC2, 0, 0, Me.ClientRectangle.Width, Me.ClientRectangle.Height, HDC1, 0, 0,
13369376)

'Clone the bitmap so we can dispose this one


Me.Print_Image = i.Clone()

'Clean Up
FormG.ReleaseHdc(HDC1)
memG.ReleaseHdc(HDC2)
Muon' xem moi. nguoi` dung` mo hin`h layer nhu* the' nao` , chi tiet' ^^ .

Em thuong` dung` la` mo hin`h

Kernel
DataAccess
Bussiness
User Control
Presentation

Cho cac' project co' tuong tac' Database


Trong Kernel se~ co' cac' lop' go^c' va` chuan? cua? ung' dung. , vi' du. nhu*
SqlBase
OdbcBase
etc....
ModuleBase
XmlBase
Common
AppException
etc...

cac' lop' nay` la` cac' lop' chi? nhan. cac' tham so' , va` duoc. cac' lop' phia' sau ke' thua` .
Common la` lop' chua cac' ham` static dung` chung
getConnection() tra? ve` connection
readConnfig(configName) doc config trong file config
encrypt()
decrypt()
...
AppException la` lop' ke' thua` tu` Exception , moi. Exception trong ung' dung. se~ duoc. throw new
cai' nay` , roi` se~ bat' het' tai. ham` main , tham so' truyen` vao` la` Message , InnerException .

SqlBase la` lop' quan? ly' Sql chung nhat' , input la` 1 connection , se~ co' cac' ham` connect ,
disconnect, ExcuteNonReturn , FillDataSet , ,,,etc , dung` voi' connection la` Sql
OdbcBase tuong tu.

XmlBase la` lop' quan ly' Xml chung , co' cac' method Creat, Remove , Update , Read cac Key va`
Value .

Tang` DataAccess se~ viet' cac' lop' quan ly' vao` ra du~ lieu. , ke' thua` tu` SqlBase , or OdbcBase
... , moi~ mot. doi' tuong. se~ co' 1 lop' tai. day , vi' du. Student , Manager ,...etc . cac' cau lenh. Sql
duoc. viet' tai. lop' nay` , va` su? dung. cac' ham` tu` lop' SqlBase de? excute .

Bussiness la` tang` tiep' theo , voi' moi~ doi' tuong. cua? DataAccess , se~ co' 1 lop' tai. Bussiness
de? control , lop' nay` se~ new 1 lop' tuong ung' tai. DataAccess de? su? dung. , du~ lieu. truyen`
vao` la` ca'c bien' duoc. validate , roi` truyen` xuong' cho DataAccess de? thanh` cau lenh. Sql ,

User Control la` tang` khoi? tao. cac' Modules , No' nhan. cac' du~ lieu. tu` Bussiness chuyen? len ,
va` fill vao` cac' Control . Moi~ module se~ su? dung. 1 so' luong. gioi' han. cac' control , vi' du.
modules view Student , se~ su? dung 1 listbox , 3 textBox ... gi` gi` do' , cai' user Control nay` ko
can` biet' textBox la` gi` , cu' fill vao` thoi , moi~ lop' tai. tang` UserControl la` 1 module trong
chuong trin`h . va` duoc. ke' thua` tu` lop' moduleBase tu` kernel ,
Vi' du. ung' dung. cua? em la` tao. Report quan? ly' Examination , thi` ko can` biet' giao dien. trong
ra sao , duoi' kernel se~ co' 1 interface , khai bao' cac' control can` co' , va` cai' user control se~
theo do' ma` fill vao` .

Tang` tren cung` hoan toan` chi? la` giao dien. , tuan theo cai' interface kia ,

Cac'h thiet' ke' phia' tren cua? em co' cai' loi. , do' la` em co' the? lam` da giao dien. 1 cach' de~
dang` , moi. thu' van~ hoat. dong. , mac. du` ko can` den' tang` tren cung` , tang` tren cung` chi?
de? hien? thi. ma` thoi , vi` the' co' the? de~ dang` chuyen? thanh` giao dien. dong` lenh. voi' cac'
ung' dung. unix
. Chia viec. cho cac' coder cung~ de~ dang` , voi' moi~ modules phan ra , nguoi` code se~ viet' 2
lop' , 1 lop' tai. DataAccess de? chay. lenh. , 1 lop' tai. Bussiness de? validate du~ lieu. .
Tang` kernel va` usercontrol hoan` toan` dung` lai. duoc. .
Co' the? thuc. hien. multi connection .
( trong cac' ung' dung. chuyen? doi? database tu` Access --> Sql server , rat pho? bien' tai. VN )
Voi' moi~ nguoi` viet' phan` cua? mi`nh , se~ ko biet' tang` tren co' cai' gi` , chi? duoc. dua cho 1
cai' dll duoc. bien dich tu` trang` tren. Co' the? bao? mat. thong tin ve` he. thong' .

Mong moi. nguoi` gop' y' ve` cac'h thiet' ke' cua? em ^^ .

code đệ quy duyệt toàn bộ các menu trong 1 MENUTRIP ( bất kể có bao nhiêu cấp ), bạn có thể
sửa đổi đoạn code này để tạo TREE trong tree view hay GRID , tham số DT là 1 datatable chứa
các menu mà người dùng được phép truy cập, nếu không tìm thấy thì menu đó sẽ bị disable

Private Sub ScanMenu(ByRef Menu As Object, ByRef DT As DataTable)


If Menu Is Nothing Then Return
Dim mns As MenuStrip = TryCast(Menu, MenuStrip)
'if first levels
If mns IsNot Nothing Then
For I As Integer = 0 To mns.Items.Count - 1
Dim Mi As ToolStripMenuItem = mns.Items(I)
If Mi.DropDownItems.Count > 0 Then
ScanMenu(Mi, DT)
End If
Next
Else
Dim Mi As ToolStripMenuItem = TryCast(Menu, ToolStripMenuItem)
If Mi Is Nothing Then Return
For I As Integer = 0 To Mi.DropDownItems.Count - 1
Dim subMi As ToolStripMenuItem
subMi = TryCast(Mi.DropDownItems(I), ToolStripMenuItem)
If subMi Is Nothing Then Continue For
If subMi.DropDownItems.Count > 0 Then
ScanMenu(subMi, DT)
Else

Dim X As DataRow() = DT.Select(String.Format("AccessMenu='{0}'", subMi.Text))


subMi.Visible = Not (X.Length = 0)
End If
Next
End If
End Sub

Đoạn mã của mình là dùng đệ quy để duyet toàn bô các item trong menu dùng để :
- Vẽ cây phân quyền ( tree view hoặc dùng c1 flexgrid )
- Duyet menu để phân quyen - thường là ẩn menu đó đi
sửa đổi 1 chút cho khớp với dữ liệu của bạn .
Chỉ áp dụng cho menutrip

Tôi cần hiển thị danh sách các đơn hàng và chi tiết từng đơn hàng trên 1 grid. có bảng
tblDonHang và tblChiTietDonHang. Thường khi lập trình ta sẽ tạo ra dataset có 2 bảng đó và đặt
quan hệ Master - Detail thì việc hiện thị là dễ dàng. Dự án được xây dựng theo phương pháp
hướng đối tượng --> có 2 lớp tương ứng là clsDonHang và clsChiTietDonHang. 2 lớp trên có các
phương thức trả về dữ liệu là tập các object chứ không còn là các record nên tôi chưa có cách.
Bác nào đã xử lý vấn đề này thì có thể giúp tôi xử lý với! help me!!!!!!!
Thông thường nếu xây dựng các lớp xử lý dữ liệu sẽ có các phương thức trả về đối tượng mang
dữ liệu tương ứng.

Ví dụ trong trường hợp của bạn, tôi giả sử mỗi đối tượng TABLE ( đơn hàng, chi tiết đơn hàng)
đều có các phương thức sau:
FillData: lấy dữ liệu và điền dữ liệu vào đối tượng bạn cung cấp.
GetData: lấy dữ liệu và trả về đối tượng tương ứng chứa dữ liệu đó.

Có thể phương thức này có dạng sau (trong trường hợp của bạn):
public class ChiTietDonHangDataTable : System.Data.Table
{

}
public class DonHangDataTable : System.Data.Table
{

}
public class clsDonHang
{
public void FillData (DonHangDataTable donhang)
{
}
public DonHangDataTable GetData ()
{
DonHangDataTable _donhang = new DonHangDataTable();
//lấy dữ liệu ở đây
// ....................
return _donhang;
}
}
public class clsChiTietDonHang
{
public void FillData(DonHangDataTable donhang)
{
}
public DonHangDataTable GetData()
{
DonHangDataTable _donhang = new DonHangDataTable();
//lấy dữ liệu ở đây
// ....................
return _donhang;
}
}
//Vậy trong trường hợp của bạn có thể xử lý như sau:
public void InitDataSet()
{

DataSet _dsDonHang = new DataSet();


DonHangDataTable _dtDonHang = new DonHangDataTable();
ChiTietDonHangDataTable _dtChiTietDonHang = new ChiTietDonHangDataTable();
clsDonHang _objDonHang = new clsDonHang();
clsChiTietDonHang _objChiTietDonHang = new clsChiTietDonHang();

_objDonHang.FillData(_dtDonHang);
_objChiTietDonHang.FillData(_objChiTietDonHang);
_dsDonHang.Tables.Add(_dtDonHang);
_dsDonHang.Tables.Add(_dtChiTietDonHang);

_dsDonHang.Relations.Add(new DataRelation("DonHang_ChiTietDonHang", "", ""));

//Gán vào Lưới ở đây

Có lẽ tôi chưa hiểu rõ ý bạn muốn trao đổi, nhưng theo như tôi hiểu là bạn muốn sử dụng các
object đó với các giá trị của các property của nó lên các control, vấn đề này thì tôi thấy NET 2 đã
xử lý rồi mà, bạn chứa các object đó trong một List<>, sau đó bạn chỉ việc dùng list này
làm datasource này cho các control có khác gì là datatable, dataview hay datareader đâu, ngoài
ra để binding theo đúng nghĩa bạn còn có thể xây dựng các phương thức để insert, update và
delete nữa, nó còn có vẻ tiện hơn là sử dụng các command cho cái adapter trước kia. Thực ra
sau khi dùng cái này tôi ít khi còn sử dụng datatable, dataview ... để tương tác dữ liệu đằng UI
nữa.
Hitting the enter key in a TextBox can sometimes have undesired effects like the
wrong submit Button being “clicked“. The method described below allows you to
specify a default Button to submit when the user hits the enter key in a TextBox.

When you press a key on your keyboard, the js OnKeyPress event is fired. This calls
a function to which we pass the id of the button associated with the TextBox. The
function gets a reference to the button and simuilates a mouse-click on the Button.
We perform a browser detection because IE and Netscape have different event
models. The function finally returns false so that the keypress event is cancelled
(otherwise a second form submit will be raised). This works with newer versions of
IE/Netscape.

function clickButton(e, buttonid){


var evt = e ? e : window.event;
var bt = document.getElementById(buttonid);
if (bt){
if (evt.keyCode == 13){
bt.click();
return false;
}
}
}

//code behind
TextBox1.Attributes.Add("onkeypress", "return clickButton(event,'" +
Button1.ClientID + "')");

The code behind generates the following code:

<input name="TextBox1" type="text" id="TextBox1" onkeypress="return


clickButton(event,'Button1')" />

This causes web control Button1 to be clicked when the enter key is hit inside
TextBox1.

i am taking one textBox and DataGrid. i want to fill DataGrid while typing the letter
(KeyPress-Event).the coding is as follows
Private Sub TextBox1_TextChanged(ByVal sender As System.Object, ByVal e As
System.EventArgs)

Dim con As New SqlConnection("server=localhost;uid=sa;pwd=;DataBase=EMP")

Dim com As SqlCommand

Dim Ds As DataSet

Dim Da As SqlDataAdapter

com = New SqlCommand("SELECT * FROM EMPLOYEE ", con)

Ds = New DataSet

Da = New SqlDataAdapter(com)

Da.Fill(Ds, "EMPLOYEE")

DataGrid1.DataSource = Ds

DataGrid1.DataBind()

con.Close()

End Sub

Mnh có một form với nhiều textbox nhập liệu. Để di chuyển giữa các text box thì mình đặt
tabindex theo thứ tự, khi form hoạt động thì nhấn tab để di chuyển. Nhưng mình muốn người
dùng khi nhấn vào phím mũi tên trên bàn phím thì cũng có tác dụng như phím tab. Vậy sự kiện
bắt phím này như thế nào.
Mình thấy vb.net có hỗ trợ e.keycode, e.keydata, e.keyvalues mình ko biết cách dùng 3 cái này
thì khác gì nhau. Mình thấy cái e.keycode, e.keydata hình như giống nhau
&nbsp;
Vấn đề 2:
Mình có một maskedtextbox để nhập liệu ngày tháng &nbsp;vào hiển thị dữ liệu lên datagrid. Sau
đó mình muốn dữ liệu sẽ hiện lại lên maskedtextbox khi duyệt dữ liệu. Nhưng với ngày tháng vd
05/02/2003 thì khi hiện lên maskedtextbox với hàm định dạng Ctype(object, datetime) thì nó hiện
lên là&nbsp; 52/20/07__
Vậy phải định dạng thế nào để có thể hiển thị số 0 trước ngày tháng <10 để cho đúng
dạng mm

O van de 1:
Ban mo MSDN len tra tu SendKey.

Vấn đề 2:
drg.Cell[xyz].ToString("dd/MM/yyyy");

Resize Control khi thay đổi độ phân giải của màn hình
Public Class Form1
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles MyBase.Load
Dim rec As Rectangle
Dim CtlOut, CtlIn As Control
For Each CtlOut In Me.Controls
CtlOut.Tag = CtlOut.Top / Me.Height & ";" & CtlOut.Left / Me.Width & ";" &
CtlOut.Width / Me.Width & ";" & CtlOut.Height / Me.Height & ";" & CtlOut.Font.Size /
Me.Height
If TypeOf CtlOut Is GroupBox Then
For Each CtlIn In CtlOut.Controls
CtlIn.Tag = CtlIn.Top / CtlOut.Height & ";" & CtlIn.Left / CtlOut.Width & ";" &
CtlIn.Width / CtlOut.Width & ";" & CtlIn.Height / CtlOut.Height & ";" & CtlIn.Font.Size
/ CtlOut.Height
Next
End If
Next
Me.Height = Screen.GetBounds(rec).Height
Me.Width = Screen.GetBounds(rec).Width
Me.Top = 0 : Me.Left = 0
End Sub
Private Sub Form1_Resize(ByVal sender As Object, ByVal e As System.EventArgs)
Handles Me.Resize
Dim CtlOut, CtlIn As Control
For Each CtlOut In Me.Controls
ResizeControl(Me, CtlOut)
If TypeOf CtlOut Is GroupBox Then
For Each CtlIn In CtlOut.Controls
ResizeControl(CtlOut, CtlIn)
Next
End If
Next
End Sub
Private Sub ResizeControl(ByVal PaCtl As Object, ByVal ChCtl As Control)
Dim ctlTag, CtlTop, CtlLeft, CtlWidth, CtlHeight, ctlFontSize As String
Dim P1, P2 As Integer
ctlTag = ChCtl.Tag.ToString
P1 = ctlTag.IndexOf(";")
CtlTop = ctlTag.Substring(0, P1)
P2 = P1 + 1
P1 = ctlTag.IndexOf(";", P2)
CtlLeft = ctlTag.Substring(P2, P1 - P2)
P2 = P1 + 1
P1 = ctlTag.IndexOf(";", P2)
CtlWidth = ctlTag.Substring(P2, P1 - P2)
P2 = P1 + 1
P1 = ctlTag.IndexOf(";", P2)
CtlHeight = ctlTag.Substring(P2, P1 - P2)
P2 = P1 + 1
ctlFontSize = ctlTag.Substring(P2)
ChCtl.Top = PaCtl.Height * CtlTop
ChCtl.Left = PaCtl.Width * CtlLeft
ChCtl.Height = PaCtl.Height * CtlHeight
ChCtl.Width = PaCtl.Width * CtlWidth
ChCtl.Font = New Font(ChCtl.Font.Name, CSng(PaCtl.Height * ctlFontSize),
ChCtl.Font.Style)
End Sub
End Class

-----
Sub AutoSize(ByVal Form1 As Variant)
On Error Resume Next
If Screen.Width <> 12000 And Screen.Height <> 9000 Then
Dim i As Long, Dai As Single, Rong As Single
Dai = Screen.Width
Rong = Screen.Height
Form1.Width = Form1.Width / (12000 / Dai)
Form1.Height = Form1.Height / (9000 / Rong)
For i = 0 To Form1.Controls.Count - 1
Form1.Controls(i).Top = Form1.Controls(i).Top / (12000 / Dai)
Form1.Controls(i).Left = Form1.Controls(i).Left / (9000 / Rong)
Form1.Controls(i).Width = Form1.Controls(i).Width / (12000 / Dai)
Form1.Controls(i).Height = Form1.Controls(i).Height / (9000 / Rong)
Form1.Controls(i).AutoSize = True
Next i
End If
Err.Clear
End Sub

' Ban co the thay 2 so : 12000 va 9000 bang cac gia tri khac tuong ung voi do phan giai chuan
cua ban la 1024 x 800
Tạo form không thể duy chuyển được
Bạn muốn tạo một form chiếm giữ một vị trí cố định trên màn hình và không thể di
chuyển được.
Tạo một form không-đường-viền bằng cách thiết lập thuộc tính FormBorderStyle là
None. Hoặc bạn có thể hiện thực thuộc tính Moveable cho form.
Bạn có thể tạo một form không-đường-viền bằng cách thiết lập thuộc tính
FormBorderStyle là None. Các form thế này không thể di chuyển được. Và chúng nếu
muốn có đường viền, bạn phải viết mã lệnh vẽ hoặccũng thiếu mất đường viền sử dụng
hình nền.
Có một cách khác để tạo một form không thể di chuyển được và form này có đường viền
giống điều kiểm. Trước tiên, thiết lập các thuộc tính ControlBox, MinimizeBox, và
MaximizeBox là False. Kế tiếp, thiết lập thuộc tính Text là chuỗi trống. Khi đó, form sẽ
có đường viền nổi màu xám hoặc đường kẻ màu đen (tùy thuộc vào tùy chọn
FormBorderStyle mà bạn sử dụng), tương tự như Button.
Phần dưới đây sẽ trình bày một cách tiếp cận khác: hiện thực thuộc tính Moveable cho
form (trong Visual Basic 6, form có thuộc tính Moveable, nhưng trong .NET, thuộc tính
này không còn nữa). Trước tiên, chúng ta xây dựng lớp ImmoveableForm như sau (thừa
kế từ [vb]System.Windows.Forms.Form):

Public Class ImmoveableForm


Inherits System.Windows.Forms.Form

Private Declare Function EnableMenuItem Lib "user32.dll" _


Alias "EnableMenuItem" (ByVal hMenu As IntPtr, _
ByVal uIDEnableItem As Int32, ByVal uEnable As Int32) As Int32

Private Const HTCAPTION As Int32 = &H2

Private Const MF_BYCOMMAND As Int32 = &H0&


Private Const MF_ENABLED As Int32 = &H0&
Private Const MF_GRAYED As Int32 = &H1&
Private Const MF_DISABLED As Int32 = &H2&

Private Const SC_MOVE As Int32 = &HF010&

Private Const WM_NCLBUTTONDOWN As Int32 = &HA1


Private Const WM_SYSCOMMAND As Int32 = &H112
Private Const WM_INITMENUPOPUP As Int32 = &H117&

Private bMoveable As Boolean = True

Public Sub New()


MyBase.New()
End Sub

<System.ComponentModel.Category("Behavior"), _
System.ComponentModel.Description("Allows the form to be moved")> _
Public Overridable Property Moveable() As Boolean
Get
Return bMoveable
End Get
Set(ByVal Value As Boolean)
If bMoveable <> Value Then
bMoveable = Value
End If
End Set
End Property

Protected Overrides Sub WndProc( _


ByRef m As System.Windows.Forms.Message)
If m.Msg = WM_INITMENUPOPUP Then
' Thụ lý việc hiển thị menu hệ thống.
If m.LParam.ToInt32 \ 65536 <> 0 Then
Dim AbleFlags As Int32 = MF_ENABLED
If Not Moveable Then AbleFlags = MF_DISABLED Or MF_GRAYED
EnableMenuItem(m.WParam, SC_MOVE, _
MF_BYCOMMAND Or AbleFlags)
End If
End If

If Not Moveable Then


If m.Msg = WM_NCLBUTTONDOWN Then
' Không cho phép kéo rê cửa sổ bằng thanh tiêu đề.
If m.WParam.ToInt32 = HTCAPTION Then
Return
End If
End If
If m.Msg = WM_SYSCOMMAND Then
' Vô hiệu chức năng Move trên menu hệ thống.
If (m.WParam.ToInt32 And &HFFF0) = SC_MOVE Then
Return
End If
End If
End If
MyBase.WndProc(m)
End Sub

End Class[/vb]

Để sử dụng lớp trên, bạn cần hiệu chỉnh phần mã do Visual Studio kết sinh cho form của
bạn như sau (phần in đậm):

[vb]Public Class Form3


Inherits ImmoveableForm

Public Sub New()


MyBase.New()

' This call is required by the Windows Form Designer.


InitializeComponent()

' Add any initialization after the InitializeComponent() call.

' Vô hiệu khả năng di chuyển form của người dùng.


Me.Moveable = False
End Sub

' (Bỏ qua phần mã còn lại.)


End Class[/vb]

Sau đó chức năng bị vô hiệu hóa

Trích từ "Các giải pháp lập trình VISUAL BASIC .NET (tập 1)"
http://www.dvpub.com.vn/dv/details.aspx?itemid=244
Cách để xác minh mã số sách có hợp lệ hay không trong VB.Net
Xác nhận tính hợp lệ của ISBN

Bạn muốn xác minh một ISBN (International Standard Book Number: mã số sách chuẩn
quốc tế) có hợp lệ hay không.
Tính và kiểm tra bằng phép Mod 11.
Trong trường hợp này, bạn nhân mỗi chữ số với vị trí của nó (ngoại trừ số cuối cùng),
cộng những số này với nhau, và kiểm tra phần dư của tổng chia cho 11 có trùng với chữ
số cuối cùng hay không.
Dưới đây là hàm mà bạn có thể sử dụng để kiểm tra ISBN:
[vb]Private Function ValidateISBN(ByVal value As String) As Boolean
Dim CheckSum As Integer = 0
Dim i As Integer
For i = 0 To value.Length - 2
CheckSum += Integer.Parse(value.Chars(i)) * (i + 1)
Next
Dim CheckDigit As Integer
CheckDigit = Integer.Parse(value.Chars(value.Length - 1))
Return (CheckSum Mod 11 = CheckDigit)
End Function[/vb]
Bạn có thể thử nghiệm hàm này như sau:
[vb]If ValidateISBN("1861007353") Then
' Đây là ISBN hợp lệ.
End If[/vb]
Nhớ rằng phương thức này giả sử mọi dấu “-” đã bị loại khỏi chuỗi. Nếu không chắc
bước này đã được thực hiện hay chưa, bạn có thể viết thêm mã để loại bỏ hoặc bỏ qua
dấu “-” .

Trích từ "Các giải pháp lập trình Visual Basic .Net (tập 1)"
http://www.dvpub.com.vn/dv/details.aspx?itemid=244
Mã hóa password
Tôi muốn mã hóa password trước khi chèn vào DB, không biêt bạn nào đã từng làm
có thể giúp tôi trong code VB.NET được không?
Bạn có thể dùng code sau:
Code:
Private Function Mahoa(ByVal pass As String) As String
Dim uEncode As New UnicodeEncoding
Dim result As Byte() = uEncode.GetBytes(pass)
Dim md5 As New MD5CryptoServiceProvider
result = md5.ComputeHash(result)
Return Convert.ToBase64String(result)
End Function
Và import thêm cái này là ok: System.Security.Cryptography
Đối số trong sự kiện VB.NET
Trong bài này tôi xin nói về hai đối số mà có mặt trong mọi sự kiện của VB.Net. Một
đối số gửi thông tin về đối tượng và một đối số gửi thông tin về hành động mà gây ra
sự kiện.
Hai đối số đó là sender và e. Đây là khai báo của sự kiện Click cho một nút:
[HIGHLIGHT="vb"]Private Sub Button1_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles Button1.Click
'
End Sub[/highlight]
Đối số sender lưu thông tin về đối tượng mà gây ra sự kiện, chúng ta sử dụng đối số
này để xác định kiểu của đối tượng mà sinh ra sự kiện. Ví dụ:
[HIGHLIGHT="vb"]Console.WriteLine(sender.ToString)
System.Windows.Forms.Button, Text: Button1Console.WriteLine(sender.GetType)
System.Windows.Forms.Button[/highlight]
Đối số thứ hai e chứa mọi thông tin mà bạn cần để xử lý sự kiện. Đối tượng e có một
vài thuộc tính mà phụ thuộc vào kiểu của sự kiện và điều khiển sinh ra sự kiện.
Thông tin mà bạn cần thiết để xử lý các kiểu sự kiện được truyền qua đối này.
Sự kiện chuột:
Dãy các sự kiện chuột xảy ra khi bạn nhấn chuột, thứ tự của chúng lần lượt là
MouseDown, Click và MouseUp. Sự kiện chuột xảy ra ngay cả khi bạn di chuyển
chuột qua các điều khiển: sự kiện MouseEnter xảy ra khi chuột bắt đầu đi vào điều
khiển, dãy các sự kiện MouseMove xảy ra khi di chuột trên điều khiển, sau đó là sự
kiện MouseHover và MouseLeave xảy ra khi chuột rời khỏi điều khiển. Mặc dù các sự
kiện khác nhau nhưng chúng cùng gửi thông tin cho ứng dụng qua đối e và bạn có
thể khai thác vài thuộc tính của đối e này để sử dụng trong chương trình của mình:
Button: trả lại một hằng tượng trưng cho nút được nhấn, và nhận giá trị thuộc tập
hằng kiểu liệt kê MouseButtons: Left, Middle, None, Right, XButton1, và XButton2.
Hai giá trị cuối cùng dùng cho kiểu chuột năm nút và tương ứng với hai nút ở hai bên
cạnh. Tuy nhiên đối e trong sự kiện Click hoặc DblClick không cung cấp thuộc tính
Button vì hai sự kiện này chỉ được thực hiện với nút chuột trái.
Clicks: trả về số lần chuột được nhấn và thả, chỉ nhận giá trị 1 hoặc 2.
Delta: thuộc tính được dùng với chuột có nút cuộn, trả về số lần nút cuộn được quay.
Bạn có thể dùng thuộc tính này để biết hộp Textbox đã được cuộn như thế nào.
X,Y: trả lại toạ độ của chuột lúc chuột được nhấn hoặc được thả. Toạ độ chuột được
tính theo toạ độ tương đối của điều khiển liên quan theo pixel. Nếu bạn nhận chuột ở
góc trái trên của một nút thì toạ độ trả về sẽ là 0,0.
Sự kiện bàn phím:
Các điều khiển mà nhận các text thường có nhiều sự kiện bàn phím, ví dụ như điều
khiển TextBox. Sự kiện KeyPress xảy ra khi một phím được nhấn còn sự kiện
KeyDown và KeyUp xảy ra khi một phím được nhấn và thả tương ứng. Sau đây là
khai báo của sự kiện KeyDown của TextBox
[HIGHLIGHT="vb"]Private Sub TextBox1_KeyDown(ByVal sender As Object, ByVal e
As_ System.Windows.Forms.KeyEventArgs) Handles TextBox1.KeyDown
End Sub[/highlight]
Đối thứ hai cung cấp thông tin về trạng thái bàn phím và phím được nhấn thông qua
các thuộc tính của nó.
Alt, Control, Shift: ba thuộc tính trả về giá trị True/False xác định phím điều khiển
tương ứng được nhấn khi phím được nhấn.
KeyCode: trả về mã phím được nhấn và là một giá trị thuộc tập hằng liệt kê Keys.
Tập hằng này chứa giá trị cho mọi phím, ví dụ kí tự "a" và "A" đều có mã là KeysA,
mã của phím "0" bên keypad là Key0, phím F1 là KeyF1. Vài phím điều khiển như
NumLock, ScrollLock, WakeUp và Sleep... luôn trả về KeyCode bằng 0
KeyData: trả về giá trị long xác định phím được nhấn, nó cũng tương tự như thuộc
tính KeyCode nhưng phân biệt kí tự và kí hiệu trên phím.
KeyValue: trả lại giá trị cho phím được nhấn, thường thì cùng giá trị như KeyData, chỉ
khác biệt ở các phím điều khiển.
--------------
Translate from Mastering VB.NET
Thêm, sửa trùng mã

Em muốn hỏi khi thêm dữ liệu ở bảng có khoá chính có kiểu nchar

thì khi thêm hay sửa dữ liệu có thể dẫn đến trùng mã

gây lỗi

Vậy cần phải có thủ tục kiểm tra khoá chính

thông báo nếu trùng thì không cho thêm

nếu trùng thì không cho sửa

Trong trường hợp này Em nên sử dụng thêm một mã nữa.Mã này chính là mã sẽ thay đổi
do người dùng nhập.Và trong thủ tục SQL Em viết như sau:

ALTER PROCEDURE sp_Insert_Update


@ID nvarchar(15),
@Ma nvarchar(15)
IF EXISTS (SELECT Ma FROM TenBang WHERE Ma=@Ma And ID<>@ID)
Begin
Insert ....
End
ELSE
Begin
Update......
End

Để đưa dữ liệu từ bảng khác lên Combo Em làm như sau nhé

Đầu tiên Em viết một thủ tục bằng SQL 2000 để lấy ra bảng Em cần đưa lên Combo
.Chẳng hạn bảng Branch

ALTER PROCEDURE SP_Select_Branch

AS

Select * from Branch


Sau đó Em viết 2 phương thức (Thủ tục sau)

Public Shared Sub ReturnDataAdapter(ByVal strSP As String,ByVal objConn As


SqlConnection) As SqlDataAdapter
Try
' Make a comman object for stored procedure
Dim cmd As New SqlCommand(strSP, objConn)
cmd.CommandType = CommandType.StoredProcedure
Dim adt As New SqlDataAdapter(cmd)
Return adt
Catch ex As Exception
MsgBox("Error :" & ex.Message.ToString, MsgBoxStyle.OKOnly, "Thong Bao
Loi")
Return Nothing
End Try
End Function

'*********************************************************
'Ham dua du lieu vao combo
Public Shared Sub GetData_Into_Cbo(ByVal sqlstr As String, ByVal cboName As
ComboBox, ByVal cboValue As String, ByVal cboDisplay As String, ByVal IsNull As
Boolean,ByVal objConn As SqlConnection)
Try
'ket noi CSDL de lay ra dataset
Dim datAdapter As SqlDataAdapter = New SqlDataAdapter
Dim datDsCB As DataSet = New DataSet
datAdapter = ReturnDataAdapter(sqlstr,objConn )
datAdapter.Fill(datDsCB)
datAdapter.Dispose()
'Kiem tra co null hay khong
If IsNull Then 'Neu isnull=true
' dinh nghia bien cot va dong
Dim datTable As DataTable
Dim i As Byte
Dim myDataColumn As DataColumn
Dim myDataRow As DataRow
' tao dong cot bang
datTable = New DataTable
myDataColumn = New DataColumn
myDataColumn.DataType = Type.GetType("System.String")
myDataColumn.ColumnName = cboDisplay
'dua cot vao bang
datTable.Columns.Add(myDataColumn)
'cot thu 1
myDataColumn = New DataColumn
myDataColumn.DataType = Type.GetType("System.String")
myDataColumn.ColumnName = cboValue
'dua cot vao bang
datTable.Columns.Add(myDataColumn)
'them mot dong
myDataRow = datTable.NewRow
myDataRow(cboValue) = ""
myDataRow(cboDisplay) = ""
'dua dong vao bang
datTable.Rows.Add(myDataRow)
If datDsCB.Tables(0).Rows.Count > 0 Then
For i = 0 To datDsCB.Tables(0).Rows.Count - 1
myDataRow = datTable.NewRow
myDataRow(cboValue) = datDsCB.Tables(0).Rows(i).Item(cboValue)
myDataRow(cboDisplay) = datDsCB.Tables(0).Rows(i).Item(cboDisplay)
'dua dong vao bang
datTable.Rows.Add(myDataRow)
Next
End If
'Dua bang vao Dataset
datDsCB.Tables.Add(datTable)
'gan gia tri nguon cho Combo
cboName.DataSource = datDsCB.Tables(datTable.TableName)
Else 'Neu khong null
'gan gia tri nguon cho Combo
cboName.DataSource = datDsCB.Tables(0)
End If
'cot dua vao gia tri nho cua combo
cboName.ValueMember = Trim(cboValue)
' dua dl tu cot de hien thi tren combo
cboName.DisplayMember = Trim(cboDisplay)
Catch ex As Exception
MsgBox(ex.ToString)
End Try
End Sub

Trên Form Em goi như sau

GetData_Into_Cbo("SP_Select_Branch",cboBranch,"BranchID","BranchName",False,Co
nn)
Trong đó : SP_Select_Branch là tên thủ tục Em viết trong SQL,cboBranch là tên
Combo,Conn là đối tượng kết nối

Bạn đã tạo được giao diện XP trong VB.NET 2003 chưa? Chắc là chưa đúng không?

Nếu chưa tạo được bạn hãy làm theo các bước sau đây đảm bảo sẽ có giao diện XP

Sau khi bạn kéo và thả các đối tượng vào Form bạn vào Properties tiếp đến bạn chọn
thuộc tính FlatStyle là System (Tất nhiên sẽ có một số đối tượng không có thuộc tính này
ví dụ như ComboBox chẳng hạn ,nhưng mình không cần quan tâm nó sẽ tự động nhận)

Sau đó bạn tải File XP.EXE.manifest rồi đổi tên XP thành tên dự án của bạn và vất vào
thư mục chứa File .EXE là xong.

Cụ thể là : Giả sử dự án của bạn tên là KT (KT là tên hiện trong Exploer Solution) bạn
sẽ đổi như sau
Đổi XP.EXE.manifest thành KT.EXE.manifest rồi vất vào thư mục chứa .EXE.

Như vậy bạn sẽ có giao diện XP

File đính kèm(s):


XP.EXE.manifest (1kb) Tải 124 lần(s)

Thay oi tai sao moi lan em cap nhat du lieu thi tren C1flexgrid ko tu dong cap nhat a. Em
co viet cau lenh: tenluoi.refesh() nhung cung ko nhan. Co can phai viet them doan lenh
nao ko a?

Em dùng câu lệnh tenluoi.refesh() thì chưa đủ đâu

Em chỉ cần gọi lại phương thức (thủ tục) GetDataGird() sau khi cập nhận dữ liệu thành
công là xong

GetDataGird() nằm trong sự kiện khi click chuột vào nút Cập nhật Em a.
Trong VB.NET việc đưa dữ liệu ra DataSet thì quả là đơn giản đúng không ?.Những liệu
bạn đã biết lọc hoặc truy vấn dữ liệu trong DataSet để lấy ra những thông tin cần thiết
chưa?.Điều này thì chắc không phải ai cũng biết.

Tối lấy một trường hợp thế này.Giả sử tôi có một DataSet chứa dữ liệu của bảng
KhachHang với các trường MaKH,TenKH
Bây giờ tôi muốn lấy ra những khách hàng có mã >10 .Đây chính là truy vấn dữ liệu
trong DataSet

Tôi xin giới thiệu với chúng ta một cách làm như sau:

Sau khi đưa dữ liệu ra DataSet bằng câu lệnh


Dim da As SqlDataAdapter
Dim ds As DataSet=New DataSet
........
da.Fill(ds,"KhachHang")
Chúng ta làm như sau:

Đầu tiên chúng ta khai báo một DataRow

Dim RowMaKH As DataRow()


RowMaKH= ds.Tables("KhachHang").Select("MaKH >10")

Như vậy RowMaKH sẽ chứa toàn bộ những khách hàng có mã >10

Để lấy giá trị thứ i trong RowMaKH bạn chỉ cần dùng câu lệnh
RowMaKH(i).Item("MaKH")
cach nao de co combobox tren luoi flexgrid
Có hai trường hợp xảy ra.

Một do người dùng định nghĩa và tạo thành ComboBox. Giả sử Thầy muốn tạo ra
combobox có nam và nữ.Trường hợp này ta làm như sau:

Dim slist As SortedList


slist = New SortedList
slist.Add("True", "Nam")
slist.Add("False", "Nữ")
GirdName.Cols("TenCot").DataMap = slist

Trường hợp 2 .Lấy từ cơ sở dữ liệu ra thành combobox

Trường hợp này sẽ làm như sau


Đầu tiên viết một hàm

'*****************************************************
'ham truyen gia tri vao cac Sortedlist de dua vao cac cbo cua luoi
Public Shared Function Add_Data_Grid(ByVal strSqlStore As String, ByVal sKey As
String, ByVal sValue As String) As SortedList
Dim datSqlAdapter As SqlDataAdapter
Dim i As Integer
Dim datDs As DataSet
'khoi tao mot SorttedList
Dim slist As SortedList = New SortedList
Try
slist = New SortedList
datSqlAdapter = New SqlDataAdapter
datDs = New DataSet
datSqlAdapter = ReturnDataAdapter(strSqlStore)
datSqlAdapter.Fill(datDs, "cboTable")
datSqlAdapter.Dispose()
If datDs.Tables("cboTable").Rows.Count > 0 Then
For i = 0 To datDs.Tables("cboTable").Rows.Count - 1
slist.Add(Trim(datDs.Tables("cboTable").Rows(i).Item(sKey).ToString),
Trim(datDs.Tables("cboTable").Rows(i).Item(sValue)))
Next
End If
datDs.Dispose()
Return slist
Catch ex As Exception
MsgBox(ex.ToString)
datDs.Dispose()
End Try
End Function

Trong code ta gọi như sau

Dim slist As SortedList


slist = New SortedList
slist = Add_Data_Grid("sp_Select", "ID", "Name")
GrdName.Cols("TenCot").DataMap = slist
'sp_Select là cau sql lay du lieu tu bang

Các đoạn này sẽ được đặt sau GetDataGird() và trong FormatGird() Em thêm câu lệnh
GirdName.AllowEditing=True

lam the nao de bat loi duoc nguoi dung a

vi du nguoi dung co tinh khong nhap ngaysinh chang han thi ta phai thong bao de ho
nhap du thi moi cho luu

va nguoi dung nhap gia tri vao truong khoa ngoai ma chua co gia tri nay o truong khoa
chinh cua bang khac thi bi loi chuong trinh

vay lam sao de kiem soat van de nay

Thứ nhất : Đối với dữ liệu ngày, tháng Em không nên dùng đối tượng TextBox mà nên
dùng đối tượng DateTImePicker .Mặc định sẽ có dữ liệu ngày tháng, Nếu cố tình không
nhập thì vẫn có.Còn nếu Em dùng TextBox thì chỉ cần kiểm tra . If TextBox.Text=""
then MessageBox.Show("Bạn chưa nhập ngày sinh")

Thứ 2. Để kiểm soát được vấn đề khoá ngoại và khoá chính như vậy thì rất đơn giản Em
làm như sau nhé

Em xem trường khoá ngoại đó có cho phép Null hay không.Nếu cho phép Null thì không
cần quan tâm đến trường khoá chính có dữ liệu hay không.Còn nếu không cho phép Null
thì khi Em dưa dữ liệu từ bảng có khóa chính lên Combo để chọn thì Em mặc định cho
Combo có dữ liệu là xong.Kể cả khi người dùng không chọn thì mặc định vẫn có dữ liệu .
lam the nao de co checkbox hien len tren luoi
Tuỳ thuộc vào cột nào Em cần có CheckBox thì Em sẽ cho làm CheckBox và chỉ cần
dùng thuộc tính .DataType

Ví dụ Em cần cho cột GioiTinh là CheckBox Em dùng câu lệnh

GrdName.Cols("GioiTinh").DataType=GetType(Boolean)
GrdName.Cols("GioiTinh").AllowEditing=True

GrdName : là tên lưới


GioiTinh : Là cột cần là CheckBox

Đoạn Code trên Em cho vào phần FormatGird()


Lam sao em tao truong ngay thang len luoi ko duoc (tren luoi ko co truong ngay thang)
Đúng vậy trên lưới không có trường ngày tháng.Để có trường ngày tháng Em phải viết
một đoạn Code .Đoạn code này sẽ nằm trong phần FormatGird().

Tuỳ thuộc vào cột nào Em muốn cho là ngày tháng mà viết code tương ứng và dùng
thuộc tính .DataType.

Ví dụ Em muốn cột ngày sinh (NgaySing) là ngày tháng.Em làm như sau

GrdName.Cols("NgaySinh").DataType=GetType(DataTime)
GrdName.Cols("NgaySinh").AllowEditing=True
GrdName : Là tên lưới
NgaySinh : Là cột ngày sinh sẽ hiện trên lưới

1. Em muốn hỏi ta có bảng Khoa có mã khoa là duy nhất không trùng

làm thế nào sau khi thêm nếu trùng mã khoa

thì thông báo mã khoa này đã tồn tại rồi

2. Thủ tục sp_Insert_Update_mFaculty phải sửa như thế nào ạ

3. Code chương trình phải sửa như thế nào ạ

Để làm được điều này thì trong thủ tục sp_Insert_Update_mFaculty Em thêm một tham
số @KT như sau

sp_Insert_Update_mFaculty
@ma int,
........
@KT bit output

AS

IF EXISTS(SELECT * FROM TenBangWHERE ma=@ma)


Begin
Update .......
SET @KT=0
End
ELSE
BEGIN
Insert ........
SET @KT=1
END

Trong Code cung thêm một tham số @KT như sau

Dim Param as SqlParameter() ={ New .......


New SqlParameter("@KT",SlqDataType.Bit)}

Param(0).Value=....
....
Param(5).Direction=ParameterDirection.Output ''''Tham số @KT giả sử là thứ 5

RunSP("sp_Insert_Update_mFaculty ",cnn,Param)

If Param(5).Value=True then
MessageBox.Show("Mã bạn vừa nhập đã tồn tại.Đề nghị bạn nhập mã khác")
End If

Làm thế nào mà khi Nhấn vào tìm kiếm nếu thấy thì

Lưới nhảy đến dòng tìm thấy và các ô textbox nhảy theo

Em đã thử rồi chỉ làm được với textbox nhưng lưới không được

Để làm được điều này Em chỉ cần dùng thuộc tính .Select là được. Cụ thể như sau

If txtHoTen.Text<>"" then
For i as integer=0 to grdName.Rows.Count -1
If txtHoTen.Text=grdName(i,"HoTen") then
grdName.Select(i,True) 'Dòng tìm thấy được chọn
End If
Next
End if

Khi có lệnh grdName.Select(i,True) này lập tức các TextBox trên Form sẽ hiển thị dữ liệu
tương ứng trên lưới thông qua sự kiện grdName_EnterCell()

Em muốn hỏi tại sao Khi chạy Form Login thanh thực đơn UltraToolBar không hiện chỉ
khi ta đóng Form Login nó mấy hiện

Em đã Cho thuộc tính ToMost của Form Login bằng True

Và trong thủ tục Load của Form Main em gọi Form Login

Nhưng không hiểu tại Sao Thực đơn UltraToolBar vẫn không hiện chỉ khi đóng Form nó
mới hiện

Trong UltraToolBar em đã đặt thuộc tính IsMenuBar là True

Và Trong Form Main Em đã đặt thuộc tính Là Form Chính

Không hiểu sao lại không được

Vậy Em thử thế này nhé

Trong form Main khi Em gọi form Login Em dùng thuộc tính Show() thay cho
ShowDialog()

frmLogin.Show()

em tao 1 panel va ben trong co 1 dockmanager (lam menu doc tren MDI form)

Nhung khi chay chuong trinh thi nguoi dung co the click chuot phai vao man hinh MDI
de add Group hoac xoa Group

Va co the thay doi do rong cua panel vay lam the nao de kiem soat viec nay

Thực ra việc Add Group hoặc xóa Group kể cả thêm Button hoặc Toolbar khi Click chuột
phải vào thực chất chỉ là ảo.Tức là những công việc đó chỉ tồn tại và có hiệu lực trong
thời gian mình chạy phần mềm thôi và khi mình thoát phần mềm rồi chạy lại thì những
mục mình đã Thêm ,Xoá vẫn tồn tại.

Em thử chạy Office 2003 mà xem .Nó cũng cho mình thêm,xóa các mục trên menu
những khi chạy lại thì vẫn còn những cái mình đã xoá.

Mình nên để người dùng thay đổi Panel Em ạ. Vì khi độ phân giải màn hình thay đổi thì
Panel sẽ được thay đổi theo.Nếu mình quản lý nó không cho nó thay đổi thì không hay
đâu.

Việc quản lý Thêm , xóa cũng có thể quản lý được nhưng mình cứ để cho người dùng
thêm xóa không sao Em ạ.

em chua cach dung "byref",trong lap trinhem toan dung "byval",nhung co mot so sach
emdoc thay co dung "byref",em thay no chang khac gi "byval",thay co the noi ro hon de
em phan biet ,va thay cho em vi du ve 1 ham nhung dung trong 2 truong hop,1 truong
hop dung "byval",1 truong hop dung "byval"

Trong VB.NET có 2 cách truyền các tham số vào các phương thức (Thủ tục hoặc hàm) là
ByVal (Truyền theo tham trị) và ByRef (Truyền theo tham chiếu) .Hai cách dùng này
hoàn toàn khác nhau chứ không phải giống nhau như Em nghĩ và trong VB.NET mặc
định khi lập trình viên truyền các tham số vào các phương thức nó sẽ là ByVal .Thông
thường thì nên dùng ByVal .

Em để ý ví dụ sau thì sẽ hiểu nhé

Private FunctionTinhTong(ByVal a As Integer,ByVal b As Integer) As Interger


Return a+b
End Function

Private Sub ThayTheByVal(ByVal C As Integer)


Dim i As Integer =5
C=i
End Sub

Private Sub ThayTheByRef(ByRef C As Integer)


Dim i As Integer =5
C=i
End Sub

Dim Tong As Integer=0

Tong=TinhTong(5+5)

Nếu là ByVal thì sau khi gọi ThayTheByVal(Tong) thì kết quả vẫn là 10
Nhưng nếu là ByRef thì sau khi goi ThayTheByRef(Tong) thì kết quả lại là 5

Em đọc kỹ rồi sẽ hiểu. Tóm lại là .Khi truyền bằng ByVal thì nó sẽ không bị thay đổi
bên trong phương thức còn khi truyền bằng ByRef thì nó sẽ bị thay đổi bên trong phương
thức
Thầy cho em hỏi các nút di chuyển ( Về đầu , Về Cuối , Về Trước , Về Sau và cả nút Huỷ
bỏ thao tác nữa ) phải viết code cho no thế nào ?

Em viết như sau nhưng không được :

Me.BindingContext(ds.Tables("mSchool")).Position=0 ' Về đầu

Me.BindingContext(ds.Tables("mSchool")).Position - = 1 ' Về trước

Me.BindingContext(ds.Tables("mSchool")).Position + = 1 ' Về sau

Me.BindingContext(ds.Tables("mSchool")).Position
= Me.BindingContext(ds.Tables("mSchool")).Count - 1 ' Về cuối

Em làm như vậy nhưng không được thầy ạ !

Em làm thế này là sai rồi .Không được là đúng rồi

Em làm như thế này nhé.

'Phương thức dùng để nhảy xuống dòng tiếp theo

Private Sub RowNext()


grdName.Focus()
If grdName.RowSel < grdName.Rows.Count - 1 Then 'Nếu không phải là cuối
grdName.Select(grdName.RowSel + 1, True)
Else
grdName.Select(grdName.RowSel, True) 'Nếu là cuối
End If
End Sub
Em dang lam bang QH,nhung khi ket noi voi CSDL thi bi thong boa loi.Vay thay hay chi
cho em ve thu thuc ket noi voi
Qúa trình kết nối như sau

Đầu tiên Em Imports 2 thư viện System.Data,System.Data.SqlClient

Sau đó
Dim strConn As String="Server=TenMay ; DataBase=TenDataBase ; User ID =sa ;
Password=sa "
Dim ObjConn As SqlConnection=New SqlConnection(strConn)
ObjConn.Open()

em co hai bảng :

CT1
SoCT char(10) MaK char(10) NgayTT datetime SoTien float CT2 SoCT char(10)
MaHang char(10) MaNV char(10) Bảng CT1 và CT2 liên kết 1-1

Trong nút lưu em viết:

dim param as sqlparameter()={new sqlparameter("SoCT",sqldbtype.char),new


sqlparameter("MaK",sqldbtype.char),new
sqlparameter("NgayTT",sqldbtype.datetime),new
sqlparameter("SoTien",sqldbtype.float),new
sqlparameter("MaHang",sqldbtype.char),new sqlparameter("MaNV",sqldbtype.char)}

param(0).value=me.txtSoCT.text

param(1).value=me.cboMaK.selectedvalue

param(2).value=me.NgayTT.text

param(3).value=me.txtSoTien.text

param(4).value=me.cboMaHang.selectedvalue

param(5).value=me.cboMaNV.selectedvalue

clsDataBase.RunSP("Insert_CT",cnn,param)

getdatagird()

-----------------------------

trong thủ tục Insert_CT:

alter proc Insert_CT

@SoCT char(10),@MaK char(1),@NgayTT DateTime,@SoTien float,@MaHang


char(10),@MaNV char(10)

as

begin transaction CT1

begin transaction CT2

begin

insert into CT1 values(@SoCT,@NgayTT,@MaK,@SoTien)


insert into CT2 values(@SoCT,@MaHang,@MaNV)

end

if(@@err<>0)...................

---------------------------

em chạy thì nó báo lỗi:

SoCT is not a parameter for procedure Insert_CT

---------------------

Em để ý nhé :

dim param as sqlparameter()={new sqlparameter("SoCT",sqldbtype.char),new


sqlparameter("MaK",sqldbtype.char),new
sqlparameter("NgayTT",sqldbtype.datetime),new
sqlparameter("SoTien",sqldbtype.float),new
sqlparameter("MaHang",sqldbtype.char),new sqlparameter("MaNV",sqldbtype.char)}

Tất cả các tham số đều không có @


Em phải làm như sau:

dim param as sqlparameter()={new sqlparameter("@SoCT",sqldbtype.char),new


sqlparameter("@MaK",sqldbtype.char),new
sqlparameter("@NgayTT",sqldbtype.datetime),new
sqlparameter("@SoTien",sqldbtype.float),new
sqlparameter("@MaHang",sqldbtype.char),new
sqlparameter("@MaNV",sqldbtype.char)}

Nếu không có @ chắc chắn sẽ báo SoCT is not a parameter for procedure Insert_CT

CT1:

SoCT char(10)
MaK char(10)
NgayTT datetime
SoTien float

CT2:
SoCT char(10)
MaHang char(10)
MaNV char(10)

Thầy giúp em nha

Em không nên viết Insert vào 2 bảng bằng một thủ tục .Em nên viết bằng TRIGER thì tốt
hơn
Thầy hướng dẫn cho em cách làm một form tìm kiếm sinh viên kết qủa hiện thị trên
Grid (tìm kiêm theo tên trong bảng mStudents)
Em đưa đoạn Code sau vào sự kiện tìm kiếm nhé:

Private Sub cmdTimKiem_Click( ByVal sender As Object , ByVal e As


System.EventArgs) Handles cmdTimKiem.Click
If grdName.Rows.Count>0 Then 'Nếu lưới có dữ liệu
If txtHoten.Text<>"" then 'Nếu họ tên không trống
For i as integer =0 to grdName.Rows.Count-1
If txtHoten.Text=grdName(i,"HoTen") Then 'Nếu tồn tại
grdName.Select(i,True)
Exit Sub
End If
Next
End If
End If

End Sub
Mình có 1 treeview, 1 nút cha và 1 nút con, có 2 contextmenu. Mình không biết cách làm thế
nào để khi nhấn chuột phải vào nút cha thì hiện contextmenu1, nhấn vào nút con thì hiện lên
contextmenu2
Giải thuật là bạn bắt sự kiện MouseDown, nếu là chuột phải thì kiểm tra node dưới con trỏ
chuột là parent hay child rồi show menu tương ứng.
Code demo là C#, bạn chịu khó convert sang VB.EET

private void treeView1_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e)


{
if (e.Button == MouseButtons.Right) // Chuột phải
{
TreeNode node = treeView1.GetNodeAt(e.X, e.Y);
if (node == null) return;

if (node.Parent == null)
this.contextMenu1.Show(treeView1, new Point(e.X, e.Y));
else
this.contextMenu2.Show(treeView1, new Point(e.X, e.Y));
//MessageBox.Show(node.Parent.Text);
}
}
khi tôi muốn sử dụng các hàm string như: right, left...thì phải khai báo không gian tên như thế nào?
(System....)
Bạn dùng namespace này:
Imports Microsoft.VisualBasic
Và gọi hàm như sau:
Dim str As String = "test string"
str = Microsoft.VisualBasic.Left(str, 1)
Nếuimport thì không cần khai báo Microsoft.VisualBasic
và ngược lại nếu khai báo thì chỉ việc sử dụng Left(string, string_len)
Tôi dùng môt file CSDL tạm để nạp dữ liệu cần in hóa đơn bán hàng. Mỗi khi in cho khách mới thì
phải xóa dữ liệu đã in cho khách hàng trước đó. Nhưng làm sao để xóa nội dung file đó cho nhanh
(không phải xóa từng dòng)?. Tôi sử dụng CSDL Access, sử dụng kết nối OleDb. Mong các bạn chỉ
dùm
Nếu chương trình của bạn hỗ trợ xử lý truyền thẳng câu lệnh SQL tới DB để chạy thì bạn có
thể truyền câu lệnh DELETE tới DB để xoá các record.
Còn không bạn có thể làm 1 vòng lặp để xoá các record của bạn.
Sử dụng kết nối và đối tượng Command thích hợp rồi truyền thằng cho nó một câu lệnh SQL:
"Delete from tên_bảng" (MySQL) các cơ sở dữ liệu khác là : "delete * from tên_bảng". Nếu
bạn muốn xóa tất cả nội dung của file đó mà không phải là xóa nội dung một bảng thì bạn
truyền câu lệnh SQL: "Drop TABLE tên_bảng" nhưng lần sau thì bạn sẽ lại phải khởi tạo lại
bảng đấy.
Cảm ơn bạn! tôi cũng đã làm đựoc như vậy rồi. Nhưng có vấn đề phát sinh là cần xác định
xem Table đó có tồn tại trong Database không?. Nếu Table đó ko tồn tại mà Drop Table thì sẽ
báo lỗi, ngược lại nếu Table đã có mà dùng Create Table hoặc SELECT ..... INTO Table thì nó
cũng báo lỗi.

You might also like