派生类认为我的基类被删除了
c#
我试图创建一个派生的 WinForm 类,但我有一个问题:当我尝试创建我的 DerivedClass(通过添加 > 新元素 > 派生表单)时,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 的接口生成派生类(Add > New Element>Derived Form)——
啊哈现在事情对我来说越来越清楚了。
在 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
}
}