2016-12-15 6 views
-3

私はいくつかのコントロールで新しいフォームを開く小さなアプリケーションを設計しています。しばらくアイドル状態であればこのフォームを閉じたいと思っています。フォームに多くのボタン、スクロールバー、ピクチャボックスがあるとしましょう...(10秒以内に)いずれもクリックされなければ、フォームは閉じます。コントロールのいずれかを検出する

私は10秒のタイマーを使用していますが、いずれかのコントロールを押した場合にリセットします。私はそれを個別に行うことはできますが、すべてのコントロールのためにそれを行うことは非常に面倒になります。

foreach (Control cc in Controls) 

を、それを使用する方法を知っていませんでした:私はいくつかの簡単な方法でそれを行うことができます....私はネット上でお読みください。助けてください。

+0

ここで、すべてのonclickイベントハンドラに追加するメソッドを作成する方法はありませんか?私はこれより短い(コードが少ない)方法はないと思う。 –

+1

これはどんなアプリケーションですか? WinForms、WPF、ASP.Net WebフォームまたはMVC? –

答えて

0

これはあなたがforeachループ内のすべてのコントロールにクリックイベントをバインドすることができ

private void Form1_Load(object sender, EventArgs e) 
    { 
     foreach(Control control in this.Controls) 
     { 
      control.Click += Oncontrol_Click; 
     } 
    } 

    private void Oncontrol_Click(object sender, EventArgs e) 
    { 
     Control control = sender as Control; 
     MessageBox.Show($"{control.Text} is clicked"); 
    } 
0

を始める必要があります。

foreach (Control c in Controls) 
{ 
    c.Click += (o, args) => ResetTimer(); 
} 

ユーザーがコントロールをクリックするたびに、ResetTimer()が発生します。

0

は、フォーム上のコントロールのすべてにクリックイベントを追加するには、この操作を行う必要があります。

private void Form1_Load(object sender, EventArgs e) 
    { 
     AttachHandler(this, (s, e2) => ResetTimer()); 
    } 

    private void AttachHandler(Control control, EventHandler handler) 
    { 
     control.Click += handler; 
     foreach (Control c in control.Controls) 
     { 
      AttachHandler(c, handler); 
     } 
    } 

それは再帰的に他のコントロールを含めることができるすべてのコントロールをダウンする必要があります。

+0

ご返信ありがとうございます。解決策は役に立ちましたが、フォーム上のパネル内にコントロールがいくつかある場合、それらを個別に処理すると反映されません。 –

+0

@AmitGarg - 「反映しない」とはどういう意味ですか?このコードは、パネルのコントロールのハンドラもアタッチする必要があります。 – Enigmativity

+0

混乱して申し訳ありません。ボタンは正しく動作していますが、スクロールバー(水平スクロールバー/垂直スクロールバー/テキストボックススクロールバー)では機能しません。 –

関連する問題