0

次のコードで問題が発生しています。コードを実行すると、問題なく for each を通過しますが、結果は私が望んでいるものではありません。コードのアイデアは、win-form ベースのボタンを表示することです。データテーブルからの結果についてですが、コードを実行するとフォームにボタンが表示されず、「はい」の値が1つあるため、ボタンが表示されるはずです

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

私の推測で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

このようにコードを変更します

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 を使用します。次に、フィールドの内容を小文字に変換します。次に、Show/Hide メソッドの代わりにプロパティ 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");
} 
于 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

ループしているという事実は、1行以上あることを示しています.特定の列のすべての行にtrue/yesの値がない場合は、1行のボタンを表示してから、次の行。

たとえば、結果の順序に応じてすべてのボタンが非表示になり、最後の行のみがボタンの状態を決定します。

btnscrap | btnproduction | btnchange

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