Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/actionscript-3/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 来自其他窗体的计时器未停止_C#_Winforms - Fatal编程技术网

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,你的很完美!谢谢你教我,我希望它将来能帮助别人。我祝你一切顺利。