我是一個新手,所以請裸露在我身邊。我的複雜問題可能有一個簡單的解決方案...或根本沒有解決方案。C#winforms - 更新關閉窗體中的Toolstripstatuslabel
我有訂單。一旦訂單完成,我使用一個線索將訂單通過電子郵件發送給供應商。線程用於防止系統在命令導出爲pdf併發送時掛起。
問題:一旦威脅完成而沒有錯誤,我想在MDIParent Toolstripstatuslabel上放置一條消息,以確認訂單已發送。但是我得到一個錯誤:「System.NullReferenceException:對象引用未設置爲對象的實例」。我可能錯了,指的是子窗口在關閉時在父窗體上放置了toolstripstatuslabel引用,因此威脅無法再訪問它。我知道簡單的解決方案是使用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;
}
我仍在尋找更好的方法,但現在這個工作。
如果它正在關閉,並且實際上在您嘗試使用它時已經消失,那麼用戶將如何看到更新? – Will
@我想他會改變他剛剛關閉的那個*父窗口上的tooltrip狀態標籤。我們可以看到一些實際的代碼嗎?很難弄清楚究竟發生了什麼問題。 –
@ user1339124我試圖從你的描述的解決方案,是你應該傳遞一個對父窗口的引用到你的線程,然後使用'App.Current.Dispatcher.Invoke((=){/ *更新狀態標籤在這裏使用你傳遞給線程的引用* /});' –