0

我在使用以下代码时遇到了一些困难,当我运行代码时,它通过 for each 没问题,但我的结果不是我想要的,代码的想法是在基于 win-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

4 回答 4

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 扩展字段也是一种优雅的方法

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");
} 
于 2013-04-22T14:53:02.413 回答
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();
    }
} 
于 2013-04-22T14:50:52.287 回答
0

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

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

但这只是客人。列的类型是什么btnchange,在您的数据库中?btnproductionbtnscrap

于 2013-04-22T14:51:13.160 回答
0

您正在循环的事实表明您有不止一行,如果您在特定列的每一行中都没有 true/yes 值,那么您最终将显示一行的按钮,然后将其隐藏在下一行。

例如,这将根据结果的顺序隐藏所有按钮,只有最后一行决定了按钮的状态。

btnscrap | btnproduction | btnchange

   yes         yes           yes 
   yes         no            yes
   no          no            no <-- the only row that matters
于 2013-04-22T15:07:04.770 回答