Redirecting Console.Write - PullRequest
       41

Redirecting Console.Write

0 голосов
/ 20 ноября 2018

Я написал приведенный ниже код из объединения учебников по c # о перенаправлении Console.Write или Console.WriteLine в текстовое поле текстового поля.Я понял, что это плохо, так как если я вызову какой-либо метод .Close(), то текстовое поле будет удалено, что противоположно тому, что я хочу сделать.

Imports System.Text
Imports System.IO

Namespace ConsoleRedirection
Public Class TextBoxStreamWriter
    Inherits TextWriter

    Private _output As TextBox = Nothing

    Public Sub New(ByVal output As TextBox)
        _output = output
    End Sub

    Public Overrides Sub WriteLine(ByVal value As String)
        MyBase.WriteLine(value)
        _output.AppendText(String.Format("[{0}] {1}" + vbNewLine, DateTime.Now, value.ToString()))
    End Sub

    Public Overrides ReadOnly Property Encoding As Encoding
        Get
            Return System.Text.Encoding.UTF8
        End Get
    End Property
End Class
End Namespace

Есть ли в любом случае, помимо загрузки текстового файла,чтобы я мог перенаправить весь вывод консоли на текстовое поле?


Чтобы ответить на вопрос из комментариев.(Этот код был первоначально найден здесь: https://saezndaree.wordpress.com/2009/03/29/how-to-redirect-the-consoles-output-to-a-textbox-in-c/... Но был преобразован в VB)

В отдельной форме код вызывается объявлением TextWriter.

Private _writer As TextWriter = New TextBoxStreamWriter(frmDebugLog.txtDebugLog)

Затем как часть .Load родительской формы:

Console.SetOut(_writer)

В более поздней части формы frmDebugLog вызывается с помощью frmDebugLog.Show()

Когда это окно, frmDebugLog, закрыто ... эта форма и ее текстовое поле отбрасываются.

1 Ответ

0 голосов
/ 20 ноября 2018

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

Private Shared txtDebugLogText As String

Public Sub New()
    ' This call is required by the designer.
    InitializeComponent()

    ' Add any initialization after the InitializeComponent() call.

    txtDebugLog.Text = txtDebugLogText
End Sub

Protected Overrides Sub OnFormClosed(e As FormClosedEventArgs)
    txtDebugLogText = txtDebugLog.Text
    MyBase.OnFormClosed(e)
End Sub

Используя поле Shared, вы сохраняете все в одном классе. Текущее значение этого поля сначала загружается в TextBox каждый раз, когда создается новый экземпляр, а текст в текущем TextBox сохраняется в этом поле всякий раз, когда экземпляр уничтожается.

...