我在某种程度上是编码的新手,偶然发现了一个问题。我自己找到了解决方案,但我确信有更好的解决方案!
我将尝试描述我的问题,因为我的糟糕的英语技能允许我和我的解决方案。关键是,我想知道是否有任何解决方案,因为我的解决方案似乎非常适合这种情况。
好的伙计们,我们走吧!
本程序本身由三个表格构成,主要形式是“控制中心”或菜单,所以说,另外两个是标签显示的计时器, 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)
{
....
}
}
显然,该解决方案确实存在一些性能问题:
即使这些基本上不论我所做的这么小的计划,我都渴望学会如何以正确的方式解决这个问题。
提前感谢您的回复!
答案 0 :(得分:1)
根据我的评论,尝试这样的事情:
public class MainForm
{
Form1 timerUp = new Form1();
Form2 timerBreak = new Form2();
private void MainForm_Load(object sender, EventArgs e)
{
timerUp.Show();
timerBreak.Show();
}
private void buttonStart_Click(object sender, EventArgs e)
{
timerUp.StartTimer();
}
}
public class Form1
{
private Timer _timer = new Timer();
public void StartTimer()
{
_timer.Start();
}
}
答案 1 :(得分:1)
据我了解您的问题,将变量timerUp
和timerBreak
从Main表单的Form_Load
事件处理程序移出到类级别就足够了,例如:
public class FormMain
{
// Class level fields
private Form1 timerUp = new Form1();
private Form2 timerBreak = new Form2();
private void FormMain_Load(object sender, EventArgs e)
{
timerUp.Show();
timerBreak.Show();
}
// Use the class level fields wherever you need to
private void buttonStart_Click(object sender, EventArgs e)
{
timerUp.timer1.Start();
}
// Dispose of the class-level fields when MainForm is disposed
protected void Dispose(bool disposing)
{
base.Dispose(disposing);
if (disposing)
{
timerUp.Dispose();
timerBreak.Dispose();
}
}
}
答案 2 :(得分:1)
在列出可能的解决方案之前,我强烈建议您详细了解MVC和/或MVVM(通常用于WPF)架构模式。它们将指导您如何在GUI应用程序中分配类和视图之间的职责。这将是一个陡峭的学习曲线,但最终还是值得的。
直接在MainForm的类级别中移动timerUp和timerBreak变量。这样,您就可以使用对主表单的引用来访问它们。
Form1 timerUp;
Form2 timerBreak;
private void MainForm_Load(object sender, EventArgs e)
{
timerUp = new Form1();
timerBreak = new Form2();
timerUp.Show();
timerBreak.Show();
}
如果您觉得两个表单的计时器控件将在整个应用程序中引用,您可以在主表单中保留对它们的引用。
您可以使用events通知计时器他们应该开始/停止。这些事件可以在您的MainForm中,也可以在单独的类中。这个单独的类还将包含您的计时器的模型(属性,如时间,状态等),并将通过property change notification事件通知您的计时器。这在MVVM中大量使用。