2010-03-02 82 views
1

我正在實例化並從窗體A調用窗體B.FormB具有一些自定義屬性,以允許將它傳遞給sqladaptors和dataset實例。Windows窗體窗體類中的屬性僅在Load事件後可訪問

當我使用Using語句實例化並顯示窗體B作爲對話框窗體時,它一切正常,但我發現我傳遞的屬性在窗體B中不可用,直到form_load事件觸發後才能使用。

我在印象之下,傳遞給實例化類的屬性應該可以從構造函數中獲得,但事實並非如此。如果它試圖在表單加載事件之前訪問屬性,我會得到一個空引用異常。

這是正確的行爲?

+0

你可以使用form.Shown事件作爲在這個答案:https://stackoverflow.com/a/219155/1579626 – 2017-10-30 13:40:13

回答

0

將所有Form B內部變量初始化移至其構造函數

以下是formA的外觀。它有2個按鈕:一個簡單地初始化formb的實例並調用公共屬性。另一個按鈕顯示formB。只有在通過Show()或ShowDialog()調用向用戶顯示錶單時纔會調用Form_load。

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Text; 
using System.Windows.Forms; 

namespace formload 
{ 
    public partial class FormA : Form 
    { 
     public FormA() 
     { 
      InitializeComponent(); 
     } 

     private void button1_Click(object sender, EventArgs e) 
     { 
      FormB frm = new FormB(); 
      MessageBox.Show(frm.MyProperty); 
      frm = null; 
     } 

     private void button2_Click(object sender, EventArgs e) 
     { 
      FormB frm = new FormB(); 
      frm.ShowDialog(); 
      MessageBox.Show(frm.MyProperty); 
      frm = null; 
     } 
    } 
} 

這裏是formb會怎樣看:

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Text; 
using System.Windows.Forms; 

namespace formload 
{ 
    public partial class FormB : Form 
    { 
     public FormB() 
     { 
      InitializeComponent(); 
      myPropString = "Default set via constructor"; 
     } 

     private void FormB_Load(object sender, EventArgs e) 
     { 
      myPropString = "Set from form load"; 
     } 

     private string myPropString; 

     public string MyProperty 
     { 
      get { return myPropString; } 
      set { myPropString = value; } 
     } 

    } 
} 
+0

嗯什麼我可以初始化內部變量,當我想從調用類的數據(FormA )? – Spooky2010 2010-03-02 09:32:01

+0

我已編輯我的回覆 – deostroll 2010-03-02 09:44:15

+0

好吧,但我的問題是這樣的 FormB frm = new FormB(); frm.MyProperty =「whatever」; frm.ShowDialog(); 在形式B問題是,如果我嘗試在FormB構造函數中獲取MyProperty的值,我得到一個空引用異常。如果我在表單加載事件中訪問它,那麼它是可用的。 我不能intitialise它的任何形式B,因爲我想要在表格B中使用的值是從形式A傳遞 我會假設我應該能夠從表單B的構造函數中獲得從形式A傳遞的值 – Spooky2010 2010-03-03 01:21:28

0

如果你正在做

FormB frm = new FormB();  ' Constructor runs now 
frm.MyProperty = "whatever"; ' Now you set the property 
frm.ShowDialog() 

顯然,你設置的屬性之前您正在運行的構造!直到設置後才能訪問該屬性。