C# 来自其他窗体的计时器未停止
建筑 我有一个C# 来自其他窗体的计时器未停止,c#,winforms,C#,Winforms,建筑 我有一个ParentForm和一个面板,其中包含子表单 遇到的问题 我想从子窗体停止父窗体的计时器,但计时器从未停止 我试过的 在子窗体中创建事件并在父窗体中订阅事件。单击子窗体中的按钮将引发事件。在父窗体上的事件处理程序中,停止计时器 ParentForm.cs public partial class ParentForm : Form { ChildForm childForm = null; public ParentForm() { In
ParentForm
和一个面板
,其中包含子表单
遇到的问题
我想从子窗体
停止父窗体
的计时器,但计时器从未停止
我试过的
在子窗体中创建事件并在父窗体中订阅事件。单击子窗体中的按钮将引发事件。在父窗体上的事件处理程序中,停止计时器 ParentForm.cs
public partial class ParentForm : Form
{
ChildForm childForm = null;
public ParentForm()
{
InitializeComponent();
}
private void ParentForm_Load(object sender, EventArgs e)
{
timer1.Start();
}
private void timer1_Tick(object sender, EventArgs e)
{
toolStripStatusLabel2.Text = DateTime.Now.ToString("HH:mm:ss");
statusStrip1.Refresh();
}
private void btnOpenChildForm_Click(object sender, EventArgs e)
{
if (childForm == null || childForm.IsDisposed)
{
childForm = new ChildForm();
//subscribe to events
childForm.FormClosed += ChildForm_FormClosed;
childForm.StopTimerButtonClicked += ChildForm_StopTimerButtonClicked;
childForm.Show();
}
else
{
childForm.WindowState = FormWindowState.Normal;
childForm.Activate();
}
}
private void ChildForm_FormClosed(object sender, FormClosedEventArgs e)
{
//unsubscribe from events
childForm.FormClosed -= ChildForm_FormClosed;
childForm.StopTimerButtonClicked -= ChildForm_StopTimerButtonClicked;
childForm = null;
}
private void ChildForm_StopTimerButtonClicked(object sender, bool e)
{
//stop timer
timer1.Stop();
}
}
public partial class ChildForm : Form
{
public delegate void EventHandlerStopTimerButtonClicked(object sender, bool e);
//event that subscribers can subscribe to
public event EventHandlerStopTimerButtonClicked StopTimerButtonClicked;
public ChildForm()
{
InitializeComponent();
}
private void btnStop_Click(object sender, EventArgs e)
{
if (StopTimerButtonClicked != null)
{
//raise event
StopTimerButtonClicked(this, true);
}
}
}
ChildForm.cs
public partial class ParentForm : Form
{
ChildForm childForm = null;
public ParentForm()
{
InitializeComponent();
}
private void ParentForm_Load(object sender, EventArgs e)
{
timer1.Start();
}
private void timer1_Tick(object sender, EventArgs e)
{
toolStripStatusLabel2.Text = DateTime.Now.ToString("HH:mm:ss");
statusStrip1.Refresh();
}
private void btnOpenChildForm_Click(object sender, EventArgs e)
{
if (childForm == null || childForm.IsDisposed)
{
childForm = new ChildForm();
//subscribe to events
childForm.FormClosed += ChildForm_FormClosed;
childForm.StopTimerButtonClicked += ChildForm_StopTimerButtonClicked;
childForm.Show();
}
else
{
childForm.WindowState = FormWindowState.Normal;
childForm.Activate();
}
}
private void ChildForm_FormClosed(object sender, FormClosedEventArgs e)
{
//unsubscribe from events
childForm.FormClosed -= ChildForm_FormClosed;
childForm.StopTimerButtonClicked -= ChildForm_StopTimerButtonClicked;
childForm = null;
}
private void ChildForm_StopTimerButtonClicked(object sender, bool e)
{
//stop timer
timer1.Stop();
}
}
public partial class ChildForm : Form
{
public delegate void EventHandlerStopTimerButtonClicked(object sender, bool e);
//event that subscribers can subscribe to
public event EventHandlerStopTimerButtonClicked StopTimerButtonClicked;
public ChildForm()
{
InitializeComponent();
}
private void btnStop_Click(object sender, EventArgs e)
{
if (StopTimerButtonClicked != null)
{
//raise event
StopTimerButtonClicked(this, true);
}
}
}
您正在创建一个新的父窗体,而不是获取现有的父窗体。您可以编写如下内容:
(this.ParentForm作为[parent form class])。[Timer Instance].Stop()
。当然,计时器需要是公共的,StopButton
类需要知道其父类的类型。不太好。单击按钮时,StopButton
可能引发公共事件,让创建StopButton
的表单订阅此事件并在其处理程序中停止计时器。或者使用界面。使ParentForm
类实现定义StopTimer()
方法的已知/公共接口。在StopButton
中,检查this.ParentForm
是否实现了该接口,如果实现了,则强制转换该接口并调用该方法。--您可能应该使用UserControls而不是Forms(只是IMO)。非常感谢大家的帮助。它完全有效,@Jimi!我现在要实现接口
和用户控件
。很好的建议,你太好了。我只是在学习如何正确使用它。@user9938,你的很完美!谢谢你教我,我希望它将来能帮助别人。我祝你一切顺利。