2017-08-04 59 views
-2

當前我正在開發一個簡單的多語言應用程序。此應用程序有兩種形式:已關閉的窗體的更新語言

表1:選擇語言(英語&意大利)

表2:歡迎消息

Form1.cs的

private void button1_Click(object sender, EventArgs e) 
    { 
       Assembly a = Assembly.Load("LanguageManagement"); 
       ResourceManager rm = new ResourceManager("LanguageManagement.Language.English", a); 

       Class1 lang = new Class1(); 
       lang.Language(rm); 
      } 

      private void button2_Click(object sender, EventArgs e) 
      { 
       Assembly a = Assembly.Load("LanguageManagement"); 
       ResourceManager rm = new ResourceManager("LanguageManagement.Language.Italian", a); 

       Class1 lang = new Class1(); 
       lang.Language(rm); 
      } 
    } 

當用戶按下按鈕1(英文),使用英文資源管理器,並調用Class 1。

class Class1 
    { 
     public void Language(ResourceManager rm) 
     { 
      Form1 form1 = (Form1)Application.OpenForms["Form1"]; 
      form1.label1.Text = rm.GetString("_Name"); 
      form1.label2.Text = rm.GetString("_Surname"); 
      form1.label3.Text = rm.GetString("_Age"); 
      form1.button4.Text = rm.GetString("_Enter"); 

      //Form2 form = new Form2(); 
      Form2 form = (Form2)Application.OpenForms["Form2"]; 

      form.label1.Text = rm.GetString("_Welcome"); 
     } 
    } 

如果用戶不選擇顯示以下錯誤的語言之前打開窗體2:

型「System.NullReferenceException」未處理的異常發生在LanguageManagement.exe 其他信息:對象引用未設置爲對象的實例。

如何更新form2的語言,即使它從未打開過?

謝謝:)

+0

使用調試器,其變量或字段爲空? – ClickRick

+0

如果'Form2'沒有打開,你不能打開它,然後設置歡迎消息。 – Scrobi

+0

我需要更新2個窗體的所有文本...即使form2永遠不會打開。 – Draco0013

回答

0

因此,您似乎想使用Class1作爲填充劑。你可以做的方法static(因爲它沒有使用任何類變量),此外通過形式爲它填充:

public void Language(ResourceManager rm, Form1 form1, Form2 form2) 
{ 
    // FORM 1 
    form1.label1.Text = rm.GetString("_Name"); 
    form1.label2.Text = rm.GetString("_Surname"); 
    form1.label3.Text = rm.GetString("_Age"); 
    form1.button4.Text = rm.GetString("_Enter"); 

    // FORM 2 
    form2.label1.Text = rm.GetString("_Welcome"); 
} 

你應該實例化類水平Form2對象Form1並同時通過變量進入方法:

Form2 form2 = new Form2(); 

private void button1_Click(object sender, EventArgs e) 
{ 
    Assembly a = Assembly.Load("LanguageManagement"); 
    ResourceManager rm = new ResourceManager("LanguageManagement.Language.English", a); 

    // here both forms will be filled 
    Class1.Language(rm, this, form2); 
} 

private void button2_Click(object sender, EventArgs e) 
{ 
    Assembly a = Assembly.Load("LanguageManagement"); 
    ResourceManager rm = new ResourceManager("LanguageManagement.Language.Italian", a); 

    Class1.Language(rm, this, form2); 
} 

可以簡化您的代碼,因爲這兩個按鈕按下有很多共同點:

private void FillWithLanguage(string language) 
{ 
    Assembly a = Assembly.Load("LanguageManagement"); 
    ResourceManager rm = new ResourceManager(language, a); 

    // here both forms will be filled 
    Class1.Language(rm, this, form2); 
} 

現在你可以減少您按鈕代碼這樣:

private void button1_Click(object sender, EventArgs e) 
{ 
    FillWithLanguageResourceManager("LanguageManagement.Language.English"); 
} 

private void button2_Click(object sender, EventArgs e) 
{ 
    FillWithLanguageResourceManager("LanguageManagement.Language.Italian");  
} 
+0

非常感謝!這就是我想要的。對不起,如果我一開始並沒有表現得很好。 – Draco0013

+0

@ Draco0013歡迎您。並歡迎使用StackOverflow。 –

+0

@ Draco0013您可以簡化您的代碼(避免雙重代碼)我對我的文章進行了編輯。看看 –

0

您應該使用static構件,其保存ResourceManager,是來自世界各地的訪問。當Form2打開時,它可以簡單地查看static成員並單獨更改語言。

class Class1 
{ 
    public static ResourceManager Resources { get; private set; } 

    public void Language(ResourceManager rm) 
    { 
     Resources = rm; 

     Form1 form1 = (Form1)Application.OpenForms["Form1"]; 
     form1.label1.Text = rm.GetString("_Name"); 
     form1.label2.Text = rm.GetString("_Surname"); 
     form1.label3.Text = rm.GetString("_Age"); 
     form1.button4.Text = rm.GetString("_Enter"); 

     //Form2 form = new Form2(); 
     Form2 form = (Form2)Application.OpenForms["Form2"]; 
    } 
} 

在你Form2

public Form2() 
{ 
    InitializeComponent(); 
    form.label1.Text = Form1.Resources.GetString("_Welcome"); 
} 
0

以下是Form1設計:

enter image description here

當用戶按下回車鍵,窗體2顯示和Form1中是隱藏的。 如果用戶,例如點擊英文按鈕,輸入按鈕被按下從來沒有,顯示此錯誤:

型「System.NullReferenceException」未處理的異常發生在LanguageManagement.exe其他信息:未將對象引用設置爲一個對象的實例。

+0

你在這裏混淆了責任。試着清楚每個對象的責任。 Form1負責選擇所看到的語言。 Class1應該做什麼? Form2的工作是什麼?誰負責調用Form2? - >這裏看起來它是Form1(當輸入按鈕被按下時) –

+0

Form1用來選擇語言。如果用戶想繼續使用英文,他不需要選擇英文按鈕,只需按Enter按鈕並打開Form2。但是,如果用戶想要軟件是意大利語,他按意大利語按鈕...但由於用戶從未打開過Form2(因爲他沒有按下Enter按鈕),所以會顯示錯誤,因爲Form2從未打開過(Form2 form =(Form2)Application.OpenForms [「Form2」];) – Draco0013

+0

問題是訪問級別。你認爲表單已經是開放的。但是對於form2的開放,它必須事先在某個地方創建。您應該在創建它的相同位置調用「打開」。 –