2013-06-12 125 views
1

好的,我有2個窗體...在f1上是一個flowlayoutPanel和一個打開f2的按鈕。 在F2上有小面板,每個都是不同的顏色。 我想這樣做:當我從f2單擊一個面板時,在f1中的FLP中創建一個具有相同顏色和大小的面板。問題是,當我點擊f2上的第一個面板時,沒有任何反應。 這是我到目前爲止有:將Form2添加到Form1(MainForm)

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(); 
} 
+0

這一行'Form1的F1 =新Form1中();'你創建一個新的form1。如果你想修改你現有的一個,你需要在你的Add_Color_Click方法中將它作爲form2'Form2 f2 = new Form2(this)'的引用傳遞給它。從那裏你將不得不在form1上創建一個公共方法來創建這個pannel –

+0

如果我通過引用的方式,它只會創建一個全新的形式..:/ –

+0

確保你有一個form2中的構造函數來保持對form1的引用作爲窗口2的私有字段 –

回答

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(); 
+0

這實際上是一種更好的解決方案。 –

+0

對不起,沒有看到你的答案,是的,它使它更容易..謝謝:) –

0

你在這裏創建Form1的一個新實例:

Form1 f1 = new Form1(); 

但是你要要在現有面板上添加面板,請使用:

Form f1 = Application.OpenForms['formname']; 
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 
    } 
} 

bassicaly這樣的事情應該做的工作

/E可能有一些拼寫錯誤,但這個想法是有

+0

沒錯這就是我所需要的。 –

+0

然後你可以標記爲答案。但你應該真的看看Servy的答案。根據你的應用程序,它可能值得做他的方式 –

+0

@MarkoBešlić你真的不應該這樣做。在幾乎所有情況下使用這種模式都是不好的做法,因爲這裏的子表單不需要了解它的父類,特別是在您給出的特定示例中。 – Servy