如何将调试信息输出到 RichTextBox?
How to output Debug Information to a RichTextBox?
我正在创建一个 FTP 客户端,我希望通过输出调试信息将响应输出到 RichTextBox。
任何人都可以帮助解决这个问题吗?谢谢
public FileARK()
{
InitializeComponent();
hostAddress.Text = "host";
UserName.Text = "foo";
Password.Text = "bar";
//FtpTrace.AddListener(new TextWriterTraceListener(responseWindow.Text));
// Debug.WriteLine(responseWindow.Text);
}
private void Connect_Click(object sender, EventArgs e)
{
conn = new FtpClient();
conn.Host = hostAddress.Text;
conn.Credentials = new NetworkCredential(UserName.Text, Password.Text);
conn.Connect();
}
private void Disconnect_Click(object sender, EventArgs e)
{
conn.Disconnect();
}
private void responseWindow_TextChanged(object sender, EventArgs e)
{
}
您可以实现自己的 TraceListener
,该 TraceListener
在 app.config 中进行配置,并动态尝试查找与配置中的名称相匹配的富文本框。
您的 class 可以如下所示:
public class TextBoxListener : TraceListener
{
RichTextBox _box;
string _data;
public TextBoxListener(string initializeData)
{
_data = initializeData;
}
private bool Init()
{
if (_box != null && _box.IsDisposed )
{
// back to null if the control is disposed
_box = null;
}
// find the logger text box
if (_box == null)
{
// open forms
foreach (Form f in Application.OpenForms)
{
// controls on those forms
foreach (Control c in f.Controls)
{
// does the name match
if (c.Name == _data && c is RichTextBox)
{
// found one!
_box = (RichTextBox) c;
break;
}
}
}
}
return _box != null && !_box.IsDisposed;
}
public override void WriteLine(string message)
{
if (Init())
{
_box.Text = _box.Text + message + "\r\n";
}
}
public override void Write(string message)
{
if (Init())
{
_box.Text = _box.Text + message;
}
}
}
此 class 最重要的部分是 Init
方法,该方法遍历所有 openforms 和所有控件以查找与 app.config 中配置的名称相匹配的 richtextbox 控件.
要利用此 class 在您的 app.config 和 add a listener
中配置跟踪
<system.diagnostics>
<trace>
<listeners>
<add name="box"
type="WindowsFormsApplication1.TextBoxListener, WindowsFormsApplication1"
initializeData="loggerRTB" />
</listeners>
</trace>
</system.diagnostics>
该类型是 class(Namespace.Classname,AssemblyName)的完全限定类型名称,在 initializeData 中,您将在表单上添加 richtextbox 控件的名称。在我的示例应用程序中,它是 loggerRTB.
在您的应用中,您现在可以使用标准 Trace
class:
Trace.WriteLine("Hello world");
请注意 TextBoxListener
仅在第一次调用 Trace.WriteLine
时实例化。
这种方法的好处之一是可以添加多个写入不同 RichTextBox 控件的侦听器,即使是在单独的表单上(假设这些表单是打开的)。
我正在创建一个 FTP 客户端,我希望通过输出调试信息将响应输出到 RichTextBox。
任何人都可以帮助解决这个问题吗?谢谢
public FileARK()
{
InitializeComponent();
hostAddress.Text = "host";
UserName.Text = "foo";
Password.Text = "bar";
//FtpTrace.AddListener(new TextWriterTraceListener(responseWindow.Text));
// Debug.WriteLine(responseWindow.Text);
}
private void Connect_Click(object sender, EventArgs e)
{
conn = new FtpClient();
conn.Host = hostAddress.Text;
conn.Credentials = new NetworkCredential(UserName.Text, Password.Text);
conn.Connect();
}
private void Disconnect_Click(object sender, EventArgs e)
{
conn.Disconnect();
}
private void responseWindow_TextChanged(object sender, EventArgs e)
{
}
您可以实现自己的 TraceListener
,该 TraceListener
在 app.config 中进行配置,并动态尝试查找与配置中的名称相匹配的富文本框。
您的 class 可以如下所示:
public class TextBoxListener : TraceListener
{
RichTextBox _box;
string _data;
public TextBoxListener(string initializeData)
{
_data = initializeData;
}
private bool Init()
{
if (_box != null && _box.IsDisposed )
{
// back to null if the control is disposed
_box = null;
}
// find the logger text box
if (_box == null)
{
// open forms
foreach (Form f in Application.OpenForms)
{
// controls on those forms
foreach (Control c in f.Controls)
{
// does the name match
if (c.Name == _data && c is RichTextBox)
{
// found one!
_box = (RichTextBox) c;
break;
}
}
}
}
return _box != null && !_box.IsDisposed;
}
public override void WriteLine(string message)
{
if (Init())
{
_box.Text = _box.Text + message + "\r\n";
}
}
public override void Write(string message)
{
if (Init())
{
_box.Text = _box.Text + message;
}
}
}
此 class 最重要的部分是 Init
方法,该方法遍历所有 openforms 和所有控件以查找与 app.config 中配置的名称相匹配的 richtextbox 控件.
要利用此 class 在您的 app.config 和 add a listener
中配置跟踪<system.diagnostics>
<trace>
<listeners>
<add name="box"
type="WindowsFormsApplication1.TextBoxListener, WindowsFormsApplication1"
initializeData="loggerRTB" />
</listeners>
</trace>
</system.diagnostics>
该类型是 class(Namespace.Classname,AssemblyName)的完全限定类型名称,在 initializeData 中,您将在表单上添加 richtextbox 控件的名称。在我的示例应用程序中,它是 loggerRTB.
在您的应用中,您现在可以使用标准 Trace
class:
Trace.WriteLine("Hello world");
请注意 TextBoxListener
仅在第一次调用 Trace.WriteLine
时实例化。
这种方法的好处之一是可以添加多个写入不同 RichTextBox 控件的侦听器,即使是在单独的表单上(假设这些表单是打开的)。