Group Blog
 
<<
มีนาคม 2551
 1
2345678
9101112131415
16171819202122
23242526272829
3031 
 
18 มีนาคม 2551
 
All Blogs
 
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

ท่านใดอยากลองเอาไปใช้ ก็ลองใช้นะครับ


Create Date : 18 มีนาคม 2551
Last Update : 21 มีนาคม 2551 2:08:49 น. 5 comments
Counter : 3223 Pageviews.

 

เก่งจัง ปรบมือให้แล้วนะ ได้ยินอ่ะป่ะ


โดย: nang_sida วันที่: 20 มีนาคม 2551 เวลา:19:11:30 น.  

 
แหล่มเลยคับ Thx


โดย: TheSky IP: 203.144.220.243 วันที่: 4 เมษายน 2551 เวลา:18:24:29 น.  

 
ขอบคุณมากครับ กำลังหาอยู่พอดี...^_^


โดย: Dondelpiero IP: 182.53.51.158 วันที่: 23 พฤษภาคม 2554 เวลา:21:04:15 น.  

 
thanks


โดย: kham IP: 202.62.96.221 วันที่: 29 พฤษภาคม 2555 เวลา:16:55:52 น.  

 
(ขอแนะนำแบบงูๆปลาๆนะครับ)
ละทำไมไม่เอา ToolStripProgressBar1.Maximum = max ละครับแบบนี้ผมว่ามันง่ายกว่าไม


โดย: ๋Jza IP: 183.89.156.239 วันที่: 22 กันยายน 2557 เวลา:18:07:26 น.  

ชื่อ :
Comment :
  *ใช้ code html ตกแต่งข้อความได้เฉพาะสมาชิก
 

I^^
Location :


[ดู Profile ทั้งหมด]

ฝากข้อความหลังไมค์
Rss Feed
Smember
ผู้ติดตามบล็อก : 8 คน [?]




Friends' blogs
[Add I^^'s blog to your web]
Links
 

 Pantip.com | PantipMarket.com | Pantown.com | © 2004 BlogGang.com allrights reserved.