2017-06-29 74 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; 
} 

我仍在寻找更好的方法,但现在这个工作。