【发布时间】:2016-03-18 23:35:46
【问题描述】:
大家好!
不知何故,我对编码很陌生,但偶然发现了一个问题。我自己设法找到了解决方案,但我确信有更好的解决方案!
我会尽量描述我的问题,就像我糟糕的英语技能允许我那样,然后我的解决方案。关键是,我想知道通用中是否有任何解决方案,因为我的解决方案似乎非常特别适合这种情况。
好的,伙计们,我们开始吧!
节目说明
程序本身是由三个窗体组成的,主窗体是“控制中心”或菜单,可以说,另外两个是标签显示的计时器, as you can see here.蓝色定时器递增,而绿色定时器则相反。
当我打开程序时,两个计时器表单也打开了,即使它们没有运行,我也需要它们。显然,我使用 FormMain_Load 方法来显示它们:
private void FormMain_Load(object sender, EventArgs e)
{
Form1 timerUp = new Form1();
timerUp.Show();
Form2 timerBreak = new Form2();
timerBreak.Show();
}
问题
现在,这正是我的问题!第二个有人单击这两个开始按钮之一,我想在表单上启动计时器(因为我将每个计时器的计时器放在自己的表单上)。但是如果我使用
private void buttonStart_Click(object sender, EventArgs e)
{
timerUp.timer1.Start();
}
为了访问“timerUp”变量,我无法访问 FormMain_Load 中的局部变量“Form1 timerUp”。它说“变量在当前上下文中不存在”。
如果有人知道一种可能的解决方案,可以在另一个班级已经打开的表单上简单地打开计时器,我会非常高兴。
我的解决方案
由于已经剧透,即使我对它的设置不满意,我还是设法找到了解决方案。
为了维护我的解决方案,两个计时器在表单打开的第二个开始,例如在 Form1 内部(第一个计时器):
private void Form1_Load(object sender, EventArgs e)
{
timer1.Start();
}
但是,这背后有一些逻辑。我在 mainForm 中设置了一些公共静态布尔值,并通过单击按钮来更改它们。例如:
public partial class FormMain : Form
{
public static bool timer1 = false;
public static bool timer2 = false;
....
private void buttonStart_Click(object sender, EventArgs e)
{
timer1 = true;
}
}
现在,再次在 Form1 中,我添加了一些 if 语句来检查这些布尔值。就这样:
private void timer1_Tick(object sender, EventArgs e)
{
if (FormMain.timer1)
{
....
}
}
显然,该解决方案确实存在一些性能问题:
- 定时器一直在运行
- 必须在每个刻度上检查 If 语句
尽管对于我这样一个小程序来说这些基本上是无关紧要的,但我渴望学习如何以正确的方式解决这样的问题。
提前感谢您的任何回复!
【问题讨论】:
-
您可以将
timerUp和timerBreak保留在FormMain字段中。但是如果用户关闭其中一个表单会发生什么? -
您可以在每个子表单中公开
timer,而不是使用布尔值。那么你会有buttonStart_Click(...) { timerUp.timer.Start(); }。或者,更封装的方法:在名为startTimer的子窗体中定义一个方法,然后在主窗体中运行timerUp.StartTimer();