2017-06-29 77 views
0

我是一個新手,所以請裸露在我身邊。我的複雜問題可能有一個簡單的解決方案...或根本沒有解決方案。C#winforms - 更新關閉窗體中的Toolstripstatuslabel

我有訂單。一旦訂單完成,我使用一個線索將訂單通過電子郵件發送給供應商。線程用於防止系統在命令導出爲pdf併發送時掛起。

問題:一旦威脅完成而沒有錯誤,我想在MDIParent Toolstripstatuslabel上放置一條消息,以確認訂單已發送。但是我得到一個錯誤:「System.NullReferenceException:對象引用未設置爲對象的實例」。我可能錯了,指的是子窗口在關閉時在父窗體上放置了too​​lstripstatuslabel引用,因此威脅無法再訪問它。我知道簡單的解決方案是使用MessageBox來確認一切順利,但是爲什麼使它容易,如果你可以做到這一點優雅?

所以我的問題:我如何從威脅中引用父窗體中的控件?我試着看着調用,但不知道如何實現它,或者如果它實際上是正確的方向。

編輯:

好了,比每天花更多的試圖找出如何使用調用後,我意識到雖然它:

我從childform

public partial class frm_n_order : Form 
{ 
    . 
    . 

private void bProcess_Click(object sender, EventArgs e) 
{ 
    . 
    . 
    . 

    new Thread(new ThreadStart(delegate 
    { 
     fExportOrder(strOrderNo); 
     fSendMailv2(strPlant, strSupCode, strOrderNo);         
    })).Start(); 

    this.close(); 
} 

private void fExportOrder(string strOrderNo) 
{ 
    //export order to pdf 
} 

private void fSendMailv2(string strPlant, string strSupCode, string strOrderNo); 
{ 
    // get pdf 
    // get email address 

    try 
    { 
     // send email 
     ((MDIParent1)MdiParent).tsslMain.Text = "Order No:" + strOrderNo + " was successfully send to " + strEmails; //here I need to find a different way of accessing the Toolstripstatuslabel in the parent form 
    } 
    catch 
    { 
     MessageBox.Show("Email did not send"); 
    } 
} 

} 

編輯代碼在使用線程時看起來很不錯,但這不是我的答案。我的問題與關閉所有控件的子表單直接相關,因此它失去了對MdiParent的引用。爲了解決這個問題,我做了以下內容:

在我的孩子上課我說:

public static Form IsFormAlreadyOpen(Type FormType) 
{ 
    foreach (Form OpenForm in Application.OpenForms) 
    { 
    if (OpenForm.GetType() == FormType) 
     return OpenForm; 
    } 
    return null; 
} 

我不認爲它是最完美的解決方案,但這個理論是說我的父窗體永遠是開放的,當我需要訪問Toolstripstatuslabel。所以我基本上遍歷所有打開的表單來查找對活動MdiParent實例的引用,然後將其傳回給調用者。在線程中,我使用下面的代碼。

MDIParent1 fm = null; 
if ((fm = (MDIParent1)IsFormAlreadyOpen(typeof(MDIParent1))) != null) 
{ 
     fm.Toolstripstatuslabel1.Text = "Order No:" + strOrderNo + " was successfully send to " + strEmails; 
} 

我仍在尋找更好的方法,但現在這個工作。

+1

如果它正在關閉,並且實際上在您嘗試使用它時已經消失,那麼用戶將如何看到更新? – Will

+1

@我想他會改變他剛剛關閉的那個*父窗口上的tooltrip狀態標籤。我們可以看到一些實際的代碼嗎?很難弄清楚究竟發生了什麼問題。 –

+0

@ user1339124我試圖從你的描述的解決方案,是你應該傳遞一個對父窗口的引用到你的線程,然後使用'App.Current.Dispatcher.Invoke((=){/ *更新狀態標籤在這裏使用你傳遞給線程的引用* /});' –

回答

0

好的,所以在花了一天多的時間試圖弄清楚如何使用Invoke之後,我意識到儘管在使用線程時它似乎是一個好習慣,但它並不是我的答案。我的問題與關閉所有控件的子表單直接相關,因此它失去了對MdiParent的引用。爲了解決這個問題,我做了以下內容:

在我的孩子上課我說:

public static Form IsFormAlreadyOpen(Type FormType) 
{ 
    foreach (Form OpenForm in Application.OpenForms) 
    { 
    if (OpenForm.GetType() == FormType) 
     return OpenForm; 
    } 
    return null; 
} 

我不認爲它是最完美的解決方案,但這個理論是說我的父窗體永遠是開放的,當我需要訪問Toolstripstatuslabel。所以我基本上遍歷所有打開的表單來查找對活動MdiParent實例的引用,然後將其傳回給調用者。在線程中,我使用下面的代碼。

MDIParent1 fm = null; 
if ((fm = (MDIParent1)IsFormAlreadyOpen(typeof(MDIParent1))) != null) 
{ 
     fm.Toolstripstatuslabel1.Text = "Order No:" + strOrderNo + " was successfully send to " + strEmails; 
} 

我仍在尋找更好的方法,但現在這個工作。