Member 14588284 Ответов: 1

Откройте progressbar в другой форме при запуске кодов


Привет
у меня проблема с прогрессбар

я извлекаю данные из базы данных oracle примерно за десять секунд

я хочу за это время открыть другую форму и запустить индикатор выполнения

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

Что я уже пробовал:

моя вторая форма кодируется примерно так
Public Class F_loading

    Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick


        If ProgressBar1.Value = ProgressBar1.Maximum Then
            ProgressBar1.Value = 1
        Else
            ProgressBar1.Value = ProgressBar1.Value + 1
        End If

    End Sub

End Class


коды первой формы вот такие

Private Sub yenile_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles yenile.Click
     F_loading.ShowDialog()
     önlistecek()
     onay.Columns(0).Width = 80
     rapor.Columns(0).Width = 80
     rapor.Columns(1).Width = 300
     onay.Columns(1).Width = 300
     F_loading.Close()
 End Sub

1 Ответов

Рейтинг:
2

OriginalGriff

ShowDialog - это блокирующий cal-он открывает модальную форму, что означает, что код не будет продолжать работать в исходной форме до тех пор, пока новая форма не закроется. В этот момент код, следующий за вызовом ShowDialog, будет выполнен, и не раньше.
Это нормально для вещей, которые требуют пользовательского ввода, таких как OpenFileDialog, но для индикаторов выполнения это не может работать.

Попробуйте вместо этого вызвать Show - но вам нужно будет попробовать закрыть его после этого, и я настоятельно рекомендую переместить ваш код Oracle во второй поток с помощью экземпляра BackGroundWorker.


Member 14588284

я изменил progressbar с webbrowser, но я не решил свою проблему

поэтому я не использую giff или progressbar


Private Sub yenile_Click(бывал отправитель как система.Объект, бывал е как система.EventArgs) обрабатывает yenile.Щелчок
F_loading.Покажите()
F_loading.WebBrowser1.Navigate("о компании:")
önlistecek()


Онай.Столбцы(0).Ширина = 80
рапор.Столбцы(0).Ширина = 80
рапор.Столбцы(1).Ширина = 300
Онай.Столбцы(1).Ширина = 300
F_loading.Закрывать()
Конец Подводной Лодки

OriginalGriff

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

Member 14588284

Я пытался, но не смог, как мне вписаться в свой код

OriginalGriff

А что вы пробовали?
Покажи нам код ... и расскажи нам, что пошло не так.

Member 14588284

подождите коды формы вот так

F_loading Открытый Класс


Частная суб методе form1_load(как byval отправителя как системы.Объект, бывал е как система.EventArgs) Обрабатывает MyBase.Load
Me.BackgroundWorker1.RunWorkerAsync()
Конец Подводной Лодки


Private Sub BackgroundWorker1_DoWork(ByVal sender As Object, _
Бывал е как система.ComponentModel.DoWorkEventArgs) Обрабатывает BackgroundWorker1.Метода dowork
önlistecek()
Конец Подводной Лодки

Private Sub BackgroundWorker1_ProgressChanged(ByVal sender As Object, _
Бывал е как система.ComponentModel.ProgressChangedEventArgs) Обрабатывает BackgroundWorker1.ProgressChanged
Меня.ProgressBar1.Значение = e.ProgressPercentage
Я.Этикетка1.Text = TryCast(e.UserState, String)

Конец Подводной Лодки


Private Sub BackgroundWorker1_RunWorkerCompleted(ByVal sender As Object, _
Бывал е как система.ComponentModel.RunWorkerCompletedEventArgs) Обрабатывает BackgroundWorker1.RunWorkerCompleted
Я.Этикетка1.Text = "операция завершена"
Конец Подводной Лодки
End Класса

коды первой формы :
Dim frm как новый F_loading
ФРМ.Метод showdialog()

OriginalGriff

Таким образом, вы не сообщаете о каком-либо прогрессе, поэтому индикатор выполнения не будет обновляться.

Что еще произошло, когда вы запустили его? Что отладчик показал вам, что происходит?