C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

条件が整ったらイベントを起こしたい

[トピック内 2 記事 (1 - 2 表示)]  << 0 >>

■90176 / inTopicNo.1)  条件が整ったらイベントを起こしたい
  
□投稿者/ どっと (1回)-(2019/02/14(Thu) 15:08:43)

分類:[.NET 全般] 

Windows Formについて質問させてください。

テキストボックスが2つ、コンボボックスが1つあります。
この3つ全てに値が入力された時にイベントを発生させたいです。

テキストボックス、コンボボックスのそれぞれのLeaveイベントで、

if(textbox1.Text != "" && textbox2.Text !="" && combo1.Text != "")
{MessageBox.Show("こんにちは");}

とやれば目的は達成されるとは思うのですが、スマートじゃない気がします。
何か他に良い方法はあるでしょうか?
引用返信 編集キー/
■90180 / inTopicNo.2)  Re[1]: 条件が整ったらイベントを起こしたい
□投稿者/ 魔界の仮面弁士 (2054回)-(2019/02/14(Thu) 15:42:32)
2019/02/14(Thu) 15:57:21 編集(投稿者)

No90176 (どっと さん) に返信
> テキストボックスが2つ、コンボボックスが1つあります。
> この3つ全てに値が入力された時にイベントを発生させたいです。

イベントは「発生させる」ものではなく、「発生する」ものですね。
利用側の話ではなく、コントロールそのものを開発する場合(UserControl など)は別として。


> テキストボックス、コンボボックスのそれぞれのLeaveイベントで、

textBox1 ではなく textbox1
comboBox1 ではなく combo1
という命名に若干の違和感がありますが、それはさておき。

その仕様だと、最後の combo1 を抜けて MessageBox が表示された後で、
再度 textbox1 にフォーカスを戻すと、Tab キーでフォーカスが移るたびに、
MessageBox が何度も表示されてしまいそうですが、構わないのでしょうか。


もしも入力完了後に一度だけ表示するなら、再チェックを回避するための
フラグ判定などを設ける必要が出てくるかと思います。

また、一度メッセージが表示された後、再度、値がクリア・編集された場合には
フラグを戻す必要がありますね。
(textbox1.Modified 等を併用するのも良いかもしれません)

ただし値の入力は、ユーザー操作以外によって行われることもある点に注意。
ユーザー操作ではなくプログラムから操作されるような場合には、
フォーカス移動を伴うとは限らず、その場合 Leave は発生しません。


> とやれば目的は達成されるとは思うのですが、スマートじゃない気がします。

チェックするコントロール数が多い場合は、配列にしておく手もありますね。

private void Form1_Load(object sender, EventArgs e)
{
  Control[] controls = { textbox1, textbox2, combo1 };
  EventHandler example = delegate {
    if(controls.All(c => c.Text != "")) {
      MessageBox.Show("こんにちは");
    }
  };
  Array.ForEach(controls, c => c.Leave += example);
}
引用返信 編集キー/

このトピックをツリーで一括表示


トピック内ページ移動 / << 0 >>

このトピックに書きこむ