none
ProgressBar的使用問題 RRS feed

  • 問題

  • 1.我開啟一個Access資料庫, 將Data放入DataSet內, 再使用DataGridView呈現資料.

    2.因讀取的Access記錄筆數很多, 費時很長, 於是我要插入ProgressBar呈現記錄讀取進度.

    3.請問在讀取Access記錄時, 因不知道會有多少筆記錄會讀入DataSet, 請問我該怎麼設定ProgressBar的Maximum值, 讓ProgressBar能呈現記錄讀取進度.

    謝謝

    2011年8月29日 下午 01:22

解答

  • 如果不想用Marquee型的ProgressBar. 可以先查出總共有幾筆記錄, 以設定ProgressBar的Maximum值, 再於BackgroundWorker的DoWork事件處理程序中利用SqlDataReader讀取記錄, 把讀到的記錄放入DataTable中, 並呼叫ReportProgress方法更新進度
    2011年8月30日 上午 06:57
  • 1.謝謝大大的指導, 我的Dataset 確實是跟DataGridView 繫結著.

    2.經指點之後, 就一直爬文認識委派, 過去沒學過委派所以不會用. 大大是否可以再指導, 以我的案例應該怎麼套用下例語法, 目地要讓目前執行緒中的 DataSet能取得在DoWork事件中開啟的Access資料庫記錄.

    returnValue = Control.Invoke(method, args)

    謝謝


    我想是因為你只爬文, 沒有照著寫寫看, 想想看. 其實道理都一樣, 只是你肯不肯用心用想而已.

    (1) 一行行Update的方法:

    Public Class Form1
        Public Delegate Sub RowChanged(ByVal inputData As DataStyle)
        Public Sub Change(ByVal inputData As DataStyle)
            If DataGridView1.InvokeRequired = True Then
                Dim d As New RowChanged(AddressOf Change)
                DataGridView1.Invoke(d, New Object() {inputData})
            Else
                Dim addRow As DataRow = dt.NewRow()
                addRow(0) = inputData._col0
                addRow(1) = inputData._col1
                dt.Rows.Add(addRow)
     
            End If
        End Sub
        Private dt As New DataTable
        Private Sub Form1_Load(ByVal sender As System.ObjectByVal e As System.EventArgsHandles MyBase.Load
            dt.Columns.Add("col0")
            dt.Columns.Add("col1")
            DataGridView1.DataSource = dt
        End Sub
        Private Sub Button1_Click(ByVal sender As System.ObjectByVal e As System.EventArgsHandles Button1.Click
            Dim t As New Threading.Thread(AddressOf AnotherThread)
            t.IsBackground = True
            t.Start()
        End Sub
        Private Sub AnotherThread()
            Dim dStyle As New DataStyle
            dStyle._col0 = "ABC"
            dStyle._col1 = "CDE"
            Change(dStyle)
        End Sub
    End Class
     
    Public Class DataStyle
        Public Property _col0 As String
        Public Property _col1 As String
    End Class

     

    (2) 一次Update的方法

    ublic Class Form1
        Public Delegate Sub RowChanged(ByVal inputData As DataTable)
        Public Sub Change(ByVal inputData As DataTable)
            If DataGridView1.InvokeRequired = True Then
                Dim d As New RowChanged(AddressOf Change)
                DataGridView1.Invoke(d, New Object() {inputData})
            Else
                DataGridView1.DataSource = Nothing
                DataGridView1.DataSource = inputData
            End If
        End Sub
     
        Private Sub Form1_Load(ByVal sender As System.ObjectByVal e As System.EventArgsHandles MyBase.Load
     
        End Sub
     
        Private Sub Button1_Click(ByVal sender As System.ObjectByVal e As System.EventArgsHandles Button1.Click
            Dim t As New Threading.Thread(AddressOf AnotherThread)
            t.IsBackground = True
            t.Start()
        End Sub
     
        Private Sub AnotherThread()
            Dim dt As New DataTable
            dt.Columns.Add("col0")
            dt.Columns.Add("col1")
            For i As Int32 = 0 To 9
                Dim addRow As DataRow = dt.NewRow()
                addRow(0) = i
                addRow(1) = 100 + i
                dt.Rows.Add(addRow)
            Next
            Change(dt)
        End Sub
    End Class
    

    花點時間爬爬論壇的文對照一下為何會這樣寫, 程式不是光用看的, 要想.

     

     

     


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。
    • 已標示為解答 小玩熊 2011年8月30日 下午 02:39
    2011年8月30日 下午 01:29
    版主

所有回覆

  • 不知道總數多少, 就不可能預測進度百分比吧.

    通常這種無法預知的狀態, 可以把ProgressBar的Style改成其它樣式, ex: Marquee (跑馬燈)

    詳情請參閱MSDN文件庫

    [ProgressBar.Style 屬性 ]

    [ProgressBarStyle 列舉型別]

    備註要注意

    當您想要表示正在進行的進度時,您可以使用跑馬燈樣式,不過卻無法表示進度的數量。 Marquee 樣式只有在啟用視覺化樣式時才有效。 Continuous 樣式只有在停用視覺化樣式時才有效。


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。
    2011年8月29日 下午 02:18
    版主
  • 1.感謝說明.

    2.若是在 BackgroundWorker 的 BackgroundWorker1_ProgressChanged 事件內, 是否可以由 e 取得百分比值?因為我無法取的百分比值,

    謝謝

    2011年8月29日 下午 02:26
  • 那個值是你要計算好丟給它的, 可以參考以下文章

    [多執行緒初探--使用BackgroundWorker(1)]


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。
    2011年8月29日 下午 02:28
    版主
  • 如果不想用Marquee型的ProgressBar. 可以先查出總共有幾筆記錄, 以設定ProgressBar的Maximum值, 再於BackgroundWorker的DoWork事件處理程序中利用SqlDataReader讀取記錄, 把讀到的記錄放入DataTable中, 並呼叫ReportProgress方法更新進度
    2011年8月30日 上午 06:57
  • 感謝說明.目前我是這麼作的, 但所讀取的記錄無法放入 DataSet, 錯誤訊息說它們不在同一執行緒, 請問我該如何排除此錯誤.

    謝囉

    2011年8月30日 上午 08:11
  • 你的Dataset 有和DataGridView 繫結對不對 ?

    這樣會跨執行緒存取, 必須使用委派

    請參考論壇既有討論[跨執行緒委派]


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。
    2011年8月30日 上午 08:29
    版主
  • 1.謝謝大大的指導, 我的Dataset 確實是跟DataGridView 繫結著.

    2.經指點之後, 就一直爬文認識委派, 過去沒學過委派所以不會用. 大大是否可以再指導, 以我的案例應該怎麼套用下例語法, 目地要讓目前執行緒中的 DataSet能取得在DoWork事件中開啟的Access資料庫記錄.

    returnValue = Control.Invoke(method, args)

    謝謝






    2011年8月30日 下午 01:06
  • 1.謝謝大大的指導, 我的Dataset 確實是跟DataGridView 繫結著.

    2.經指點之後, 就一直爬文認識委派, 過去沒學過委派所以不會用. 大大是否可以再指導, 以我的案例應該怎麼套用下例語法, 目地要讓目前執行緒中的 DataSet能取得在DoWork事件中開啟的Access資料庫記錄.

    returnValue = Control.Invoke(method, args)

    謝謝


    我想是因為你只爬文, 沒有照著寫寫看, 想想看. 其實道理都一樣, 只是你肯不肯用心用想而已.

    (1) 一行行Update的方法:

    Public Class Form1
        Public Delegate Sub RowChanged(ByVal inputData As DataStyle)
        Public Sub Change(ByVal inputData As DataStyle)
            If DataGridView1.InvokeRequired = True Then
                Dim d As New RowChanged(AddressOf Change)
                DataGridView1.Invoke(d, New Object() {inputData})
            Else
                Dim addRow As DataRow = dt.NewRow()
                addRow(0) = inputData._col0
                addRow(1) = inputData._col1
                dt.Rows.Add(addRow)
     
            End If
        End Sub
        Private dt As New DataTable
        Private Sub Form1_Load(ByVal sender As System.ObjectByVal e As System.EventArgsHandles MyBase.Load
            dt.Columns.Add("col0")
            dt.Columns.Add("col1")
            DataGridView1.DataSource = dt
        End Sub
        Private Sub Button1_Click(ByVal sender As System.ObjectByVal e As System.EventArgsHandles Button1.Click
            Dim t As New Threading.Thread(AddressOf AnotherThread)
            t.IsBackground = True
            t.Start()
        End Sub
        Private Sub AnotherThread()
            Dim dStyle As New DataStyle
            dStyle._col0 = "ABC"
            dStyle._col1 = "CDE"
            Change(dStyle)
        End Sub
    End Class
     
    Public Class DataStyle
        Public Property _col0 As String
        Public Property _col1 As String
    End Class

     

    (2) 一次Update的方法

    ublic Class Form1
        Public Delegate Sub RowChanged(ByVal inputData As DataTable)
        Public Sub Change(ByVal inputData As DataTable)
            If DataGridView1.InvokeRequired = True Then
                Dim d As New RowChanged(AddressOf Change)
                DataGridView1.Invoke(d, New Object() {inputData})
            Else
                DataGridView1.DataSource = Nothing
                DataGridView1.DataSource = inputData
            End If
        End Sub
     
        Private Sub Form1_Load(ByVal sender As System.ObjectByVal e As System.EventArgsHandles MyBase.Load
     
        End Sub
     
        Private Sub Button1_Click(ByVal sender As System.ObjectByVal e As System.EventArgsHandles Button1.Click
            Dim t As New Threading.Thread(AddressOf AnotherThread)
            t.IsBackground = True
            t.Start()
        End Sub
     
        Private Sub AnotherThread()
            Dim dt As New DataTable
            dt.Columns.Add("col0")
            dt.Columns.Add("col1")
            For i As Int32 = 0 To 9
                Dim addRow As DataRow = dt.NewRow()
                addRow(0) = i
                addRow(1) = 100 + i
                dt.Rows.Add(addRow)
            Next
            Change(dt)
        End Sub
    End Class
    

    花點時間爬爬論壇的文對照一下為何會這樣寫, 程式不是光用看的, 要想.

     

     

     


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。
    • 已標示為解答 小玩熊 2011年8月30日 下午 02:39
    2011年8月30日 下午 01:29
    版主
  • 感謝再次指導.
    2011年8月30日 下午 02:39