重新打开以前的窗口窗体时显示日期时间的问题

问题描述 投票:0回答:1

当我从另一个表单返回主表单时,我在显示计时器时遇到问题

主窗体有以下代码

public Main()
{
     InitializeComponent();
}

private void timer1_Tick(object sender, EventArgs e)
{
    timeLabel.Text = DateTime.Now.ToString("dd/MMM/yyyy HH:mm");
}

private void GestioneSerataButton_Click(object sender, EventArgs e)
{
    this.Hide();
    GestioneSerataForm gfor = new GestioneSerataForm();
    gfor.Show();
}

private void Main_FormClosing(object sender, FormClosingEventArgs e)
{
    Application.Exit();
}

现在如果我单击按钮以转到 GestioneSerataForm 就可以了。

当我尝试使用以下代码关闭 GestioneSerataForm 时

private void GestioneSerataForm_FormClosing(object sender, FormClosingEventArgs e)
{
    Main main = new Main();
    this.Close();
    main.Show();
}

我在 Main.Designer 中有与 Controls.Add(timeLabel) 相关的 System.StackOverflowException;

我该如何解决这个问题?

我的需要只是显示当前计时器而不是其他

我尝试启动和停止计时器并将其公开,以便在 GestioneSerataForm 中重新启动它,但它不起作用

c# windows windows-forms-designer
1个回答
0
投票

您的

Main
表单创建并显示
GestioneSerataForm
表单:

GestioneSerataForm gfor = new GestioneSerataForm();
gfor.Show();

您的

GestioneSerataForm
表单将创建并显示
Main
表单:

Main main = new Main();
//...
main.Show();

这种情况会无限期地发生,每种形式都会一遍又一遍地创造另一种形式。

不要创建 new

Main
表单,而是提供
GestioneSerataForm
表单实例并引用您已有的
Main
表单。 例如:

// in GestioneSerataForm.cs
private Main _main;

public GestioneSerataForm(Main main)
{
    _main = main;
}

和:

// in Main.cs
private void GestioneSerataButton_Click(object sender, EventArgs e)
{
    this.Hide();
    GestioneSerataForm gfor = new GestioneSerataForm(this);
    gfor.Show();
}

请注意调用

this
构造函数时使用的对
GestioneSerataForm
的引用。

然后您可以使用该引用来显示原始

Main
表单实例:

private void GestioneSerataForm_FormClosing(object sender, FormClosingEventArgs e)
{
    _main.Show();
}
© www.soinside.com 2019 - 2024. All rights reserved.