2012-01-31 32 views
0

我試圖通過幾個WinForms之間的值,我總共有6個WinForms,用戶將循環。我使用TextBox和Label控件在窗體之間傳遞值。C#Winforms之間傳遞值間歇工作

當我打開主要winform,然後單擊一個按鈕加載第二個winform,一切工作正常(我可以將值傳遞給第一個窗體)。我的問題是,一旦我將用戶引導到另一種形式的this.Hide();當前(第二WinForm的),然後嘗試用第三種形式將值傳遞到第一,我得到以下錯誤:

Object reference not set to an instance of an object.

我困惑,因爲應該通過值的控制傳遞值的第一個窗體不是NULL

我使用相同的代碼將所有窗體連接在一起。

public MainForm MainForm; 

然後我試圖通過像這樣的價值觀:

MainForm.textBox1.Text = txt_FileName.Text; 

注:所有可在形式之間傳遞值的文本框和標籤控件public

人遇到這個?或者任何想法? 。

+1

顯然有些東西是空的,所以你需要向我們提供一些錯誤上下文中的代碼。 – ChaosPandion 2012-01-31 03:29:29

+2

您應該考慮使用在表單之間傳遞的簡單數據對象,而不是公共控件。所有表單中的所有控件都應該是私人的(或者如果您從表單中獲得的話可能會受到保護)。一般來說,用戶界面對象中的公共控件是災難發展的祕訣。 即使你得到這個工作,你會有這個設置的維修噩夢。 – xxbbcc 2012-01-31 03:29:48

回答

1

您需要確保所有表單都已實例化(通過新的MyForm1()...)。只要聲明一個MainForm類型的變量不會創建一個表單實例 - 你必須這樣做。我的猜測是,當您嘗試訪問控件時,您的某個表單尚未創建。

這是另一個不使用公共控件的理由(請參閱我的評論),因爲您的控件的生命週期與您的表單的生命週期相關聯。最好隱藏公共訪問控件並通過數據對象將數據發送到表單 - 表單將所有這些值設置爲自己的控件。這也使驗證更容易,因爲控件的值只能設置爲表單允許的值。如果您從外部設置控制值,則在所有情況下都會遇到難以驗證的控制值。

我假設你正在嘗試使用類似於嚮導的模式表單,其中用戶從一種形式轉到另一種形式,遵循一條清晰的路徑。如果是這樣,你可以做這樣的事情:

// Data class to set data in Form2 
internal class Form2Data 
{ 
    public string Name; 
    ... 
} 

... 

internal class Form2 : Form 
{ 
    public static DialogResult ShowDlg (Form2Data oData) 
    { 
     Form2 oFrm = new Form2(); 

     oFrm.SetData (oData); 
     DialogResult nResult = oFrm.ShowDialog(); 

     if (nResult == DialogResult.Ok) 
      oFrm.GetData (oData); 

     return (nResult); 
    } 

    private void SetData (Form2Data oData) 
    { 
     // Set control values here 
    } 

    private void GetData (Form2Data oData) 
    { 
     // Read control values here 
    } 
} 

... 
// You call this as such: 
Form2Data oData = new Form2Data(); 
oData.Name = "..."; 

DialogResult nResult = Form2.ShowDlg (oData); 

// after the call, oData should have updated values from Form2 
if (nResult == DialogResult.Ok) 
{ 
    // show your next form in a similar pattern - set up data 
    // call form's static method to pass it and then wait for 
    // the form to finish and return with updated data. 
} 

你也必須在你的其他形式使用類似的模式。這確實需要更多的工作,因爲您需要爲所有表單設置不同的數據對象,但這樣您可以在顯示錶單(在SetData和GetData中)之前和之後輕鬆地進行驗證。它還能更好地封裝你的程序,因爲控制不能從外部訪問。

0

您應該使用表單的實例值傳遞值。

例如:

SecondForm secForm2 = new SecondForm(); 
secForm2.textBox1.Text = txt_FileName.Text 

所以如果你通過從SecondForm價值ThirdForm:

ThirdForm thiForm = new ThirdForm(); 
thiForm.textBox1.Text = textBox1.Text 
1

的.Net 2.0和更高版本擁有名爲 「默認實例」 窗口形成特徵,它爲您提供了一個與類型名稱相同的實例。此功能的目的是爲了與從舊的vb6應用程序遷移的代碼兼容。如果您不是從舊的vb應用程序遷移,通常最好避免使用默認實例。他們會給你帶來麻煩,比如你現在有麻煩。相反,創建一個變量來保存自己構造的表單實例。