2016-03-16 2 views
0

У меня есть код VB.net для извлечения данных с SQL-сервера (хранимой процедуры) в Datagridview (dgMC). все работало нормально, но progressbar1 не обновляется. я хотел бы progressbar1 показывает обновление в процентах, если пользователь знает статус получения данных. данные около 1000K.Как обновить панель прогресса при извлечении данных из базы данных в datagridview VB.NET

Friend Delegate Sub SetDataSourceDelegate(table As DataTable) 
    Private Sub setDataSource(table As DataTable) 
     ' Invoke method if required: 
     If Me.InvokeRequired Then 
      Me.Invoke(New SetDataSourceDelegate(AddressOf setDataSource), table) 
     Else 
      dgMC.DataSource = table 
      ProgressBar1.Visible = False 
     End If 
    End Sub 
    Private Sub loadTable() 
     Dim cnn As SqlConnection = GetConnection() 
     Dim cmdSearch As New SqlCommand("MC_Display", cnn) 
     cmdSearch.CommandType = CommandType.StoredProcedure 
     Try 
      cnn.Open() 
      Dim readerSearch = cmdSearch.ExecuteReader 
      If readerSearch.HasRows Then 
       Dim dt = New DataTable() 
       dt.Load(readerSearch) 
       setDataSource(dt) 
      Else 
       Me.Cursor = Cursors.Default 
       MsgBox("No Data Found.", MsgBoxStyle.Exclamation) 
       dgMC.DataSource = Nothing 
      End If 
      readerSearch.Close() 
     Catch ex As Exception 
      Throw ex 
     Finally 
      cnn.Close() 
     End Try 
    End Sub 

    Private Sub btnGoMC_Click(sender As Object, e As EventArgs) Handles btnGoMC.Click 
     ProgressBar1.Visible = True 
     ProgressBar1.Style = ProgressBarStyle.Marquee 
     Dim thread As New System.Threading.Thread(New System.Threading.ThreadStart(AddressOf loadTable)) 
     thread.Start() 
    End Sub 

ответ

1

Чтобы точно знать количество данных, вы должны создать запрос со счетом (*) ваших данных.

Затем, когда вы извлекаете данные, вы должны знать, какая строка извлекается, потому что вам нужно рассчитать процент.

И, наконец, освежить ProgressBar:

Dim percentage As Double = (currentRow/totalRows) * 100 
ProgressBar.Value = Int32.Parse(Math.Truncate(percentage).ToString()) 

Я надеюсь, что это помогает вам

0

Поскольку вы не выполняете ничего, что количественному (вы выдачу запроса SQL в базу данных, блокируя обработку для этого потока, пока база данных не даст вам данные, которые вы запросили), вы не сможете обновить индикатор выполнения с чем-либо значимым. В таких случаях обычно достаточно прокрутки Marquee. Кроме того, у вас есть индикатор выполнения в потоке пользовательского интерфейса, поэтому он может реагировать и начинать новый поток, чтобы блокировать поток пользовательского интерфейса. На данный момент вы не можете легко получить доступ к строке выполнения в потоке пользовательского интерфейса.

Некоторые другие мысли, хотя ... Если у вас есть доступ к параллельной библиотеке задач, я бы посоветовал использовать это вместо создания необработанного потока и начала выполнения процесса. Вы можете использовать тип в TPL под названием «Задача», который является абстракцией Thread и заботится о некоторых деталях, которые вам, вероятно, не нужно беспокоиться в этом конкретном приложении/сценарии. Он также дает мощное асинхронное программирование через парадигму Async/Await в .NET 4.5. Существует отличная серия блог парень по имени Стефан Клири, который имеет большой опыт по этой парадигме: Stephen Cleary Async/Await

Краткий пример:

Private Sub btnGoMC_Click(sender As Object, e As EventArgs) Handles btnGoMC.Click ProgressBar1.Visible = True ProgressBar1.Style = ProgressBarStyle.Marquee Dim thread As New System.Threading.Thread(New System.Threading.ThreadStart(AddressOf loadTable)) thread.Start() End Sub

Может стать:

`Private Async Sub btnGoMC_Click(sender As Object, e As EventArgs) Handles btnGoMC.Click 
    ProgressBar1.Visible = True 
    ProgressBar1.Style = ProgressBarStyle.Marquee 
    Await Task.Run(Sub() loadTable) 
End Sub` 
+0

Я но получил сообщение msg: «Run» не входит в «Task». – Sokea

+0

Какая версия платформы .NET предназначена для таргетинга? – davidallyoung

+0

после изменения на .NET 4.5 в порядке, но все же прогрессbar1 не обновляется, и пользовательский интерфейс кажется не ответом. – Sokea

Смежные вопросы