我有一个panel
的C#WinForms应用程序。面板加载UserControl
,UserControl
包含DataGridView
。
在我的UserControl
中,我在MouseDown
DataGrid
事件的事件处理程序
private void palletsGrid_MouseDown(object sender, MouseEventArgs e)
{
try
{
EventHandler handler = onScrolling;
if (handler != null)
{
handler(this, new EventArgs());
}
}
Catch (Exception ex)
{
Logging.LogWarn("Mouse down error: ", ex);
}
}
onScrolling
是公开声明的EventHandler
属性。
我在主窗体中处理这个EventHandler
因为,我有一个定时器,每5秒自动刷新一次。因此,当发生此事件(滚动DataGridView
)时,我需要知道要停止刷新的主窗体。
在我的主要形式中,这就是我正在做的事情:
private void userControl_ScrollEvent(object sender, EventArgs e)
{
try
{
timer1.Stop();
Timer pauseTimer = new Timer();
pauseTimer.Interval = 60000;
pauseTimer.Start();
pauseTimer.Tick += new System.EventHandler(pauseTimer_Tick);
}
catch (Exception ex)
{
Logging.LogFatal("Scroll event capture error: ", ex);
}
}
这样做,当用户滚动DataGridView
时,主窗体停止自动刷新60秒。一旦60秒pauseTimer
滴答,refreshTimer
恢复正常。
问题:
我需要我的表单才能知道我何时触摸屏幕两次。如同,如果我现在触摸屏幕,计时器启动。不刷新60秒。如果我再次触摸它,60秒需要从第二次触摸开始。不是第一个。因此,每次触摸屏幕时,pauseTimer
都需要重新启动。
答案 0 :(得分:2)
就像@FrankM指出的那样,每次滚动时都不应该创建一个新的计时器。在代码中创建计时器(System.Windows.Forms.Timer)时应始终小心,如果这样做,则必须确保它们正确处理。最简单的方法是从设计师添加计时器,这样就可以为您进行适当的清理。 More on disposal of System.Windows.Forms.Timers
解决方案1:在设计器中添加暂停时间并在滚动事件中重新启动它。如何重新启动计时器可能并不明显,但您可以先禁用计时器,然后启用计时器:
{{1}}
解决方案2:摆脱暂停计时器,只需更改刷新计时器的间隔。
{{1}}