 |
|
เรื่อง Print Report ใน Visual Studio ครับ ต้องการให้ขึ้นหน้าใหม่ทำอย่างไร |
|
 |
|
|
 |
 |
|
อันนี้เป็นโค๊ดนะครับ
Code (VB.NET)
Public Sub StringToPrint_rptLog(ByVal sender As Object, ByVal e As Printing.PrintPageEventArgs)
Dim posY As Integer = 115
Dim i As Integer = 0
If (frmLog.ckhbxInjob.Checked = False) Then
AnyString(e.Graphics, "รายการ Login Logout ทั้งหมด", 300, 20)
Else
AnyString(e.Graphics, "รายการ Login ที่ยังไม่ได้ Logout", 300, 20)
End If
AnyString(e.Graphics, "________________________________________________________________________________________________", 20, 35)
AnyString(e.Graphics, "ชื่อพนักงาน", 20, 60)
AnyString(e.Graphics, "เวลา Login", 170, 60)
AnyString(e.Graphics, "ประจำที่", 320, 60)
AnyString(e.Graphics, "IN-OUT", 390, 60)
AnyString(e.Graphics, "เงินที่เก็บได้", 490, 60)
AnyString(e.Graphics, "เวลา Logout", 590, 60)
AnyString(e.Graphics, "________________________________________________________________________________________________", 20, 85)
While (i <= frmLog.loops - 1)
AnyString(e.Graphics, frmLog.dgvLog.Rows(i).Cells(0).Value.ToString(), 20, posY)
AnyString(e.Graphics, frmLog.dgvLog.Rows(i).Cells(1).Value.ToString(), 170, posY)
AnyString(e.Graphics, frmLog.dgvLog.Rows(i).Cells(2).Value.ToString(), 320, posY)
AnyString(e.Graphics, frmLog.dgvLog.Rows(i).Cells(3).Value.ToString(), 390, posY)
AnyString(e.Graphics, frmLog.dgvLog.Rows(i).Cells(4).Value.ToString(), 490, posY)
AnyString(e.Graphics, frmLog.dgvLog.Rows(i).Cells(5).Value.ToString(), 590, posY)
posY = posY + 30
i = i + 1
If (i Mod 34 = 0) Then
e.HasMorePages = True
Else
e.HasMorePages = False
End If
End While
End Sub
คือจากโค๊ดนี้เป็นการพิมพ์ข้อมูลใน DataGrid ออกมาครับ ทีนี้ผมใช้ HasMorePage ในการขึ้นหน้าใหม่ครับ โดยการ กำหนดให้หน้านึงพิมพ์ได้ 34 บันทัดแล้วก็จะขึ้นบันทัดใหม่
แต่ทีนี้ถ้าใช้ HasMorePages มันจะพิมพ์ข้อมูลใน DataGrid ให้หมดก่อน ค่อยขึ้นหน้าใหม่
แต่ผมอยากให้มันเป็นประมาณว่า สมมติ ใน DataGrid มีข้อมูลกี่บันทัดก็ตาม ให้มันพิมพ์ออกมาทางกระดาษโดยที่กระดาษ 1 หน้า จะพิมพ์ออกมา 34 บันทัด
แล้วก็ขึ้นหน้าใหม่แล้วก็พิมพ์อีก 34 บันทัดไปเรื่อย ๆ จนหมดข้อมูลใน DataGridView แบบนี้ต้องเขียนในลักษณะไหนหรอครับ
Tag : .NET, VB.NET
|
|
 |
 |
 |
 |
Date :
2013-05-30 17:53:14 |
By :
CPU4Core |
View :
1749 |
Reply :
3 |
|
 |
 |
 |
 |
|
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
ดันฮึบ ๆ
|
 |
 |
 |
 |
Date :
2013-06-03 09:55:51 |
By :
CPU4Core |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
ผมทำได้ละครับ หลังจากที่ไม่ได้สนใจมันมาตั้งแต่ตั้งกระทู้มัวแต่ไปทำอย่างอื่น วันนี้ หลังจากดันกระทู้เสร็จเลยลองมานั่ง ไล่มันไปทีละสเต็ป
ประมาณ 1 Hr ก็ออกมาได้ตามนี้นะครับ
Code (VB.NET)
Public Sub StringToPrint_rptLog(ByVal sender As Object, ByVal e As Printing.PrintPageEventArgs)
Dim posY As Integer = 115
Static i As Integer = 0
Static IsNewPage As Boolean = False
Dim y As Integer = frmLog.loops
If (frmLog.ckhbxInjob.Checked = False) Then
If (i < 1) Then
AnyString(e.Graphics, "รายการ Login Logout ทั้งหมด", 300, 20)
End If
Else
If (i < 1) Then
AnyString(e.Graphics, "รายการ Login ที่ยังไม่ได้ Logout", 300, 20)
End If
End If
AnyString(e.Graphics, "________________________________________________________________________________________________", 20, 35)
AnyString(e.Graphics, "ชื่อพนักงาน", 20, 60)
AnyString(e.Graphics, "เวลา Login", 170, 60)
AnyString(e.Graphics, "ประจำที่", 320, 60)
AnyString(e.Graphics, "IN-OUT", 390, 60)
AnyString(e.Graphics, "เงินที่เก็บได้", 490, 60)
AnyString(e.Graphics, "เวลา Logout", 590, 60)
AnyString(e.Graphics, "________________________________________________________________________________________________", 20, 85)
Do
If (IsNewPage = True) Then
y = frmLog.loops
End If
AnyString(e.Graphics, frmLog.dgvLog.Rows(i).Cells(0).Value.ToString(), 20, posY)
AnyString(e.Graphics, frmLog.dgvLog.Rows(i).Cells(1).Value.ToString(), 170, posY)
AnyString(e.Graphics, frmLog.dgvLog.Rows(i).Cells(2).Value.ToString(), 320, posY)
AnyString(e.Graphics, frmLog.dgvLog.Rows(i).Cells(3).Value.ToString(), 390, posY)
AnyNum(e.Graphics, frmLog.dgvLog.Rows(i).Cells(4).Value.ToString(), 490, posY, StringAlignment.Far)
AnyString(e.Graphics, frmLog.dgvLog.Rows(i).Cells(5).Value.ToString(), 590, posY)
posY = posY + 30
i = i + 1
If (i Mod 34 = 0) Then
e.HasMorePages = True
y = 1
IsNewPage = True
Else
e.HasMorePages = False
End If
Loop While (i < y)
If (i >= frmLog.loops) Then
AnyString(e.Graphics, "________________________________________________________________________________________________", 20, posY)
AnyString(e.Graphics, "พิมพ์รายงานเมื่อ : " & Me.get_DateNow.ToString("dd/MM/yyyy hh:mm:ss"), 20, posY + 30)
AnyString(e.Graphics, "ผู้พิมพ์รายงาน : " & Me.get_NameFromLogin(frmMain.txtUsername.Text), 20, posY + 60)
i = 0
y = 0
End If
End Sub
หลักการคือ เราต้องประกาศตัวแปร i เป็น Static มันจะได้จำค่าล่าสุดเอาไว้ โดยตัวแปร i นี่ผมใช้นับ row ใน GridView ส่วนตัวแปร Y เอาไว้
หลอกมันว่ามันอ่านข้อมูลหมดหรือยังครับ
จากนั้นก็เอามาเช็คว่า Mod 34 ลงตัวหรือไม่ ถ้าลงตัวก็ ขึ้นหน้าใหม่โดย e.HasMorePages เป็นตัวเรียกหน้าใหม่
จากนั้นอย่างที่บอกครับว่า e.HasMorePage มันจะเรียกใหม่เมื่อมันอ่านข้อมูลหมด ผมก็เลยหลอกมันไปเวยข้อมูลหมดแล้ว
แล้วจึงใช้ประโยชน์จากตัวแปรแบบ Static ดึงข้อมุลที่เหลือออกมาอีกครั้งนึงครับ
อธิบายไม่ค่อยเก่งลองดูโค๊ดละกันครับ
|
 |
 |
 |
 |
Date :
2013-06-03 16:13:59 |
By :
CPU4Core |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
เยี่ยมไปเลยครับ
|
 |
 |
 |
 |
Date :
2013-06-03 16:16:13 |
By :
mr.win |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
|
|