2010-01-20 7 views
5

Estoy usando Visual Studios 2008, VB9 y estoy tratando de escribir una aplicación que básicamente realiza cálculos en un conjunto de datos ingresados ​​por un usuario. Durante los cálculos, quiero mostrar los datos en cada paso y mantenerlos en el área de visualización en la GUI (no sobrescritos por los siguientes datos que se muestran).Visual Basic Loop y mostrar una línea a la vez

Por ejemplo:

UserInput = 1 

Do 

    UserInput += 1 

    OutputLabel.Text = "UserInput " & UserInput 

Loop Until UserInput = 5 

y la salida se vería como

EntradaUsuario 1 EntradaUsuario 2 EntradaUsuario 3 EntradaUsuario 4 EntradaUsuario 5

Probé este, y otras estructuras de bucle y parece que no puede arreglar las cosas. La aplicación real es un poco más sofisticada, pero el ejemplo sirve para fines lógicos.

¡Todos los consejos son bienvenidos, gracias!

Respuesta

3

Ésta es la versión sencilla:

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

Sin embargo, hay dos problemas con él y otros como él (incluyendo cada otra respuesta dada hasta ahora):

  1. Crea muchas cadenas adicionales
  2. Dado que está en un bucle , la etiqueta no podrá procesar ningún evento de pintura para actualizarse hasta que termine todo el procesamiento.

Así que es posible que también acaba de hacer esto:

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

Y si realmente quieren divertirse sólo se puede hacer algo como esto (ningún bucle requiere!):

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

No creo que quiera divertirme demasiado :) Intentaré algunos de estos y veré cómo se ven – Jmichelsen

+0

Terminé haciéndolo de forma muy similar a como lo hice aquí, ¡gracias por la ayuda! – Jmichelsen

3

Necesita concatenar el valor en OutputLabel.Text.

OutputLabel.Text &= "UserInput " & UserInput 

También puede restablecer antes del bucle: OutputLabel.Text = ""

1

Si necesita un índice iterada puede intentar algo como lo siguiente

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

Si tiene entradas de usuario en una colección, es mejor que lo haga utilizando ForEach loop.

1

¿Necesita hacerlo en una GUI?Si se trata simplemente de procesamiento y la extinción de las filas de esa manera, tal vez debería considerar una aplicación de consola, en cuyo caso se hace muy fácil, simplemente llamando en

Console.WriteLine("my string") 
+0

Tiene que estar en una GUI, probaré algunos de estos métodos y veré qué sucede – Jmichelsen

1

que haría uso de un control más apropiado, como 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

Todas estas formas realmente funcionan muy bien, pero el que se ajusta a mi situación de la mejor fue la siguiente:

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 

me cambiaron las cosas a un cuadro de lista, pero tri ed este mismo método con cuadros de texto y etiquetas, con algunos ajustes, todos funcionaron muy bien. ¡Gracias por toda tu ayuda!

Cuestiones relacionadas