Цикл и отображение Visual Basic по одной строке за раз - PullRequest
5 голосов
/ 20 января 2010

Я использую Visual Studio 2008, VB9 и пытаюсь написать приложение, которое в основном выполняет вычисления для набора данных, вводимых пользователем.Во время вычислений я хочу отображать данные на каждом шаге и сохранять их в области отображения в графическом интерфейсе (не перезаписывать при следующих отображаемых данных).

Например:

UserInput = 1

Do

  UserInput += 1

  OutputLabel.Text = "UserInput " & UserInput

Loop Until UserInput = 5

и вывод будет выглядеть как

UserInput 1 UserInput 2 UserInput 3 UserInput 4 UserInput 5

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

Любые советы приветствуются, спасибо!

Ответы [ 6 ]

3 голосов
/ 20 января 2010

Это простая версия:

Dim delimiter as String = ""
For UserInput As Integer = 1 To 5
    OutputLabel.Text &= String.Format("{0}UserInput {1}", delimiter, UserInput)
    delimiter = " "
Next

Тем не менее, есть две проблемы с ним и другие, как он (включая каждый другой ответ, данный до сих пор):

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

Так что вы можете просто сделать это:

Dim sb As New StringBuilder()
Dim delimiter As String = ""
For UserInput As Integer = 1 To 5
    sb.AppendFormat("{0}UserInput {1}", delimiter, UserInput)
    delimiter = " "
Next
OutputLabel.Text = sb.ToString()

И если вы действительно хотите повеселиться, вы можете просто сделать что-то вроде этого ( без циклатребуется! ):

OutputLabel.Text = Enumerable.Range(1, 5).Aggregate(Of String)("", Function(s, i) s & String.Format("UserInput {0} ", i))
3 голосов
/ 20 января 2010

Вам необходимо объединить значение в OutputLabel.Text.

OutputLabel.Text &= "UserInput " & UserInput

Вы также можете сбросить его до цикла: OutputLabel.Text = ""

1 голос
/ 21 января 2010

Все эти способы на самом деле работают очень хорошо, но лучше всего подходит тот, который подходит для моей ситуации:

Do
  Dim OutputString as String
  Application.DoEvents() 'to make things paint actively
  UserInput += 1
  OutputString = String.Format("{0}", UserInput)
  ListBox.Items.Add(OutputString)


Loop Until UserInput = 5

Я изменил элементы в список, но попробовал этот же метод с текстовыми полями и метками, с некоторымитвики, все они работали очень хорошо.Спасибо за вашу помощь!

1 голос
/ 20 января 2010

Я бы использовал более подходящий элемент управления, например richtextbox

    Dim UserInput As Integer = 0
    Const userDone As Integer = 5

    RichTextBox1.Clear()
    Do

        RichTextBox1.AppendText(String.Format("User input {0:n0}   ", UserInput))
        RichTextBox1.AppendText(Environment.NewLine)
        RichTextBox1.Refresh() 'the data at each step
        UserInput += 1

    Loop Until UserInput = userDone
1 голос
/ 20 января 2010

Вам нужно сделать это в графическом интерфейсе?Если это просто обработка и вывод строк, как это, возможно, вам следует рассмотреть консольное приложение, и в этом случае это становится ДЕЙСТВИТЕЛЬНО легко, просто вызывая

Console.WriteLine("my string")
1 голос
/ 20 января 2010

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

For I As Integer = 1 To 5
     If I > 1 Then OutputLabel.Text &= " "
     OutputLabel.Text &= "UserInput " & I.ToString()
End For

Если у вас есть пользовательский ввод в коллекцию, вам лучше обойтись с помощью цикла ForEach.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...