2010-01-20 15 views
5

Uso gli studi visivi 2008, VB9 e sto provando a scrivere un'app che esegue fondamentalmente calcoli su un insieme di dati immessi da un utente. Durante i calcoli, desidero visualizzare i dati ad ogni passaggio e mantenerli nell'area di visualizzazione sulla GUI (non sovrascritti dai dati successivi visualizzati).Visual Basic Loop e visualizza una riga alla volta

Ad esempio:

UserInput = 1 

Do 

    UserInput += 1 

    OutputLabel.Text = "UserInput " & UserInput 

Loop Until UserInput = 5 

e l'uscita sarà simile

UserInput 1 UserInput 2 UserInput 3 UserInput 4 UserInput 5

Ho provato questo, e altre strutture ad anello e non riesco a fare le cose per bene. L'app effettiva è un po 'più sofisticata, ma l'esempio funziona bene per scopi logici.

Qualsiasi consiglio è benvenuto, grazie!

risposta

3

Questa è la versione semplice:

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

Tuttavia, ci sono due problemi con esso ed altri simili (compresi i ogni altra risposta data finora):

  1. Crea un sacco di stringhe aggiuntive
  2. Poiché è in un ciclo , l'etichetta non sarà in grado di elaborare alcun evento di pittura per aggiornarsi fino a quando non si completa l'elaborazione.

Così si può anche semplicemente fare questo:

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() 

E se davvero voglia di divertirsi si può semplicemente fare qualcosa di simile (nessun circuito necessari!):

OutputLabel.Text = Enumerable.Range(1, 5).Aggregate(Of String)("", Function(s, i) s & String.Format("UserInput {0} ", i)) 
+0

Non penso di volermi divertire così tanto :) Proverò alcuni di questi e vedrò come sembrano – Jmichelsen

+0

Ho finito per farlo molto simile al tuo modo qui, grazie per l'aiuto! – Jmichelsen

3

È necessario concatenare il valore in OutputLabel.Text.

OutputLabel.Text &= "UserInput " & UserInput 

si potrebbe anche voler azzerare prima il ciclo: OutputLabel.Text = ""

1

Se è necessario un indice iterato, è possibile provare qualcosa di simile al seguente

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

Se si dispone di input utente in una raccolta, è possibile essere meglio serviti utilizzando il ciclo ForEach.

1

Hai bisogno di farlo in una GUI?Se è semplicemente elaborando e mettendo le righe del genere, forse si dovrebbe prendere in considerazione un'applicazione console, nel qual caso diventa davvero facile, semplicemente chiamando

Console.WriteLine("my string") 
+0

Ha bisogno di essere in una GUI, proverò alcuni di questi metodi e vedrò cosa succede – Jmichelsen

1

userei un controllo più appropriato, come 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

Tutti questi modi in realtà funzionano davvero bene, ma quello che si adattano la mia situazione il migliore era questa:

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 

ho cambiato le cose ad una casella di riepilogo, ma tri Ed è stato lo stesso metodo con le caselle di testo e le etichette, con alcune modifiche, hanno funzionato tutte molto bene. Grazie per tutto il vostro aiuto!

Problemi correlati