|
จากคำถามที่ถามมาในเว็บบอร์ด โจทย์ก็ธรรมดาแต่น่าสนใจดี แอดมินเลยมานำเสนอกระบวนการคิดในการแก้ปัญหา และเทคนิคการนำเอา DateTimePicker มาใส่ไว้ใน DataGridView โดยเราจะต้องเขียนโค้ด หรือที่เรียกว่า Run-Time (เห็นผลก็ต่อเมื่อรันโปรแกรม) ซึ่งมันจะมีประสิทธิภาพที่สูงกว่าการ Design-Time (ออกแบบอย่างไรจะมองเห็นผลได้ทันที) ... หลักการคือเพิ่มแถวรายการขึ้นมาก่อน จากนั้นทำการเปลี่ยนวันที่ เวลา แล้วนำเวลาในตารางกริดในแต่ละแถว ไปเปรียบเทียบกับเวลาปัจจุบัน หากเวลาในตารางกริดยังมากกว่าเวลาปัจจุบัน มันก็จะนับเวลาถอยหลังไปเรื่อย จนกว่าจะน้อยกว่าเวลาปัจจุบัน ก็จะหยุดการนับ
มาดูโค้ดฉบับเต็มกันเถอะ ...
- Public Class frmCountDownGrid
- '// Declare object of the DateTimePicker.
- Dim oDTP As New DateTimePicker
- Private Sub frmCountDownGrid_FormClosed(sender As Object, e As System.Windows.Forms.FormClosedEventArgs) Handles Me.FormClosed
- Me.Dispose()
- GC.SuppressFinalize(Me)
- End Sub
- '// KeyDown Function Keys.
- Private Sub frmCountDownGrid_KeyDown(sender As Object, e As System.Windows.Forms.KeyEventArgs) Handles Me.KeyDown
- Select Case e.KeyCode
- Case Keys.F3
- Call AddRow()
- Case Keys.F5
- Call btnRemoveRow_Click(sender, e)
- Case Keys.F10
- Me.Close()
- End Select
- End Sub
- Private Sub frmCountDownGrid_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
- Me.KeyPreview = True '// For KeyDown Event.
- With dgvData
- '// Autosize Column
- .AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill
- .AllowUserToAddRows = False
- .SelectionMode = DataGridViewSelectionMode.CellSelect
- '// Data rows
- .Font = New Font("Tahoma", 9)
- ' Adjust Header Styles
- With .ColumnHeadersDefaultCellStyle
- .BackColor = Color.Navy
- .ForeColor = Color.Black ' Color.White
- .Font = New Font("Tahoma", 9, FontStyle.Bold)
- End With
- .RowHeadersDefaultCellStyle.SelectionBackColor = Color.Empty
- End With
- '// Declare columns type.
- Dim ProjectName As New DataGridViewTextBoxColumn()
- Dim Deadline As New DataGridViewTextBoxColumn
- Dim CountDown As New DataGridViewTextBoxColumn()
- '// Add new Columns
- dgvData.Columns.AddRange(New DataGridViewColumn() { _
- ProjectName, Deadline, CountDown _
- })
- With dgvData
- .Columns(0).HeaderText = "Project Name"
- .Columns(1).HeaderText = "Deadline"
- .Columns(2).HeaderText = "Countdown"
- .Columns(2).DefaultCellStyle.Format = "dd/MM/yyyy HH:mm:ss"
- .Columns(2).DataPropertyName = "Date"
- '// Add 4th column (Index = 3), It's Button.
- Dim btnAddRow As New DataGridViewButtonColumn()
- dgvData.Columns.Add(btnAddRow)
- With btnAddRow
- .HeaderText = ""
- .Text = "Add"
- .Name = "btnAddRow"
- .UseColumnTextForButtonValue = True
- .Width = 60
- End With
- '// Add 5th column (Index = 4), It's Button.
- Dim btnRemoveRow As New DataGridViewButtonColumn()
- dgvData.Columns.Add(btnRemoveRow)
- With btnRemoveRow
- .HeaderText = ""
- .Text = "Delete"
- .Name = "btnRemoveRow"
- .UseColumnTextForButtonValue = True
- .Width = 60
- End With
- End With
- '//
- Timer1.Interval = 1000 '// Refresh every 1 second.
- Timer1.Enabled = True
- lblCompareTime.Text = Format(Now, "dd/MM/yyyy HH:mm:ss")
- End Sub
- Private Sub Timer1_Tick(sender As System.Object, e As System.EventArgs) Handles Timer1.Tick
- For row As Integer = 0 To dgvData.Rows.Count - 1
- Dim StartDate As Date = dgvData.Rows(row).Cells(1).Value
- Dim EndDate As Date = Date.Now
- Dim TimeSpan As TimeSpan = StartDate.Subtract(EndDate)
- Dim DifDays As Integer = TimeSpan.Days
- Dim DifHr As Integer = TimeSpan.Hours
- Dim DifMin As Integer = TimeSpan.Minutes
- Dim DifSec As Integer = TimeSpan.Seconds
- '// เปรียบเทียบเวลา Deadline กับเวลาปัจจุบัน (lblCompareTime) ที่จะเดินหน้าทุกวินาที
- '// หากยังมีค่าไม่เท่ากัน ก็นับถอยหลังลงไปเรื่อยๆ จนกว่า Deadline จะมีค่าที่ต่ำกว่าเวลาปัจจุบัน
- lblCompareTime.Text = Format(Now, "dd/MM/yyyy HH:mm:ss")
- If dgvData.Rows(row).Cells(1).Value > CDate(lblCompareTime.Text) Then
- '// ถอยหลังเวลาลงไปเรื่อยๆ
- dgvData.Rows(row).Cells(2).Value = DifDays & " วัน, " & DifHr & " ชั่วโมง, " & DifMin & " นาที, " & DifSec & " วินาที."
- ElseIf dgvData.Rows(row).Cells(1).Value <= CDate(lblCompareTime.Text) Then
- dgvData.Rows(row).Cells(2).Value = "0 วัน, 0 ชั่วโมง, 0 นาที, 0 วินาที."
- End If
- Next
- End Sub
- '// Add new row.
- Private Sub AddRow()
- Dim row As String() = New String() {"Project", Now(), "", Now()}
- dgvData.Rows.Add(row)
- End Sub
- '/ Event is clicked in the cell.
- Private Sub dgvData_CellClick(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles dgvData.CellClick
- Select Case e.ColumnIndex
- '// DateTimePicker
- Case 1
- '//Adding DateTimePicker control into DataGridView
- dgvData.Controls.Add(oDTP)
- '// Setting the custom format.
- oDTP.Format = DateTimePickerFormat.Custom
- oDTP.CustomFormat = "dd/MM/yyyy HH:mm:ss"
- oDTP.ShowUpDown = True
- '// It returns the retangular area that represents the Display area for a cell
- Dim oRectangle = dgvData.GetCellDisplayRectangle(e.ColumnIndex, e.RowIndex, True)
- '//Setting area for DateTimePicker Control
- oDTP.Size = New Size(oRectangle.Width, oRectangle.Height)
- '// Setting Location
- oDTP.Location = New Point(oRectangle.X, oRectangle.Y)
- '// Read value from DataGridView into DateTimePicker
- oDTP.Value = dgvData.CurrentCell.Value
- '// Now make it visible
- oDTP.Visible = True
- '// Force to change date value at oDTP_ValueChanged Event.
- AddHandler oDTP.ValueChanged, AddressOf oDTP_ValueChanged
- '// Add Button
- Case 3
- Call AddRow()
- '// Delete Button
- Case 4
- Call btnRemoveRow_Click(sender, e)
- End Select
- End Sub
- '// Event Handler when the change value in DateTimePicker.
- Private Sub oDTP_ValueChanged(sender As Object, e As System.EventArgs)
- '// Display date value and copy the value into current cell.
- dgvData.CurrentCell.Value = Format(oDTP.Value, "dd/MM/yyyy HH:mm:ss")
- End Sub
- Private Sub dgvData_CellLeave(sender As Object, e As System.Windows.Forms.DataGridViewCellEventArgs) Handles dgvData.CellLeave
- '// Hidden DateTimePicker when lost focus the cell.
- oDTP.Visible = False
- End Sub
- Private Sub frmCountDownGrid_Resize(sender As Object, e As System.EventArgs) Handles Me.Resize
- oDTP.Visible = False
- End Sub
- Private Sub btnAddRow_Click(sender As System.Object, e As System.EventArgs) Handles btnAddRow.Click
- Call AddRow()
- End Sub
- Private Sub btnRemoveRow_Click(sender As System.Object, e As System.EventArgs) Handles btnRemoveRow.Click
- If dgvData.RowCount = 0 Then Exit Sub
- dgvData.Rows.Remove(dgvData.CurrentRow)
- End Sub
- End Class
คัดลอกไปที่คลิปบอร์ด
ดาวน์โหลดโค้ดต้นฉบับ VB.NET (2010) ได้ที่นี่ ...
|
ขออภัย! โพสต์นี้มีไฟล์แนบหรือรูปภาพที่ไม่ได้รับอนุญาตให้คุณเข้าถึง
คุณจำเป็นต้อง ลงชื่อเข้าใช้ เพื่อดาวน์โหลดหรือดูไฟล์แนบนี้ คุณยังไม่มีบัญชีใช่ไหม? ลงทะเบียน
x
|