2013-04-22 122 views
0

我對以下代碼有些困難,當我運行代碼時,它通過了每個沒有問題,但我的結果不是我想要的,代碼的想法是基於從數據表結果的雙贏的形式,但是當代碼運行沒有任何按鍵都顯示在表格上,和一個應該表現爲有一個「是」價值Foreach循環/數據表

private void formconfig1() 
    { 
     dtresults = SQLMethods.GetUserNames(); 

     string scrap; 
     string production; 
     string change; 

     int i = 0; 

     foreach (DataRow row in dtresults.Rows) 
     { 

      scrap = dtresults.Rows[i]["btnscrap"].ToString(); 
      if (scrap.Equals("yes")) 
      { 
       btnSREntry.Show(); 
      } 
      else 
      { 
       btnSREntry.Hide(); 
      } 

      production = dtresults.Rows[i]["btnproduction"].ToString(); 
      if (production.Equals("yes")) 
      { 
       btnProductionEntry.Show(); 
      } 
      else 
      { 
       btnProductionEntry.Hide(); 
      } 

      change = dtresults.Rows[i]["btnchange"].ToString(); 
      if (change.Equals("yes")) 
      { 
       btnSRChange.Show(); 
      } 
      else 
      { 
       btnSRChange.Hide(); 
      } 
      i++; 
     } 
+3

在foreach循環中手動遞增循環計數器會引發警鐘。當你使用迭代器時,你不需要維護一個循環索引。使用'row'而不是'dtresults.Rows [i]'並且完全擺脫'i'。 – 2013-04-22 14:47:31

+1

爲什麼當你使用'DataTable.Rows [indexer]'屬性時,爲什麼使用'foreach'給當前行? – 2013-04-22 14:47:56

+0

另外,你有沒有嘗試用調試器遍歷代碼並查看返回的行? – Mels 2013-04-22 14:48:32

回答

0

假設上顯示的按鈕進行數據列是布爾(如果他們不是他們可能應該是因爲這就是你如何使用他們),你的代碼應該看起來像這樣。

bool scrap; 
bool production; 
bool change; 

foreach (DataRow row in dtresults.Rows) 
{ 
    scrap = (bool)row["btnscrap"]; 
    if (scrap) 
    { 
     btnSREntry.Show(); 
    } 
    else 
    { 
     btnSREntry.Hide(); 
    } 

    production = (bool)row["btnproduction"]; 
    if (production) 
    { 
     btnProductionEntry.Show(); 
    } 
    else 
    { 
     btnProductionEntry.Hide(); 
    } 

    change = (bool)row["btnchange"]; 
    if (change) 
    { 
     btnSRChange.Show(); 
    } 
    else 
    { 
     btnSRChange.Hide(); 
    } 
} 
+0

我試過你的方法,但我得到以下錯誤「Invalid cast exception」 – 2013-04-22 15:13:59

+0

@CHRISTOPHERMCCONVILLE什麼是你的列的數據類型?我在我的回答中提到他們可能*應該*是布爾(或位),因爲這就是你使用它們的方式。 – 2013-04-22 15:15:19

0

我的猜測是dtresults.Rows[i]["btnscrap"]實際上是一個布爾值。
您必須測試布爾值而不是字符串表示。

bool isScrap = (bool)dtresults.Rows[i]["btnscrap"]; 
if (isScrap) 
{ 
    btnSREntry.Show(); 
} 
else 
{ 
    btnSREntry.Hide(); 
} 

但這只是一個客人。你的數據庫中的列btnchangebtnproductionbtnscrap有什麼類型?

0

我會改變你的代碼以這種方式

foreach (DataRow row in dtresults.Rows) 
{ 
    btnSREntry.Visible = (row["btnscrap"].ToString().ToLower() == "yes"); 
    btnProductionEntry.Visible = (row["btnproduction"].ToString().ToLower() == "yes"); 
    btnSRChange.Visible = (row["btnchange"].ToString().ToLower() == "yes"); 
} 

首先,我使用DataRow的foreach循環宣佈,第二,我想你的字段的內容轉換爲小寫和第三我會使用Visible屬性,而不是顯示/隱藏方法,以方便使用三元運算

的也是一個優雅的方法可能是與DataRow的擴展字段

foreach (DataRow row in dtresults.Rows) 
{ 
    btnSREntry.Visible = (row.Field<string>("btnscrap").ToLower() == "yes"); 
    btnProductionEntry.Visible = (row.Field<string>("btnproduction").ToLower() == "yes"); 
    btnSRChange.Visible = (row.Field<string>("btnchange").ToLower() == "yes"); 
} 

當然這假定你的數據庫字段是文本類型的。
相反,如果他們是布爾(位),那麼你可以簡化代碼很多

foreach (DataRow row in dtresults.Rows) 
{ 
    btnSREntry.Visible = row.Field<bool>("btnscrap"); 
    btnProductionEntry.Visible = row.Field<bool>("btnproduction"); 
    btnSRChange.Visible = row.Field<bool>("btnchange"); 
} 
+3

如果你刪除'? true:false',結果是一樣的。這裏不需要條件運算符。 – 2013-04-22 15:00:50

+0

@HansKesting現在修好了 – Steve 2013-04-22 15:03:43

+0

@HansKesting你對這個問題的評論也是真的有意思。最後一行的值總是決定按鈕的可見性,除非在上面的問題中沒有解釋某些邏輯。 – Steve 2013-04-22 15:06:36

0

,你是通過循環的事實表明,你有更多的thean一行,如果你沒有一個真正的/對於某個特定列,每一行的值都是最後一行,然後顯示一行的按鈕,然後將其隱藏在下一行。

例如,這將最終隱藏所有按鈕,具體取決於結果的順序,只有最後一行指示按鈕的狀態。

btnscrap | btnproduction | btnchange 

    yes   yes   yes 
    yes   no   yes 
    no   no   no <-- the only row that matters