2014-02-11 26 views
0

我在我的user control上有一个刷新按钮,每次点击它时都可以正常工作。这是它的点击事件的代码:调用包含委托的点击事件会阻止应用程序启动

private void btnRefresh_Click(object sender, EventArgs e) 
{ 
    if (!RefreshFolder()) 
    { 
     Notify(new string[] { "Refresh failed." }); 
    } 
    else 
    { 
     Notify(new string[] { "Refreshed." }); 
    } 

} 

Notify函数碰巧是来自我的主窗体的委托调用。正常调用时,此功能运行良好。我想要做的是当我的用户控件加载时引发上述事件。但是,当我在加载事件中调用btnRefresh.PerformClick()时,应用程序无法启动并在一段时间后自动退出。但是,当代替Notify函数时,我将MessageBox.Show("blah")函数正常工作。

这是代表我用:

public delegate void NotifyMe(string[] messages); 

而且在我的主要形式,我在它的构造以下行让我的用户控件可以使用的通知主要控制功能:

userctrlSelectManualCampaignFile.Notify += new NotifyMe(Notify); 

该函数的工作原理与我所说的完全吻合,除非当我尝试提高点击事件时。有任何想法吗?

更新: 主要形式的构造:

public MainForm() 
{ 
    InitializeComponent(); 
    logger = new Logger(); 
    connectionHelper = new ConnectionHelper(); 
    datetimeHelper = new DateTimeHelper(); 
    userctrlSettingsGeneral.Notify += new NotifyMe(Notify); 
    userctrlSelectManualCampaignFile.Notify += new NotifyMe(Notify); 
} 

我的用户控件的构造:

public ManualCampaignFiles() 
{ 
    InitializeComponent(); 
} 
+0

是的。显示构造函数的形式 –

+0

@ T.S。用主窗体和用户控件构造函数更新。 – Disasterkid

+1

如果改为'btnRefresh.PerformClick()'你只需调用'btnRefresh_Click'?此外,这并不令人困惑。你有'userctrlSettingsGeneral.Notify + = new NotifyMe(Notify);'。基本上,你想实现回调效果。你应该有'private notifyMe _callback;'在你的控制之下。然后做'if(_callback!= null)_callback(); –

回答

1

你可能会导致一个 “沉默” 的异常被抛出,导致应用程序放弃。

这样的异常可以被框架“吞噬”,例如在事件处理程序中。

尝试设置您的调试环境以打破抛出的异常。为此,转到Debug> Exceptions ...菜单,然后在显示的对话框中,确保检查与公共语言运行时例外对应的“Thrown”复选框。

这样,当你激活你的程序时,它会在抛出异常的时候中断,从而让你弄清楚发生了什么。

干杯

0

我找到了答案in another forum:提高你应该检查,如果事件不为空

事件之前。这是 事件引发的常见模式。

答案提供者:Vitaliy Liptchinsky。

但Hans Passant的回答也非常接近真相。

相关问题