4

私は8x8ボタンの配列を作成しようとしていますが、これまでのところ機能しています。今、私は問題に遭遇しました。ボタンをクリックしたときにボタンの色(背景色)を変えたいのですが。そして、もう一度クリックすると別の色に変わります。

これはこれまでの私のコードです:

namespace WindowsFormsApplication2
{
    public partial class Form1 : Form
    {
        Button[,] btn = new Button[8,8];

        public Form1()
        {
            InitializeComponent();

            for (int x = 0; x < btn.GetLength(0); x++)
            {
                for (int y = 0; y < btn.GetLength(1); y++)
                {
                    btn[x,y] = new Button();
                    btn[x,y].SetBounds(40 * x, 40 * y, 40, 40);
                    btn[x,y].Click += new EventHandler(this.btnEvent_click);
                    Controls.Add(btn[x, y]);
                    btn[x,y].BackColor = Color.Black;
                }
            }

            /* 
            btn.Click += new EventHandler(this.btnEvent_click);
            btn[x,y].Text = Convert.ToString(x+","+y);
            Controls.Add(btn);
            btn[x,y].Click += new EventHandler(this.btnEvent_click);
            */
        }

        private void form1_load(object sender, EventArgs e)
        {

        }

        void btnEvent_click(object sender, EventArgs e)
        {
           (Control)sender).BackColor = Color.Red;
        }
    }
}

これまでのところ、色を赤に変更することしかできません。また、ifとforのステートメントを複数回試し、色を2回変更しました。

誰か助けてもらえますか?

4

7 に答える 7

5

こんにちは一時的に、以下のソリューションを使用できます:

void btnEvent_click(object sender, EventArgs e)
{
    Control ctrl = ((Control)sender);
    switch (ctrl.BackColor.Name)
    {
        case "Red":
            ctrl.BackColor = Color.Yellow;
            break;
        case "Black":
            ctrl.BackColor = Color.White;
            break;
        case "White":
            ctrl.BackColor = Color.Red;
            break;
        case "Yellow":
            ctrl.BackColor = Color.Purple;
            break;
        default:
            ctrl.BackColor = Color.Red;
            break;
    }
}

より良い解決策があることも知っていますが、その間はこれを使用できます...必要に応じてスイッチステートメントにも色を追加できます

于 2012-12-19T10:34:10.663 に答える
2

次のように、Button から継承し、内部で色の変更を処理する新しいクラスを作成できます。

class TwoColorButton : Button
{
    private int stateCounter = 0;
    private Color[] states = new Color[] { Color.Black, Color.Red };

    public TwoColorButton()
        : base()
    {
        this.BackColor = states[stateCounter];
        this.Click += this.clickHandler;
    }

    protected void clickHandler(object sender, EventArgs e)
    {
        stateCounter = stateCounter == 0 ? 1 : 0;
        this.BackColor = states[stateCounter];
    }
}
于 2012-12-19T10:29:58.907 に答える
1

Color.FromArgb(int) メソッドと Random クラスを使用できます。下記参照:

Random rnd = new Random();

//Alpha set allways 255
Color.FromArgb(255, rnd.Next(255), rnd.Next(255), rnd.Next(255));

//Or Completly random
Color.FromArgb(rnd.Next());
于 2012-12-19T10:21:48.973 に答える
0

似たようなことを試しましたか?

    void btnEvent_click(object sender, EventArgs e)
    { 
       if ((Control)sender).BackColor != Color.Red)
           (Control)sender).BackColor = Color.Red;
       else 
           (Control)sender).BackColor = Color.Green;
    }
于 2012-12-19T10:18:37.373 に答える
0

試してみてください..その作業...

button1 クリック イベント内:

Random randomGen = new Random();
KnownColor[] names = (KnownColor[])Enum.GetValues(typeof(KnownColor));
KnownColor randomColorName = names[randomGen.Next(names.Length)];
Color randomColor = Color.FromKnownColor(randomColorName);
button1.BackColor = randomColor;
于 2012-12-19T10:20:12.823 に答える
0

ボタンクラスを継承するクラスを常に作成し、たとえばクリックされた頻度などのカウンターを追加し、クリックするたびにそれを増やし、そのクリックに応じて色を変更することができます

于 2012-12-19T10:21:02.753 に答える
0

固定された色のセットを「循環」させたい場合は、次のようなことを試すことができます。

void btnEvent_click(object sender, EventArgs e)
{
    var button = (Button)sender;
    switch(button.BackColor)
    {
        case Color.Black: { button.BackColor= Color.Red;} break;
        case Color.Red: { button.BackColor= Color.Blue;} break;
        case Color.Blue: { button.BackColor= Color.Green;} break;
        // and so on ... don't forget the default clause, just in case
        default: { button.BackColor= Color.Black;} break;
    }
}
于 2012-12-19T10:25:20.897 に答える