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

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

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

Re[4]: テキストボックスの入力チェック


(過去ログ 80 を表示中)

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

■47460 / inTopicNo.1)  テキストボックスの入力チェック
  
□投稿者/ msnr (31回)-(2010/03/03(Wed) 09:55:45)

分類:[C#] 

こんにちは、Form に配置された textBox1〜3 の入力チェックをしたいと思ってます。
Formには textBox1〜4 の4つが配置されており今後も数個増えていく予定です。

まずtextBox1〜3 の入力チェックをしたいのでテスト的に文字列0 及び null でメッセージ
を出す、プロシージャを作りました。以下となります

        public static void checkTextBox(Control c)
        {
            // c 内コントロールを列挙
            foreach (Control t in c.Controls)
            {
                do
                {
                    if (!(t is TextBoxBase)) { break; } ←ここの書き方も不安です・・・
                    if (t.Name.ToString() == "textBox4") { break; }
                    if (t.Text == null || t.Text.Length == 0)
                        {
                            MessageBox.Show(t.Name);
                            break;
                        }
                } while (true);
            }
        }
        private void button2_Click(object sender, EventArgs e)
        {
            checkTextBox(this);
        }

今後、foreach内でネストが深くなるのを避けたいと思っております。
また、今後textBox1〜3だけではなくなる事も有りますので、どの様に組めば
効率的なのか悩んでいます。
誠に恐縮ですが、アドバイス頂けたら幸いかと思っております。

何卒、宜しくお願い致します。

引用返信 編集キー/
■47469 / inTopicNo.2)  Re[1]: テキストボックスの入力チェック
□投稿者/ 魔界の仮面弁士 (1526回)-(2010/03/03(Wed) 16:31:38)
No47460 (msnr さん) に返信
> 今後、foreach内でネストが深くなるのを避けたいと思っております。

そもそも、毎回、Controls から列挙しようとするのではなく、
ループで操作しやすいよう、事前に Load イベントの時点で
 private List<TextBox> textBoxes;
などに蓄えておく事をおすすめします。

その方が、今後、TextBox の名前が変更された場合にも有利ですし、あるいは
「TextBox1,3,4」と「TextBox2,5,7」を分けて管理したいといった場合でも、
都合が良いと思います。


> foreach (Control t in c.Controls)
t.Controls も含めて、再帰的に探索しなくても大丈夫でしょうか?

今のコードは、指定されたコントロールの直下にある物しか見ていないので、

 Form1
 ├panel1
 │├textBox1
 │├panel2
 ││└textBox2
 │└textBox3
 └textBox4

のような構造の時に『checkTextBox(panel1)』を行うと、
textBox1, textBox3 は得られますが、textBox2 は操作されません。



> foreach (Control t in c.Controls)
> {
>     do
>     {
>         if (!(t is TextBoxBase)) { break; } ←ここの書き方も不安です・・・
>         if (t.Name.ToString() == "textBox4") { break; }
>         if (t.Text == null || t.Text.Length == 0)
>         {
>             MessageBox.Show(t.Name);
>             break;
>         }
>     } while (true);
> }

そのコードだと、3 つの break 条件いずれにもヒットしなかった場合、
無限ループに陥ってしまいますよ。


> ←ここの書き方も不安です・・・
内側のループは不要だと思います。TextBox のみを対象としたいなら、
 foreach (Control t in c.Controls)
 {
  if(!(t is TextBoxBase)) continue;
    :
 }
とすればよいかと。


また、C# 2008 以降であれば if 判定も不要で、
 foreach (TextBoxBase t in c.Controls.OfType<TextBoxBase>())
 {
    :
 }
で済ます事もできます。


> if (t.Text == null || t.Text.Length == 0)
前者の条件は、あまり意味が無いと思います。

TextBox の場合、Text プロパティが null を返すことはなく、
null をセットしても "" として扱われる仕様になっていますので、
この場合には、
   if( string.IsNullOrEmpty(t.Text) )
でどうでしょうか。

あるいは、Control.Text.Length で取得する代わりに、
TextBoxBase.TextLength プロパティを使うという手もあります。

引用返信 編集キー/
■47472 / inTopicNo.3)  Re[2]: テキストボックスの入力チェック
□投稿者/ msnr (32回)-(2010/03/03(Wed) 18:28:39)
No47469 (魔界の仮面弁士 さん) に返信
> ■No47460 (msnr さん) に返信
>>今後、foreach内でネストが深くなるのを避けたいと思っております。
>
> そもそも、毎回、Controls から列挙しようとするのではなく、
> ループで操作しやすいよう、事前に Load イベントの時点で
>  private List<TextBox> textBoxes;
> などに蓄えておく事をおすすめします。
>
> その方が、今後、TextBox の名前が変更された場合にも有利ですし、あるいは
> 「TextBox1,3,4」と「TextBox2,5,7」を分けて管理したいといった場合でも、
> 都合が良いと思います。

魔界の仮面弁士 さん ありがとうございます。
非常に丁寧な御回答で助かっております。

> ループで操作しやすいよう、事前に Load イベントの時点で
>  private List<TextBox> textBoxes;
> などに蓄えておく事をおすすめします。

ここが、私には理解できなくて只今、検索中なのですが
なかなか分かりません・・・
もし宜しければ、もう少しご教授頂けないでしょうか?

差し出がましいですが、お時間の許す限りお付き合いください。
宜しくお願い致します。
引用返信 編集キー/
■47473 / inTopicNo.4)  Re[3]: テキストボックスの入力チェック
□投稿者/ なちゃ (408回)-(2010/03/03(Wed) 19:09:45)
個人的には、こういう時はIExtenderProviderだったかを使って、
各テキストボックスに追加したプロパティでチェック対象か判断するようにします。
対象外のテキストボックスが出来たりしても対処出来ますし。
コントロールの列挙などもある意味自動でやってしまえます。

引用返信 編集キー/
■47474 / inTopicNo.5)  Re[3]: テキストボックスの入力チェック
□投稿者/ Jitta on the way (573回)-(2010/03/03(Wed) 19:11:01)
No47472 (msnr さん) に返信

>>ループで操作しやすいよう、事前に Load イベントの時点で
>> private List<TextBox> textBoxes;
>>などに蓄えておく事をおすすめします。
>
> ここが、私には理解できなくて只今、検索中なのですが
> なかなか分かりません・・・
> もし宜しければ、もう少しご教授頂けないでしょうか?

“なにを”教授して欲しいのでしょうか?フォームを設計した時点で入力エリアは決まっています。それを列挙することの、何が解らないのでしょうか?



>
> 差し出がましいですが、お時間の許す限りお付き合いください。
「差し出がましい」?
「あつかましい」ではなく?
引用返信 編集キー/
■47479 / inTopicNo.6)  Re[4]: テキストボックスの入力チェック
□投稿者/ msnr (33回)-(2010/03/03(Wed) 20:18:17)
No47474 (Jitta on the way さん) に返信
> ■No47472 (msnr さん) に返信
>
> “なにを”教授して欲しいのでしょうか?フォームを設計した時点で入力エリアは決まっています。それを列挙することの、何が解らないのでしょうか?
>
まったく、その通りです。
その列挙の方法から分からず、四苦八苦していたもので・・・
『“なにを”教授して欲しいのでしょうか?』と言われれば
まったくその通りだと思います。
>
>>
>>差し出がましいですが、お時間の許す限りお付き合いください。
> 「差し出がましい」?
> 「あつかましい」ではなく?

失礼しました、日本語まで間違えてしまいました。
申し訳有りません。
引用返信 編集キー/
■47483 / inTopicNo.7)  Re[5]: テキストボックスの入力チェック
□投稿者/ msnr (34回)-(2010/03/03(Wed) 21:56:05)
今一度落ち着いて考え、実現したい事を整理し頑張ってみます。

御迷惑を掛けてしまうと思いますが、自分なりのコードにして書き込みます。
もう少しこのままにして置いてください。

宜しくお願い致します!!
引用返信 編集キー/
■47566 / inTopicNo.8)  Re[6]: テキストボックスの入力チェック
□投稿者/ msnr (35回)-(2010/03/06(Sat) 23:41:25)
皆さま、いつもお世話になっております。

この度は、皆さまに色々なアドバイスをもらいました結果
とりあえず、実現したい事は出来ました。

>“なにを”教授して欲しいのでしょうか?フォームを設計した時点で入力エリアは
>決まっています。それを列挙することの、何が解らないのでしょうか?
Jitta on the way 様のおっしゃる通り、フォームの設計を見直し
コントロールにパネルを1つ配置しチェックしたいコントロールを
中に入れ、ループを回す方法に変えました。
現在の私の力ではこの方法が1番安易で効率的だと考えた結果です。
導いて頂き、ありがとうございます。

また前述とは違い、戻り値を空白のテキストボックス数に変更しました。
コードは以下となります。

大変厚かましいですが、何かアドバイス頂けると非常に嬉しいです。。。
自信がないので・・・
お時間の許す限り、お付き合いください。
宜しくお願いいたします。 m(__)m

        public static int checkTextBox(Control c)
        {
            int cnt = 0;
            // c 内コントロールを列挙
            foreach (Control t in c.Controls)
            {
                if (!(t is TextBoxBase)) continue;
                if (string.IsNullOrEmpty(t.Text))
                {
                    cnt++;
                }
            }
            return cnt;
        }
        private void button2_Click(object sender, EventArgs e)
        {
            int i = checkTextBox(this.panel1);
            MessageBox.Show(i.ToString());
        }

引用返信 編集キー/
■47567 / inTopicNo.9)  Re[7]: テキストボックスの入力チェック
□投稿者/ msnr (36回)-(2010/03/06(Sat) 23:43:51)
> Jitta on the way 様のおっしゃる通り、フォームの設計を見直し
> コントロールにパネルを1つ配置しチェックしたいコントロールを
> 中に入れ、ループを回す方法に変えました。

すいません、間違えました。

誤)コントロールにパネルを1つ配置しチェックしたいコントロールを
正)フォームにパネルを1つ配置しチェックしたいコントロールを

です。
引用返信 編集キー/
■47591 / inTopicNo.10)  Re[4]: テキストボックスの入力チェック
□投稿者/ msnr (37回)-(2010/03/09(Tue) 00:05:02)
皆さま、ありがとうございます。

もっと勉強してから出直します!!

今後とも宜しくお願いいたします
解決済み
引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -