我正在實例化並從窗體A調用窗體B.FormB具有一些自定義屬性,以允許將它傳遞給sqladaptors和dataset實例。Windows窗體窗體類中的屬性僅在Load事件後可訪問
當我使用Using語句實例化並顯示窗體B作爲對話框窗體時,它一切正常,但我發現我傳遞的屬性在窗體B中不可用,直到form_load事件觸發後才能使用。
我在印象之下,傳遞給實例化類的屬性應該可以從構造函數中獲得,但事實並非如此。如果它試圖在表單加載事件之前訪問屬性,我會得到一個空引用異常。
這是正確的行爲?
我正在實例化並從窗體A調用窗體B.FormB具有一些自定義屬性,以允許將它傳遞給sqladaptors和dataset實例。Windows窗體窗體類中的屬性僅在Load事件後可訪問
當我使用Using語句實例化並顯示窗體B作爲對話框窗體時,它一切正常,但我發現我傳遞的屬性在窗體B中不可用,直到form_load事件觸發後才能使用。
我在印象之下,傳遞給實例化類的屬性應該可以從構造函數中獲得,但事實並非如此。如果它試圖在表單加載事件之前訪問屬性,我會得到一個空引用異常。
這是正確的行爲?
將所有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; }
}
}
}
嗯什麼我可以初始化內部變量,當我想從調用類的數據(FormA )? – Spooky2010 2010-03-02 09:32:01
我已編輯我的回覆 – deostroll 2010-03-02 09:44:15
好吧,但我的問題是這樣的 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
如果你正在做
FormB frm = new FormB(); ' Constructor runs now
frm.MyProperty = "whatever"; ' Now you set the property
frm.ShowDialog()
顯然,你設置的屬性之前您正在運行的構造!直到設置後才能訪問該屬性。
你可以使用form.Shown事件作爲在這個答案:https://stackoverflow.com/a/219155/1579626 – 2017-10-30 13:40:13