2017-09-12 17 views
-3

私は基本的に.csvファイルにユーザー入力データを保存する時間を追跡する.exeファイルをセットアップしました。私はすでに、「少なくとも8時間」が満たされていない限り、ユーザーがファイルを保存することができない基準のコード設定を行っています。条件が満たされるまでフォームが閉じられないようにできますか?

しかし、ユーザーがファイルを管理しない限り、.exeファイルを開いたままにしておく(強制オープンのような)こともしたい。 「8時間」の基準が満たされていない限り、ユーザーはプログラムを終了できません。どんな助けもありがとう。 これは基準が決定され、そこから自分のコードのセクションです:

private void button1_Click(object sender, EventArgs e) 
    { 
     if (Convert.ToInt32(textBox28.Text) + Convert.ToInt32(textBox29.Text) + Convert.ToInt32(textBox2.Text) + Convert.ToInt32(textBox3.Text) + Convert.ToInt32(textBox4.Text) + Convert.ToInt32(textBox6.Text) + Convert.ToInt32(textBox5.Text) + Convert.ToInt32(textBox7.Text) + Convert.ToInt32(textBox36.Text) + Convert.ToInt32(textBox40.Text) < 8) 
     { 
      MessageBox.Show("Total hours should be at least 8"); 
     } 
     else 
     { 
      StreamWriter myOutputStream = new StreamWriter("C:\\demo\\test.csv",true); 
      myOutputStream.WriteLine((dateTimePicker1.Text) + "," + (textBox47.Text) + "," + (textBox28.Text) + "," + (textBox29.Text) + "," + (textBox2.Text) + "," + (textBox3.Text) + "," + (textBox4.Text) + "," + (textBox6.Text) + "," + (textBox5.Text) + "," + (textBox7.Text) + "," + (textBox36.Text) + "," + (textBox40.Text)); 
      myOutputStream.Close(); 


     } 
    } 
+0

これは技術的に不可能です。ユーザーは、アプリケーションコードで何をしているかに関係なく、タスクマネージャーを使用してプロセスをいつでも停止することができます。 – dymanoid

+0

私はそれをよく知っています。しかし、私はより多くのユーザーが単に条件を満たすことなく 'X'を押すことができないようにする必要があったように意味した。 – leo

答えて

1

あなたはFormClosingイベントをサブスクライブして、クローズ処理をキャンセルしたいかどうかを確認することができます

public partial class Form1 : Form 
{ 
    private bool closeCriteriaMet; 

    public Form1() 
    { 
     InitializeComponents(); 

     // subscribe event 
     Closing += OnFormClosing; 
    } 

    // "Closing" event handler 
    private void OnFormClosing(object sender, FormClosingEventArgs e) 
    { 
     e.Cancel = !closeCriteriaMet; // tell the Form not to close 
    } 
} 
LarsTechが示唆したように)

それとも単にOnFormClosingメソッドをオーバーライド

public partial class Form1 : Form 
{ 

    // "Closing" event handler 
    protected override void OnFormClosing(FormClosingEventArgs e) 
    { 
     base.OnFormClosing(e); 
     e.Cancel |= !closeCriteriaMet; // combine the cancel flag 
    } 
} 

しかし、これは、ユーザーがUIを介してフォームを閉じないようにするだけであることに注意してください。このプロセスは、タスクマネージャやその他のツールを使用しても終了できます。

+1

なぜOnFormClosingメソッドをオーバーライドしないのですか?フォームは自分のイベントを聞く必要はありません。 – LarsTech

+0

@LarsTechあなたは正しい、奇妙なことに、私はそれをやったことはなかったでしょう。なぜなら、私は常に上書きするのではなくハンドラを追加したデザイナーから始めたからです。 –

+0

@LarsTech、これは、自分のイベントに。あなたは購読を嫌う必要はありません。ほとんどのwinformsクラスのオーバーライドアプローチには落とし穴がありますが、基本実装を呼び出すのを忘れてしまえば、これ以上対応するイベントを受け取ることはありません。これはデバッグが難しいかもしれません。 – dymanoid

関連する問題