C#窗體間傳值方法總結

原文:http://zhuoyue03007.blog.163.com/blog/static/2781816620096745516500/

 

假設我們需要點擊主窗體FMMain中的某一個按鈕時打開子窗體FMChild並將某一個值傳給子窗體FMChild,一般情況下,我們點擊按鈕顯示子窗體FMChild的代碼爲:

FMChild fmChild = new FMChild();
fmChild.ShowDialog();
fmChild.Dispose();


如果我們需要將主窗體FMMain中的string strValueA的值傳給FMChild,那麼我們首先對strValueA進行如下處理:

private string strValueA;
public string StrValueA
{
get
{
return strValueA;
}
set
{
strValueA = value;
}
}


使其成爲主窗體FMMain的一個屬性,接着修改顯示子窗體的代碼爲以下兩種的其中一種。

方法一:

FMChild fmChild = new FMChild();
fmChild.ShowDialog(this);
fmChild.Dispose();


方法二:

FMChild fmChild = new FMChild();
FMChild.Owner = this;
fmChild.ShowDialog();
fmChild.Dispose();


然後在修改子窗體FMChild中申明一個主窗體FMMain對象,

FMMain fmMain;


在需要使用主窗體FMMain的string strValueA的地方加上如下代碼:

fmMain = (FMMain)this.Owner;


這樣,就可以獲得主窗體FMMain中strValueA的值了。

這時,如果你需要將子窗體FMChild中的string strValueB傳給主窗體FMMain,同樣處理string strValueB。

private string strValueB;
public string StrValueB
{
get { return strValueB; }
set { strValueB = value; }
}


那麼你在關閉子窗體代碼fmChild.Dispose();後,可以寫一些代碼來保存或者處理FMChild的strValueB,例如:

string strTmp = fmChild.StrValueB;


注意,在Visual C#智能設備Pocket PC 2003設備應用程序中顯示子窗體FMChild只能使用:

FMChild fmChild = new FMChild();FMChild.Owner = this;fmChild.ShowDialog();fmChild.Dispose();


在Visual C#智能設備Pocket PC 2003的設備應用程序中ShowDialog()沒有重載。

 


C#窗體間傳值的幾種方法
調用窗體(父):Form1,被調用窗體(子):Form2
方法1: 所有權法
//Form1:
//需要有一個公共的刷新方法
public void Refresh_Method()
{
//...
}
//在調用Form2時,要把Form2的所有者設爲Form1
Form2 f2 = new Form2() ;
f2.Owner = this;
f2.ShowDialog() ;
//Form2:
//在需要對其調用者(父)刷新時
Form1 f1 ;
f1 = (Form1)this.Owner;
f1.Refresh_Method() ;
方法2:自身傳遞法
//Form1:
//需要有一個公共的刷新方法
public void Refresh_Method()
{
//...
}
Form2 f2 = new Form2() ;
f2.ShowDialog(this) ;
//Form2:
private Form1 p_f1;
public Form2(Form1 f1)
{
InitializeComponent();
p_f1 = f1;
}
//刷新時
p_f1.Refresh_Method() ;
方法3:屬性法
//Form1:
//需要有一個公共的刷新方法
public void Refresh_Method()
{
//...
}
//調用時
Form2 f2 = new Form2() ;
f2.P_F1 = this;
f2.Show() ;

//Form2:
private Form1 p_f1;
public Form1 P_F1
{
get{return p_f1;}
set{p_f1 = value;}
}
//刷新時
p_f1.Refresh_Method() ;
方法4:委託法
//聲明一個委託
public delegate void DisplayUpdate();
//Form1:
//需要有一個公共的刷新方法
public void Refresh_Method()
{
//...
}
//調用時
Form2 f2 = new Form2() ;
f2.ShowUpdate += new DisplayUpdate(Refresh_Method) ;
f2.Show() ;
//Form2:
//聲明事件
public event DisplayUpdate ShowUpdate;
//刷新時,放在需要執行刷新的事件裏
ShowUpdate();

 

 

 

Form1中放一個Label1,一個Button1,Form1爲主窗口,當點擊Button1時,執行:
Form2 f2 = new Form2();
f2.ShowDialog(this);

Form2中放一個TextBox1,一個Button1,當點擊Button1時執行:

Form1 f1 = (Form1)this.Owner;
f1.Label1.Text = this.TextBox1.Text;

注意:Form1中的label1要設爲public

 


用C#實現兩個WinForm間的傳值

這個題目我曾經出給來公司面試的人,也曾經出給剛畢業的大學生,幾乎是沒有人會做啊。難道這個問題真的這麼難麼?現在我給出實現的主要源代碼(開發平臺爲VC#2005)。

實現的思路:
     從Form1傳遞到Form2: 2個窗體即兩個類,兩個窗體間的數據傳送,可以採用構造函數來實現。

     從Form2返回到Form1,並傳遞數據:實例化Form2後,打f2用ShowDialog()方法,然後等待f2關閉時再回傳數據到Form1。

實現步驟及代碼:

      1:新建兩個窗口: Form1,Form2;
      2:打開Form2,添加一個textBox:textBox1;添加一個Button:button1;然後添加一個構造函數:
        //定義一個變量,用來傳值。
        public string returnValue ;

        public Form2(string txtValue)
        {
            InitializeComponent();

            this.textBox1.Text = txtValue;
        }
然後在button1的單擊事件中添加如下代碼:
        private void button1_Click(object sender, EventArgs e)
        {
            returnValue = this.textBox1.Text;
            this.Close();
        }



      3:Form1中添加一個textBox:textBox1;添加一個Button:button1;然後在button1的單擊事件中添加如下代碼:
        private void button1_Click(object sender, EventArgs e)
        {
            string txtValue = this.textBox1.Text;
            Form2 f2 = new Form2(txtValue);
            f2.ShowDialog();
            this.textBox1.Text = f2.returnValue;
        }

 


Form1 中 (父窗口:)
public class Form1 : System.Windows.Forms.Form
{
      private System.Windows.Forms.Button btnOpen;
      public System.Windows.Forms.TextBox txtContent; //注意是public

       ........

       ........

      [STAThread]
     static void Main()
     {
          Application.Run(new Form1());
     }

    private void btnOpen_Click(object sender, System.EventArgs e)
    {
       Form2 frm=new Form2(this);
       frm.ShowDialog();
    }

}

Form2中(子窗口)

public class Form2 : System.Windows.Forms.Form
{
           private System.Windows.Forms.Button button1;
           private System.Windows.Forms.TextBox txtValue;

           private Form _parentForm=null;

 

       public Form2()
       {  
            InitializeComponent();
       }

      public Form2(Form parentForm)
      {
          InitializeComponent();
          this._parentForm =parentForm;
      }

           ........

          ........


   //更新父窗口中文本框中的值!

     private void button1_Click(object sender, System.EventArgs e)
     {
           ((Form1)_parentForm).txtContent.Text =this.txtValue .Text ;
     }

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章