C# выделение контрола в Panel

216
10 января 2018, 15:33

Пример

using System; 
using System.Windows.Forms; 
 
namespace WindowsFormsApp1 
{ 
  public partial class Form1 : Form 
  { 
    public Control control; 
    public Form1() 
    { 
      InitializeComponent(); 
    } 
 
    private void Form1_Load(object sender, EventArgs e) { 
      main_panel.Controls.Add(new SecondPanel(control, 300, 100)); 
      main_panel.Controls.Add(new SecondPanel(control, 300, 200)); 
      main_panel.Controls.Add(new SecondPanel(control, 300, 300)); 
    } 
  } 
}

using System; 
using System.Drawing; 
using System.Windows.Forms; 
 
namespace WindowsFormsApp1 
{ 
  class SecondPanel : Panel 
  { 
    private Control control; 
    public SecondPanel(Control control, int x, int y) { 
      this.Location = new Point(x, y); 
      this.control = control; 
      this.Click += new EventHandler(click); 
      this.BackColor = Color.Blue; 
      this.Size = new Size(50, 50); 
    } 
 
    private void click(object sender, EventArgs e)  { 
      this.BackColor = Color.Red; 
      if(control != null) { 
          control.BackColor = Color.Blue; 
          control = this; 
      } 
    } 
  } 
}

В результате если кликать все закрашивается красным а мне нужно чтобы предыдущая панель обратно ставала синей

Answer 1

Вам нужен отдельный объект со ссылкой на последнюю кликнутую панель.

namespace WindowsFormsApp1
{
  class SecondPanelHolder
  {
    SecondPanel panel;
  }
  class SecondPanel : Panel
  {
    public SecondPanelHolder Holder { get; set; }
    public SecondPanel(SecondPanel holder, int x, int y) {
      this.Location = new Point(x, y);
      this.Holder = holder;
      this.Click += new EventHandler(click);
      this.BackColor = Color.Blue;
      this.Size = new Size(50, 50);
    }
    private void click(object sender, EventArgs e)  {
      if (Holder != null) {
        if (Holder.panel != null)
          Holder.panel.BackColor = Color.Blue;
        Holder.panel = this;
      }
      this.BackColor = Color.Red;
    }
  }
}

Дадим этот объект всем панелям.

namespace WindowsFormsApp1
{
  public partial class Form1 : Form
  {
    SecondPanelHolder holder = new SecondPanelHolder();
    public Form1()
    {
      InitializeComponent();
    }
    private void Form1_Load(object sender, EventArgs e) {
      main_panel.Controls.Add(new SecondPanel(holder, 300, 100));
      main_panel.Controls.Add(new SecondPanel(holder, 300, 200));
      main_panel.Controls.Add(new SecondPanel(holder, 300, 300));
    }
  }
}
READ ALSO
Дополнительные ряды в InlineKeyboardButton в Telegram Bot

Дополнительные ряды в InlineKeyboardButton в Telegram Bot

Есть код который создает разметку клавиатуры в два рядаЧто-то такое:

245
Свой пункт в контекстном меню Windows

Свой пункт в контекстном меню Windows

При установке новых программ, при нажатии правой кнопки мыши и выборе в меню создать можно выбрать создаваемый файл этой программой

251
Обновление программы из лаунчера

Обновление программы из лаунчера

У меня есть лаунчер для игры (скачивает саму игру и запускает её с параметрами)Я хочу что-бы при обновлении лаунчер докачивал обновление,...

162
Использование событии в приложении

Использование событии в приложении

Добрый день, прошу совета с грамотным использованием событии в приложенияхУ меня был проект клиент-сервер на сокетах

234