2012-02-26 16 views
0

私はたくさんのテキストボックスを持っていて、そのすべてを記入する必要があります。 C#では、空白または空白を持つフィールドのグループがあるかどうかを確認するにはどうすればよいですか?nullまたは空白の場合に複数のテキストボックスを確認する

私はstring.isNullOrWhiteSpace(string here)に精通していますが、if文を複数記述したくない場合は、コードが不正になります。私はこの

if(string.isNullOrWhiteSpace(string here) 
    || string.isNullOrWhiteSpace(string here) 
    || string.isNullOrWhiteSpace(string here)) 
{ 
    // do something 
} 

のようなものを避けるためにしようとしています

は、不正なコードのこのタイプのためにそこに固定していますか?

答えて

3

フォーム(または関連するコンテナ)のコントロールコレクションを照会し、テキストボックスをフィルタリングし、さらに空であるかどうかを調べることができます(実際にはnull値はありません)。例:

var emptyTextboxes = from tb in this.Controls.OfType<TextBox>() 
        where string.IsNullOrEmpty(tb.Text) 
        select tb; 

if (emptyTextboxes.Any()) 
{ 
    // one or more textboxes are empty 
} 

流暢な構文を使用すると効果的に同じことができます。このコードの場合

bool isIncomplete = this.Controls.OfType<TextBox>().Any(tb => string.IsNullOrEmpty(tb.Text)); 
if (isIncomplete) 
{ 
    // do your work 
} 

は、あなたは、少なくとものVisual Studio 2008/C#3/.NET 3.5で作業する必要があります。プロジェクトにはSystem.Core.dllへの参照が必要です(デフォルトで1つ必要)。クラスファイルに using System.Linq;ディレクティブが必要です。


お客様のコメントに基づいて、linqバージョンの理解や作業に問題がある場合は、別の方法を検討してください。あなたは確かに明示的なループでこれを行うことができます(Linqコードは最終的にループになります)。テキストボックスのすべてが単一の容器中にあるかのように

bool isIncomplete = false; 
foreach (Control control in this.Controls) 
{ 
    if (control is TextBox) 
    { 
      TextBox tb = control as TextBox; 
      if (string.IsNullOrEmpty(tb.Text)) 
      { 
       isIncomplete = true; 
       break; 
      } 
    } 
} 

if (isIncomplete) 
{ 

} 

最後に、このコードが書かれて考えてみましょう。そのコンテナはフォーム、パネルなどである可能性があります。this(フォーム)の代わりにthis.SomePanelのような適切なコンテナを指す必要があります。複数の、おそらく入れ子になっているコンテナで作業している場合は、プログラムで(再帰的な検索、明示的な連結など)見つけるために多くの作業を行うか、配列やその他のコレクションに参照をプリロードするだけです。例

var textboxes = new [] { textbox1, textbox2, textbox3, /* etc */ }; 
// write query against textboxes instead of this.Controls 

のためにあなたが複数のGroupBoxコントロールを持っていると述べました。それぞれのGroupBoxがフォームにロードされ、別のコントロールにネストされていない場合、これが開始される可能性があります。

var emptyTextboxes = from groupBox in this.Controls.OfType<GroupBox>() 
        from tb in groupBox.Controls.OfType<TextBox>() 
        where string.IsNullOrEmpty(tb.Text) 
        select tb; 
+0

あなたは、さらにあなたのコードを説明することができますか? – user962206

+0

理解しづらい部分はありますか?これはLinqを使用しています。Linqは、C#とVisual Studio(2008と2010)の最後の2つのリリースの一部です。 –

+0

コンポーネントをクエリできますか?私はそのためのオンライン文書があることを知らなかった?私はかなり興味があります。コンポーネントのクエリに関するドキュメントをもっと見たいと思っています。 – user962206

1

これは、「不良コード」とみなされます。要件に応じて、どのテキストボックスを入力する必要があるかはさまざまです。さらに、すべてのフィールドが常に必要とされている場合でも、ユーザーが入力しなかったフィールドを知らせるフレンドリなエラーメッセージを表示したい場合もあります。フォームをどのようにレンダリングするかによって、この問題を解決するさまざまな方法があります。あなたがここに指定していないので、そうするための非常に直接的な方法です。

var incompleteTextBoxes = this.Controls.OfType<TextBox>() 
           .Where(tb => string.IsNullOrWhiteSpace(tb.Text)); 

foreach (var textBox in inCompleteTextBoxes) 
{ 
    // give user feedback about which text boxes they have yet to fill out 
} 
0

さらに別の解決策。 これは、コントロールツリー全体を再帰的に移動し、すべてのテキストボックスのnullまたは空のテキストを確認します。 注意点 - あなたには、いくつかの空想のコントロールが標準Winformsのテキストボックスから継承していない場合 - チェックが

を実行されません
bool check(Control root,List<Control> nonFilled) 
{ 
    bool result =true; 
    if (root is TextBox && string.isNullOrEmpty(((TextBox)root).Text) ) 
    { 
    nonFilled.Add(root); 
    return false; 
    } 
    foreach(Control c in root.Controls) 
    { 
    result|=check(c,nonFilled) 
    } 
    return result; 
} 

使用法:

List<Control> emptytextboxes=new List<Control>() 
    bool isOK=check(form, emptytextboxes); 
関連する問題