Foreach循环/数据表
我对以下代码有些困难,当我运行代码时,它通过了每个没有问题,但我的结果不是我想要的,代码的想法是基于从数据表结果的双赢的形式,但是当代码运行没有任何按键都显示在表格上,和一个应该表现为有一个“是”价值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++;
}
假设上显示的按钮进行数据列是布尔(如果他们不是他们可能应该是因为这就是你如何使用他们),你的代码应该看起来像这样。
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();
}
}
我试过你的方法,但我得到以下错误“Invalid cast exception” – 2013-04-22 15:13:59
@CHRISTOPHERMCCONVILLE什么是你的列的数据类型?我在我的回答中提到他们可能*应该*是布尔(或位),因为这就是你使用它们的方式。 – 2013-04-22 15:15:19
我的猜测是dtresults.Rows[i]["btnscrap"]
实际上是一个布尔值。
您必须测试布尔值而不是字符串表示。
bool isScrap = (bool)dtresults.Rows[i]["btnscrap"];
if (isScrap)
{
btnSREntry.Show();
}
else
{
btnSREntry.Hide();
}
但这只是一个客人。你的数据库中的列btnchange
,btnproduction
和btnscrap
有什么类型?
我会改变你的代码以这种方式
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");
}
,你是通过循环的事实表明,你有更多的thean一行,如果你没有一个真正的/对于某个特定列,每一行的值都是最后一行,然后显示一行的按钮,然后将其隐藏在下一行。
例如,这将最终隐藏所有按钮,具体取决于结果的顺序,只有最后一行指示按钮的状态。
btnscrap | btnproduction | btnchange
yes yes yes
yes no yes
no no no <-- the only row that matters
在foreach循环中手动递增循环计数器会引发警钟。当你使用迭代器时,你不需要维护一个循环索引。使用'row'而不是'dtresults.Rows [i]'并且完全摆脱'i'。 – 2013-04-22 14:47:31
为什么当你使用'DataTable.Rows [indexer]'属性时,为什么使用'foreach'给当前行? – 2013-04-22 14:47:56
另外,你有没有尝试用调试器遍历代码并查看返回的行? – Mels 2013-04-22 14:48:32