C# - 重新启动计时器,当事件处理程序再次被调用时



我有一个panel的C#Winforms应用程序。面板加载UserControlUserControl包含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);
}

最新更新