Как изменить цвет фона только одной динамической кнопки при повторном нажатии?

Я создал 9 кнопок динамически, и каждая со своим событием клика.

Когда кнопка нажата, она становится красной. При повторном нажатии кнопки цвет кнопки снова становится светло-серым.

По какой-то причине, когда я нажимаю одну кнопку, все остальные кнопки также становятся красными. Как мне сделать так, чтобы только тот, на который нажали, был красным?

    private void frmToppings_Load(object sender, EventArgs e)
    {
        this.ControlBox = false;
        this.FormBorderStyle = FormBorderStyle.None;
        this.WindowState = FormWindowState.Maximized;
        formXsize = this.Size.Width;
        formYsize = this.Size.Height;
        path = dir + "deli1.jpg";
        Image img = Image.FromFile(path, true);
        this.BackgroundImage = img;
        this.BackgroundImageLayout = ImageLayout.Stretch;
        this.btns[0] = new Point(formXsize / 6 - formXsize / 7, formYsize / 3 - formYsize / 8);
        this.btns[1] = new Point(formXsize / 3 - formXsize / 7, formYsize / 3 - formYsize / 8);
        this.btns[2] = new Point(formXsize / 2 - formXsize / 7, formYsize / 3 - formYsize / 8);
        this.btns[3] = new Point(formXsize / 6 - formXsize / 7, formYsize / 2 - formYsize / 8);
        this.btns[4] = new Point(formXsize / 3 - formXsize / 7, formYsize / 2 - formYsize / 8);
        this.btns[5] = new Point(formXsize / 2 - formXsize / 7, formYsize / 2 - formYsize / 8);
        this.btns[6] = new Point(formXsize / 6 - formXsize / 7, formYsize / 1 - formYsize / 5);
        this.btns[7] = new Point(formXsize / 3 - formXsize / 7, formYsize / 1 - formYsize / 5);
        this.btns[8] = new Point(formXsize / 2 - formXsize / 7, formYsize / 1 - formYsize / 5);
        this.btnSize = new Size(formXsize / 7, formYsize / 7);
        this.txt[0] = new Point(formXsize / 2 + 70, formYsize / 10 - formYsize / 12);
        this.txtSize = new Size(formXsize - 950, formYsize - 40);
        this.Controls.Clear();
        DrawHoagieToppingsForm();
    }

    public void DrawHoagieToppingsForm()
    {
        Button btnMayo = new Button();
        btnMayo.Text = "Mayo";
        btnMayo.Location = btns[0];
        btnMayo.Size = btnSize;
        btnMayo.Click += new EventHandler(btnMayo_Click);
        btnMayo.BackColor = SystemColors.Control;
        Controls.Add(btnMayo);

        Button btnOil = new Button();
        btnOil.Text = "Oil";
        btnOil.Location = btns[1];
        btnOil.Size = btnSize;
        btnOil.Click += new EventHandler(btnOil_Click);
        btnOil.BackColor = SystemColors.Control;
        Controls.Add(btnOil);

        Button btnOnion = new Button();
        btnOnion.Text = "Onion";
        btnOnion.Location = btns[2];
        btnOnion.Size = btnSize;
        btnOnion.Click += new EventHandler(btnOnion_Click);
        btnOnion.BackColor = SystemColors.Control;
        Controls.Add(btnOnion);

        Button btnHotPeppers = new Button();
        btnHotPeppers.Text = "Hot Peppers";
        btnHotPeppers.Location = btns[3];
        btnHotPeppers.Size = btnSize;
        btnHotPeppers.Click += new EventHandler(btnHotPeppers_Click);
        btnHotPeppers.BackColor = SystemColors.Control;
        Controls.Add(btnHotPeppers);

        Button btnSweetPeppers = new Button();
        btnSweetPeppers.Text = "Sweet Peppers";
        btnSweetPeppers.Location = btns[4];
        btnSweetPeppers.Size = btnSize;
        btnSweetPeppers.Click += new EventHandler(btnSweetPeppers_Click);
        btnSweetPeppers.BackColor = SystemColors.Control;
        Controls.Add(btnSweetPeppers);

        Button btnOregano = new Button();
        btnOregano.Text = "Oregano";
        btnOregano.Location = btns[5];
        btnOregano.Size = btnSize;
        btnOregano.Click += new EventHandler(btnOregano_Click);
        btnOregano.BackColor = SystemColors.Control;
        Controls.Add(btnOregano);

        TextBox txtReceipt = new TextBox();
        txtReceipt.Multiline = true;
        txtReceipt.ReadOnly = true;
        txtReceipt.Location = txt[0];
        txtReceipt.Size = txtSize;
        Controls.Add(txtReceipt);

        Button btnBack = new Button();
        btnBack.Text = "Back";
        btnBack.Location = btns[6];
        btnBack.Size = btnSize;
        btnBack.Click += new EventHandler(btnBack_Click);
        Controls.Add(btnBack);

        Button btnCancel = new Button();
        btnCancel.Text = "Cancel";
        btnCancel.Location = btns[7];
        btnCancel.Size = btnSize;
        btnCancel.Click += new EventHandler(btnCancel_Click);
        Controls.Add(btnCancel);

        Button btnAddToOrder = new Button();
        btnAddToOrder.Text = "Add to Order";
        btnAddToOrder.Location = btns[8];
        btnAddToOrder.Size = btnSize;
        btnAddToOrder.Click += new EventHandler(btnAddToOrder_Click);
        Controls.Add(btnAddToOrder);
    }

    private void btnMayo_Click(object sender, EventArgs e)
    {
        this.BackColor = Color.Red;
    }

    private void btnOil_Click(object sender, EventArgs e)
    {
        //this.BackColor = Color.Red;
    }

    private void btnOnion_Click(object sender, EventArgs e)
    {
        //this.BackColor = Color.Red;
    }

    private void btnHotPeppers_Click(object sender, EventArgs e)
    {
        //this.BackColor = Color.Red;
    }

    private void btnSweetPeppers_Click(object sender, EventArgs e)
    {
        //this.BackColor = Color.Red;
    }

    private void btnOregano_Click(object sender, EventArgs e)
    {
        //this.BackColor = Color.Red;
    }

person pyuntae    schedule 05.12.2018    source источник
comment
Ваш код неполный. И woudl установить цвет фона самой формы или окна. Пожалуйста, предоставьте полный пример, чтобы мы могли помочь вам отладить его.   -  person Christopher    schedule 05.12.2018
comment
@Кристофер, я обновил   -  person pyuntae    schedule 05.12.2018
comment
За исключением той части, в которой возникает проблема — кода обработчика событий — вы пропустили. В любом случае я написал ответ.   -  person Christopher    schedule 05.12.2018
comment
@Christopher Есть ли обработчики событий для каждой кнопки? Или я путаюсь?   -  person pyuntae    schedule 05.12.2018
comment
Как я уже сказал, эти обработчики событий устанавливают для цвета фона Form определенное значение. С этой стороны свойств WPF/UWP/зависимости кнопки не наследуют такое изменение. Гораздо меньше объяснить, почему все кнопки имеют цвет.   -  person Christopher    schedule 05.12.2018
comment
Похоже, что метод DrawHoagie вызывается один раз при загрузке формы. Это означает, что в них нет ничего действительно динамичного, и они могут быть элементами управления временем разработки.   -  person Ňɏssa Pøngjǣrdenlarp    schedule 05.12.2018


Ответы (2)


Это может быть сжато до одного обработчика кликов, который вы регистрируете со всеми кнопками. Фишка в том, что кнопка, вызвавшая событие, передается в аргументе «отправитель». Вам просто нужно использовать его, чтобы иметь полный доступ к определенной кнопке:

private void btnCycleColors(object sender, EventArgs e)
{
  //This cast will fail if the event is registered with anything that is not a Button
  //But usually we can ignore that, as this will be quickly noticed
  Button caller = (Button)sender;

  if(caller.BackColor == X)
    caller.BackColor = Y;
}

Используя switch... case с сопоставлением с образцом или, возможно, с массивом, вы даже сможете заставить их правильно циклически перемещаться по списку без лишнего кода.

Конечно, если позже вам нужно будет извлечь цвет, на котором находится кнопка, это звучит как ошибочный дизайн UI/UX. Как правило, значения, необходимые для вычислений/операций, должны храниться в коде. Элементы пользовательского интерфейса являются просто представлениями текущих значений. Таким образом, вам не нужно идти и анализировать свойства кнопок, чтобы получить выбранные пользователем значения.

person Christopher    schedule 05.12.2018

Я нашел ответ, который работает:

public void single_button_Click(object sender, EventArgs e)
{
  Button btn = (Button)sender;
  if (btn.BackColor == Color.Red)
  {
    btn.BackColor = SystemColors.Control;
  }
  else if (btn.BackColor == SystemColors.Control)
  {
    btn.BackColor = Color.Red;
  }
}
person pyuntae    schedule 05.12.2018