Как я могу изменить текст одной метки из строкового массива vb. net? - PullRequest
0 голосов
/ 13 апреля 2020

, поэтому я хочу отобразить строковый массив в одной метке, который меняет содержимое с периодом времени, я перепробовал все, таймер, фоновый рабочий, все, проблема, когда я использую al oop вставка a таймер, интервал в начале должен быть таким длинным, если элементов массива было так много, поэтому я попробовал фоновый рабочий, но он не работает
это код:

 Dim array() As String = {"so", "nb", "de", "rty", "dcds"}
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    BackgroundWorker1.RunWorkerAsync()
End Sub
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    Control.CheckForIllegalCrossThreadCalls = False

End Sub




 Private Sub BackgroundWorker1_DoWork(sender As Object, e As DoWorkEventArgs) Handles BackgroundWorker1.DoWork
    Dim worker As BackgroundWorker = CType(sender, BackgroundWorker)
    Dim delay As Integer = 2000
    Dim interval As Integer = 100
    Dim elapsed As Integer = 0
    Dim pos As Integer = array.Length

    While Not worker.CancellationPending
        If (elapsed >= delay) Then
            worker.ReportProgress(pos)
            ' change label text in the Progress event handler
            pos = (pos + 1)
            elapsed = 0
            If (pos = array.Length) Then
                Exit While
            End If

        End If

        Thread.Sleep(interval)

    End While
End Sub

Private Sub BackgroundWorker1_ProgressChanged(sender As Object, e As ProgressChangedEventArgs) Handles BackgroundWorker1.ProgressChanged
    Dim j As Integer
    For j = 0 To array.Length
        Label1.Text = array(j)

    Next
End Sub

Ответы [ 2 ]

0 голосов
/ 13 апреля 2020

При асинхронном подходе вы можете отображать значения массива одно за другим без BackgroundWorker и явно созданного таймера.

Private _values As New String() From {"so", "nb", "de", "rty", "dcds"}

Private Async Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    For Each value In _values
        await Task.Delay(2000)
    Next
End Sub

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

Private Async Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    Dim button = DirectCast(sender, Button);
    button.Enabled = False

    For Each value In _values
        await Task.Delay(2000)
    Next

    button.Enabled = True
End Sub 
0 голосов
/ 13 апреля 2020

Ваш для l oop перезаписывает свойство .Text метки на каждой итерации. Вы также получите исключение Index Out of Range, потому что индексы массива основаны на нуле. Максимальный индекс будет на 1 меньше, чем длина.

Private arStr() As String = {"so", "nb", "de", "rty", "dcds"}

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    Dim LabelText = String.Join(Environment.NewLine, arStr)
    Label1.Text = LabelText
End Sub

РЕДАКТИРОВАТЬ

Private arStr() As String = {"so", "nb", "de", "rty", "dcds"}

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    Static index As Integer
    If index < arStr.Length Then
        Label1.Text &= arStr(index) & Environment.NewLine
        index += 1
    End If
End Sub
...