将输出重定向到另一种形式
Redirect output to another form
我有一个 WinForms 应用程序,它有两个表单 - Form1 和 Form2。
我在 Form1 中有一个发送电子邮件的循环。
我想从 Form1 中的循环发送状态消息
到 Form2 中的 RichTextBox。
我怎样才能做到这一点?
感谢任何反馈。
解决方案取决于两个表单之间的关系:Form1 是否知道 Form2,例如因为 Form1 创建了 Form2?
class Form1 : Form
{
private Form2 Form2 {get; set;}
private void CreateForm2()
{
this.Form2 = new Form2;
}
private void SendStatusMessage(StatusMessage message)
{
this.Form2.ProcessStatusMessage(message);
}
}
如果 Form1 不知道 Form2,但 Form2 知道 Form1,那么您应该更改 Form1,使其在状态消息可用时发送事件。
public class EventStatusMessageArgs : EventArgs
{
public StatusMessage Message { get; set; }
}
class Form1 : Form
{
public Event EventHandler<EventStatusMessageArgs> StatusMessageCreated;
protected virtual void OnStatusMessageCreated(StatusMessage statusMessage)
{
var eventHandler = new EventStatusMessageArgs
{
SatusMessage = statusMessage;
};
this.StatusMessageCreated?.Invoke(this, eventHandler);
}
private void CreateStatusMessage(...)
{
StatusMessage statusMessage = ...
this.OnStatusMessageCreated(statusMessage);
}
}
class Form2 : Form
{
// Form2 somehow knows about existence Form1
public Form1 Form1 {get; set;}
public void OnFormLoading (object sender, ...)
{
// subscribe to events from Form1:
this.Form1.StatusMessageCreated += this.OnForm1CreatedStatusMessage;
}
public void OnForm1CreatedStatusMessage(object sender, EventStatusMessageArgs args)
{
StatusMessage createdStatusMessage = args.StatusMessage;
this.ProcessCreatedStatusMessage(createdStatusMessage);
}
}
第三种情况:Form1和Form2不知道对方的存在。幸运的是,创建 Form1 和 Form2 的 mainForm 做到了:
class MainForm : Form
{
private readonly Form1 form1;
private readonly Form2 form2;
public MainForm()
{
InitializeComponents();
this.form1 = new Form1() {...};
this.form2 = new Form2() {...};
// make sure that the StatusMessage events from form1 go to form2:
this.form1.StatusMessageCreated += this.form2.OnForm1CreatedStatusMessage;
}
}
顺便说一句:当物品被处置时,总是取消订阅事件。
我有一个 WinForms 应用程序,它有两个表单 - Form1 和 Form2。 我在 Form1 中有一个发送电子邮件的循环。 我想从 Form1 中的循环发送状态消息 到 Form2 中的 RichTextBox。 我怎样才能做到这一点? 感谢任何反馈。
解决方案取决于两个表单之间的关系:Form1 是否知道 Form2,例如因为 Form1 创建了 Form2?
class Form1 : Form
{
private Form2 Form2 {get; set;}
private void CreateForm2()
{
this.Form2 = new Form2;
}
private void SendStatusMessage(StatusMessage message)
{
this.Form2.ProcessStatusMessage(message);
}
}
如果 Form1 不知道 Form2,但 Form2 知道 Form1,那么您应该更改 Form1,使其在状态消息可用时发送事件。
public class EventStatusMessageArgs : EventArgs
{
public StatusMessage Message { get; set; }
}
class Form1 : Form
{
public Event EventHandler<EventStatusMessageArgs> StatusMessageCreated;
protected virtual void OnStatusMessageCreated(StatusMessage statusMessage)
{
var eventHandler = new EventStatusMessageArgs
{
SatusMessage = statusMessage;
};
this.StatusMessageCreated?.Invoke(this, eventHandler);
}
private void CreateStatusMessage(...)
{
StatusMessage statusMessage = ...
this.OnStatusMessageCreated(statusMessage);
}
}
class Form2 : Form
{
// Form2 somehow knows about existence Form1
public Form1 Form1 {get; set;}
public void OnFormLoading (object sender, ...)
{
// subscribe to events from Form1:
this.Form1.StatusMessageCreated += this.OnForm1CreatedStatusMessage;
}
public void OnForm1CreatedStatusMessage(object sender, EventStatusMessageArgs args)
{
StatusMessage createdStatusMessage = args.StatusMessage;
this.ProcessCreatedStatusMessage(createdStatusMessage);
}
}
第三种情况:Form1和Form2不知道对方的存在。幸运的是,创建 Form1 和 Form2 的 mainForm 做到了:
class MainForm : Form
{
private readonly Form1 form1;
private readonly Form2 form2;
public MainForm()
{
InitializeComponents();
this.form1 = new Form1() {...};
this.form2 = new Form2() {...};
// make sure that the StatusMessage events from form1 go to form2:
this.form1.StatusMessageCreated += this.form2.OnForm1CreatedStatusMessage;
}
}
顺便说一句:当物品被处置时,总是取消订阅事件。