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

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

[VB.NET] พื้นฐานการพิมพ์รายงานด้วย ActiveReports .NET ลงบนกระดาษขนาด A4

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

308

กระทู้

498

โพสต์

5971

เครดิต

ผู้ดูแลระบบ

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

Rank: 9Rank: 9Rank: 9

เครดิต
5971


การทำรายงาน หรือ Report แบบ Hard Copy ก็จะมีอยู่ 2 ค่ายหลักใหญ่ๆคือ Crystal Report หรือ CR และ ActiveReports หรือ (AR) สำหรับตัวแอดมินเองถนัดและชื่นชอบการใช้งาน AR มาตั้งแต่ยุค AR2 ActiveX/COM ซึ่งเดิมเป็นของค่าย DataDynamics แต่ตอนหลังก็ถูกรวบไปขึ้นอยู่กับเมืององุ่น GrapeCity สาเหตุที่แอดมินชอบเจ้า AR เป็นพิเศษ ก็เพราะว่าลักษณะการทำงานของ AR จะเหมือนกับฟอร์มๆหนึ่งในตัว Visual Basic เอง และตัวมันเองสามารถทำการแสดงผลข้อมูลได้ดีและรวดเร็วทั้ง Bound Data และ UnBound Data ... จบ ...
อ่านรายละเอียดเพิ่มเติมกับแหล่งข้อมูลของ ActiveReports รุ่นต่างๆได้ที่นี่ ...
หรือ

ดาวน์โหลดชุดติดตั้ง ActiveReports .NET (V6) ได้ที่นี่ (เฉพาะสมาชิกเท่านั้น)
อ่านวิธีการเรียกใช้งาน ActiveReports แบบเบื้องต้น
ก้าวแรกกับการพิมพ์รายงานด้วย ActiveReports .NET
ขอสรุปการทำงานของ AR ให้ฟังแบบสั้นๆก็คือ ... ทุกๆครั้งที่เรียกใช้งาน ActiveReports จะเริ่มกระบวนการขั้นตอนแรกที่โปรแกรมย่อยที่มีชื่อว่า ReportStart เพื่อทำการตั้งค่าหน้ากระดาษ ค่าตัวแปร หรือ Control ต่างๆในแบบ @Run Time เพียงครั้งแรกครั้งเดียวก่อนที่จะทำการพิมพ์ แต่หลังจากนั้น ...

หลักการที่สำคัญของ ActiveReports
(1) เริ่มการอ่านแถวข้อมูลเข้ามาจากโปรแกรมย่อย FetchData โดยทำการเปรียบเทียบค่าด้วยการนับรายการ (หากใช้ฐานข้อมูลจริง ส่วนนี้ก็จะใช้ในการทำกรุ๊ปด้วย)
(2) หากข้อมูลหรือจำนวนแถวยังไม่หมด นั่นคือ EOF (หรือ End Of File) = False ก็กระโดดมาทำการพิมพ์ที่  Detail1_Format หากหมดข้อมูลแล้ว EOF = True ก็จะสิ้นสุดกระบวนการพิมพ์
(3) กลับไปข้อที่ 1 อีกครั้ง เพื่อตรวจสอบว่ามีข้อมูลจะพิมพ์อีกหรือไม่
*** ขั้นตอนทั้งหมดนี้ คุณจะมองเห็นภาพได้อย่างชัดเจนก็ต่อเมื่อคุณใช้ Debugger ***

References ... ก่อนการใช้งานต้องเรียกเข้ามาก่อนเสมอนะครับ

มาดูโค้ดในส่วนของ ActiveReports ...
  1.     ' / --------------------------------------------------------------------------------
  2.     ' / ทุกๆครั้งที่เริ่มต้นสั่งพิมพ์ จะต้องตั้งค่าเริ่มต้นใน ReportStart เพียงครั้งแรกและครั้งเดียว
  3.     Private Sub AR6PrintEmployee_ReportStart(sender As Object, e As System.EventArgs) Handles Me.ReportStart
  4.         '/ การตั้งค่าหน้ากระดาษ
  5.         With PageSettings
  6.             '/ หน่วยวัดเป็นนิ้ว (ใช้ CmToInch ด้วยการรับค่าเซนติเมตร แต่แปลงเป็นนิ้วแทน เพื่อวัดระยะได้ง่ายกว่า)
  7.             .Margins.Left = CmToInch(1.5)
  8.             .Margins.Right = CmToInch(0.2)
  9.             .Margins.Top = CmToInch(1.5)
  10.             .Margins.Bottom = CmToInch(1.5)
  11.             ' ตั้งค่ากระดาษแนวตั้ง
  12.             .Orientation = PageOrientation.Portrait
  13.             ' กระดาษขนาด A4
  14.             .PaperKind = Drawing.Printing.PaperKind.A4
  15.             ' กรณีที่กำหนดขนาดกระดาษเอง
  16.             ' .PaperKind = Drawing.Printing.PaperKind.Custom
  17.         End With
  18.         ' ปกติต้องเคลียร์ค่าต่างๆของ TextBox ก่อนการพิมพ์
  19.         txtEmployeeID.Text = ""
  20.         txtEmployeeName.Text = ""
  21.         txtPosition.Text = ""
  22.         txtDepartment.Text = ""
  23.         txtSalary.Text = ""
  24.     End Sub
คัดลอกไปที่คลิปบอร์ด
ReportStart ...

ส่วนของการอ่านข้อมูลเข้ามา (Fetch Data) แล้วตรวจสอบว่าพิมพ์หมดหรือยัง ...
  1.     ' / --------------------------------------------------------------------------------
  2.     ' / เมื่อพิมพ์ข้อมูลจาก Detail1_Format เสร็จก็จะวนกลับมาเรียกข้อมูล (Fetch Data) ใหม่อีกครั้ง
  3.     ' / ด้วยการเลื่อนค่าจำนวนแถวขึ้น ItemNo +1 แล้วเทียบกับจำนวนแถวใน DataGrid
  4.     Private Sub AR6PrintEmployee_FetchData(sender As Object, eArgs As DataDynamics.ActiveReports.ActiveReport.FetchEventArgs) Handles Me.FetchData
  5.         ItemNo = ItemNo + 1
  6.         '/ ตรวจสอบจำนวนการพิมพ์ทั้งหมด ด้วยการนับจำนวนแถวใน DataGrid ที่อยู่ในฟอร์มหลัก
  7.         '/ จะส่งค่าจำนวนแถวมาก็ได้ แต่ผมเลือกอ้างถึงตัว DataGrid ใน frmARNetSimple โดยตรง
  8.         If ItemNo > frmARNetSimple.DataGridView1.RowCount Then
  9.             '// หากหมดแล้วก็จบการพิมพ์
  10.             eArgs.EOF = True
  11.             '// ยังไม่หมดข้อมูล
  12.         Else
  13.             eArgs.EOF = False
  14.         End If
  15.     End Sub
คัดลอกไปที่คลิปบอร์ด

โค้ดในส่วนของการพิมพ์รายละเอียดข้อมูล (Detail) ...
  1.     ' / --------------------------------------------------------------------------------
  2.     ' / รายละเอียดต่างๆก็จะนำมาแสดงใน Detail
  3.     Private Sub Detail1_Format(sender As System.Object, e As System.EventArgs) Handles Detail1.Format
  4.         '/ การอ้างถึงค่าในแต่ละแถว, หลักของ DataGridView Control ที่อยู่ใน frmARNetSimple
  5.         '/ ค่า ItemNo เริ่มต้นจาก 1 แต่ลำดับแถวใน DataGrid จะเริ่มต้นจาก 0 (Index=0) ก็เลยต้องลบออกด้วย 1
  6.         txtEmployeeID.Text = frmARNetSimple.DataGridView1.Rows(ItemNo - 1).Cells(0).Value
  7.         '/ แถว 0 หลัก 1
  8.         txtEmployeeName.Text = frmARNetSimple.DataGridView1.Rows(ItemNo - 1).Cells(1).Value
  9.         '/ แถว 0 หลัก 2
  10.         txtPosition.Text = frmARNetSimple.DataGridView1.Rows(ItemNo - 1).Cells(2).Value
  11.         '/ แถว 0 หลัก 3
  12.         txtDepartment.Text = frmARNetSimple.DataGridView1.Rows(ItemNo - 1).Cells(3).Value
  13.         '/ แถว 0 หลัก 4 (CDbl = Convert To Double)
  14.         txtSalary.Text = Format(CDbl(frmARNetSimple.DataGridView1.Rows(ItemNo - 1).Cells(4).Value), "#,##0.00")
  15.         '/ จากนั้นก็เริ่มแถวใหม่(แต่หลักคงเดิม)

  16.         '/ หาเลขคู่กับเลขคี่ เพื่อพิมพ์ลาเบล lblBG สลับสีในการพิมพ์แต่ละแถว
  17.         '/ หากเลขจำนวนใดๆหารด้วย 2 เหลือเศษ 0 = เลขคู่
  18.         If (ItemNo Mod 2) = 0 Then
  19.             lblBG.BackColor = Color.Cornsilk
  20.             '/ หากเลขจำนวนใดๆหารด้วย 2 เหลือเศษ 1 = เลขคี่
  21.         Else
  22.             lblBG.BackColor = Color.Azure
  23.         End If

  24.         '/ จากนี้มันก็กระโดดกลับไปที่ Sub FetchData เพื่ออ่านค่าเข้ามาพิมพ์ใหม่
  25.         '/ หากหมดจำนวนแถวที่ต้องการพิมพ์ (นับจำนวนแถวใน DataGrid) ก็จะจบการทำงาน (EOF=True)
  26.     End Sub
คัดลอกไปที่คลิปบอร์ด

โค้ดในส่วนของการกำหนด ActiveReports Designer เข้ากับไฟล์รายงาน ... ซึ่งจะอยู่ในฟอร์มหลักที่เรียกใช้งาน (frmARNetSimple.vb)
  1.     ' / --------------------------------------------------------------------------------
  2.     ' / Print Preview ก่อนทำการพิมพ์
  3.     Private Sub btnPreview_Click(sender As System.Object, e As System.EventArgs) Handles btnPreview.Click
  4.         Dim rpt As New ARNetSimple
  5.         ' / --------------------------------------------------------------------------------
  6.         ' / ส่วนที่สำคัญในการผูก ARDesigner เข้ากับรายงาน
  7.         ' / Instance name ARDesigner มันจะชี้ไปที่ไฟล์ ARNetSimple.vb
  8.         ' / โหลดรายงาน Document (ARNetSimple) เข้าสู่ ActiveReports Viewer
  9.         Me.Viewer1.Document = rpt.Document
  10.         ' / --------------------------------------------------------------------------------
  11.         ' / ปรับการย่อขยาย (Zoom) ของหน้ารายงาน
  12.         Viewer1.ReportViewer.Zoom = 0.85 ' 85%
  13.         ' / Run Report
  14.         rpt.Run()
  15.     End Sub
คัดลอกไปที่คลิปบอร์ด

มาดูโค้ดฉบับเต็มในฟอร์มหลักของ VB.NET ...
  1. Public Class frmARNetSimple

  2.     Private Sub frmARNetSimple_FormClosed(sender As Object, e As System.Windows.Forms.FormClosedEventArgs) Handles Me.FormClosed
  3.         Me.Dispose()
  4.         Application.Exit()
  5.     End Sub

  6.     Private Sub frmARNetSimple_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
  7.         Call InitGrid()
  8.         Call FillDataSample()
  9.     End Sub

  10.     '// Sample Data
  11.     Private Sub FillDataSample()
  12.         Dim row As String() = New String() {"EMP00001", "นายทองก้อน ทับทิมกรอบ", "Managing Director", "Management", "1,999,999"}
  13.         DataGridView1.Rows.Add(row)
  14.         row = New String() {"EMP00002", "นายบุญห่อ พ่อรวย", "ช่างเขาเถอะ", "Technical", "8,500"}
  15.         DataGridView1.Rows.Add(row)
  16.         row = New String() {"EMP00003", "นางสาวกุ๊กกิ๊ก น่ารักที่สุด", "เลขา", "Management", "27,500.75"}
  17.         DataGridView1.Rows.Add(row)
  18.         row = New String() {"EMP00004", "นางบัวผัน ฝันเฟื่อง", "หัวหน้าบัญชี", "บัญชี", "200"}
  19.         DataGridView1.Rows.Add(row)
  20.     End Sub

  21.     ' / --------------------------------------------------------------------------------
  22.     ' / การกำหนดค่าต่างๆให้กับตารางกริดแบบ @Run Time
  23.     Private Sub InitGrid()
  24.         Dim Column0 As New DataGridViewTextBoxColumn()
  25.         Dim Column1 As New DataGridViewTextBoxColumn()
  26.         Dim Column2 As New DataGridViewTextBoxColumn()
  27.         Dim Column3 As New DataGridViewTextBoxColumn()
  28.         Dim Column4 As New DataGridViewTextBoxColumn()
  29.         With DataGridView1
  30.             With Column0
  31.                 .Name = "EmployeeID"
  32.                 .HeaderText = "รหัสพนักงาน"
  33.                 .HeaderCell.Style.Alignment = DataGridViewContentAlignment.MiddleLeft
  34.                 .DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleLeft
  35.             End With
  36.             With Column1
  37.                 .Name = "Fullname"
  38.                 .HeaderText = "ชื่อ - นามสกุล"
  39.                 .HeaderCell.Style.Alignment = DataGridViewContentAlignment.MiddleLeft
  40.                 .DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleLeft
  41.             End With
  42.             With Column2
  43.                 .Name = "PositionName"
  44.                 .HeaderText = "ตำแหน่ง"
  45.             End With
  46.             With Column3
  47.                 .Name = "DepartmentName"
  48.                 .HeaderText = "แผนก"
  49.             End With
  50.             With Column4
  51.                 .ValueType = GetType(Double)
  52.                 .Name = "Salary"
  53.                 .HeaderText = "เงินเดือน"
  54.                 '// Value type
  55.                 .ValueType = GetType(System.Decimal)
  56.                 '// Format number 2 decimal place.
  57.                 .DefaultCellStyle.Format = "N2"
  58.                 .HeaderCell.Style.Alignment = DataGridViewContentAlignment.MiddleRight
  59.                 .DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleRight
  60.             End With
  61.             With DataGridView1
  62.                 .Columns.Add(Column0)
  63.                 .Columns.Add(Column1)
  64.                 .Columns.Add(Column2)
  65.                 .Columns.Add(Column3)
  66.                 .Columns.Add(Column4)
  67.             End With
  68.             '// Sample coding with Run-Time
  69.             With DataGridView1
  70.                 .RowHeadersVisible = True
  71.                 .AllowUserToAddRows = False
  72.                 .AllowUserToDeleteRows = False
  73.                 .AllowUserToResizeColumns = False
  74.                 .AllowUserToResizeRows = False
  75.                 .SelectionMode = DataGridViewSelectionMode.FullRowSelect
  76.                 .MultiSelect = False
  77.                 .ReadOnly = True
  78.                 '// Data rows
  79.                 .Font = New Font("Tahoma", 9)
  80.                 .RowTemplate.MinimumHeight = 20
  81.                 .RowTemplate.Height = 26
  82.                 '// Column Header
  83.                 .ColumnHeadersHeight = 30
  84.                 .ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.EnableResizing
  85.                 '// แสดงสีสลับแถวคู่-คี่
  86.                 .AlternatingRowsDefaultCellStyle.BackColor = Color.AliceBlue
  87.                 '// ปรับขนาดความกว้างของหลักให้พอดี
  88.                 .AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill
  89.                 .AutoResizeColumns()
  90.                 '// Header Own Style
  91.                 With .ColumnHeadersDefaultCellStyle
  92.                     .BackColor = Color.Navy
  93.                     .ForeColor = Color.Black
  94.                     .Font = New Font("Tahoma", 9, FontStyle.Bold)
  95.                 End With
  96.             End With
  97.         End With
  98.     End Sub

  99.     ' / --------------------------------------------------------------------------------
  100.     ' / Print Preview ก่อนทำการพิมพ์
  101.     Private Sub btnPreview_Click(sender As System.Object, e As System.EventArgs) Handles btnPreview.Click
  102.         Dim rpt As New ARNetSimple
  103.         ' / --------------------------------------------------------------------------------
  104.         ' / ส่วนที่สำคัญในการผูก ARDesigner เข้ากับรายงาน
  105.         ' / Instance name ARDesigner มันจะชี้ไปที่ไฟล์ ARNetSimple.vb
  106.         ' / โหลดรายงาน Document (ARNetSimple) เข้าสู่ ActiveReports Viewer
  107.         Me.Viewer1.Document = rpt.Document
  108.         ' / --------------------------------------------------------------------------------
  109.         ' / ปรับการย่อขยาย (Zoom) ของหน้ารายงาน
  110.         Viewer1.ReportViewer.Zoom = 0.85 ' 85%
  111.         ' / Run Report
  112.         rpt.Run()
  113.     End Sub
  114. End Class
คัดลอกไปที่คลิปบอร์ด

โค้ดฉบับเต็มในส่วนของ ActiveReports ...
  1. Imports DataDynamics.ActiveReports
  2. Imports DataDynamics.ActiveReports.Document

  3. Public Class ARNetSimple
  4.     ' ตัวแปรนี้ต้องประกาศเป็นแบบ Public เพื่อให้ส่วนของ Detail1_Format และ FetchData มองเห็นด้วย
  5.     Private ItemNo As Integer

  6.     ' / --------------------------------------------------------------------------------
  7.     ' / เมื่อพิมพ์ข้อมูลจาก Detail1_Format เสร็จก็จะวนกลับมาเรียกข้อมูล (Fetch Data) ใหม่อีกครั้ง
  8.     ' / ด้วยการเลื่อนค่าจำนวนแถวขึ้น ItemNo +1 แล้วเทียบกับจำนวนแถวใน DataGrid
  9.     Private Sub AR6PrintEmployee_FetchData(sender As Object, eArgs As DataDynamics.ActiveReports.ActiveReport.FetchEventArgs) Handles Me.FetchData
  10.         ItemNo = ItemNo + 1
  11.         '/ ตรวจสอบจำนวนการพิมพ์ทั้งหมด ด้วยการนับจำนวนแถวใน DataGrid ที่อยู่ในฟอร์มหลัก
  12.         '/ จะส่งค่าจำนวนแถวมาก็ได้ แต่ผมเลือกอ้างถึงตัว DataGrid ใน frmARNetSimple โดยตรง
  13.         If ItemNo > frmARNetSimple.DataGridView1.RowCount Then
  14.             '// หากหมดแล้วก็จบการพิมพ์
  15.             eArgs.EOF = True
  16.             '// ยังไม่หมดข้อมูล
  17.         Else
  18.             eArgs.EOF = False
  19.         End If
  20.     End Sub

  21.     ' / --------------------------------------------------------------------------------
  22.     ' / รายละเอียดต่างๆก็จะนำมาแสดงใน Detail
  23.     Private Sub Detail1_Format(sender As System.Object, e As System.EventArgs) Handles Detail1.Format
  24.         '/ การอ้างถึงค่าในแต่ละแถว, หลักของ DataGridView Control ที่อยู่ใน frmARNetSimple
  25.         '/ ค่า ItemNo เริ่มต้นจาก 1 แต่ลำดับแถวใน DataGrid จะเริ่มต้นจาก 0 (Index=0) ก็เลยต้องลบออกด้วย 1
  26.         txtEmployeeID.Text = frmARNetSimple.DataGridView1.Rows(ItemNo - 1).Cells(0).Value
  27.         '/ แถว 0 หลัก 1
  28.         txtEmployeeName.Text = frmARNetSimple.DataGridView1.Rows(ItemNo - 1).Cells(1).Value
  29.         '/ แถว 0 หลัก 2
  30.         txtPosition.Text = frmARNetSimple.DataGridView1.Rows(ItemNo - 1).Cells(2).Value
  31.         '/ แถว 0 หลัก 3
  32.         txtDepartment.Text = frmARNetSimple.DataGridView1.Rows(ItemNo - 1).Cells(3).Value
  33.         '/ แถว 0 หลัก 4 (CDbl = Convert To Double)
  34.         txtSalary.Text = Format(CDbl(frmARNetSimple.DataGridView1.Rows(ItemNo - 1).Cells(4).Value), "#,##0.00")
  35.         '/ จากนั้นก็เริ่มแถวใหม่(แต่หลักคงเดิม)

  36.         '/ หาเลขคู่กับเลขคี่ เพื่อพิมพ์ลาเบล lblBG สลับสีในการพิมพ์แต่ละแถว
  37.         '/ หากเลขจำนวนใดๆหารด้วย 2 เหลือเศษ 0 = เลขคู่
  38.         If (ItemNo Mod 2) = 0 Then
  39.             lblBG.BackColor = Color.Cornsilk
  40.             '/ หากเลขจำนวนใดๆหารด้วย 2 เหลือเศษ 1 = เลขคี่
  41.         Else
  42.             lblBG.BackColor = Color.Azure
  43.         End If

  44.         '/ จากนี้มันก็กระโดดกลับไปที่ Sub FetchData เพื่ออ่านค่าเข้ามาพิมพ์ใหม่
  45.         '/ หากหมดจำนวนแถวที่ต้องการพิมพ์ (นับจำนวนแถวใน DataGrid) ก็จะจบการทำงาน (EOF=True)
  46.     End Sub

  47.     ' / --------------------------------------------------------------------------------
  48.     ' / ทุกๆครั้งที่เริ่มต้นสั่งพิมพ์ จะต้องตั้งค่าเริ่มต้นใน ReportStart เพียงครั้งแรกและครั้งเดียว
  49.     Private Sub AR6PrintEmployee_ReportStart(sender As Object, e As System.EventArgs) Handles Me.ReportStart
  50.         '/ การตั้งค่าหน้ากระดาษ
  51.         With PageSettings
  52.             '/ หน่วยวัดเป็นนิ้ว (ใช้ CmToInch ด้วยการรับค่าเซนติเมตร แต่แปลงเป็นนิ้วแทน เพื่อวัดระยะได้ง่ายกว่า)
  53.             .Margins.Left = CmToInch(1.5)
  54.             .Margins.Right = CmToInch(0.2)
  55.             .Margins.Top = CmToInch(1.5)
  56.             .Margins.Bottom = CmToInch(1.5)
  57.             ' ตั้งค่ากระดาษแนวตั้ง
  58.             .Orientation = PageOrientation.Portrait
  59.             ' กระดาษขนาด A4
  60.             .PaperKind = Drawing.Printing.PaperKind.A4
  61.             ' กรณีที่กำหนดขนาดกระดาษเอง
  62.             ' .PaperKind = Drawing.Printing.PaperKind.Custom
  63.         End With
  64.         ' ปกติต้องเคลียร์ค่าต่างๆของ TextBox ก่อนการพิมพ์
  65.         txtEmployeeID.Text = ""
  66.         txtEmployeeName.Text = ""
  67.         txtPosition.Text = ""
  68.         txtDepartment.Text = ""
  69.         txtSalary.Text = ""
  70.     End Sub
  71. End Class
คัดลอกไปที่คลิปบอร์ด

ดาวน์โหลดชุดติดตั้ง ActiveReports .NET (V6) ได้ที่นี่ (เฉพาะสมาชิกเท่านั้น)
ดาวน์โหลดโค้ดต้นฉบับแบบเต็ม VB.NET (2010) ได้ที่นี่




ขออภัย! โพสต์นี้มีไฟล์แนบหรือรูปภาพที่ไม่ได้รับอนุญาตให้คุณเข้าถึง

คุณจำเป็นต้อง ลงชื่อเข้าใช้ เพื่อดาวน์โหลดหรือดูไฟล์แนบนี้ คุณยังไม่มีบัญชีใช่ไหม? ลงทะเบียน

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

0

กระทู้

3

โพสต์

64

เครดิต

Member

Rank: 2

เครดิต
64
โพสต์ 2018-1-16 12:11:10 | ดูโพสต์ทั้งหมด

ขอบคุณครับอาจารย์

1

กระทู้

13

โพสต์

91

เครดิต

Member

Rank: 2

เครดิต
91
โพสต์ 2022-10-18 21:21:37 | ดูโพสต์ทั้งหมด

แก้ไขครั้งสุดท้ายโดย OUDONE เมื่อ 2022-10-18 21:24

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

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

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

GMT+7, 2024-3-28 15:38 , Processed in 0.243652 second(s), 4 queries , File On.

Powered by Discuz! X3.4, Rev.62

Copyright © 2001-2020 Tencent Cloud.

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