tag shown form event activated .net winforms logging textbox

.net - shown - El mejor enfoque para Windows Forms rodando salida de registro en TextBox



shown c# (5)

Necesitaba hacer esto hace un tiempo y Listbox era la solución. Nadie notará la diferencia.

En una aplicación Forms, estoy mostrando el resultado del registro desde una aplicación de línea de comandos de larga ejecución que generó una gran cantidad de resultados. Comienzo el programa en segundo plano y capturo su salida y actualmente lo visualizo en un TextBox usando AppendText. Prefiero solo mostrar, por ejemplo, las últimas 1000 líneas. La eliminación de líneas de un TextBox es costosa, y un TextBox realmente no se siente como el mejor enfoque para la visualización de registro móvil.

¿Alguna idea sobre el mejor control para hacer una ventana de registro progresiva en Windows Forms?


Solía ​​tener listboxes hacer este tipo de cosas. Simplemente elimine la primera línea si el recuento de líneas alcanza, digamos, 1000. Si la línea de registro es demasiado larga, puede hacer que el cuadro de lista sea un poco más ancho (depende de la información de registro y de si es posible captar el significado desde el primer palabras sin desplazamiento horizontal) y hacer visible la barra de desplazamiento horizontal.


exactamente lo que necesitaba Lo resolví con el siguiente código que mantiene visible el último elemento agregado:

delegate void UpdateCCNetWindowDelegate(String msg); private void Message2CCNetOutput(String message) { // Check whether the caller must call an invoke method when making method calls to listBoxCCNetOutput because the caller is // on a different thread than the one the listBoxCCNetOutput control was created on. if (listBoxCCNetOutput.InvokeRequired) { UpdateCCNetWindowDelegate update = new UpdateCCNetWindowDelegate(Message2CCNetOutput); listBoxCCNetOutput.Invoke(update, message); } else { listBoxCCNetOutput.Items.Add(message); if (listBoxCCNetOutput.Items.Count > Program.MaxCCNetOutputLines) { listBoxCCNetOutput.Items.RemoveAt(0); // remove first line } // Make sure the last item is made visible listBoxCCNetOutput.SelectedIndex = listBoxCCNetOutput.Items.Count - 1; listBoxCCNetOutput.ClearSelected(); } }


Tenía la misma necesidad y apreciaba mucho esta ayuda. Esta es una versión ligeramente modificada.

Crea un cuadro de lista:

<ListBox x:Name="lbLog" Background="LightGray"></ListBox>

En el hilo principal (en la parte inicial del código), coloque esto para almacenar una referencia al hilo de la interfaz de usuario:

Thread m_UIThread; .... m_UIThread = Thread.CurrentThread;

Entonces este es su método de registro, que se puede llamar desde cualquier hilo:

public void AddToLog(String message) { if (Thread.CurrentThread != m_UIThread) { // Need for invoke if called from a different thread this.Dispatcher.BeginInvoke( DispatcherPriority.Normal, (ThreadStart)delegate() { AddToLog(message); }); } else { // add this line at the top of the log lbLog.Items.Insert(0, message); // keep only a few lines in the log while (lbLog.Items.Count > LOG_MAX_LINES) { lbLog.Items.RemoveAt(lbLog.Items.Count-1); } } }


solución muy simple

Textbox1.Appendtext(<yourtext>)

para rodar log como consola