c#在类和表单中更改属性

时间:2015-12-13 12:10:41

标签: c# forms timer

大家好!

我在某种程度上是编码的新手,偶然发现了一个问题。我自己找到了解决方案,但我确信有更好的解决方案! 我将尝试描述我的问题,因为我的糟糕的英语技能允许我和我的解决方案。关键是,我想知道是否有任何解决方案,因为我的解决方案似乎非常适合这种情况。
好的伙计们,我们走吧!

计划说明

本程序本身由三个表格构成,主要形式是“控制中心”或菜单,所以说,另外两个是标签显示的计时器, 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语句

即使这些基本上不论我所做的这么小的计划,我都渴望学会如何以正确的方式解决这个问题。
提前感谢您的回复!

3 个答案:

答案 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)

据我了解您的问题,将变量timerUptimerBreak从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应用程序中分配类和视图之间的职责。这将是一个陡峭的学习曲线,但最终还是值得的。

  1. 直接在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();
      }
    
  2. 如果您觉得两个表单的计时器控件将在整个应用程序中引用,您可以在主表单中保留对它们的引用。

  3. 您可以使用events通知计时器他们应该开始/停止。这些事件可以在您的MainForm中,也可以在单独的类中。这个单独的类还将包含您的计时器的模型(属性,如时间,状态等),并将通过property change notification事件通知您的计时器。这在MVVM中大量使用。