2017-12-08 17 views
0

私はpanelのC#WinFormsアプリケーションを持っています。パネルにはUserControlがロードされ、UserControlにはDataGridViewが格納されます。私UserControlC# - イベントハンドラが再び呼び出されたときにタイマを再起動します。

、私はonScrollingが公に宣言EventHandler財産である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); 
    } 
} 

MouseDownイベントのイベントハンドラを持っています。

メインフォームでEventHandlerを処理しています。タイマーは5秒ごとに自動更新されるためです。だから私は、このイベント(スクロールしてDataGridView)が発生したときにリフレッシュを止めるために知るために、メインフォームが必要です。ユーザーが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); 
    } 
} 

は、メインフォームは、60秒のための自動更新を停止します。私のメインフォームで

が、これは私がやっているものです。 60秒に一度pauseTimerのティックを入力すると、refreshTimerは通常のように再開します。

問題:

私は画面を2回タッチすると知っている私のフォームを必要としています。のように、私が今画面に触れると、タイマーが始まります。 60秒間リフレッシュしません。私がもう一度触れると、60秒は2回目のタッチから始める必要があります。最初のものではありません。だから私が画面に触れるたびに、pauseTimerを再起動する必要があります。

+2

ユーザーがスクロールするたびにタイマーを作成しています。悪いアイデア。タイマー1のようなメンバーとしてタイマーを作ってみてください。それで簡単に再始動することもできます。 – FrankM

+0

うーん..いいところ@FrankM。私はそれをしないように私のアプリケーションを変更します。 –

答えて

2

@FrankMが指摘するように、スクロールするたびに新しいタイマーを作成するべきではありません。タイマー(System.Windows.Forms.Timer)をコード内に作成するときは常に注意が必要です。そうした場合、タイマーが正しく配置されていることを確認する必要があります。最も簡単な方法は、デザイナーからタイマーを追加することです。この方法で、適切なクリーンアップが行われます。 More on disposal of 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); 
} 
+0

私は2番目のソリューションが好きです!私はこれらのいずれかを試して、それが私のために働くなら解決策としてマークします。ありがとう –

+0

2番目の解決策は私のためにはるかにエレガントに働いた。ありがとうございました。タイマーを無効にして有効にする理由はありますか?それは必要ですか? –

+0

喜んで助けてください:)無効にしてから有効にすると、タイマーが効果的に再開します。有効にするだけの場合は、所定の間隔ですでに有効になっている場合は、タイマーは再起動しません。 – TDull

関連する問題