как показать анимированный GIF загрузки при нажатии кнопки vb.net с помощью backgroundworker - PullRequest
0 голосов
/ 28 мая 2018

каждый, Я обновил свой вопрос , я только новичок в хранимых процедурах Visual Basic.Net и Oracle.

У меня есть этот набор кодов, который я нашел в Интернете.Это работает, но как я могу преобразовать этот импортирующий CSV-файл из выборки строк из базы данных, используя хранимую процедуру Oracle.

    Dim strRow As String()              'String array to read all fields in a row
Dim dblAmount As Double             'Variable for total amount 
Dim blnReported As Boolean = True   'Flag to check progress report completed or not

'Create TextFieldParser class to parse the stock.csv file in the current location
Dim txtFile As FileIO.TextFieldParser

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    'Allow background operation to be cancelled
    bgWorker.WorkerSupportsCancellation = True

    'Allow background operation to report progress
    bgWorker.WorkerReportsProgress = True

    'Disable Stop Button. It is enabled only after start
    'button is pressed
    btnStop.Enabled = False

    'set status message
    lblStatus.Text = "Press Start to import data from csv."

    'Add columns to the grid
    dgvCSVData.Columns.Add("colNo", "No")
    dgvCSVData.Columns("colNo").Width = 30
    dgvCSVData.Columns.Add("colDate", "Date")
    dgvCSVData.Columns("colDate").Width = 60
    dgvCSVData.Columns.Add("colItem", "Item")
    dgvCSVData.Columns("colItem").Width = 120
    dgvCSVData.Columns.Add("colQty", "Quantity")
    dgvCSVData.Columns("colQty").Width = 50
    dgvCSVData.Columns.Add("colUnit", "Unit")
    dgvCSVData.Columns("colUnit").Width = 30
    dgvCSVData.Columns.Add("colAmt", "Amt")
    dgvCSVData.Columns("colAmt").Width = 60
End Sub

Private Sub btnStart_Click(sender As Object, e As EventArgs) Handles btnStart.Click
    'Disable Start button and Enable Stop
    btnStart.Enabled = False
    btnStop.Enabled = True

    'set status message
    lblStatus.Text = "Importing data from CSV file."

    'Start time-consuming operation in background
    Call bgWorker.RunWorkerAsync()
End Sub

Private Sub btnStop_Click(sender As Object, e As EventArgs) Handles btnStop.Click
    'Enable Start button and disable Stop
    btnStart.Enabled = True
    btnStop.Enabled = False

    'Stop background operation
    bgWorker.CancelAsync()

    'set status message
    lblStatus.Text = "Import cancelled. Press Start again."
End Sub

Private Sub bgWorker_DoWork(sender As Object, e As System.ComponentModel.DoWorkEventArgs) Handles bgWorker.DoWork
    Dim intCount As Int16 = 0
    txtFile = New FileIO.TextFieldParser("stock.csv")
    'Specify structure of the file
    txtFile.TextFieldType = FileIO.FieldType.Delimited
    txtFile.SetDelimiters(",")

    'Skip header row
    txtFile.ReadFields()

    'Start reading data from file
    While Not txtFile.EndOfData

        If bgWorker.CancellationPending Then
            e.Cancel = True
            Exit Sub

        Else

            'Wait for Progress Report to finish
            While Not blnReported
                Application.DoEvents()
            End While

            'Read all field in a row into a string array
            strRow = txtFile.ReadFields()

            'Do some calculations and assign value to data grid
            dblAmount = CDbl(strRow(3)) * CDbl(strRow(4))

            'Add some sleep to simulate a long running operation
            System.Threading.Thread.Sleep(500)

            'Progress report pending
            blnReported = False

            'increment counter
            intCount += 1

            'Report the progress
            bgWorker.ReportProgress(10, intCount)

        End If

    End While
End Sub

Private Sub bgWorker_ProgressChanged(sender As Object, e As System.ComponentModel.ProgressChangedEventArgs) Handles bgWorker.ProgressChanged
    'Copy values to data grid
    dgvCSVData.Rows.Add(strRow)
    dgvCSVData.Rows(dgvCSVData.CurrentRow.Index - 1).Cells("colAmt").Value = dblAmount

    pgbCopyProgress.Value = e.UserState
    'Progress report finished
    blnReported = True
End Sub

Private Sub bgWorker_RunWorkerCompleted(sender As Object, e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles bgWorker.RunWorkerCompleted
    If e.Cancelled Or Not IsNothing(e.Error) Then
        'Clear the data grid
        dgvCSVData.Rows.Clear()
    Else
        'Progress completed
        pgbCopyProgress.Value = 100

        'Release txtfile
        txtFile.Dispose()
        btnStop.Enabled = False
        btnStart.Enabled = True

    End If
End Sub

Вот мой код для вызова строк в базе данных

 Public Function RESA_Checker(ByVal stores As String, ByVal bus_date As String, ByVal warehouse As String)
    dt = New DataTable
    bg.GetProcDataTable(connStr, "SALES_CHECKER.procedure_checker")
    cmd.Parameters.Add(New OracleParameter("stores", OracleDbType.Varchar2)).Value = stores
    cmd.Parameters.Add(New OracleParameter("bus_date", OracleDbType.Varchar2)).Value = bus_date
    cmd.Parameters.Add(New OracleParameter("warehouse", OracleDbType.Varchar2)).Value = warehouse
    cmd.Parameters.Add(New OracleParameter("O_OUTPUT", OracleDbType.RefCursor)).Direction = ParameterDirection.Output
    adap_or.SelectCommand = cmd
    adap_or.Fill(dt)


    Return dt
    ora_conn.Close()
End Function

Моя цель заключается в том, чтобы пользователь через диалоговое окно с индикатором выполнения или анимированным GIF-сообщением информировал пользователя о том, что форма загружает и продолжает извлекать записи из базы данных с надписью «Пожалуйста, подождите» / «Поиск», ипредотвратить путаницу для пользователя, думая, что форма разбилась.

Ps Было бы полезно, если бы дали ссылки на видеоуроки.Я надеюсь, что вы могли бы помочь мне, спасибо.

1 Ответ

0 голосов
/ 30 мая 2018

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

Как и вы, я тоже новичок, но мы можем это понять.Есть много способов сделать это, поэтому я перечислю несколько.Если никто не поцарапает ваш зуд, надеюсь, они направят вас в правильном направлении.Я также вижу, что вы знаете, что такое фоновый работник, поэтому я предполагаю, что вы знаете, как он работает, или можете найти ресурсы, чтобы выяснить это самостоятельно (если нет, я свяжу некоторые ресурсы с ним ниже).

ProgressBar:

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

Ниже, когда кнопка нажата, она ищет в списке списокСтрока "Белоснежка".Если текущая строка, которую она проверяет в списке, не является «Белоснежкой», то значение ProgressBar1 увеличивается, чтобы показать, что заголовок перемещения был проверен.Это будет повторяться, пока не появится строка «Белоснежка».Тогда наш цикл отобразит завершенный ProgressBar1 и отобразит «Найдено!»

Пример кода:

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    Dim moviesList As New List(Of String) From {"Cinderella", "Snow White", "Rapunzel"}
    ProgressBar1.Maximum = moviesList.Count()
    For Each movie In moviesList
        If movie = "Snow White" Then
            ProgressBar1.Value = ProgressBar1.Maximum
            Label1.Text = "Found it!"
        Else
            ProgressBar1.Value += 1
        End If
    Next
End Sub

Метка:

Вы можете отобразить метку, сообщающую пользователю, что процесс кнопки все еще обрабатывается до ее завершения.

Ниже, когда кнопка нажата, она ищет в списке строку «Белоснежка» и устанавливает для Label1 значение"Loading ...".Если текущая строка, проверяемая в списке, не является «Белоснежкой», она продолжается как обычно, если это «Белоснежка», она обновит Label1 и скажет «Найдено!».Отображая это, пользователь может видеть, загружается программа или нет.

Пример кода:

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    Dim moviesList As New List(Of String) From {"Cinderella", "Snow White", "Rapunzel"}
    Label1.Text = "Loading..."
    For Each movie In moviesList
        If movie = "Snow White" Then
            Label1.Text = "Found it!"
        End If
    Next
End Sub

Анимированный Gif:

Вы можете отобразить анимированный GIF во время обработки кнопки.

Ниже, когда кнопка нажата, она ищет в списке строку «Белоснежка» и устанавливает для свойства Visible PictureBox1 значение True.Если вы добавили GIF-файл в PictureBox1 (если вы не знаете, как я связал его в ресурсах), вы можете увидеть загрузочный GIF-файл PictureBox1.Когда цикл находит строку «Белоснежка» в списке moviesList, он отображает «Found it!»в Label1 и задайте для свойства Visible PictureBox1 значение False.

Пример кода:

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    Dim moviesList As New List(Of String) From {"Cinderella", "Snow White", "Rapunzel"}
    PictureBox1.Visible = True
    For Each movie In moviesList
        If movie = "Snow White" Then
            PictureBox1.Visible = False
            Label1.Text = "Found it!"
        End If
    Next
End Sub

Ресурсы:

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

Анимирование PictureBox: https://www.youtube.com/watch?v=Zsvi0p9YUE4

Поместите Gif в PictureBox: https://www.youtube.com/watch?v=igSsB_61BR8

Создание экрана загрузки: https://www.youtube.com/watch?v=w8mtv9zJBD0

Информация BackgroundWorker: Документация BackgroundWorker

...