2015-11-19 81 views
-2

我正在爲c#編程的東西在學校。我有2個窗體,當我關閉子窗體時,我想在父窗體上繪製一些東西,而我不想使用任何按鈕,之後我不得不點擊它們。這是我嘗試過的,但不起作用。當一個人正在關閉/關閉時從另一個窗體繪製另一個窗體

private void button1_Click(object sender, EventArgs e) 
    {  
     this.Close(); //Closes Form2(Child) 
    } 
private void Form2_FormClosing(object sender, FormClosingEventArgs e) 
    { 
     Form1 f1 = new Form1(); 
     Graphics g; 
     g = f1.CreateGraphics(); 
     g.DrawRectangle(Pens.Black, 100, 100, 50, 50); 
    } 

我也嘗試過使用FormClosed事件。

+0

我刪除了我的帖子。那麼我想選擇第一個窗體(父窗體)來創建一個圖形,第一個窗體除了打開第二個窗體外沒有其他任何操作。 – Warpunker

回答

0

在你的父窗體,當你初始化子窗體,設置它的Owner屬性this

Graphics g; 
g = ((Form1)this.Owner).CreateGraphics(); 
g.DrawRectangle(Pens.Black, 100, 100, 50, 50); 

var form2 = new Form2(); 
form2.Owner = this; 

然後從孩子的形式,你可以通過做這個訪問父

+0

謝謝,它現在正在工作:) – Warpunker

+0

很高興提供幫助。只是爲了確保你明白爲什麼它能夠工作 - 在你的代碼中,你正在創建一個新的Form1('var f1 = new Form1()'),它與你用來打開Form2的窗體完全不同'。爲了處理原始表單上的數據,您需要訪問該實例,而不是另一個實例。 –

+0

對,對不起,我對編程有點新,但是我明白我做錯了什麼。 – Warpunker

0

考慮到您的Form1是父窗體,而Form2是您的子窗體,也就是Form2最初是從Form1調用的。然後,您應該首先將您的Form1副本發送到您正在創建的新Form2中,並將其存儲在私有字段中,並在關閉時使用它來繪製它。類似的東西來:

private Form1 _parent; 
public Form2(Form1 parent) 
{ 
    _parent = parent; 
} 
private void button1_Click(object sender, EventArgs e) 
{  
    this.Close(); //Closes Form2(Child) 
} 
private void Form2_FormClosing(object sender, FormClosingEventArgs e) 
{ 
    Graphics g = _parent.CreateGraphics(); 
    g.DrawRectangle(Pens.Black, 100, 100, 50, 50); 
} 

而且對父母,你應該有類似的東西:

private void button1_Click(object sender, FormClosingEventArgs e) 
{ 
    Form2 form2 = new Form2(this); 
    form2.Show(); 
} 

與您發佈的代碼的問題是,你正在創建一個新的Form1上,這是不一樣的對象/實例作爲您在打開新實例Form2時已經具有的原始Form1。

+0

雖然這會起作用,但您可以使用表單的「所有者」屬性。 –

+0

嚴格來說,「所有者」屬性爲Form2添加了比此問題更多的行爲。這就是我決定不使用它的原因。 –

相關問題