Как добавить один экземпляр Panel несколько раз в одну FlowLayoutPanel (C# настольное приложение)? - PullRequest
0 голосов
/ 28 марта 2020

У меня есть приложение, в котором я хотел бы добавить один экземпляр Panel несколько раз в один экземпляр FlowLayoutPanel. Так что, если я изменю цвет фона одного экземпляра Panel, он вступит в силу для всех видов.

Ответы [ 2 ]

1 голос
/ 30 марта 2020

Вы можете попробовать следующий код для многократного добавления панели к одной FlowLayoutPanel.

Кроме того, я создаю код, который изменяет цвет спины в FlowLayoutPanel.

Код:

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }


    private Panel CreateNotificationPanel()
    {
        var p = new Panel { BackColor = Color.Red };
        p.Controls.Add(new Button { Text = "Test" });
        return p;
    }
    FlowLayoutPanel flp = new FlowLayoutPanel { Dock = DockStyle.Fill };
    private void Form1_Load(object sender, EventArgs e)
    {
        flp.Controls.Add(CreateNotificationPanel());
        flp.Controls.Add(CreateNotificationPanel());
        flp.Controls.Add(CreateNotificationPanel());
        this.Controls.Add(flp);
    }

    private void button1_Click(object sender, EventArgs e)
    {
        var result = flp.Controls.OfType<Panel>().ToList();
        foreach (var item in result)
        {
            item.BackColor = Color.Yellow;
        }
    }
}

Результат:

enter image description here

1 голос
/ 28 марта 2020

Один экземпляр означает, что только один из этих точных экземпляров существует во всем приложении. У элемента управления может быть только один владелец, но не несколько.

Таким образом, один экземпляр не может существовать с несколькими владельцами, поэтому это невозможно сделать.

Однако на основе на то, что вы описываете, то в этом тоже нет необходимости. Вы не хотите, чтобы один экземпляр требовал, чтобы несколько элементов управления работали одинаково в одно и то же время. Поэтому сохраните все панели в списке или массиве, а затем переберите их и примените новый цвет фона, когда это необходимо. Вот так.

//Create a list on your form level.
private List<Panel> PanelList { get; set; }

//Store a list of Panels.  You can also add them manually.
//Do this after initialisation of your form and all controls are added.
this.PanelList = this.Controls.OfType<Panel>().ToList();

//When required, call this method
private void UpdatePanelBackgroundColor(Color backColor)
{
    foreach (var panel in this.PanelList)
        panel.BackColor = backColor;
}
...