Foreach循环/数据表

时间:2013-04-22 14:45:20

标签: c# foreach datatable

我在使用以下代码时遇到了一些困难,当我运行代码时,它通过了每个没有问题,但我的结果不是我想要的,代码的想法是在胜利上显示按钮-form基于数据表的结果,但是当代码运行时,表单上没有显示任何按钮,并且应该出现一个按钮,因为有一个“是”值

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++;
        } 

4 个答案:

答案 0 :(得分: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();
    }
} 

答案 1 :(得分:0)

我的猜测是dtresults.Rows[i]["btnscrap"]实际上是一个布尔值 您必须测试布尔值而不是字符串表示。

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

但那只是一位客人。您的数据库中的列btnchangebtnproductionbtnscrap有哪些类型?

答案 2 :(得分: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");
} 

首先,我将使用在foreach循环中声明的DataRow,第二,我将你的字段的内容转换为小写,第三,我将使用属性Visible而不是Show / Hide方法来方便使用三元运算符

也可以使用DataRow扩展Field

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 :(得分:0)

你循环的事实表明你有更多的一行,如果你在特定列的每一行都没有true / yes值,你最终会显示一行的按钮然后隐藏它在下一行。

例如,根据结果的顺序,最终会隐藏所有按钮,只有最后一行指示按钮的状态。

btnscrap | btnproduction | btnchange

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