Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/271.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Windows窗体-如果窗体加载事件失败,则使用BeginInvoke_C#_Winforms_Event Handling - Fatal编程技术网

C# Windows窗体-如果窗体加载事件失败,则使用BeginInvoke

C# Windows窗体-如果窗体加载事件失败,则使用BeginInvoke,c#,winforms,event-handling,C#,Winforms,Event Handling,今天,我注意到我的代码中有一个bug,我认为我早就处理好了。我正在使用Windows窗体应用程序,并且经常使用form\u load事件。为了处理Form_load事件中出现错误并引发异常的情况,我使用以下代码: catch (Exception ex) { LogErrorAndShowMessage(ex, Resources.ERROR_LOAD); //Otherwise Error : "Cannot call Close() while doing CreateHa

今天,我注意到我的代码中有一个bug,我认为我早就处理好了。我正在使用
Windows窗体
应用程序,并且经常使用
form\u 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);
}
从今天起,一切都很顺利。发生了什么-在
Form_load
事件中,我为我的组合框设置了
数据源
,碰巧从
SetDataSource
方法引发了一个错误,该错误与我在使用
BeginInvoke
之前得到的错误完全相同-
在执行CreateHandle()时无法调用Close()

这是异常行为,如果异常是从其他地方抛出的,那么代码仍然可以正常工作,只有在设置数据源的过程中,我得到了错误

有什么建议可能导致这种异常行为?我如何修复它

附言

以下是我创建新表单的方式:

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);
    }
}
受保护的无效加载表单(ToolStripButton/*ToolStripDropDownButton*/formButton,
字符串按钮文本,
long?loadEntityId=null,
bool closeAlreadyOpened=true)其中T:BaseForm
{
mainformparentfrm=GetParentForm();
if(parentFrm!=null)
{
如果(formButton!=null)
{
parentFrm.SetForeColor(formButton);
}
T openForm=SingletonFormProvider.GetInstance(parentFrm,
封闭式(已打开);
openForm.LoadEntityId=LoadEntityId;
openForm.mdipparent=parentFrm;
openForm.Dock=DockStyle.Fill;
openForm.Show();
Activate();
}
其他的
{
Show(“未找到父窗体!”,“错误”,
MessageBoxButtons.OK,MessageBoxIcon.Error);
}
}

也许正如Hans Passant提供的那样,我应该在
openForm.Show()
周围放置
try catch
来处理这个问题?

加载事件像这样麻烦。它通常在调用表单的Show()方法时激发。但是,如果表单构造函数中的初始化代码要求创建本机窗口,那么它可能会提前触发。非常不健康,因为表单对象尚未完全初始化。通过在Load事件处理程序中设置断点并查看调试器的“调用堆栈”窗口,您始终可以了解代码是如何做到这一点的

通常,您应该避免Load事件,只有在少数情况下需要知道窗口的实际大小时才需要Load事件。其他所有内容都属于构造函数,就像普通.NET类一样。您需要做一些关于捕获和记录异常的事情,最好使用类工厂来完成。样板厂可能是这样的:

    public static Form1 CreateInstance() {
        try {
            var frm = new Form1();
            frm.Show();
            return frm;
        }
        catch (Exception ex) {
            LogErrorAndShowMessage(ex);
            return null;
        }
    }

加载事件像这样麻烦。它通常在调用表单的Show()方法时激发。但是,如果表单构造函数中的初始化代码要求创建本机窗口,那么它可能会提前触发。非常不健康,因为表单对象尚未完全初始化。通过在Load事件处理程序中设置断点并查看调试器的“调用堆栈”窗口,您始终可以了解代码是如何做到这一点的

通常,您应该避免Load事件,只有在少数情况下需要知道窗口的实际大小时才需要Load事件。其他所有内容都属于构造函数,就像普通.NET类一样。您需要做一些关于捕获和记录异常的事情,最好使用类工厂来完成。样板厂可能是这样的:

    public static Form1 CreateInstance() {
        try {
            var frm = new Form1();
            frm.Show();
            return frm;
        }
        catch (Exception ex) {
            LogErrorAndShowMessage(ex);
            return null;
        }
    }

谢谢,我希望你能来。事实上,我有这样一个类,请看编辑帖子,告诉我你认为这会起作用吗?很明显,你已经有了一个处理构造函数抛出的异常的好地方。因此,只需将代码从加载事件处理程序移到构造函数中即可。谢谢。非常感谢。谢谢,我希望你能来。事实上,我有这样一个类,请看编辑帖子,告诉我你认为这会起作用吗?很明显,你已经有了一个处理构造函数抛出的异常的好地方。因此,只需将代码从加载事件处理程序移到构造函数中即可。谢谢。非常感谢。这可能是一个愚蠢的问题,但是你能把你的代码从表单加载方法转移到表单的构造函数中吗?如果表单未显示/显示,您将不会遇到句柄错误…我还没有真正考虑过这一点。我不确定构造器是不是合适的地方。我想这是可能的。这可能是一个愚蠢的问题,但是你能把你的代码从Form_Load方法转移到Form的构造函数中吗?如果表单未显示/显示,您将不会遇到句柄错误…我还没有真正考虑过这一点。我不确定构造器是不是合适的地方。我想这是可能的。