将面板从Form2添加到form1(MainForm)

本文关键字:form1 MainForm 添加 Form2 | 更新日期: 2023-09-27 18:18:07

好的,我有两个表单…f1上是一个flowlayoutPanel和一个打开f2的按钮。在f2上有小面板,每个都是不同的颜色。我想这样做:当我在f2中点击一个面板时,一个面板将在f1的FLP中创建,具有相同的颜色和大小。问题是,当我点击第一个面板上的f2什么都没有发生。这是我目前所看到的:

f1

private void Add_Color_Click(object sender, EventArgs e)
{
    Form2 f2 = new Form2();
    f2.Show();
}

f2
Form1 f1 = new Form1();        
private void panel1_Click(object sender, EventArgs e)
{
    Panel pnl = new Panel();
    pnl.BackColor = panel1.BackColor;
    pnl.Size = panel1.Size;
    f1.BackColor = panel1.BackColor;
    f1.FLPMain.Controls.Add(pnl);
    this.Close();
}   

将面板从Form2添加到form1(MainForm)

所以你的子表单不需要知道你的第一个表单的事情。听起来你在创建一个通用的颜色选择工具。您应该能够在您的应用程序中需要选择颜色的其他地方使用相同的表单,例如:

作为一般规则,如果子窗体不"知道"它的父窗体是最好的,它使它们解耦,使得单独编写每个类更容易,而不必强迫开发人员了解项目中的其他类型。这其实并不难。

所以,不是让Form2去给Form1添加面板,它可以在选择颜色和大小时通知Form1。这是通过一个事件完成的:

public class Form2 : Form
{
    //define the event
    public event Action<Color, Size> ColorChosen;
    private void panel1_Click(object sender, EventArgs e)
    {
        //raise the event
        var panel = (Panel)sender;
        ColorChosen(panel.BackColor, panel.Size);
        Close();
    }
}

(大小注意;通过使用sender,同样的事件处理程序可以添加到所有你想要点击的面板,而不是有大量的事件处理程序,做几乎相同的事情。

然后在Form1中,我们只需为这个自定义事件分配一个事件处理程序,我们创建并添加一个新的面板到表单:

Form2 child = new Form2();
child.ColorChosen += (color, size) =>
{
    Panel panel = new Panel();
    panel.BackColor = color;
    panel.Size = size;
    Controls.Add(panel);
};
child.Show();

您在这里创建了一个Form1的新实例:

Form1 f1 = new Form1();

但是你想在现有面板上添加你的面板,所以使用:

Form f1 = Application.OpenForms['formname']; 

就这样做

private void Add_Color_Click(object sender, EventArgs e)
{
    Form2 f2 = new Form2(this);
    f2.Show();
}
class Form2
{
    private Form1 _frm;
    public Form2(Form1 frm)
    {
        //initialize + other code if required
        _frm = frm;
    }
    private void Panel_Click(object sender, EventArgs e)
    {
        _frm.CreatePanel(/*param you need*/);  //name it what ever you want
    }
}

基本上类似的东西应该做这个工作

/e可能会有一些错别字但重点是