件名:[VB2005] Validating イベント内で MsgBox を使えないジレンマ(Insider.NET 会議室)より:
>項目ごとにダイアログが出るとうっとうしいと苦情を言うユーザー
項目毎にダイアログを出せ、というですよ
たとえば、0~100 の範囲で入力しないといけない場合に、範囲外は「0~100の範囲で入力してくださいよ!」的なダイアログ(e.Cancel = True)を出せ、というですよ。
更に80以上だったら「え?本当に80以上なの、すごいね!」みたいなダイアログ(e.Cancel = False)で御節介を焼いて欲しいそうな。
なるほどねぇ。。。
入力中に、ダイアログでメッセージを表示するのは、基本的に賛成できません。入力の流れを妨げるからです。よくある質問で、「Enter キーでフォーカスを移動させるには?」というのは、これに似た理由ですね。[Tab] キーはテンキーにはありませんので、手の移動が大きい=入力の流れが妨げられる、と。この場合、Windows 標準のキー操作と衝突を起こすわけですが、どちらかというと、流れを妨げる方が大きな問題となるでしょう。フォーカス移動を「テンキーの [Enter] キーのみ」に絞れるなら、その方がいいとも思いますけど。
あるいは、わかってやっている場合もあります。例えば、伝票入力です。伝票はすでにどこかで作られていて、それをコンピュータに入力するのかもしれません。このとき、エラーはともかく、警告で入力の流れを妨げられると、ユーザはイライラするでしょう。特に、公共事業などではデータの入力を業者が行う場合があります。業者さんは指示されたとおりに入力するのが仕事なので、指示元のデータの正誤については責任がありません。このとき、指示元のデータと違うことを指摘するならともかく、入力値が正常な範囲でありながら入力の流れを阻害するような動作は、集中力を欠かせることになります。
特に、発注者と使用者が同じでない場合は、注意する必要があります。システム課などが業務の流れを知らず、「こうしてあればいいだろう」「こう使って欲しい」と思って発注しても、実際に使う場面にそぐわなければ、使われないシステムの仲間入りをする可能性が高くなります。
と、だめだめ言っていてもなんなので、提案です。
ToolTip を使ってみました。エラーメッセージは、ErrorProvider を使いました。
Visual Studio 2005 にて、Windows アプリケーションを作成します。
Form に、TextBox を2つ置きます。(ひとつは、フォーカスを遷移させるためだけのもの)
ToolTip と ErrorProvider も置きます。
ToolTip の、ToolTipTitle プロパティに、「警告」と入力します。また、IsBaloon プロパティを True にしておきましょう。ただの ToolTip だと、どこのコントロールに対して表示されたのかわかりにくいので。
TextBox1 にフォーカスし、プロパティ ウインドウで稲妻ボタンをクリックします。Validating イベントをダブル クリックします。
できたイベント ハンドラに、後述のコードを書きます。
さて、実行してみましょう。
Validating コードの例:
private void textBox1_Validating(object sender, CancelEventArgs e) {
Int32 chk;
errorProvider1.Clear();
toolTip1.Hide(textBox1);
if (Int32.TryParse(textBox1.Text, out chk) == false || (chk > 100 || chk < 0)) {
e.Cancel = true;
errorProvider1.SetError(textBox1, "0以上100以下の数値を入力してください。");
} else {
if (chk >= 80) {
// see: https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=98281
toolTip1.Show("", textBox1);
toolTip1.Show("80以上です。本当にいいですか?", textBox1);
}
e.Cancel = false;
}
}
ErrorProvider は、規定では設定したコントロールの右側に、Icon プロパティで指定したアイコンを表示します。ここで指定したアイコンが表示できるだけの幅を、コントロールの右側に確保しておく必要があります。う~ん、ErrorProvider に、「ベルを鳴らす」機能があれば良かったのに...
toolTip1.Show メソッドを2つ並べて書いているのは、修正されていないバグのためです。こうしていても、たまに表示されるツールチップの位置がずれます。
表示されたツールチップを消すためには、フォーカスを他のフォームに移してやる必要があります。ツールチップをクリックしてもいいです。
ツールチップが表示された状態で、フォームを動かすと、ツールチップが付いてきません。その後、ツールチップにフォーカスを移してツールチップを消し、もう一度ツールチップが表示されるような操作をすると、表示される場所がずれますorz あはは。。。バグ見つけちゃったよ。
Validating イベントではこんな感じにしておいて、登録のアクションで、エラーなら登録させない。警告なら登録する、しないを選べるようにしておく。そんな感じかな。でも、ToolTip のバグのおかげで、使いにくいやorz
投稿日時 : 2007年12月15日 22:06