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



我试图创建派生的WinForm类,但我遇到了一个问题:当我试图创建DerivedClass(通过Add>新元素>派生窗体(时,Visual studio告诉我该对象不存在

我确信关系到的对象是BaseForm,因为我在控制台中看到了Setting Error消息。(我的猜测是因为调用了Close()函数(

public partial class BaseForm : Form
{
Port port;
public BaseForm()
{
InitializeComponent();
}
protected void Form1_Load(object sender, EventArgs e)
{
port = new Port();
if (port.Port_Setting() != 0)
{
Console.WriteLine("Setting Error");
Close();
}
}
}

目前,BaseForm是空的,只是一个没有添加组件的表单。

到目前为止,我的Port类唯一使用的部分是这个,只是初始化它以供进一步使用:

class Port
{
protected SerialPort sp = new SerialPort();
public int Port_Setting()
{
Console.WriteLine("Setting port");
if (sp.IsOpen)
{
sp.Close();
}
sp.BaudRate = 38400;
sp.DataBits = 8;
sp.StopBits = System.IO.Ports.StopBits.One;
sp.Parity = System.IO.Ports.Parity.None;
sp.PortName = "COM3";
bool Error = false;
try
{
sp.Open();
}
catch (UnauthorizedAccessException) { Error = true; }
catch (ArgumentException) { Error = true; }
catch (System.IO.IOException) { Error = true; }
if (Error)
{
return -1;
}
return 0;
}
}

通过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
}
}

最新更新