[VB.NET] Krypton Toolkit DataGridView for Visual Basic .NET (2010/2022)
Krypton Toolkit สำหรับ .NET Winforms ก็คือ Component ที่คล้ายๆกับ Control มาตรฐานของไมโครซอฟท์ เช่น Label TextBox หรือ DataGridView Control แต่จะมีรูปร่างหน้าตาที่ดูดีสวยงามกว่า และยังมี Control พิเศษตัวอื่นๆเสริมเข้ามาอีก ในปัจจุบันเราสามารถนำมาใช้งานได้ฟรีทั้งแบบส่วนบุคคล หรือในทางธุรกิจได้ ...โค้ดตัวอย่างของจริงนี้จะนำเสนอการควบคุม DataGridView Control ของตัว Krypton Toolkit ซึ่งโค้ดหลักๆจะนำมาจากการควบคุม DataGridView ของไมโครซอฟท์ แต่จะแก้ไขโค้ดบางส่วนจากของเดิมในเรื่องของการทำ Validate Data หรือการเช็คความถูกต้องของข้อมูล ก่อนที่จะทำการบันทึกข้อมูลลงไปในฐานข้อมูล เช่น การป้อนค่าเลขจำนวนเต็ม หรือจำนวนเลขทศนิยม เป็นต้น ซึ่งเราจะสามารถแก้ไขข้อมูลในแต่ละเซลล์ได้เอง ในลักษณะที่เรียกกันว่า In Line Edit ทำให้อำนวยความสะดวกต่อผู้ใช้งานได้ค่อนข้างดี และในโปรเจคนี้จะใช้การเขียนด้วยโค้ดขึ้นมาเกือบทั้งหมด เราจะเห็นผลลัพธ์ของการทำงานก็ต่อเมื่อสั่งรันให้โปรแกรมทำงาน (Run Time) ซึ่งจะมีประสิทธิภาพมากกว่าการใช้ Design Time ...
คลิปวิดีโอการสร้างกลุ่ม Control ของฟรีจาก Krypton Toolkit แบบ Manual ลงใน ToolBox และการทำ Skin (Palette)
http://www.g2gsoft.com/webboard/images/VBNet/kryptontoolkit2010.png
http://www.g2gsoft.com/webboard/images/VBNet/kryptontoolkit2022.png
http://www.g2gsoft.com/webboard/images/VBNet/kryptontoolkitinstall.png
http://www.g2gsoft.com/webboard/images/VBNet/kryptontoolkitreference.png
http://www.g2gsoft.com/webboard/images/VBNet/kryptontoolkitversion.png
มาดูโค้ดฉบับเต็มกันเถอะ ... .Net Framework 4.0 '// Last updated 18/9/2564
'// for .Net Framework 3.5+
'// https://www.nuget.org/packages/Krypton.Toolkit/5.550.2108.1
'//
'// for .Net Framework 4.6.2+ (80.23.11.321)
'// https://www.nuget.org/packages/Krypton.Toolkit
Imports Krypton.Toolkit
Public Class frmKryptonDataGridView
Private Sub frmKryptonDataGridView_KeyDown(sender As Object, e As System.Windows.Forms.KeyEventArgs) Handles Me.KeyDown
'// The form must be set to Press KeyPreview = True.
Select Case e.KeyCode
Case Keys.F7
Call AddRow()
Case Keys.F8
Call DeleteRow()
End Select
End Sub
' / --------------------------------------------------------------------------------------------
' / S T A R T ... H E R E
' / --------------------------------------------------------------------------------------------
Private Sub frmKryptonDataGridView_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
Me.KeyPreview = True
Call InitializeGrid()
Call AddRow()
'// KryptonToolkit Palette.
With cmbPalette
.Items.Add("Office2003")
.Items.Add("Office2007Blue")
.Items.Add("Office2007Silver")
.Items.Add("Office2007Black")
.Items.Add("Office2010Blue")
.Items.Add("Office2010Silver")
.Items.Add("Office2010Black")
End With
cmbPalette.SelectedIndex = 4
'// Set to KryptonDataGridView By changing the Palette according to the main form.
Me.PaletteMode = Krypton.Toolkit.PaletteMode.Global
'// If you want to specify a specific display, you can select PaletteMode.
Me.dgvData.PaletteMode = Krypton.Toolkit.PaletteMode.Global
'Me.dgvData.PaletteMode = Krypton.Toolkit.PaletteMode.Office2007Black
End Sub
' / --------------------------------------------------------------------------------------------
' / Change Palette Mode.
' / --------------------------------------------------------------------------------------------
Private Sub cmbPalette_SelectedIndexChanged(sender As System.Object, e As System.EventArgs) Handles cmbPalette.SelectedIndexChanged
Dim manager As New KryptonManager()
Select Case cmbPalette.SelectedIndex
Case 0
'KryptonManager.GlobalPaletteMode = PaletteModeManager.ProfessionalOffice2003
manager.GlobalPaletteMode = PaletteModeManager.ProfessionalOffice2003
Case 1
manager.GlobalPaletteMode = PaletteModeManager.Office2007Blue
Case 2
manager.GlobalPaletteMode = PaletteModeManager.Office2007Silver
Case 3
manager.GlobalPaletteMode = PaletteModeManager.Office2007Black
Case 4
manager.GlobalPaletteMode = PaletteModeManager.Office2010Blue
Case 5
manager.GlobalPaletteMode = PaletteModeManager.Office2010Silver
Case 6
manager.GlobalPaletteMode = PaletteModeManager.Office2010Black
End Select
End Sub
' / --------------------------------------------------------------------------------------------
' / Initialized DataGridView @Run Time.
' / --------------------------------------------------------------------------------------------
Private Sub InitializeGrid()
With dgvData
.RowHeadersVisible = False
.AllowUserToAddRows = False
.AllowUserToDeleteRows = False
.AllowUserToResizeRows = False
.MultiSelect = False
'// Need to modify each cell.
.SelectionMode = DataGridViewSelectionMode.CellSelect
.ReadOnly = False
'// Font for RowTemplate.
.RowTemplate.DefaultCellStyle.Font = New Font("Tahoma", 11, FontStyle.Regular)
.RowTemplate.MinimumHeight = 32
'// Header.
.ColumnHeadersDefaultCellStyle.Font = New Font("Tahoma", 11, FontStyle.Bold)
'// Show alternating colors in even and odd rows.
.AlternatingRowsDefaultCellStyle.BackColor = Color.AliceBlue
' Automatically set the width.
.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill
'// Set ColumnHeadersHeightSizeMode before adjusting row heights.
'dgvData.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.EnableResizing
dgvData.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.DisableResizing
dgvData.ColumnHeadersHeight = 36
'// GridStyles
'.GridStyles.Style = DataGridViewStyle.List
'.GridStyles.Style = DataGridViewStyle.Mixed
.GridStyles.Style = DataGridViewStyle.Sheet
End With
'// Create columns dynamically.
Dim colString As New KryptonDataGridViewTextBoxColumn() '// Index 0
dgvData.Columns.Add(colString)
With dgvData.Columns(0) '// OR colString
.Name = "colString"
.HeaderText = "String"
End With
'//
Dim colInteger As New KryptonDataGridViewTextBoxColumn() '// Index 1
dgvData.Columns.Add(colInteger)
With colInteger
.Name = "colInteger"
.HeaderText = "Integer"
.DefaultCellStyle.Format = "0"
End With
'//
Dim colDouble As New KryptonDataGridViewTextBoxColumn() '// Index 2
dgvData.Columns.Add(colDouble)
With colDouble
.Name = "colDouble"
.HeaderText = "Double"
.DefaultCellStyle.Format = "0.00"
End With
'//
Dim colCombo As New KryptonDataGridViewComboBoxColumn() '// Index 3
dgvData.Columns.Add(colCombo)
With colCombo
.Name = "colCombo"
.HeaderText = "ComboBox"
.DropDownStyle = ComboBoxStyle.DropDownList
.ReadOnly = False
.DisplayMember = "Name"
.DataSource = GetDataTable()
End With
'//
'// Create a KryptonDataGridViewDateTimePickerColumn.
Dim dateTimePickerColumn As New KryptonDataGridViewDateTimePickerColumn()'// Index 4
With dateTimePickerColumn
.HeaderText = "Date"
.Name = "colDate"
'// Set the format of the DateTimePicker.
.Format = DateTimePickerFormat.Short
End With
'// Add the column to the KryptonDataGridViewCheckBoxColumn.
dgvData.Columns.Add(dateTimePickerColumn)
'//
Dim colCheckBox As New KryptonDataGridViewCheckBoxColumn() '// Index 5
dgvData.Columns.Add(colCheckBox)
With colCheckBox
.Name = "colCheckBox"
.HeaderText = "CheckBox"
End With
'//
Dim colUpDown As New KryptonDataGridViewNumericUpDownColumn()'// Index 6
dgvData.Columns.Add(colUpDown)
With colUpDown
.Name = "colUpDown"
.HeaderText = "UpDown"
.Maximum = 100
.Minimum = 0
.Increment = 1
End With
'// Add 8th column (Index = 7), It's Button.
Dim btnAddRow As New KryptonDataGridViewButtonColumn() '// Index 7
dgvData.Columns.Add(btnAddRow)
With btnAddRow
.HeaderText = "Add-F7"
.Text = "Add"
.Name = "btnAddRow"
.UseColumnTextForButtonValue = True
.Width = 80
End With
'// Add 9th column (Index = 8), It's Button.
Dim btnRemoveRow As New KryptonDataGridViewButtonColumn() '// Index 8
dgvData.Columns.Add(btnRemoveRow)
With btnRemoveRow
.HeaderText = "Del-F8"
.Text = "Delete"
.Name = "btnRemoveRow"
.UseColumnTextForButtonValue = True
.Width = 80
End With
'// Alignment header and cell any columns.
For iCol As Byte = 1 To 8
If iCol = 1 Or iCol = 2 Then
dgvData.Columns(iCol).HeaderCell.Style.Alignment = DataGridViewContentAlignment.MiddleRight
dgvData.Columns(iCol).DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleRight
ElseIf iCol = 3 Or iCol = 4 Or iCol = 6 Then
dgvData.Columns(iCol).HeaderCell.Style.Alignment = DataGridViewContentAlignment.MiddleLeft
dgvData.Columns(iCol).DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleLeft
Else
dgvData.Columns(iCol).HeaderCell.Style.Alignment = DataGridViewContentAlignment.MiddleCenter
dgvData.Columns(iCol).DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter
End If
Next
End Sub
' / --------------------------------------------------------------------------------------------
' / Sample DataTable for ComboBox.
' / --------------------------------------------------------------------------------------------
Function GetDataTable() As DataTable
Dim DT As DataTable = New DataTable
'// Add new columns.
With DT.Columns
.Add("PK", GetType(Integer))
.Add("Name", GetType(String))
End With
'// Add sample data rows.
With DT.Rows
.Add(1, "M100")
.Add(2, "M150")
.Add(3, "M16")
.Add(4, "M4")
.Add(5, "AK47")
.Add(6, "RPG")
End With
Return DT
End Function
' / --------------------------------------------------------------------------------------------
' / SAMPLE DATA FOR ADD TO ROW.
' / --------------------------------------------------------------------------------------------
Private Sub AddRow()
Dim RandGen As New Random()
'// Random Double Value.
Dim minValue As Double = 0.0 ' Minimum value for the range
Dim maxValue As Double = 9999.0 ' Maximum value for the range
'// Generate a random double between minValue and maxValue.
Dim randomDouble As Double = RandGen.NextDouble() * (maxValue - minValue) + minValue
'// ComboBox.
'Dim ls As New List(Of String) ({"M100", "M150", "M16", "M4", "AK47", "RPG"})
'// Get sample data from DataTable.
Dim dt As DataTable = GetDataTable()
Dim ls As New List(Of String)()
For Each row As DataRow In dt.Rows
ls.Add(row("Name").ToString())
Next
'// Random value from List.
Dim RandArray As String = ls(RandGen.Next(0, ls.Count))
'// Sample data for each columns.
'// String, Integer, Double, ComboBox, Date, CheckBox, UpDown
dgvData.Rows.Add( _
"Product " & RandGen.Next(1, 999), _
RandGen.Next(1, 999), _
randomDouble, _
RandArray, _
DateTime.Today.AddDays(-RandGen.Next(365)), _
IIf(RandGen.Next(0, 2) > 0, "True", "False"), _
RandGen.Next(1, 100) _
)
End Sub
' / --------------------------------------------------------------------------------------------
' / Sub program to delete selected rows.
' / --------------------------------------------------------------------------------------------
Private Sub DeleteRow()
If dgvData.RowCount = 0 Then Return
'// Delete selected row items.
dgvData.Rows.Remove(dgvData.CurrentRow)
End Sub
' / --------------------------------------------------------------------------------------------
' / Click mouse event in grid cell.
' / --------------------------------------------------------------------------------------------
Private Sub dgvData_CellClick(sender As Object, e As System.Windows.Forms.DataGridViewCellEventArgs) Handles dgvData.CellClick
Select Case e.ColumnIndex
'// Add Row.
Case 7
Call AddRow()
'// Delete Row.
Case 8
'MsgBox(("Row : " + e.RowIndex.ToString & "Col : ") + e.ColumnIndex.ToString)
Call DeleteRow()
End Select
End Sub
' / --------------------------------------------------------------------------------------------
' / Enter press event in grid cell.
' / --------------------------------------------------------------------------------------------
Private Sub dgvData_CellEndEdit(sender As Object, e As System.Windows.Forms.DataGridViewCellEventArgs) Handles dgvData.CellEndEdit
'/ change occurred in the 1st or 2nd index digit.
Select Case e.ColumnIndex
Case 1'/ Integer Value.
'/ Index = 1 (Integer)
'/ To trap errors in the case of having a Null Value, enter the value 0 instead.
If IsNothing(dgvData.Rows(e.RowIndex).Cells(1).Value) Then dgvData.Rows(e.RowIndex).Cells(1).Value = "0"
'/ Handle the CellFormatting event to format numeric values.
AddHandler dgvData.CellFormatting, AddressOf KryptonDataGridView_CellFormatting
Case 2 '/ Double Value.
'/ Index = 2 (Double)
'/ If Null Value
If IsNothing(dgvData.Rows(e.RowIndex).Cells(2).Value) Then dgvData.Rows(e.RowIndex).Cells(2).Value = "0.00"
'/ Handle the CellFormatting event to format numeric values.
AddHandler dgvData.CellFormatting, AddressOf KryptonDataGridView_CellFormatting
End Select
End Sub
' / --------------------------------------------------------------------------------------------
' / When you start pressing the keys in digits (Index) 1 and 2.
' / --------------------------------------------------------------------------------------------
Private Sub dgvData_EditingControlShowing(sender As Object, e As DataGridViewEditingControlShowingEventArgs) Handles dgvData.EditingControlShowing
'// Or use the index columns of DataGridView.
'Select Case dgvData.Columns(dgvData.CurrentCell.ColumnIndex).Index
' Case 1
'
'End Select
'// Don't forget to specify the Column Name earlier as well (InitializeGrid sub program).
Select Case dgvData.Columns(dgvData.CurrentCell.ColumnIndex).Name
' / Can use both Colume Index or Field Name
Case "colInteger", "colDouble"
If TypeOf e.Control Is Krypton.Toolkit.KryptonDataGridViewTextBoxEditingControl Then
Dim editingControl As Krypton.Toolkit.KryptonDataGridViewTextBoxEditingControl = TryCast(e.Control, Krypton.Toolkit.KryptonDataGridViewTextBoxEditingControl)
'// Event Handler for intercepts keystrokes.
AddHandler editingControl.KeyPress, AddressOf KryptonDataGridViewKeyPress
End If
End Select
End Sub
' / --------------------------------------------------------------------------------------------
' / Intercepts keystrokes only with numeric and point (.) only one.
' / --------------------------------------------------------------------------------------------
Private Sub KryptonDataGridViewKeyPress(sender As Object, e As KeyPressEventArgs)
Select Case dgvData.CurrentCell.ColumnIndex
Case 1, 6 '// Integer
'// Allow numeric digits (0-9) in the TextBox.
If Not Char.IsControl(e.KeyChar) AndAlso Not Char.IsDigit(e.KeyChar) Then e.Handled = True
Case 2'// Double
'// Allow numeric digits (0-9) and the decimal point (.) only one in the TextBox.
If Not Char.IsControl(e.KeyChar) AndAlso Not Char.IsDigit(e.KeyChar) AndAlso e.KeyChar <> "." Then e.Handled = True
'// Check for an existing decimal point in the cell.
Dim tb As KryptonDataGridViewTextBoxEditingControl = DirectCast(sender, KryptonDataGridViewTextBoxEditingControl)
If e.KeyChar = "." AndAlso tb.Text.Contains(".") Then e.Handled = True
End Select
End Sub
' / --------------------------------------------------------------------------------------------
' / Event Handler from dgvData_CellEndEdit to format numbers.
' / --------------------------------------------------------------------------------------------
Private Sub KryptonDataGridView_CellFormatting(sender As Object, e As DataGridViewCellFormattingEventArgs)
If e.ColumnIndex = dgvData.Columns("colInteger").Index Then
'// Format as an integer.
If Not e.Value Is Nothing AndAlso IsNumeric(e.Value) Then e.Value = CInt(e.Value)
ElseIf e.ColumnIndex = dgvData.Columns("colDouble").Index Then
'// Format as a double with two decimal places.
If Not e.Value Is Nothing AndAlso IsNumeric(e.Value) Then e.Value = CDbl(e.Value).ToString("0.00")
End If
End Sub
End Class
ดาวน์โหลดโค้ดฉบับเต็ม VB.NET (2022) + .Net Framework 4.6.2+ ได้ที่นี่ ...
ดาวน์โหลดโค้ดฉบับเต็ม VB.NET (2010) + .Net Framework 4.0 ได้ที่นี่ ...
ขอบคุณครับ
หน้า:
[1]