11 เมษายน 2555

Tips VB.NET2005 : Progress Bar กับ Database

Tips VB.NET2005 : Progress Bar กับ Database


วิธีการใช้ Progress Bar ในช่วงที่ดึงข้อมูลจากฐานข้อมูลลง Dataset

หลาย ๆ คนคงประสบปัญหาเวลาข้อมูลที่ Select ขึ้นมามีขนาดใหญ่ แล้วทำให้คนใช้ต้องรอนานมากกว่าจะ Fill ข้อมูลลง Dataset เสร็จ
ใน VB.NET 2005 นั้นมันมีแถม ProgressBar มา แต่การนำมาใช้ช่วงที่ Fill ลง Dataset นั้นทำไม่ได้โดยตรง แต่ก็ยังมีวิธีอ้อม ๆ ซึ่งตัว Code นั้นก็ไม่ยากเกินกำลัง

มาลองศึกษาดูนะครับ

เราต้องมาศึกษาสมการที่จะใช้กันก่อนคือ ถ้าสมมติว่าข้อมูลที่เราดึงมาได้นั้นมีขนาด 20,000 records
เราเซต ProgressBar Maximum ไว้ที่ 100
สูตรจะได้ว่า (PGBMaximum x ข้อมูลที่กำลังทำ) / RecordMaximum ซึ่งคำตอบสำหรับค่าสูงสุดก็คือ 100 นั่นเอง

ส่วน Coding นั้นมาดูกันครับ

อันดับแรก เราสร้าง Sub ชื่อ Progress ตามด้านล่าง (ก๊อปปี้ไปได้เลยนะครับ)

Private Sub Progress(ByVal sender As Object, ByVal e As System.Data.DataRowChangeEventArgs)
   'running คือ ข้อมูลที่กำลังทำไปทีละตัว ๆ (Running Record)
'ToolStripProgressBar1.Maximum คือ ProgressBar Maximum
'max คือ RecordMaximum

ToolStripProgressBar1.Value = CInt((ToolStripProgressBar1.Maximum * running) / max)
running += 0.5
End Sub

ข้อสังเกตุของฟังก์ชั่น Progress นั้น ทำไม running ถึงบวกทีละ 0.5 เนื่องจากตอนทดสอบ เมื่อข้อมูลถูก Fill ลงใน DataSet จำนวนที่มันวนในนี้มันดับเบิ้ลขึ้นมา
ถ้าท่านไม่อยากบวกทีละ 0.5 แต่อยากจะบวกทีละ 1 ก็ให้ค่า max = max * 2 หละกันนะครับ หรือจะไปแก้ตอนที่นับ Value ก็ได้


อันดับต่อมา ใน Code ของผู้สร้างที่มีการ Fill ข้อมูลจาก DataAdapter ลง DataSet สมมติโค้ดง่าย ๆ นะครับ
ก่อนการทำงาน เราจะต้องยอมเสียเวลานิดนึงเพื่อหาว่า ข้อมูลที่เราต้องการดึงมานั้น มีทั้งหมดเท่าไหร่ เพื่อที่จะโยนข้อมูลลงในตัวแปร max
จะได้ Code ดังต่อไปนี้

Dim sql As String = "select count(*) from person where name like 'ก%'"
Dim cnt As New OleDb.OleDbCommand(sql, DBConn)
max = cnt.ExecuteScalar()

เมื่อได้ค่า max มาแล้ว เราจะทำการอ่านข้อมูลจากฐานข้อมูล เพื่อทำการ Fill ลง DataAdapter

sql = "select * from Person where name like 'ก%''"
Dim adap As New OleDb.OleDbDataAdapter(sql, ConnStr)
DS.Tables.Add("person")

ณ ตอนนี้ เราต้องทำการ Add Event Handler ของตัว DataSet ในช่วงที่เกิด RowChanged นะครับ

AddHandler DS.Tables("person").RowChanged, AddressOf Progress

ดังนั้นตอนนี้ เมื่อเกิดเหตุการณ์ RowChanged ที่ Dataset ในตัว Table ชื่อ Person มันก็จะไปเรียกฟังก์ชั่น Progress มาทำงานอัตโนมัติแล้วครับ
หลังจากนั้น ให้เราทำการ Fill ข้อมูลจาก Data Adapter ไปยัง DataSet ได้เลยครับ หลังจากนั้นค่อยทำการลบ Handler ที่ทำไว้

adap.Fill(DS, "person")
RemoveHandler DS.Tables("person").RowChanged, AddressOf Progress

มาดูฟังก์ชั่นตัวอย่างทั้งหมดกันเลยครับ ผมสร้างเป็นปุ่ม Button ใน Event Click

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
'หาจำนวนที่ค้นพบ
Dim sql As String = "select count(*) from person where name like 'ก%'"
Dim cnt As New OleDb.OleDbCommand(sql, DBConn)
max = cnt.ExecuteScalar()
running = 0 'เคลียร์ค่า Running Record

'เริ่มการดึงข้อมูลลง Dataset
sql = "select * from person where name like 'ก%'"
Dim adap As New OleDb.OleDbDataAdapter(sql, ConnStr)
DS.Tables.Add("person")

'ผูก Event กับฟังก์ชั่น Progress
AddHandler DS.Tables("person").RowChanged, AddressOf Progress
adap.Fill(DS, "person")

'เมื่อ Fill ข้อมูลเสร็จ ให้ลบการผูก Event กับฟังก์ชั่น Progress
RemoveHandler DS.Tables("person").RowChanged, AddressOf Progress

'ทำการเอาข้อมูลลง DataGrid
DataGridView1.DataSource = DS.Tables("person")
DataGridView1.Refresh()

'เคลียร์สถานะของ ProgressBar
ToolStripProgressBar1.Value = 0
End Sub

ท่านใดอยากลองเอาไปใช้ ก็ลองใช้นะครับ
ที่มา ::  http://www.bloggang.com

0 ความคิดเห็น:

แสดงความคิดเห็น