araban_110 โพสต์ 2025-2-27 15:02:50

แสดงรายการห้องพัก ว่าห้องไหนโดนเข้าพักแล้ว

แก้ไขครั้งสุดท้ายโดย araban_110 เมื่อ 2025-2-27 18:25

เรียนสอบถามอาจารย์ครับ
มีใครเคยทำหรือพอแนะนำ ได้บ้างครับ ว่าเราจะแสดงข้อมูลการจองห้องพัก ให้ออกมาเป็นตาราง วันที่ได้บ้างครับ ตามรูปตัวอย่างครับพอดี ทำออกมาแล้ว วันที่กับห้องไม่ตรงกัน งมหาหลายวันแล้ว ยังไม่ได้เลยครับ


            Dim SQL As String = " SELECT * FROM tb_booking WHERE checkIn >= #" & startDt & "#AND checkOut <= #" & endDt & "#"e
            Dim cmd As New OleDbCommand(SQL, conn)
            If conn.State = ConnectionState.Open Then conn.Close()
            conn.Open()
            Dim reader As OleDbDataReader = cmd.ExecuteReader()


            While reader.Read()
                Dim Start_Date As DateTime = reader.GetValue(10)
                Dim End_Date As DateTime = reader.GetValue(11)
                Dim Start_Date_C As Integer = Start_Date.Day
                Dim End_Date_C As Integer = End_Date.Day
                DVG_Calendar(Start_Date_C, End_Date_C).Style.BackColor = Color.Red

            End While

thongkorn โพสต์ 2025-3-2 14:13:59

ผมเขียนโค้ดเป็นตัวอย่างให้ดูเผื่อเป็นแนวทางก็ล่ะกันครับ โดยใช้ข้อมูลสมมุติแทน เวลานำไปใช้งานจริงก็ต้องดึงข้อมูลจากตาราง ซึ่งก็ขึ้นอยู่กับการออกแบบ จากภาพตัวอย่างที่ให้ผมมาดู เช่น ห้อง 305 จะมีการจองไว้ได้มากกว่า 1 วัน ผมก็เลยใช้ List(Of Integer) เข้ามาช่วย ...

*** แนะนำให้ใช้พวก Schedule Control เช่น DevExpress มาใช้งานแทนจะดีกว่าการใช้ตารางกริดครับ ***

โค้ดตัวอย่าง ... ตัดแปะโค้ดไปวางแปะไว้ในฟอร์มได้เลย เพราะผมไม่ได้ลาก DataGridView มาใส่ไว้บนฟอร์ม
Public Class frmBooking
    '// สร้างคลาสสำหรับเก็บข้อมูลการจองห้อง
    Public Class RoomBookingInfo
      '// Status เก็บสถานะของห้อง (Available, Occupied, Booked)
      Public Property Status As String
      '// BookedDates เก็บรายการวันที่ที่ถูกจอง List(Of Integer) ตัวอย่างคือสามารถจองได้หลายวัน เช่น 10, 11, 12
      Public Property BookedDates As List(Of Integer)

      '// สถานะ และวันที่ๆระบุ
      Public Sub New(status As String, bookedDates As List(Of Integer))
            Me.Status = status
            Me.BookedDates = bookedDates
      End Sub
    End Class

    Public Sub New()
      InitializeComponent()
      LoadRoomStatus()
    End Sub

    Private Sub LoadRoomStatus()
      '// สร้าง DataGridView และเพิ่มคอลัมน์สำหรับวันที่ 1-31
      Dim dgv As New DataGridView()
      dgv.Dock = DockStyle.Fill
      Me.Controls.Add(dgv)
      '// ปรับรูปแบบของตารางกริด
      dgv.RowHeadersVisible = False
      dgv.AllowUserToAddRows = False
      dgv.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill

      '// เพิ่มคอลัมน์ "Room" และวันที่ 1-31
      dgv.Columns.Add("Room", "Room")
      For day As Integer = 1 To 31
            dgv.Columns.Add(day.ToString(), day.ToString())
      Next

      '// ข้อมูลการจองห้อง โดยใช้คลาส RoomBookingInfo (ส่วนนี้เราได้มาจากการอ่านค่าในตารางข้อมูล)
      '// RoomBookingInfo จะประกอบด้วย สถานะของห้องและวันที่ในการจองห้อง (จองได้หลายวัน)
      Dim roomBookings As New Dictionary(Of String, RoomBookingInfo) From {
            {"101", New RoomBookingInfo("Occupied", New List(Of Integer)())},
            {"102", New RoomBookingInfo("Occupied", New List(Of Integer)())},
            {"105", New RoomBookingInfo("Booked", New List(Of Integer) From {10, 11, 12})},
            {"201", New RoomBookingInfo("Available", New List(Of Integer)())},
            {"202", New RoomBookingInfo("Available", New List(Of Integer)())},
            {"203", New RoomBookingInfo("Booked", New List(Of Integer) From {20})}
      }
      '// เพิ่มแถวสำหรับแต่ละห้อง
      For Each room In roomBookings.Keys
            Dim row As New DataGridViewRow()
            row.CreateCells(dgv)
            row.Cells(0).Value = room '// ใส่หมายเลขห้องในคอลัมน์แรก

            '// ตรวจสอบสถานะของห้องและวันที่
            For day As Integer = 1 To 31
                Dim cellIndex As Integer = day '// ดัชนีของเซลล์เริ่มจาก 1 (วันที่ 1)
                Dim status As String = roomBookings(room).Status
                Dim bookedDates As List(Of Integer) = roomBookings(room).BookedDates

                '// ตรวจสอบสถานะและตั้งค่าสีพื้นหลัง
                If status = "Available" Then
                  row.Cells(cellIndex).Style.BackColor = Color.White
                ElseIf status = "Occupied" Then
                  row.Cells(cellIndex).Style.BackColor = Color.LightBlue
                ElseIf status = "Booked" AndAlso bookedDates.Contains(day) Then
                  row.Cells(cellIndex).Style.BackColor = Color.Red
                Else
                  row.Cells(cellIndex).Style.BackColor = Color.White
                End If
            Next

            '// เพิ่มแถวลงใน DataGridView
            dgv.Rows.Add(row)
      Next
    End Sub
End Class

araban_110 โพสต์ 2025-3-2 15:29:12

ขอบคุณมากครับ อาจารย์
หน้า: [1]
ดูในรูปแบบกติ: แสดงรายการห้องพัก ว่าห้องไหนโดนเข้าพักแล้ว