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

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

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

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

5

กระทู้

21

โพสต์

149

เครดิต

Member

Rank: 2

เครดิต
149

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

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

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

262

กระทู้

422

โพสต์

3751

เครดิต

ผู้ดูแลระบบ

Rank: 9Rank: 9Rank: 9

เครดิต
3751
โพสต์ 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 ครับ
สิ่งที่ดีกว่าการให้ คือการให้แบบไม่มีที่สิ้นสุด

262

กระทู้

422

โพสต์

3751

เครดิต

ผู้ดูแลระบบ

Rank: 9Rank: 9Rank: 9

เครดิต
3751
โพสต์ 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
สิ่งที่ดีกว่าการให้ คือการให้แบบไม่มีที่สิ้นสุด

262

กระทู้

422

โพสต์

3751

เครดิต

ผู้ดูแลระบบ

Rank: 9Rank: 9Rank: 9

เครดิต
3751
โพสต์ 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

โพสต์

149

เครดิต

Member

Rank: 2

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

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

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

262

กระทู้

422

โพสต์

3751

เครดิต

ผู้ดูแลระบบ

Rank: 9Rank: 9Rank: 9

เครดิต
3751
โพสต์ 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, ดาวน์โหลดแล้ว: 157

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

5

กระทู้

21

โพสต์

149

เครดิต

Member

Rank: 2

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

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

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


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


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

262

กระทู้

422

โพสต์

3751

เครดิต

ผู้ดูแลระบบ

Rank: 9Rank: 9Rank: 9

เครดิต
3751
โพสต์ 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

โพสต์

149

เครดิต

Member

Rank: 2

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

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

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

262

กระทู้

422

โพสต์

3751

เครดิต

ผู้ดูแลระบบ

Rank: 9Rank: 9Rank: 9

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

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


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

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

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

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

GMT+7, 2021-9-19 03:15 , Processed in 0.067193 second(s), 5 queries , File On.

Powered by Discuz! X3.4, Rev.62

Copyright © 2001-2020 Tencent Cloud.

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