2013-04-22 78 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