1

好的,我有 2 个表单...在 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();
}   
4

3 回答 3

1

因此,您的子表单不需要了解您的第一个表单。听起来您正在创建类似通用颜色选择器工具的东西。例如,您应该能够在应用程序的其他地方使用相同的表单,您也需要选择颜色。

作为一般规则,最好是子窗体不“知道”它的父窗体,它使它们保持分离,使单独编写每个类变得更容易,而不会迫使开发人员对项目中的其他类型非常了解。其实也不是特别难。

因此,与其让 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();
于 2013-06-12T14:46:08.280 回答
0

您正在此处创建 Form1 的新实例:

Form1 f1 = new Form1();

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

Form f1 = Application.OpenForms['formname']; 
于 2013-06-12T13:57:50.300 回答
0

就这样做

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 可能有一些错别字,但想法就在那里

于 2013-06-12T14:34:29.760 回答