C# 派生类认为我的基类已被删除

C# 派生类认为我的基类已被删除,c#,.net,visual-studio,winforms,C#,.net,Visual Studio,Winforms,我尝试使用标准(添加>新元素>派生表单)方式生成从MyWinForm派生的类。但是我得到的消息只存在于我的MyWinForm\u Load中,即消息框中的消息 protected void MyWinForm_Load(object sender, EventArgs e) { PortCom = new SerialCom(350); if (PortCom.Com_Configuration() != 0) {

我尝试使用标准(添加>新元素>派生表单)方式生成从MyWinForm派生的类。但是我得到的消息只存在于我的
MyWinForm\u Load
中,即消息框中的消息

    protected void MyWinForm_Load(object sender, EventArgs e)
    {
        PortCom = new SerialCom(350);

        if (PortCom.Com_Configuration() != 0)
        {
            MessageBox.Show(PortCom.ErrorMsg, "Erreur", MessageBoxButtons.OK, 0, 0, MessageBoxOptions.RightAlign);
            Close();
        }

    }
然后,设计器工具告诉我,我的对象
MyWinForm
不存在,但它还不应该被创建

为什么它告诉我,当我试图创建派生类时,我的对象被删除了

通过Visual Studio的接口生成派生类(添加> 新元素>派生形式)–

啊哈,现在我越来越清楚了。
当您在visual studio中派生表单,并在设计器中打开该派生表单时,将执行基本表单(您从中继承的父表单)上的一些代码。
我并不知道所有的方法,但我相信当您在设计时在设计器中加载继承的表单时,例如,
load
事件将在基本表单中执行。
这不是VS的缺陷,这是出于设计。其思想是,当您创建自定义用户控件时,用户控件中的代码也可以在设计时执行。
从另一个表单继承表单对设计者来说是一样的

如果您在设计时与否,您可以做的是签入基本表单的代码

我通过在我的基本表单上添加此方法来实现这一点

 protected bool IsInDesignMode
 {
     get { return DesignMode || LicenseManager.UsageMode == LicenseUsageMode.Designtime; }
 }
你可以这样使用它

    private void FormBase_Load(object sender, EventArgs e)
    {
        if (IsInDesignMode == false)
        {
            // write code here that should only run at runtime
        }
    }

我尝试将Close()放在注释中,得到了相同的结果,为什么它会在创建类时启动函数而不是在编译时启动?在我否决一个问题之前需要花费很多时间,但我必须同意,这个问题很难理解。我很难弄清楚你的问题到底是什么。你能不能试着解释一下,问题出在哪里?我的问题是,由于一个不确定的原因,我无法生成派生类。为什么在我生成类而不是编译它时调用我的函数?还有,很抱歉这个术语,我英语不太好,而且对C#@yunnosch还不熟悉。我只是想在这里更好地提问,这不是我自己-evident@Prim我想你对WinForms的工作原理很困惑,而且很难知道如何更具体地帮助你,因为你提供的信息无法解释你想做什么以及为什么你认为你看到的行为是错误的。我可以说1)您看到的问题与访问修饰符无关2)编写与封闭表单交互的代码将不起作用3)这也与编译无关,因为如果代码没有编译,那么你就无法运行应用程序了。希望一些文档可以更好地为你解释:解释这些功能的作用和不作用-它们只与编译相关,而不是在运行时-解释表单的生命周期,并且应该解释如果你想与表单交互,为什么
Close()
ing表单是错误的