我是一个新手,所以请裸露在我身边。我的复杂问题可能有一个简单的解决方案...或根本没有解决方案。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((=){/ *更新状态标签在这里使用你传递给线程的引用* /});' –