Thursday, December 22, 2011

การออกรายงานโดยใช้ CrystalReport กับ DatagridView และ ADO.Net

1.Design หน้าตาแบบฟอร์ม(Form1) อย่าลืม DatagridView นะครับ

2. หลังจาก Design ฟอร์มเรียบร้อยให้ทำการ Add DataSet เข้ามาใน Project แล้วคลิกขวาเลือก
Add > DataTable
3. ที่หน้าต่าง DataTable คลิกขวา Add > Column และกำหนด DataType ตามที่ต้องการ

4.สร้างฟอร์มเพื่อเอาไว้ใช้แสดงรายงานโดยใช้ CrystalReportViewer(Form2)
5.Add crystal report เข้ามาใน Project
6.คลิกขวาที่ Database Field เลือก Database Expert… เลือก Project Data > ADO.Net DataSets
ทำการเพิ่ม DataTable ของเราที่อยู่ใน DataSet เข้าไป

7. ออกแบบรายงานตามรูปแบบต้องการ


มาถึงตัวอย่างการใช้งานครับ จากรูปแบบฟอร์มข้างต้น(Form1)
โดยเราจะทำการคำนวณราคารวม (จำนวน x ราคา)
Private Sub dgv_CellEndEdit(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles dgv.CellEndEdit
'แสดงค่าผลรวม และ ทศนิยม
For i As Integer = 1 To 2
If e.ColumnIndex = i Then
dgv.Rows(e.RowIndex).Cells(e.ColumnIndex).Value = CDbl(dgv.Rows(e.RowIndex).Cells(e.ColumnIndex).Value).ToString("#,##0.00")
dgv.Rows(e.RowIndex).Cells(3).Value = CDbl(CDbl(dgv.Rows(e.RowIndex).Cells(1).Value) * CDbl(dgv.Rows(e.RowIndex).Cells(2).Value)).ToString("#,##0.00")
Exit Sub
End If
Next
End Sub

ในการคำนวณนั้นต้องเป็นตัวเลขกับตัวเลขเท่านั้นเราจึงต้องทำการตรวจสอบค่าที่ป้อนเข้าไป 'การตรวจสอบการกรอกข้อมูลว่าเป็นตัวเลขหรือไม่
Private Sub dgv_EditingControlShowing(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewEditingControlShowingEventArgs) Handles dgv.EditingControlShowing

If dgv.CurrentCell.ColumnIndex = 1 Or dgv.CurrentCell.ColumnIndex = 2 Then
Dim txtNumeric As TextBox = e.Control
AddHandler txtNumeric.KeyPress, AddressOf txtNumeric_KeyPress
End If

End Sub

Private Sub txtNumeric_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs)

If dgv.CurrentCell.ColumnIndex = 1 Or dgv.CurrentCell.ColumnIndex = 2 Then
'ตรวจสอบการกด ตัวเลข "." backspace
Dim txtNumeric As TextBox = sender
If Asc(e.KeyChar) = Keys.Enter OrElse e.KeyChar Like "[.]" OrElse Asc(e.KeyChar) = Keys.Back Then
ElseIf Not (IsNumeric(e.KeyChar)) Then
MsgBox("กรุณาใส่ตัวเลขเท่านั้น")
e.Handled = True
End If

'ป้องกันการกด "." 2 ครั้ง
For i As Integer = 1 To txtNumeric.TextLength
If (Mid(txtNumeric.Text, i, 1)) = "." Then
If e.KeyChar Like "[.]" Then
e.Handled = True
Exit Sub
End If
End If
Next
End If

End Sub

ทดลองรันแล้วทำการป้อนข้อมูลเข้าไปใน DatagridView
คลิกที่ปุ่มพิมพ์เพื่อแสดงรายงาน
จบแล้วครับ
อาจจะเป็นเรื่องที่ พี่ ๆ น้อง ๆ หลายคนคงรู้แล้วแต่ก็หวังว่าพอจะมีประโยชน์สำหรับมือใหม่ไม่มากก็น้อยนะครับ(แล้วแต่การนำไปประยุกต์ใช้) ผมไม่เก่งทฤษฏี อาศัยครูพักลักจำเอาครับ อาจจะอธิบายน้อย เน้นรูปเยอะ code ก็เป็น code ง่าย ๆ ครับเอาแค่พอทำได้(เต็มที่แล้วครับ อิอิ)
แต่ก็อยากมีส่วนร่วมครับ
ขอบคุณครับ

ปล.ไม่กล้าใช้คำว่า บทความ ครับ เพราะดูมันเป็นเรื่องไม่พิเศษอะไรมากมายครับ คิดว่าเล่าสู่กันฟังแล้วกันนะครับ (ก่อน Post นี่ผมตีลังกาคิดประมาณ 37 รอบ ว่าจะ Post ดีมั้ยอ่ะครับ เหอ ๆ)

No comments:

Post a Comment