читать построчно из richtextbox и показывать в метке (vb.net)

Я хотел бы читать строку за строкой из richtextbox и показывать каждую строку каждую секунду в метке.
У меня есть эти блоки кода.
и я думаю, что мне нужен таймер, но я не мог его сделать.
Вы можете мне помочь?
Замечания:

Если я использую этот код, я вижу только последнюю строку в метке.

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    Dim RotateCount As String()
    For i As Integer = 0 To RichTextBox1.Lines.Length - 1
        Label1.Text = RichTextBox1.Lines(i)
    Next
End Sub

Я имею в виду, предположим, что у нас есть строки в richtextbox вроде..

a1
b2
c3
d4
e5

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

a1 
(after 1 sec.)
b2 
(after 1 sec.)
c3 
(after 1 sec.)

так...


person Olgu Kivanc    schedule 06.02.2016    source источник
comment
Я вижу только последнюю строку в метке, потому что вы продолжаете заменять текст метки по ходу цикла: Label1.Text = RichTextBox1.Lines(i). Это легко увидеть с помощью отладчика. Если вы хотите переместить весь текст, добавьте его   -  person Ňɏssa Pøngjǣrdenlarp    schedule 06.02.2016


Ответы (4)


Кажется, вы ожидаете, что, поскольку вы установили свойство Text, метка немедленно перерисовывается с новым текстом. Этого не произойдет, пока вы не выйдете из обработчика событий и система не сможет перерисовать метку. Конечно, с этим кодом отображается только последний текст.

Чтобы достичь своей цели, вы можете использовать таймер с интервалом в 1 секунду и счетчик, который отслеживает отображаемую текущую строку:

 Dim tm As System.Windows.Forms.Timer = new System.Windows.Forms.Timer()
 Dim counter As Integer = 0

В этот момент ваша кнопка нажимает, просто запускает таймер и выходит

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
     tm.Interval = 1000
     AddHandler tm.Tick, AddressOf onTick
     tm.Start()
     ' Don't allow to click again this button until
     ' the timer is stopped
     Button1.Enabled = False
     Button2.Enabled = True
End Sub

Когда возникает событие Tick, вы меняете текст метки на строку, проиндексированную счетчиком, увеличиваете ее и проверяете, достигли ли вы последней строки, перезапустив первую, если это так. Обратите внимание, что перед выходом кнопка отключена. Это необходимо, чтобы избежать второго/третьего/четвертого и т. д. щелчка по одной и той же кнопке во время работы таймера… Подробнее о Button2 позже….

Sub onTick(sender as Object, e as EventArgs)
    Label1.Text = RichTextBox1.Lines(counter)
    counter += 1
    if counter >= RichTextBox1.Lines.Count Then
        counter = 0
    End If
End Sub

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

' This button stops the timer and reenable the first button disabling
' itself - It should start as disabled from the form-designer
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
    tm.Stop
    RemoveHandler tm.Tick, AddressOf onTick
    Button1.Enabled = True
    Button2.Enabled = False
End Sub
person Steve    schedule 06.02.2016

Ты почти там. Ваша проблема в том, что вы продолжаете задавать текст, а не добавлять к нему. Label1.Text = ... устанавливает текст, если вы хотите продолжать добавлять к нему, вы должны использовать Label1.Text &= ...

Также обратите внимание, что вам нужно включить что-то вроде Environment.NewLine, чтобы включить разрывы строк.

For i As Integer = 0 To RichTextBox1.Lines.Length - 1
    Label1.Text &= RichTextBox1.Lines(i) & If(i < RichTextBox1.Lines.Length - 1, Environment.NewLine, "")
Next
person Visual Vincent    schedule 06.02.2016

Спасибо за помощь !!! Я решил с помощью этого кода;

    Public Class Form1
    Dim tm = New System.Windows.Forms.Timer()
    Dim counter As Integer = 0


    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load

    End Sub

    Sub onTick(sender As Object, e As EventArgs)
        Label1.Text = RichTextBox1.Lines(counter)
        counter += 1
        If counter >= RichTextBox1.Lines.Count Then
            counter = 0
        End If
    End Sub

    Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
        For i = 0 To RichTextBox2.Lines.Count - 1
            TextBox1.Text = RichTextBox2.Lines(i)
            wait(2000)
        Next
    End Sub

    Private Sub wait(ByVal interval As Integer)
        Dim sw As New Stopwatch
        sw.Start()
        Do While sw.ElapsedMilliseconds < interval
            ' Allows UI to remain responsive
            Application.DoEvents()
        Loop
        sw.Stop()
    End Sub
End Class
person Olgu Kivanc    schedule 06.02.2016
comment
@Plutonix это зло в какой-то степени. Он используется для периодической обработки событий, когда вы выполняете какую-либо длительную операцию в потоке пользовательского интерфейса, и ему не нужно ее использовать. Я бы рекомендовал использовать отдельный поток, так как использование DoEvents имеет возможность повторного входа... - person zaggler; 07.02.2016

Это очень просто.

Объявите еще одну строковую переменную и загрузите всю строку в эту переменную. Улучшенный код приведен ниже.

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As system.EventArgs) Handles Button1.Click
   Dim a1 as int32
   a1=0
  'get number of lines of the rich text box content
   a1=RichTextBox1.Lines.Count()
   Dim str As String
    For i As Int32 = 0 To a1-1
        str = str + RichTextBox1.Lines(i)
    Label1.Text= str
    Next
End Sub
person antony thomas    schedule 23.07.2016