1

小さな問題がありますが、最初にいくつかのコンテキストがあります

正しい答えがクリックされ、他の3つが赤くなると、ボタンの背景色がYellowGreenに変わるようになりましたが、新しい問題は、ユーザーがクリックした答えが間違っている場合にそれを行う方法がわからないことです、3つの間違った答えが赤くなり、正しい答えが緑色で強調表示されます(ユーザーがクリックしたボタンの周りに明るい境界線が表示され、選択された答えであることを通知します).

元の問題を機能させるために、次のことを行いました。

if (btnA.Tag.ToString() == "0")
        {
            btnA.BackColor = Color.YellowGreen;
            btnB.BackColor = Color.Red;
            btnC.BackColor = Color.Red;
            btnD.BackColor = Color.Red;
        }

数字 0 ~ 4 に対して上記の 4 回を実行しました (配列内の 4 つの可能な回答。フォームの A、B、C、または D.

私のコードは次のようになりました:

private void button4_Click(object sender, EventArgs e)
    {

        //Disables the buttons upon clicking 
        btnA.Font = new Font(btnA.Font.Name, btnA.Font.Size, FontStyle.Bold);
        btnA.FlatAppearance.BorderColor = Color.Cyan;
        btnA.FlatAppearance.BorderSize = 3;
        btnA.Enabled = false;
        btnB.Enabled = false;
        btnC.Enabled = false;
        btnD.Enabled = false;

        if (btnA.Tag.ToString() == "0")
        {
            btnA.BackColor = Color.YellowGreen;
            btnB.BackColor = Color.Red;
            btnC.BackColor = Color.Red;
            btnD.BackColor = Color.Red;
        }

        if (btnA.Tag.ToString() == "0")
        {
            iCorrect++;
            if (debugMode)
            {
                Debug.WriteLine("Correct: " + iCorrect.ToString());
            }
        }
    }

    private void button5_Click(object sender, EventArgs e)
    {
        //
        btnB.Font = new Font(btnB.Font.Name, btnB.Font.Size, FontStyle.Bold);
        btnB.FlatAppearance.BorderColor = Color.Cyan;
        btnB.FlatAppearance.BorderSize = 3;
        btnA.Enabled = false;
        btnB.Enabled = false;
        btnC.Enabled = false;
        btnD.Enabled = false;


        if (btnA.Tag.ToString() == "1")
        {
            btnA.BackColor = Color.Red;
            btnB.BackColor = Color.YellowGreen;
            btnC.BackColor = Color.Red;
            btnD.BackColor = Color.Red;
        }

        if (btnA.Tag.ToString() == "1")
        {
            iCorrect++;
            if (debugMode)
            {
                Debug.WriteLine("Correct: " + iCorrect.ToString());
            }
        }
    }

    private void button6_Click(object sender, EventArgs e)
    {
        //
        btnC.Font = new Font(btnC.Font.Name, btnC.Font.Size, FontStyle.Bold);
        btnC.FlatAppearance.BorderColor = Color.Cyan;
        btnC.FlatAppearance.BorderSize = 3;
        btnA.Enabled = false;
        btnB.Enabled = false;
        btnC.Enabled = false;
        btnD.Enabled = false;

        if (btnA.Tag.ToString() == "2")
        {
            btnA.BackColor = Color.Red;
            btnB.BackColor = Color.Red;
            btnC.BackColor = Color.YellowGreen;
            btnD.BackColor = Color.Red;
        }

        if (btnA.Tag.ToString() == "2")
        {
            iCorrect++;
            if (debugMode)
            {
                Debug.WriteLine("Correct: " + iCorrect.ToString());
            }
        }
    }

    private void button7_Click(object sender, EventArgs e)
    {
        //
        btnD.Font = new Font(btnD.Font.Name, btnD.Font.Size, FontStyle.Bold);
        btnD.FlatAppearance.BorderColor = Color.Cyan;
        btnD.FlatAppearance.BorderSize = 3;
        btnA.Enabled = false;
        btnB.Enabled = false;
        btnC.Enabled = false;
        btnD.Enabled = false;

        if (btnA.Tag.ToString() == "3")
        {
            btnA.BackColor = Color.Red;
            btnB.BackColor = Color.Red;
            btnC.BackColor = Color.Red;
            btnD.BackColor = Color.YellowGreen;
        }

        if (btnA.Tag.ToString() == "3")
        {
            iCorrect++;
            if (debugMode)
            {
                Debug.WriteLine("Correct: " + iCorrect.ToString());
            }
        }
    }
}
}

いくつかの異なることを試しましたが、基本的にやりたいことではない奇妙なことが起こり続け、これを達成するためにどのような構文やコードを使用する必要があるのか​​ わかりません。

4

1 に答える 1

2

ボタンを false に設定する場合は、別の小さなメソッドを作成し、ボタンを有効または無効にする場所でこれを呼び出すことができます。コードの例を次に示します。

foreach( var control in this.Controls.OfType<Button>() )
{
   control.enabled = false;
} 

これにより、これを使用する方法についてのアイデアが得られるはずです。また、コードを強調表示して右クリックし、[リファクタリング] -> [メソッドの抽出] をクリックすると、同様に使用できるメソッド テンプレートが表示されます。

特定のタイプのコントロールを介してより長いバージョンのループを実行したい場合は、次のこともできます..これに従って、作業したいコンポーネントタイプに基づいて条件を追加できるはずです..遊んだり、学んだりするのに良いもの

If you have TextBoxesクリアしたい

YourFormName.Controls.OfType<TextBox>().ToList().ForEach(textBox => textBox.Clear());


private void ClearTextBoxes(Control control)
{
    foreach(Control childControl in control.Controls)
    {
         TextBox textbox = childControl as TextBox;
         if(textbox != null)
            textbox.Text = string.Empty;
         else if(childControl.Controls.Count > 0)
             ClearTextBoxes(childControl);//Recursive call here
    }
}

Check the Button / Sender Nameまたは、forloop の内部にいる場合は、たとえば caae ステートメントの text.Name を確認してから、switch ステートメントで有効または無効に設定できます。foreach ループ内で以下を確認していることを確認してください

switch (((Button)sender).Name)
{
  case " btnA":
    {
     //sent enabled or disabled  
     break;
    }
case " btnB":
    {
       //sent enabled or disabled  
       break;
    }
//etc......
}
于 2013-03-12T18:53:31.487 に答える