Winform窗體間傳值

窗體間傳值要弄清楚到底是哪個對象的問題,否則容易傳錯值。就比如窗體對象loginFrm爲登陸窗體,想把當前的登陸用戶信息傳遞給主窗體mainFrm,但是卻實例了一個新的對象loginFrm把裏頭的信息傳遞給了mainFrm,所以得到了一空值,頗有刻舟求劍的味道,不同的內存空間就比如湖水的寬廣一樣,存放着不同的對象,彼此要分清楚。窗體傳值的前提是,要傳的字段,在類裏面的訪問修飾符必須是public(如果在源窗體內傳值則例外,參見下列常用方法2)
常用的方法:

  • 1    靜態變量,在窗體裏Class Form1中,寫入一個靜態變量A,可以給其賦值,那麼在這個項目中,就可以通過Form1.A來調用。不推薦此種方法,不太安全。

  • 2    比較穩妥的方法,就是在傳值的過程中,首先在被傳值窗體form2中,建立一個公有屬性B,做爲接收者。在form1裏實例form2時,把需要傳遞的值A賦給新實例form2.B,或者是通過Form2類的構造函數傳遞,方法很多,此種傳值較爲安全(推薦)。

  • 3    若是要得到一組固定的數據,那麼可以寫成一個公有的帶返回值的方法,在源窗體中。然後在目標窗體中實例源窗體對象,調用此方法獲得數據,此方法雖不同於靜態變量,但有異曲同工之妙,可以不必強調對象。其缺點是,方法體內傳遞數據爲固定的,不能變通。

  • 4    查詢對話框,大家都用過記事本,裏頭有個查詢功能,就是當選中一段文字時,打開查詢對話框,就會在查詢對話框中顯示選中的那段文字,其代碼實現爲:
Form1中:我們要把一個文本傳遞給Form2窗體,假定爲passText
              public string passText
              {
                   get{ return textBox1.Text;}
              }      
              Form1
中還有個按鈕button1在其點擊事件中有:
                             private void button1_Click(object sender,EventArgs e)
              {
                                     Form2 f2 = new Form2();   //
呃。。這個就不用說了
                      f2.Owner = this;  //
設置附屬,好搭關係~
                     f2.Show();   //
看得出來撒
              }
Form2的對象中:
            
假設有個文本框txtBox1,
             private void form2_Load(object sender,EventArgs e)
             {
                                    //
通過目標窗體,找到擁有它的源窗體,得到的是一個object
                                     
對象,要轉換成Form1這個類型,就可以得到它的公有屬性passText拉。
                 textBox1.Text = ((Form1)this.Owner).passText;
                             } 
這樣當我們打開Form2時,就會在其文本框中,顯示Form1的文本框信息了(想要做到查詢對話框顯示選中文本的效果,只需要在把passText 的屬性改成textBox.SelectedText即可.
這種方法的主要好處是在於,我們能在目標窗體的對象中,找到源窗體的對象。而有別與上面兩種情況。

  • 5    窗體間同步傳值的實現,就是實時更新兩個窗體間的信息,有心的朋友可能發現,既然能在目標窗體中,找到源窗體,那麼我們還可以通過源窗體來控制目標窗體,從這裏面突破,就能達到此效果了。代碼如下還是依照4例:在Form1中:
程序代碼:

public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        public string passText
        {
            get {
                return textBox1.SelectedText.Text;
            }
        }

        private void button1_Click(object sender, EventArgs e)
        {
            Form2 f2 = new Form2();
            f2.Owner = this;
            f2.Show();
        }

        private void Form1_Load(object sender, EventArgs e)
        {

        }

        private void textBox1_TextChanged(object sender, EventArgs e)
        {
            if(this.OwnedForms.Length != 0)
            (this.OwnedForms[0] as Form2).selectText = textBox1.Text;/*OwnedForms
是一個數組 ,表示當前對象擁有的子窗體數組,同樣要把通過下標得到的元素轉換爲Form2類型。*/
        }
    }
}

namespace WindowsApplication1
{
    public partial class Form2 : Form
    {
        public string selectText
        {
            set
            {
                textBox1.Text = value;   //
設置一個屬性,讓form1操作
            }
        }

        public Form2()
        {
            InitializeComponent();
        }

        private void Form2_Load(object sender, EventArgs e)
        {
            textBox1.Text = ((Form1)this.Owner).passText;
        }
    }
}

  • 6.通過委託事件來實現子窗體向父窗體傳值
在Form1中寫入代碼:

Form2 form= new Form2 ();
form.SendEvent += new Form2 .SendMessage(GetMessage);
form.Show();

/// <summary>
/// 代理調用的方法
/// </summary>
/// <param name="str">Form2傳過來的值</param>
public void GetMessage(string str)
{
    //在這裏處理Form2傳過來的值str
}

在Form2窗體中寫入代碼:

//代理聲明
public delegate void SendMessage(string str);
//事件聲明
public event SendMessage SendEvent;

     //調用事件(message爲你所要傳遞的值)
     SendEvent(message);

如果是2個毫無相關的頁面之間的傳值可以用靜態類來實現!

最後,要說一下的是,在傳值的時候,不光可以傳變量屬性,還有個很好的東西,每個窗體都有個Tag屬性,是一個標記,object類型的,我們可以把一個類賦給它。這樣就爲我們的代碼,提供了極大的便利,大家可以依據上面種傳值方式,進行使用。
發佈了49 篇原創文章 · 獲贊 12 · 訪問量 24萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章