Ler*_*ica 0 c# event-handling winforms
今天我注意到我的代码中有一个错误,我以为我是在不久前处理过的.我正在处理Windows Forms应用程序,我form_load经常使用该事件.为了处理Form_load事件中出现错误并抛出异常的情况,我使用以下代码:
catch (Exception ex)
{
LogErrorAndShowMessage(ex, Resources.ERROR_LOAD);
//Otherwise Error : "Cannot call Close() while doing CreateHandle()".
this.BeginInvoke(new InvokeDelegate(CloseTheForm));
LoadForm<Materials>(closeAlreadyOpened : false);
}
Run Code Online (Sandbox Code Playgroud)
这就是我如何声明委托和方法:
public delegate void InvokeDelegate();//used if form load fails
private void CloseTheForm()
{
this.Close();
}
Run Code Online (Sandbox Code Playgroud)
从今天起它运作良好.发生了什么 - 在Form_load我设置DataSource我的ComboBoxes 的事件中,碰巧从SetDataSource方法中抛出了一个错误,最终得到的错误与我在使用之前得到的相同BeginInvoke- Cannot call Close() while doing CreateHandle().
这是一种例外行为,如果从其他地方抛出异常代码仍然正常工作,只有在设置数据源期间我得到了错误.
任何可能导致这种异常行为的建议以及如何解决?
PS
这就是我创建新表单的方式:
protected void LoadForm<T>(ToolStripButton/*ToolStripDropDownButton*/ formButton,
string buttonText,
long? loadEntityId = null,
bool closeAlreadyOpened = true) where T : BaseForm
{
MainForm parentFrm = GetParentForm();
if (parentFrm != null)
{
if (formButton != null)
{
parentFrm.SetForeColor(formButton);
}
T openForm = SingletonFormProvider.GetInstance<T>(parentFrm,
closeAlreadyOpened);
openForm.LoadEntityId = loadEntityId;
openForm.MdiParent = parentFrm;
openForm.Dock = DockStyle.Fill;
openForm.Show();
openForm.Activate();
}
else
{
MessageBox.Show("Parent form not found!", "Error",
MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
Run Code Online (Sandbox Code Playgroud)
也许正如Hans Passant我所说try-catch,我应该绕过这个openForm.Show()来处理这个问题?
Load事件很麻烦.它通常在调用窗体的Show()方法时触发.但是如果表单构造函数中的初始化代码需要创建本机窗口,它可以提前触发.由于表单对象尚未完全初始化,因此相当不健康.通过在Load事件处理程序中设置断点并查看调试器的Call Stack窗口,您始终可以找到代码所执行的操作.
通常,您应该避免Load事件,只有在您需要知道窗口的实际大小的极少数情况下才需要它.其他所有内容都属于构造函数,就像使用常规.NET类一样.您需要做一些关于捕获和记录异常的事情,这最好用类工厂完成.样板工厂看起来像这样:
public static Form1 CreateInstance() {
try {
var frm = new Form1();
frm.Show();
return frm;
}
catch (Exception ex) {
LogErrorAndShowMessage(ex);
return null;
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
430 次 |
| 最近记录: |