最佳解答者
表單互通一問?

問題
-
我看了這篇文章http://www.dotblogs.com.tw/larrynung/archive/2009/03/24/7669.aspx的表單互通,也練習了一遍且有作用的,
但是我把他改成關閉後Form2也能將資料設定Form1,但是確有錯誤,說是疑是無限迴圈? 為什麼呢? 還是說要達到這種結果不能用這種寫法?
以下是程式
Form1:
namespace F1
{
public partial class Form1 : Form
{
Form2 f2 = new Form2(); //執行F2這行會出錯
public Form1()
{
InitializeComponent();
}private void button2_Click(object sender, EventArgs e)
{
f2.numericUpDown1.Value = this.numericUpDown1.Value;
}private void button1_Click(object sender, EventArgs e)
{
f2.ShowDialog();
}
}
}
Form2:
namespace F2
{
public partial class Form2 : Form
{
Form1 f1 = new Form1(); //執行F1這行會出錯
public Form2()
{
InitializeComponent();
}private void Form2_FormClosed(object sender, FormClosedEventArgs e)
{
f1.numericUpDown1.Value = this.numericUpDown1.Value;
}
}}
解答
-
Hi,你的問題點跟關不關掉無關程式運行就會發生了這搞不懂的話就是你對變數初始器沒有認知以你的程式來看Form1實體建立時會產生Form2 (因為你有加Form2 f2 = new Form2();)而Form2被建立後Form1又會建立 (因為Form1 f1 = new Form1();)所以你的程式變成New Form1=>New Form2=>New Form1=>New Form2....
http://www.dotblogs.com.tw/larrynung/- 已標示為解答 Q楓仔Q 2009年8月13日 上午 09:11
-
我知道他會new新的, 我是疑問我關掉Form2讓值寫回Form1,為什麼會有無限迴圈,我是因為這點納悶才問的
因為你寫在全域中啊. 產生一個Form的執行個體, 並不代表它一定要Show出來才叫產生,你只要New了這個執行個體就出現了.然後你又 1 產生2 , 2產生1 ......., 所以就會形成一個沒完沒了的迴圈
還有一個重點: 你每次產生的執行個體雖然是參考同一個Class , 但是它是不同的執行個體.
請關心自己的問題,不要問了就放空;這是對別人與自己的尊重- 已標示為解答 Q楓仔Q 2009年8月13日 上午 09:11
所有回覆
-
您好,有點不懂您說的 [把他改成關閉後Form2也能將資料設定Form1]
您試試看以下程式碼
Form1using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; namespace WindowsFormsApplication1 { public partial class Form1 : Form { Form2 f2 = new Form2(); public Form1() { InitializeComponent(); } private void button2_Click(object sender, EventArgs e) { f2.numericUpDown1.Value = this.numericUpDown1.Value; } private void button1_Click(object sender, EventArgs e) { f2.f1 = this; f2.ShowDialog(); } } }
Form2using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; namespace WindowsFormsApplication1 { public partial class Form2 : Form { public Form2() { InitializeComponent(); } public Form1 f1; private void Form2_FormClosed(object sender, FormClosedEventArgs e) { f1.numericUpDown1.Value = this.numericUpDown1.Value; } } }
.NET菜鳥自救會 http://www.dotblogs.com.tw/chou/ -
hi
如同Bill Chung 大說的,不要New個沒完沒了(因為Form1初始化同時也實體化Form2,這時換Form2初始化同時也實體化Form1)
你可以把form是否有實體化的判斷動作寫在click事件中
public partial class Form1 : Form
{
Form2 f2 ;
public Form1()
{
InitializeComponent();
}private void button2_Click(object sender, EventArgs e)
{
if (f2 == null)
{
f2 = new Form2();
f2.numericUpDown1.Value = this.numericUpDown1.Value;
}
else
f2.numericUpDown1.Value = this.numericUpDown1.Value;
}private void button1_Click(object sender, EventArgs e)
{
if (f2 == null)
{
f2 = new Form2();
f2.ShowDialog();
}
else
f2.ShowDialog();
}
}
form2做法也一樣 -
Hi,
我文章上面你的狀況就有寫到你沒看仔細吧而且文中也有提到Form2控制Form1的做法你這樣寫跟沒看文章的寫法好像沒啥兩樣我把它節錄出來P.S.這邊初學者很容易犯的問題就是會在Form2內再宣告出一個Form1,並對宣告出的Form1做資料互傳,最後的結果當然是資料互傳後結果不如預期。這是因為沒認清物件參考的原因,每宣告一個物件實體作業系統都會分配一塊記憶體空間,因此需認清本來的Form1表單與Form2內新宣告的Form1是不同的物件參考這個事實。
http://www.dotblogs.com.tw/larrynung/ -
謝謝各位前輩的指教,小弟沒經過深思和研讀就發文造成各位的不便非常抱歉,
但是我是看著文章所需所寫的,真的沒有就只是抄code....!! 我是真的不太懂我的問題是出在哪
我知道他會new新的, 我是疑問我關掉Form2讓值寫回Form1,為什麼會有無限迴圈,我是因為這點納悶才問的
至於寫程式的規劃因為只是練習所以就沒做程式上的規劃
文章最後一點沒仔細看是因為我在試改變的寫法時一直偵錯就沒繼續往下看,沒看到下面有提到相關內容
因為我都是找一些相關書籍練習,再自己加以改變,可能不是每個部分都能完全理解
但是上述前輩所提到的內容與指教小弟會虛心檢討
-
Hi,你的問題點跟關不關掉無關程式運行就會發生了這搞不懂的話就是你對變數初始器沒有認知以你的程式來看Form1實體建立時會產生Form2 (因為你有加Form2 f2 = new Form2();)而Form2被建立後Form1又會建立 (因為Form1 f1 = new Form1();)所以你的程式變成New Form1=>New Form2=>New Form1=>New Form2....
http://www.dotblogs.com.tw/larrynung/- 已標示為解答 Q楓仔Q 2009年8月13日 上午 09:11
-
我知道他會new新的, 我是疑問我關掉Form2讓值寫回Form1,為什麼會有無限迴圈,我是因為這點納悶才問的
因為你寫在全域中啊. 產生一個Form的執行個體, 並不代表它一定要Show出來才叫產生,你只要New了這個執行個體就出現了.然後你又 1 產生2 , 2產生1 ......., 所以就會形成一個沒完沒了的迴圈
還有一個重點: 你每次產生的執行個體雖然是參考同一個Class , 但是它是不同的執行個體.
請關心自己的問題,不要問了就放空;這是對別人與自己的尊重- 已標示為解答 Q楓仔Q 2009年8月13日 上午 09:11