2016-08-23 64 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; 
     } 

另外,情報

行必須在每個列的值,使按鈕啓用。例如,用戶完全填充其每一列的第一行,然後按鈕啓用,但是一旦用戶僅輸入第二行的1列,則該按鈕開始禁用。要啓用該按鈕,用戶必須完成該行的每一列。

+12

除了恐怖的,如果陳述......你的問題到底是什麼? – Sayse

+2

你在使用WPF嗎? –

+2

你有什麼樣的應用程序?網站,窗口。你會使用某種網格嗎? – lordkain

回答

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))) 
    && ... 

然而,正如一些人評論,您的代碼開始變得幾乎無法讀取。最基本的改善將是創建檢查單行幾個功能:

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) 
} 

,然後寫

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

我可以走得更遠,並提出適當的模型/視圖的方法,但我認爲這更適合於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爲空或空它會使整行不填充,因爲你想所有行被填充按鈕應該被禁用在這種情況下。

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

首先,當你有三列和10行,最好是使用爲此目的而製造的組件。

所以第一升級將使用DataGridView

然後你就可以通過每個單元有foreach循環運行,並檢查它們是不是空的,甚至使用LINQ做一次吧。

這就解決了問題。

但是,如果您不想花時間學習DataGridView,則可以將||替換爲&&,因爲垂直條是OR運算符,而&&是AND。所以你想檢查所有的單元格是否填滿...