如果表单处于活动状态,则停止计时器
Stop timer if Form is active
如果用户正在使用当前表单(例如,在文本框上书写),我是否可以通过某种方式停止计时器。这样做的原因是我每分钟都会刷新表单("Update data from Database")但是如果用户正在文本框上书写并且计时器到达那一分钟它会重置文本框并且用户必须再次写入,换句话说,它有大约。 1分钟写完表格。
private void timer1_Tick(object sender, EventArgs e)
{
SelectProgress();
}
private void SelectProgreso()
{
try
{
OleDbDataReader reader;
reader = oleDbCmd.ExecuteReader();
reader.Read();
progress= reader[1].ToString();
int op = Int32.Parse(progress);
switch (op)
{
case 1:
progressBar1.Value = 20;
button1.Enabled = false;
break;
case 2:
progressBar1.Value = 40;
button1.Enabled = false;
break;
case 3:
progressBar1.Value = 60;
button1.Enabled = false;
break;
case 4:
progressBar1.Value = 80;
break;
case 5:
progressBar1.Value = 100;
button1.Enabled = false;
break;
default:
Console.WriteLine("Error");
break;
}
}
catch (OleDbException error)
{
MessageBox.Show(error.ToString());
}
finally
{
mycon.Close();
}
}
我正在使用 Visual Studio 2013 WindowsForm。
对此的任何帮助或评论表示赞赏。
谢谢。
是的,您可以将事件处理程序添加到表单上更新 "lastEdited" 字段或类似内容的所有相关控件,这样,当计时器关闭时,您可以检查它已经过了多长时间最后一次编辑,只有在数据足够长的情况下才重新加载数据。
没有直接的方法来做到这一点,就像没有直接的方法来确定Form
是否是"active"一样(除其他原因外,因为 "active" 对不同的人有不同的意义。
您可以做的一些事情:
- 不要在数据库刷新时更新您的可编辑控件。
- 在用户输入时停止计时器,例如监听所有控件的
TextChanged
事件。
- 在
Focus
个事件上停止计时器。
请注意,无论何时停止计时器,您还需要定义启动它的逻辑备份(可能是另一个计时器!)。基本上,您需要定义 "active" 和 "inactive" 的实际含义,并针对此编写逻辑代码。
您可以做的另一件事是在更新之前检查文本框是否有焦点,如果有焦点则不要更新它。
将第二个计时器附加到界面的 TextChanged
等事件,同时停止主计时器。
第二个计时器滴答事件然后在没有输入的几秒钟后启动主计时器。
编辑:像这样:)
Timer mainTimer;
Timer activityTimer;
public Form1()
{
mainTimer = new Timer();
activityTimer = new Timer();
mainTimer.Interval = 60000;
activityTimer.Interval = 2000;
activityTimer.Tick += activityTick;
InitializeComponent();
}
private void activityTick(object sender, EventArgs e)
{
mainTimer.Start();
activityTimer.Stop();
}
private void onUserinput(object sender, EventArgs e)
{
mainTimer.Stop();
activityTimer.Stop();
activityTimer.Start();
}
如果用户正在使用当前表单(例如,在文本框上书写),我是否可以通过某种方式停止计时器。这样做的原因是我每分钟都会刷新表单("Update data from Database")但是如果用户正在文本框上书写并且计时器到达那一分钟它会重置文本框并且用户必须再次写入,换句话说,它有大约。 1分钟写完表格。
private void timer1_Tick(object sender, EventArgs e)
{
SelectProgress();
}
private void SelectProgreso()
{
try
{
OleDbDataReader reader;
reader = oleDbCmd.ExecuteReader();
reader.Read();
progress= reader[1].ToString();
int op = Int32.Parse(progress);
switch (op)
{
case 1:
progressBar1.Value = 20;
button1.Enabled = false;
break;
case 2:
progressBar1.Value = 40;
button1.Enabled = false;
break;
case 3:
progressBar1.Value = 60;
button1.Enabled = false;
break;
case 4:
progressBar1.Value = 80;
break;
case 5:
progressBar1.Value = 100;
button1.Enabled = false;
break;
default:
Console.WriteLine("Error");
break;
}
}
catch (OleDbException error)
{
MessageBox.Show(error.ToString());
}
finally
{
mycon.Close();
}
}
我正在使用 Visual Studio 2013 WindowsForm。 对此的任何帮助或评论表示赞赏。 谢谢。
是的,您可以将事件处理程序添加到表单上更新 "lastEdited" 字段或类似内容的所有相关控件,这样,当计时器关闭时,您可以检查它已经过了多长时间最后一次编辑,只有在数据足够长的情况下才重新加载数据。
没有直接的方法来做到这一点,就像没有直接的方法来确定Form
是否是"active"一样(除其他原因外,因为 "active" 对不同的人有不同的意义。
您可以做的一些事情:
- 不要在数据库刷新时更新您的可编辑控件。
- 在用户输入时停止计时器,例如监听所有控件的
TextChanged
事件。 - 在
Focus
个事件上停止计时器。
请注意,无论何时停止计时器,您还需要定义启动它的逻辑备份(可能是另一个计时器!)。基本上,您需要定义 "active" 和 "inactive" 的实际含义,并针对此编写逻辑代码。
您可以做的另一件事是在更新之前检查文本框是否有焦点,如果有焦点则不要更新它。
将第二个计时器附加到界面的 TextChanged
等事件,同时停止主计时器。
第二个计时器滴答事件然后在没有输入的几秒钟后启动主计时器。
编辑:像这样:)
Timer mainTimer;
Timer activityTimer;
public Form1()
{
mainTimer = new Timer();
activityTimer = new Timer();
mainTimer.Interval = 60000;
activityTimer.Interval = 2000;
activityTimer.Tick += activityTick;
InitializeComponent();
}
private void activityTick(object sender, EventArgs e)
{
mainTimer.Start();
activityTimer.Stop();
}
private void onUserinput(object sender, EventArgs e)
{
mainTimer.Stop();
activityTimer.Stop();
activityTimer.Start();
}