这是Form1
我正在尝试使用form2中的变量级别来设置form1
中的计时器间隔 int time = 0;
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
timer1.Start();
}
private void timer1_Tick(object sender, EventArgs e)
{
time++;
定时器的间隔取决于变量“level”的值,该变量位于form2中
if (Form8.level.Equals("expert"))
{
timer1.Interval = 10000;
if (time == 10000)
{
timer1.Stop();
MessageBox.Show("time ended");
}
}
else
{
timer1.Equals(60000);
if (time==60000)
{
timer1.Stop();
MessageBox.Show("time ended");
}
}
}
这是Form2
这是我想在form1中使用的变量
public Static String level = "";
private void button1_Click(object sender, EventArgs e)
{
this.Hide();
Form1 f1 = new Form1();
f1.Show();
}
答案 0 :(得分:3)
好的,我不认为您的代码确实存在错误,只有一些问题可能会让您觉得代码无效。
首先,我建议你考虑更恰当地命名你的课程。我个人倾向于在功能之后命名我的表单。因此,您可以考虑将Form8
重命名为DifficultyForm
。通过这种方式,您可以更轻松地理解代码。此外,像elapsedLevelTime
这样的名称可以让您了解计时器的用途。如果其他人查看了您的代码,那么此人就不会真正了解timer1
的使用。
现在让我们快速回顾一下代码应该做什么:用户似乎选择某种难度。然后,显示另一个窗口。在所示窗口中,计时器应该递增,直到达到某个时间。然后将显示文本“time ended”。
如您所述,您在Designer中创建了很多东西。所以我假设所有事件都正确附加。这导致了结论,罪魁祸首位于timer1_elapsed
,实际计算经过时间的代码:
private void timer1_Tick(object sender, EventArgs e)
{
time++;
if (Form8.level.Equals("expert"))
{
timer1.Interval = 10000;
if (time == 10000)
{
timer1.Stop();
MessageBox.Show("time ended");
}
}
else
{
timer1.Equals(60000);
if (time==60000)
{
timer1.Stop();
MessageBox.Show("time ended");
}
}
}
调试算法时,Rubber duck debugging - 尽管有趣的名字 - 是一种有价值的方法。让我们逐步完成您的代码。
加载表单时启动计时器。您没有真正指定计时器设置,但默认计时器的间隔为100毫秒。因此tick
方法每秒提高10次左右。
当计时器滴答时,time
将增加1。因此,1秒后,time
将为10。
现在您正在检查所选级别是否专家。所以我们必须在这里选择:
一个。水平是专家。在这种情况下,您将间隔设置为10000
。这将导致{10}每10秒引发一次tick
事件。然后,检查time
- 变量是否为10000
。如果是这种情况,则结束计时器并显示“时间结束”。这是两个问题:
if (time == 10000)
代替if (time >= 10000)
。这样,如果在没有检查的情况下更新time
变量,您的计时器将永远不会完成 10000
,因此将在10000 * 10s
秒后达到此条件,即大约27小时。湾水平不是专家。在这里,我们的代码也存在一些问题:
timer1.Equals(60000);
在这里是一个无用的陈述。 Equals
方法基本上会检查timer1 == 60000;
。if
- 条件相同的可能问题。见上文:a1 60000 * 0.1s
之后达到约100分钟的条件。以下是一些改进代码的建议:
在tick事件之外设置计时器间隔。它看起来像是需要的 只设置一次。
检查timer1.Equals(60000)
检查您是否真的想要这些长间隔
确保您了解time
包含的值,以及增加的频率
我尝试在一个小型WindowsForm项目中使用可能的解决方案重新创建您的问题:
public partial class Form1 : Form
{
private Timer secondMeasureTimer;
private int elapsedTime; //in seconds
private string level = "expert";
public Form1()
{
InitializeComponent();
secondMeasureTimer = new Timer();
secondMeasureTimer.Tick += secondMeasureTimer_Tick;
secondMeasureTimer.Interval = 1000; // 1 second resolution
}
void secondMeasureTimer_Tick(object sender, EventArgs e)
{
#if DEBUG
System.Diagnostics.Debugger.Log(0, "secondMeasure", "secondMeaserTimer ticked at " + DateTime.Now + Environment.NewLine); // Output every time the event is raised for debugging purposes
#endif
elapsedTime++; // increas time every second
if (level == "expert" && elapsedTime >= 10)
{
textBox1.Text = "10 seconds elapsed";
secondMeasureTimer.Stop();
}
else if (elapsedTime >= 60)
{
textBox1.Text = "60 seconds elapse";
secondMeasureTimer.Stop();
}
}
private void timerButton_Click(object sender, EventArgs e)
{
if (secondMeasureTimer.Enabled)
{
secondMeasureTimer.Stop();
}
else
{
elapsedTime = 0;
secondMeasureTimer.Start();
}
}
}
答案 1 :(得分:1)
如果这不是Web应用程序,则可以使用静态变量
即, public staic String level =“”;
然后访问formname.level
将为您提供该值。
试试这可能会对你有所帮助。
答案 2 :(得分:0)
而不是关闭尝试以下方法
private void button1_Click(object sender, EventArgs e)
{
this.Hide();
Form1 f1 = new Form1(this);
f1.Show();
}