2016-08-23 17 views
1

私は3列、Item Code, Product Name, and Quantityを持っています。各列には10個のテキストボックスがあります。行がいっぱいになると保存ボタンを有効にし、そうでない場合は無効にします。しかし、私の問題はどうすればそれをすることができるのですか?これは私がこれまで試したものです:If-Else条件の演算子

public void showButtonSave() 
    { 
     if ((!String.IsNullOrEmpty(txtItem.Text) && !String.IsNullOrEmpty(txtProduct.Text) && !String.IsNullOrEmpty(txtQuantity.Text)) 
     || (!String.IsNullOrEmpty(txtItem2.Text) && !String.IsNullOrEmpty(txtProduct2.Text) && !String.IsNullOrEmpty(txtQuantity2.Text)) 
     || (!String.IsNullOrEmpty(txtItem3.Text) && !String.IsNullOrEmpty(txtProduct3.Text) && !String.IsNullOrEmpty(txtQuantity3.Text)) 
     || (!String.IsNullOrEmpty(txtItem4.Text) && !String.IsNullOrEmpty(txtProduct4.Text) && !String.IsNullOrEmpty(txtQuantity4.Text)) 
     || (!String.IsNullOrEmpty(txtItem5.Text) && !String.IsNullOrEmpty(txtProduct5.Text) && !String.IsNullOrEmpty(txtQuantity5.Text)) 
     || (!String.IsNullOrEmpty(txtItem6.Text) && !String.IsNullOrEmpty(txtProduct6.Text) && !String.IsNullOrEmpty(txtQuantity6.Text)) 
     || (!String.IsNullOrEmpty(txtItem7.Text) && !String.IsNullOrEmpty(txtProduct7.Text) && !String.IsNullOrEmpty(txtQuantity7.Text)) 
     || (!String.IsNullOrEmpty(txtItem8.Text) && !String.IsNullOrEmpty(txtProduct8.Text) && !String.IsNullOrEmpty(txtQuantity8.Text)) 
     || (!String.IsNullOrEmpty(txtItem9.Text) && !String.IsNullOrEmpty(txtProduct9.Text) && !String.IsNullOrEmpty(txtQuantity9.Text)) 
     || (!String.IsNullOrEmpty(txtItem10.Text) && !String.IsNullOrEmpty(txtProduct10.Text) && !String.IsNullOrEmpty(txtQuantity10.Text))) 
     { 
      btnAdd.Enabled = true; 
     } 
     else 
     { 
      btnAdd.Enabled = false; 
     } 

追加informaton

行は、ボタンを有効にするために、各列の値を持っている必要があります。例では、ユーザーはすべての列の1行目を完全に埋めるので、Buttonは有効になりますが、ユーザーが2行目の1列のみを入力すると、ボタンは無効になります。ボタンを有効にするには、ユーザーは行のすべての列を完了する必要があります。

+12

そのif文の恐怖を除いて...あなたの質問は何ですか? – Sayse

+2

WPFを使用していますか? –

+2

どのようなアプリケーションがありますか? Web、windows。あなたはある種のグリッドを使用しますか? – lordkain

答えて

3

私は、各行が今あなたが持っているもの[編]

を記入したら、保存ボタンを有効にするには、任意の行がいっぱいになると、それが可能になることである(つまり、最初の行が満たされている第2、または第3など)。

あなたが行のすべてが満たされるようにしたい場合は、あなたの代わりに「または」どこでも書き込み「と」する必要があります。

if ((!String.IsNullOrEmpty(txtItem.Text) && !String.IsNullOrEmpty(txtProduct.Text) && !String.IsNullOrEmpty(txtQuantity.Text)) 
    && (!String.IsNullOrEmpty(txtItem2.Text) && !String.IsNullOrEmpty(txtProduct2.Text) && !String.IsNullOrEmpty(txtQuantity2.Text)) 
    && (!String.IsNullOrEmpty(txtItem3.Text) && !String.IsNullOrEmpty(txtProduct3.Text) && !String.IsNullOrEmpty(txtQuantity3.Text)) 
     ... 

あなたがでた場合、それを有効にする可能性が高いです少なくとも最初の行が充填されており、どちらか完全に満たされるか、または完全に空されている行のその後:

if ((!String.IsNullOrEmpty(txtItem.Text) && !String.IsNullOrEmpty(txtProduct.Text) && !String.IsNullOrEmpty(txtQuantity.Text)) 
    && ((!String.IsNullOrEmpty(txtItem2.Text) && !String.IsNullOrEmpty(txtProduct2.Text) && !String.IsNullOrEmpty(txtQuantity2.Text)) 
    || (String.IsNullOrEmpty(txtItem2.Text) && String.IsNullOrEmpty(txtProduct2.Text) && String.IsNullOrEmpty(txtQuantity2.Text))) 
    && ... 

何人かの人がコメントしているようしかし、あなたのコードはかなり読めなくなり始めています。その後、私はさらに行くと、適切なモデル/ビューのアプローチを提案することができ

btnSave.Enabled = IsCompletelyFilled(txtItem, txtProduct, txtQuantity) 
    && IsValidFilledOrEmpty(txtItem2, txtProduct2, txtQuantity2) 
    && IsValidFilledOrEmpty(txtItem3, txtProduct3, txtQuantity3) 
    && IsValidFilledOrEmpty(txtItem4, txtProduct4, txtQuantity4) 
    && IsValidFilledOrEmpty(txtItem5, txtProduct5, txtQuantity5) 
    ... ; 

を書く

private bool IsCompletelyEmpty(TextBox item, TextBox product, TextBox quantity) 
{ 
    // To do: check that quantity is numeric, positive, item code is valid, etc. 
    return String.IsNullOrEmpty(item.Text) 
    && String.IsNullOrEmpty(product.Text) 
    && String.IsNullOrEmpty(quantity.Text); 
} 

private bool IsCompletelyFilled(TextBox item, TextBox product, TextBox quantity) 
{ 
    return !String.IsNullOrEmpty(item.Text) 
    && !String.IsNullOrEmpty(product.Text) 
    && !String.IsNullOrEmpty(quantity.Text); 
} 

private bool IsValidFilledOrEmpty(TextBox item, TextBox product, TextBox quantity) 
{ 
    return IsCompletelyFilled(item, product, quantity) 
    || IsCompletelyEmpty(item, product, quantity) 
} 

そして、私は思う:最も基本的な改善は、単一の行をチェックし、いくつかの関数を作成することですそれはCode Reviewに適しています。

+0

ありがとうございました@CompuChip –

2

あなたが満たされるすべての行をチェックし、だけにして、ボタンを有効にする場合さて、あなたはすべての値をチェックする拡張メソッドを作成することができます

public static bool AllValuesNotNull(params string[] @strings) 
{ 
    return [email protected](string.IsNullOrEmpty); 
} 

をし、それを使用します。

btnAdd.Enabled = AllValuesNotNull(txtItem.Text, txtItem.Text2, txtItem.Text4 ... etc) 

PS のtextBoxesがnullまたは空の場合は、行全体が塗りつぶされず、のすべての行がこのシナリオで無効にする必要があります。行を無効にする必要があります。

1

ここでは少し範囲外になるかもしれませんが、行の入力をグループ化するクラスを導入すると、あなたのコードは本当に利益を得ると思います。これにより、コードをより読みやすく保守しやすくします。各行に追加の入力が必要な場合や、行数を変更したい場合は、

public class RowModel { 

    public RowModel() { 
     Item = new TextBox(); 
     Product = new TextBox(); 
     Quantity = new TextBox(); 
    } 

    public int Index { get; set; } // might be useful to display better error messages 
    public TextBox Item { get; set; } 
    public TextBox Product { get; set; } 
    public TextBox Quantity { get; set; } 

    // here we only check if this single row is valid 
    public bool IsValid() { 
     return !String.IsNullOrWhiteSpace(Item.Text) 
      && !String.IsNullOrWhiteSpace(Product.Text) 
      && !String.IsNullOrWhiteSpace(Quantity.Text); 

     // any additional validation here, e.g. Quantity > 0 
    } 
} 

このようなあなたの行を作成します。

const int numberOfRows = 10; 
IList<RowModel> rows = new List<RowModel>(); 
for (var i = 0; i < numberOfRows; i++) { 
    rows.Add(new RowModel { Index = i }); 
} 

次に、このようにそれらをチェック:すべての

using System.Linq; 
IList<RowModel> rows; 
var allValid = rows.All(r => r.IsValid()); 
btnSave.Enabled = allValid; 
0

まず、あなたは3つの列と10行を持っている場合は、それが優れていますこのために作成されたコンポーネントを使用します。

だから、最初のアップグレードは、その後、あなたがforeachループで各セルを介して実行することができますDataGridView

を使用すると、彼らは空ではありませんチェック、あるいは一度にそれを行うためにLINQを使用することです。

それはそれを解決した問題です。あなたがDataGridViewのを学ぶために時間がかかるしたくない場合は垂直バーは、OR演算子であり、&&がANDので

しかし、あなただけ&&||を置き換えることができます。だから、すべての細胞が満たされていることを確認したい。