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

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

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

Re[10]: エラー処理  当該testboxにforcu


(過去ログ 41 を表示中)

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

■21379 / inTopicNo.1)  エラー処理  当該testboxにforcus
  
□投稿者/ t6_kana (7回)-(2008/07/01(Tue) 14:29:57)

分類:[C#] 

こんにちは。

標記の件で調べています。
下記テキストボックスに値を入力後、不正な入力があったら、「userid,username password…の入力が
不正です」とメッセージを表示して、その値にforcusを当てたいのですが、下記ですと
うまくいきません。

どのようにしたら良いでしょうか?

以上宜しくお願いします。

      try
{
string userid = textBox1.Text.ToString();
string username = textBox2.Text.ToString();
string password = textBox3.Text.ToString();
int age = int.Parse(textBox4.Text);
string salary = textBox6.Text.ToString();
string sex = comboBox1.SelectedItem.ToString();
}
catch (Exception ex)
{
MessageBox.Show("項目" + ex + "の値が不正です。");
}
引用返信 編集キー/
■21380 / inTopicNo.2)  Re[1]: エラー処理  当該testboxにforcus
□投稿者/ 鶏唐揚 (221回)-(2008/07/01(Tue) 14:36:46)
2008/07/01(Tue) 14:49:52 編集(投稿者)
2008/07/01(Tue) 14:48:20 編集(投稿者)

No21379 (t6_kana さん) に返信
えーと、いろいろ突っ込みどころ満載なんですが、
そもそも.Focus()がどこにも見当たらないので上手くいかない以前の問題ではないですかね?

あとテキストボックスのTextプロパティはstring型なのでToStringは必要ありません。


追記:ごめんやっぱ突っ込む
>エラー処理
例外処理です。

>その値にforcusを当てたいのですが
forcusじゃなくてFocusならコード補完に出てくると思われます

引用返信 編集キー/
■21383 / inTopicNo.3)  Re[2]: エラー処理  当該testboxにforcus
□投稿者/ 刈歩 菜良 (95回)-(2008/07/01(Tue) 14:57:41)
刈歩 菜良 さんの Web サイト
例外が発生し得るのは

> int age = int.Parse(textBox4.Text);

だけなので、textBox4.Focus();でよいのではないでしょうか?
引用返信 編集キー/
■21384 / inTopicNo.4)  Re[2]: エラー処理  当該testboxにforcus
□投稿者/ ロック (23回)-(2008/07/01(Tue) 14:59:14)
入力後のチェックならtry-catchではなく、各テキストボックスで個々に
一文字ずつループしてチェックするか、正規表現でチェックしたりした方が良いと思います。
これだと、int.Parse()くらいでしかcatchできてないんじゃないですか?
フォーカスは各コントロールのFocus()メソッドで設定可能です。

MaskedTextBoxなら、入力している最中でも許可していない入力があった場合の
エラーを拾えたと思います。


>MessageBox.Show("項目" + ex + "の値が不正です。");
あと、Exceptionでエラーになったコントロールって分かるのでしょうか?
ココでToString()や.Messageで文字列化しても分からないと思いますが
どうでしょうか?
#この辺は自分も分からないので確認です(汗


って、書いてて思ったんですが、try-catchでエラーを拾うためにわざとToString()してました?
引用返信 編集キー/
■21385 / inTopicNo.5)  Re[3]: エラー処理  当該testboxにforcus
□投稿者/ 刈歩 菜良 (96回)-(2008/07/01(Tue) 15:01:05)
刈歩 菜良 さんの Web サイト
No21383 (刈歩 菜良 さん) に返信
> 例外が発生し得るのは
>
>>int age = int.Parse(textBox4.Text);
>
> だけなので、textBox4.Focus();でよいのではないでしょうか?
あ!
デザイン時にComboBox1で選択項目がなければ、そこでも例外発生しますね。
でも、その場合はぬるぽになるのでしょうか?
だとしたら、デフォルト値をデザイン時に選択しておくのが吉かと...
引用返信 編集キー/
■21389 / inTopicNo.6)  Re[4]: エラー処理  当該testboxにforcus
□投稿者/ 鶏唐揚 (222回)-(2008/07/01(Tue) 15:21:33)
2008/07/01(Tue) 15:23:02 編集(投稿者)

>あと、Exceptionでエラーになったコントロールって分かるのでしょうか?
>ココでToString()や.Messageで文字列化しても分からないと思いますが
>どうでしょうか?
>#この辺は自分も分からないので確認です(汗
取れません。例外を投げた張本人は.Sourceで取れますが、
不正な入力感知のためのint.Parseで例外発生しても
FormatExceptionを投げた"mscorlib.dll"となりますね

>って、書いてて思ったんですが、try-catchでエラーを拾うためにわざとToString()してました?
としても、元々string型で返ってくるデータをToStringしても例外は発生しないので
意味ないですね。


こういうのは1個1個調べてエラーとして返したほうがスマートな気がする…

どーしてもこの形でやりたいなら、Object型変数1個用意し、例外発生しうる処理の前に
処理しようとしてるコントロールをぶちこんで、
catch後はそのobject変数のNameプロパティでメッセージ表示し、.Focusするしかないと思います

引用返信 編集キー/
■21390 / inTopicNo.7)  Re[4]: エラー処理  当該testboxにforcus
□投稿者/ t6_kana (9回)-(2008/07/01(Tue) 15:24:02)
皆さんすいません(__)

わたしの説明不足と、アホ丸出しなコードに返信していただいてorz

まず…どこから説明したらよいのやら…

>鶏唐揚さん

まったくそのとおりです。

>刈歩 菜良さん

わたしの説明不足でした(後記)

>ロックさん

ループしてチェックする方法をこれから調べます。


それでは説明させていただきます。

try-catchは忘れてください。(忘れなくてもいいです。)


string userid = textBox1.Text;
string username = textBox2.Text;
string password = textBox3.Text;
int age = int.Parse(textBox4.Text);
string salary = textBox6.Text;
string sex = comboBox1.SelectedItem.ToString();

例えば各textboxに値を入れます。例えばageはintですので、文字を入力すると
エラーになります。それを、「項目ageの入力が不正です。」とメッセージボックスを表示させます。

そして、当該textboxにフォーカスを当てたいのです。

とここまで書けばよかったですね…





引用返信 編集キー/
■21392 / inTopicNo.8)  Re[5]: エラー処理  当該testboxにforcus
□投稿者/ 鶏唐揚 (223回)-(2008/07/01(Tue) 15:42:33)
>不正な入力があったら
>例えばageはintですので、文字を入力するとエラーになります。
「不正な入力」というのが、「数値に変換できない文字を入力」という意味で解釈してよろしいのですね。

なら、TryParseを使ってみてはどうでしょうか。
ただしVC#2005以降じゃないと使えません。

int age;

if(int.TryParse(textBox4.Text, out age))
{
    //OK、ageには既に変換後の数値が入っている
}
else
{
    //数値に変換できないのでNG
    MessageBox.Show("項目ageの入力が不正です。");
}

引用返信 編集キー/
■21397 / inTopicNo.9)  Re[6]: エラー処理  当該testboxにforcus
□投稿者/ 刈歩 菜良 (97回)-(2008/07/01(Tue) 16:33:28)
刈歩 菜良 さんの Web サイト
横から補足です。

No21392 (鶏唐揚 さん) に返信
> else
> {
> //数値に変換できないのでNG
> MessageBox.Show("項目ageの入力が不正です。");
> }

else句の中で
textBox4.Focus();
でフォーカスが当たります。
でも、MessageBoxはモーダルだから、メッセージボックスを閉じないともちろんフォーカスはメッセージボックス以外のどこにも当たりませんが...

そういうことじゃないですよね?
引用返信 編集キー/
■21399 / inTopicNo.10)  Re[7]: エラー処理  当該testboxにforcus
□投稿者/ 鶏唐揚 (224回)-(2008/07/01(Tue) 16:42:00)
No21397 (刈歩 菜良 さん) に返信
> 横から補足です。
あぁ、フォーカス云々を忘れていましたorz
補足ありがとうございます。

ついでに補足後のコード

int age;

if(int.TryParse(textBox4.Text, out age))
{
    //OK、ageには既に変換後の数値が入っている
}
else
{
    //数値に変換できないのでNG
    MessageBox.Show("項目ageの入力が不正です。");
    textBox4.Focus();
}

引用返信 編集キー/
■21405 / inTopicNo.11)  Re[8]: エラー処理  当該testboxにforcus
□投稿者/ みきぬ (7回)-(2008/07/01(Tue) 17:36:38)
http://msdn.microsoft.com/ja-jp/library/system.windows.forms.control.focus.aspx
MSDN曰く、
「Focus は、主にカスタム コントロールの作成者が使用するための下位メソッドです。代わりに、アプリケーション プログラマは、子コントロールには Select メソッドまたは ActiveControl プロパティ、フォームには Activate メソッドを使用する必要があります。」

引用返信 編集キー/
■21406 / inTopicNo.12)  Re[8]: エラー処理  当該testboxにforcus
□投稿者/ t6_kana (11回)-(2008/07/01(Tue) 17:37:39)
>刈歩 菜良さん
>鶏唐揚さん

ありがとうございました。
ですが、デバックすると何もなかったかのように(messageboxはでますがOKをおすと)
次の行にいってしまいますね。

ここで、入力画面に戻したいのですが。「forcus」もあたりませんね。
しかも、そのまま通り過ぎて、DBにnullで反映されてしまいます。
エラー部分で処理をとめたいのですが。
例外処理なのですがはっきりいって、(userid != "")だけだと足りないですよね?
「○」と入力したらDBに「○」と入ってしまいましたwかなり条件が分岐するのではないでしょうか?
総括的な例外処理ってないものですかね?

としてみました。

string userid = textBox1.Text;
if (userid != "")
{
//OK
}
else
{
MessageBox.Show("項目useridの入力が不正です。");
textBox1.Focus();
}

string username = textBox2.Text;
if (username != "")
{
//OK
}
else
{
MessageBox.Show("項目usernameの入力が不正です。");
textBox2.Focus();
}

引用返信 編集キー/
■21411 / inTopicNo.13)  Re[9]: エラー処理  当該testboxにforcus
□投稿者/ 鶏唐揚 (225回)-(2008/07/01(Tue) 17:48:52)
2008/07/01(Tue) 17:56:37 編集(投稿者)

>デバックすると何もなかったかのように(messageboxはでますがOKをおすと)
>次の行にいってしまいますね。
チェックをして不正な入力だったらメッセージを表示してフォーカスを当てたいが
やりかたがわからない、との質問だったので、その部分に関する回答のコードを提示しただけです。
それをそのまま貼り付けただけでは、当然止める処理もメソッドを抜け出す処理も
書かれていないので、メッセージ閉じた後次の行が実行されるのは当然です。
提示された回答コードを元に、望む動作になるよう自分で実装しなければなりません。

>ここで、入力画面に戻したいのですが。
>エラー部分で処理をとめたいのですが。
それは私らの仕事じゃないと思うのですが…そもそも、
どんなソフトをどんな風にコーディング、細かく言えばそのチェック処理がどのようなメソッドの中にあり
そのメソッドはどんな風によばれ…なんて私らが知りうるはずがないので、どうすれば入力画面に戻せるのかなんて回答できません。

>例外処理なのですがはっきりいって、(userid != "")だけだと足りないですよね?
わかりません。useridに、どのような文字を許可しどのような文字を許可しないかなんて
設計者及び製造者しか知りませんので、上記の「戻したい」と同様、私らには回答できません。

引用返信 編集キー/
■21414 / inTopicNo.14)  Re[10]: エラー処理  当該testboxにforcu
□投稿者/ t6_kana (12回)-(2008/07/01(Tue) 17:55:57)
2008/07/01(Tue) 17:58:18 編集(投稿者)
2008/07/01(Tue) 17:58:13 編集(投稿者)

>鶏唐揚さん

再三失礼いたしました。質問の仕方も知らずに。
返信がすばやいので、つい甘えてしまいました。

皆さんありがとうございました。

また困ったときに宜しくお願いします(__)
解決済み
引用返信 編集キー/


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

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -