我有一个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
都需要重新启动。
@frankm指出,每次滚动时都不应创建一个新的计时器。在代码中创建计时器(system.windows.forms.timer)时,您应该始终要小心,如果这样做,则必须确保它们正确处理。最简单的方法是添加设计师的计时器,这样可以为您提供适当的清理。更多有关处置System.windows.forms.timers
的更多信息解决方案1:在设计器中添加一个Pausetimer,并在滚动事件中重新启动。如何重新启动计时器可能并不明显,但是您首先禁用计时器,然后启用它:
try
{
timer1.Enabled = false;
//Set interval and tick-handler from designer
pauseTimer.Enabled = false;
pauseTimer.Enabled = true;
}
catch (Exception ex)
{
Logging.LogFatal("Scroll event capture error: ", ex);
}
解决方案2:摆脱暂停计时器,只需更改刷新时间的间隔。
try
{
//Assume that this is the refreshtimer. In the Tick-eventhandler
//you reset interval to default refresh intervals
timer1.Interval = 60000;
timer1.Enabled = false;
timer1.Enabled = true;
}
catch (Exception ex)
{
Logging.LogFatal("Scroll event capture error: ", ex);
}