ชุมชนคนรักภาษาเบสิค - Visual Basic Community

 ลืมรหัสผ่าน
 ลงทะเบียน
ค้นหา
ดู: 4503|ตอบกลับ: 9

ขอวิธีสร้าง countdown ใน datagridview แต่ละ Rows หน่อยครับ

[คัดลอกลิงก์]

5

กระทู้

21

โพสต์

165

เครดิต

Member

Rank: 2

เครดิต
165

ผมอย่างสร้าง สร้าง columns countdown ใน datagridview แต่ละ Rows หน่อยครับ

มีท่านใด มีแนวทางไหมครับ

ขอบรุณครับ
Clip_25.jpg
Clip_25.jpg

320

กระทู้

512

โพสต์

6619

เครดิต

ผู้ดูแลระบบ

ทองก้อน ทับทิมกรอบ

Rank: 9Rank: 9Rank: 9

เครดิต
6619
โพสต์ 2021-5-1 21:33:09 | ดูโพสต์ทั้งหมด

Column CountDown ไม่จำเป็นต้องเก็บไว้ในตารางข้อมูล แต่สร้างมาจากตารางกริด โดยเอาหลัก Deadline มาทำการคำนวณหาครับ โค้ดตัวอย่างการหาค่าความแตกต่างของวัน เวลา
  1.         Dim StartDate As Date = "23/05/2564 00:00:00" '// วันครบกำหนด
  2.         Dim EndDate As Date = Date.Now
  3.         Dim TimeSpan As TimeSpan = StartDate.Subtract(EndDate)
  4.         Dim DifDays As Integer = TimeSpan.Days
  5.         Dim DifHr As Integer = TimeSpan.Hours
  6.         Dim DifMin As Integer = TimeSpan.Minutes
  7.         MessageBox.Show("จำนวนวัน: " & DifDays & vbCrLf & "จำนวนชั่วโมง: " & DifHr & vbCrLf & "จำนวนนาที: " & DifMin)
คัดลอกไปที่คลิปบอร์ด


หากอยากให้แสดงผลเป็นแบบ Real Time เพื่อนับเวลาอยู่ตลอด ก็ต้องใช้ Timer เข้าช่วย โดยการวนรอบแถวในตารางกริดตามเวลาที่ตั้งไว้ว่าจะเอาวินาที หรือนาที ซึ่งจะทำอยู่ในส่วนของ Timer ครับ
สิ่งที่ดีกว่าการให้ คือการให้แบบไม่มีที่สิ้นสุด

320

กระทู้

512

โพสต์

6619

เครดิต

ผู้ดูแลระบบ

ทองก้อน ทับทิมกรอบ

Rank: 9Rank: 9Rank: 9

เครดิต
6619
โพสต์ 2021-5-2 10:50:59 | ดูโพสต์ทั้งหมด

อันนี้โค้ดทดสอบการนับตัวเลขลงในตารางกริด การนับถอยหลังเวลาก็จะคล้ายๆกันครับ
  1.     Private Sub frmCountDownGrid_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
  2.         DataGridView1.ColumnCount = 3
  3.         DataGridView1.Columns(0).Name = "Job Name"
  4.         DataGridView1.Columns(1).Name = "Number"
  5.         DataGridView1.Columns(2).Name = "Countdown"
  6.         DataGridView1.Rows.Add({"Job 1", 3, 3})
  7.         DataGridView1.Rows.Add({"Job 2", 5, 5})
  8.         Timer1.Interval = 1000
  9.         Timer1.Enabled = True
  10.     End Sub

  11.     Private Sub Timer1_Tick(sender As System.Object, e As System.EventArgs) Handles Timer1.Tick
  12.         For row As Integer = 0 To DataGridView1.Rows.Count - 1
  13.             Dim num As Integer = DataGridView1.Rows(row).Cells(2).Value
  14.             If num <> 0 Then DataGridView1.Rows(row).Cells(2).Value = num - 1
  15.         Next
  16.     End Sub
คัดลอกไปที่คลิปบอร์ด





Countdown.jpg
สิ่งที่ดีกว่าการให้ คือการให้แบบไม่มีที่สิ้นสุด

320

กระทู้

512

โพสต์

6619

เครดิต

ผู้ดูแลระบบ

ทองก้อน ทับทิมกรอบ

Rank: 9Rank: 9Rank: 9

เครดิต
6619
โพสต์ 2021-5-2 11:38:23 | ดูโพสต์ทั้งหมด

ตอบให้เป็นโค้ดแบบเต็มๆเลยดีกว่าครับ Add DataGridView1 และ Timer1 เข้าไปในฟอร์ม ...
  1.     Private Sub frmCountDownGrid_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
  2.         With DataGridView1
  3.             '// Autosize Column
  4.             .AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill
  5.             .AllowUserToAddRows = False
  6.         End With
  7.         With DataGridView1
  8.             .ColumnCount = 3
  9.             .Columns(0).Name = "Job Name"
  10.             .Columns(1).Name = "Deadline"
  11.             .Columns(2).Name = "Countdown"
  12.             .Rows.Add({"Job 1", "23/05/2564 00:00:00", "23/05/2564 00:00:00"})
  13.             .Rows.Add({"Job 2", "01/06/2564 00:00:00", "01/05/2564 00:00:00"})
  14.         End With
  15.         Timer1.Interval = 1000
  16.         Timer1.Enabled = True
  17.     End Sub

  18.     Private Sub Timer1_Tick(sender As System.Object, e As System.EventArgs) Handles Timer1.Tick
  19.         For row As Integer = 0 To DataGridView1.Rows.Count - 1
  20.             Dim StartDate As Date = DataGridView1.Rows(row).Cells(1).Value
  21.             Dim EndDate As Date = Date.Now
  22.             Dim TimeSpan As TimeSpan = StartDate.Subtract(EndDate)
  23.             Dim DifDays As Integer = TimeSpan.Days
  24.             Dim DifHr As Integer = TimeSpan.Hours
  25.             Dim DifMin As Integer = TimeSpan.Minutes
  26.             DataGridView1.Rows(row).Cells(2).Value = DifDays & " วัน, " & DifHr & " ชั่วโมง, " & DifMin & " นาที."
  27.         Next
  28.     End Sub
คัดลอกไปที่คลิปบอร์ด



CountdownTime.jpg
สิ่งที่ดีกว่าการให้ คือการให้แบบไม่มีที่สิ้นสุด

5

กระทู้

21

โพสต์

165

เครดิต

Member

Rank: 2

เครดิต
165
 เจ้าของ| โพสต์ 2021-5-3 08:36:23 | ดูโพสต์ทั้งหมด

thongkorn ตอบกลับเมื่อ 2021-5-2 11:38
ตอบให้เป็นโค้ดแบบเต็มๆเลยดีกว่าครับ Add DataGridView1 และ Timer1 เข้าไปในฟอร์ม ...

ขอบพระคุณครับ อาจารย์
เพิ่มเติมอีกนิดนึงครับ อาจารย์
คือผมต้องการทุกๆครับที่ผม Add Row เข้าไปใน DataGrid แล้วค่อยนับถอยหลังครับ
ตัวอย่างที่อาจารย์ให้มา มันนับถอยหลังพร้อมๆ กันครับ
ขอบพระคุณอาจารย์มากๆเลยครับ ที่เป็นแนวทางให้ผม

320

กระทู้

512

โพสต์

6619

เครดิต

ผู้ดูแลระบบ

ทองก้อน ทับทิมกรอบ

Rank: 9Rank: 9Rank: 9

เครดิต
6619
โพสต์ 2021-5-3 12:41:57 | ดูโพสต์ทั้งหมด

ผมก็นึกว่าดึงมาจากฐานข้อมูลก่อนครับ ... เพิ่ม Control เข้าไปดังนี้ ...
TextBox = txtProjectName
DateTimePicker = dtpDeadline
Button = btnAddRow
Button = btnRemoveRow
  1. Public Class frmCountDownGrid

  2.     Private Sub frmCountDownGrid_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
  3.         With DataGridView1
  4.             '// Autosize Column
  5.             .AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill
  6.             .AllowUserToAddRows = False
  7.             .SelectionMode = DataGridViewSelectionMode.FullRowSelect
  8.         End With
  9.         With DataGridView1
  10.             .ColumnCount = 3
  11.             .Columns(0).Name = "Project Name"
  12.             .Columns(1).Name = "Deadline"
  13.             .Columns(2).Name = "Countdown"
  14.             '.Rows.Add({"Project 1", "23/05/2564 00:00:00", ""})
  15.             '.Rows.Add({"Project 2", "01/06/2565 00:00:00", ""})
  16.         End With
  17.         Timer1.Interval = 1000
  18.         Timer1.Enabled = True
  19.         '//
  20.         txtProjectName.Clear()
  21.         dtpDeadline.Format = DateTimePickerFormat.Custom
  22.         dtpDeadline.CustomFormat = "dd MMMM yyyy hh:mm"
  23.         dtpDeadline.Value = Now()
  24.     End Sub

  25.     Private Sub Timer1_Tick(sender As System.Object, e As System.EventArgs) Handles Timer1.Tick
  26.         For row As Integer = 0 To DataGridView1.Rows.Count - 1
  27.             Dim StartDate As Date = DataGridView1.Rows(row).Cells(1).Value
  28.             Dim EndDate As Date = Date.Now
  29.             Dim TimeSpan As TimeSpan = StartDate.Subtract(EndDate)
  30.             Dim DifDays As Integer = TimeSpan.Days
  31.             Dim DifHr As Integer = TimeSpan.Hours
  32.             Dim DifMin As Integer = TimeSpan.Minutes
  33.             DataGridView1.Rows(row).Cells(2).Value = DifDays & " วัน, " & DifHr & " ชั่วโมง, " & DifMin & " นาที."
  34.         Next
  35.     End Sub

  36.     Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles btnAddRow.Click
  37.         If txtProjectName.Text.Trim.Length = 0 Then
  38.             MessageBox.Show("กรุณาป้อนชื่อโปรเจค")
  39.             txtProjectName.Focus()
  40.             Exit Sub
  41.         End If
  42.         Call AddRow()
  43.     End Sub

  44.     Private Sub AddRow()
  45.         Dim row As String()
  46.         row = New String() {txtProjectName.Text, dtpDeadline.Value}
  47.         DataGridView1.Rows.Add(row)
  48.         '//
  49.         txtProjectName.Clear()
  50.         dtpDeadline.Value = Now()
  51.         txtProjectName.Focus()
  52.     End Sub

  53.     Private Sub RemoveRow()
  54.         '// Delete current row from DataGridView1
  55.         If DataGridView1.RowCount = 0 Then Exit Sub
  56.         DataGridView1.Rows.Remove(DataGridView1.CurrentRow)
  57.     End Sub

  58.     Private Sub btnRemove_Click(sender As System.Object, e As System.EventArgs) Handles btnRemoveRow.Click
  59.         Call RemoveRow()
  60.     End Sub
  61. End Class
คัดลอกไปที่คลิปบอร์ด


CountDownTimeGrid.jpg

CountDownGrid.zip

15.06 KB, ดาวน์โหลดแล้ว: 12448

สิ่งที่ดีกว่าการให้ คือการให้แบบไม่มีที่สิ้นสุด

5

กระทู้

21

โพสต์

165

เครดิต

Member

Rank: 2

เครดิต
165
 เจ้าของ| โพสต์ 2021-5-4 08:21:06 | ดูโพสต์ทั้งหมด

แก้ไขครั้งสุดท้ายโดย komenservice เมื่อ 2021-5-4 09:11
thongkorn ตอบกลับเมื่อ 2021-5-3 12:41
ผมก็นึกว่าดึงมาจากฐานข้อมูลก่อนครับ ... เพิ่ม Control เข้ ...

ขอบพระคุณอาจารย์มากๆเลยครับ ผมได้นำไปประยุกต์ ได้เยอะเลยครับอาจารย์


แต่เวลามันไม่หยุดครับ อิอิ


มันติดลบไปเรื่อยๆครับ

320

กระทู้

512

โพสต์

6619

เครดิต

ผู้ดูแลระบบ

ทองก้อน ทับทิมกรอบ

Rank: 9Rank: 9Rank: 9

เครดิต
6619
โพสต์ 2021-5-4 10:42:37 | ดูโพสต์ทั้งหมด

จากของเดิมหลัก Deadline ในตารางกริด มันเป็นวันที่-เวลาคงที่ หลัก Countdown มันเป็นการนับถอยหลังลง ซึ่งจะยากในการสร้างเงื่อนไข หรือเสียเวลาหาคำสั่งมาทดสอบ 2 หลักนี้ ดังนั้นเราจะใช้หลักการขั้นพื้นฐานพอครับ โดย
- เพิ่มอีก 1 หลัก (CompareTime) แต่หลักนี้จะต้องถูกซ่อนเอาไว้ (Visible = False) โดยเราจะเก็บค่าเวลาปัจจุบันในหลักนี้ ให้เพิ่มค่าขึ้นทุก 1 วินาที
- และแต่ละวินาทีนั้น ก็จะนำค่าในหลัก CompareTime ไปเปรียบเทียบกับหลัก Deadline หากมีค่าเท่ากันเมื่อไหร่ก็จะหยุดการนับถอยหลังทันที จะได้ไม่ติดลบเวลาครับ ... ง่ายมั้ยครับ

  1. Public Class frmCountDownGrid

  2.     Private Sub frmCountDownGrid_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
  3.         With DataGridView1
  4.             '// Autosize Column
  5.             .AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill
  6.             .AllowUserToAddRows = False
  7.             .SelectionMode = DataGridViewSelectionMode.FullRowSelect
  8.         End With
  9.         With DataGridView1
  10.             .ColumnCount = 4
  11.             .Columns(0).Name = "Project Name"
  12.             .Columns(1).Name = "Deadline"
  13.             .Columns(2).Name = "Countdown"
  14.             .Columns(3).Name = "CompareTime"    '// หลักเปรียบเทียบเวลา โดยเวลาจะเดินหน้าไปทุก 1 วินาที จนกว่าจะเท่ากับ Deadline ก็จะหยุดการทำงาน
  15.             .Columns(3).Visible = True 'False   '// ปกติต้องซ่อนการมองเห็นด้วย False
  16.         End With
  17.         Timer1.Interval = 1000
  18.         Timer1.Enabled = True
  19.         '//
  20.         txtProjectName.Clear()
  21.         dtpDeadline.Format = DateTimePickerFormat.Custom
  22.         dtpDeadline.CustomFormat = "dd MMMM yyyy hh:mm:ss"
  23.         dtpDeadline.Value = Now()
  24.     End Sub

  25.     Private Sub Timer1_Tick(sender As System.Object, e As System.EventArgs) Handles Timer1.Tick
  26.         For row As Integer = 0 To DataGridView1.Rows.Count - 1
  27.             Dim StartDate As Date = DataGridView1.Rows(row).Cells(1).Value
  28.             Dim EndDate As Date = Date.Now
  29.             Dim TimeSpan As TimeSpan = StartDate.Subtract(EndDate)
  30.             Dim DifDays As Integer = TimeSpan.Days
  31.             Dim DifHr As Integer = TimeSpan.Hours
  32.             Dim DifMin As Integer = TimeSpan.Minutes
  33.             '// เปรียบเทียบเวลา Deadline กับเวลาปัจจุบันที่จะเดินหน้าทุกวินาทีในแต่ละแถว
  34.             '// หากยังมีค่าไม่เท่ากัน ก็นับถอยหลังลงไปเรื่อยๆ จนกว่าจะเป็น 0 ก็จะหยุด
  35.             If DataGridView1.Rows(row).Cells(1).Value <> DataGridView1.Rows(row).Cells(3).Value Then
  36.                 '// หลัก CompareTime เวลาจะเดินหน้าไปทุกวินาที จนกว่าจะเท่ากับ Dealline ก็จะหยุดทันที
  37.                 DataGridView1.Rows(row).Cells(3).Value = Format(Now, "dd/MM/yyyy hh:mm:ss")
  38.                 '// ถอยหลังเวลาลงไปเรื่อยๆ
  39.                 DataGridView1.Rows(row).Cells(2).Value = DifDays & " วัน, " & DifHr & " ชั่วโมง, " & DifMin & " นาที."
  40.             End If
  41.         Next
  42.     End Sub

  43.     Private Sub btnAddRow_Click(sender As System.Object, e As System.EventArgs) Handles btnAddRow.Click
  44.         If txtProjectName.Text.Trim.Length = 0 Then
  45.             MessageBox.Show("กรุณาป้อนชื่อโปรเจค")
  46.             txtProjectName.Focus()
  47.             Exit Sub
  48.         End If
  49.         Call AddRow()
  50.     End Sub

  51.     Private Sub AddRow()
  52.         Dim row As String()
  53.         row = New String() {txtProjectName.Text, dtpDeadline.Value, "", Now()}
  54.         DataGridView1.Rows.Add(row)
  55.         '//
  56.         txtProjectName.Clear()
  57.         dtpDeadline.Value = Now()
  58.         txtProjectName.Focus()
  59.     End Sub

  60.     Private Sub RemoveRow()
  61.         '// Delete current row from DataGridView1
  62.         If DataGridView1.RowCount = 0 Then Exit Sub
  63.         DataGridView1.Rows.Remove(DataGridView1.CurrentRow)
  64.     End Sub

  65.     Private Sub btnRemoveRow_Click(sender As System.Object, e As System.EventArgs) Handles btnRemoveRow.Click
  66.         Call RemoveRow()
  67.     End Sub
  68. End Class
คัดลอกไปที่คลิปบอร์ด

CountDownHideColumn.jpg
สิ่งที่ดีกว่าการให้ คือการให้แบบไม่มีที่สิ้นสุด

5

กระทู้

21

โพสต์

165

เครดิต

Member

Rank: 2

เครดิต
165
 เจ้าของ| โพสต์ 2021-5-4 23:38:26 | ดูโพสต์ทั้งหมด

thongkorn ตอบกลับเมื่อ 2021-5-4 10:42
จากของเดิมหลัก Deadline ในตารางกริด มันเป็นวันที่-เวลาคง ...

ขอบพระคุณครับ อาจารย์
ทำตามโค๊ดของอาจารย์ ได้แล้วครับ Countdown หยุดที่ 0 นาที 0 วินาที แล้วครับ
ผมเอาไปปรับแต่งความสวยงามนิดหน่อยครับ
ขอบพระคุณอาจารย์ อีกครังครับ

320

กระทู้

512

โพสต์

6619

เครดิต

ผู้ดูแลระบบ

ทองก้อน ทับทิมกรอบ

Rank: 9Rank: 9Rank: 9

เครดิต
6619
โพสต์ 2021-5-7 10:29:57 | ดูโพสต์ทั้งหมด

komenservice ตอบกลับเมื่อ 2021-5-4 23:38
ขอบพระคุณครับ อาจารย์
ทำตามโค๊ดของอาจารย์ ได้แล้วค ...


ลองเอาโค้ดไปศึกษาดูครับ ...

สิ่งที่ดีกว่าการให้ คือการให้แบบไม่มีที่สิ้นสุด
ขออภัย! คุณไม่ได้รับสิทธิ์ในการดำเนินการในส่วนนี้ กรุณาเลือกอย่างใดอย่างหนึ่ง ลงชื่อเข้าใช้ | ลงทะเบียน

รายละเอียดเครดิต

ข้อความล้วน|อุปกรณ์พกพา|ประวัติการแบน|G2GNet.com  

GMT+7, 2024-12-13 00:58 , Processed in 0.181750 second(s), 5 queries , File On.

Powered by Discuz! X3.4, Rev.62

Copyright © 2001-2020 Tencent Cloud.

ตอบกระทู้ ขึ้นไปด้านบน ไปที่หน้ารายการกระทู้