在使用Windows Forms设计器时出现以下错误:
设计器错误:"CCDCount.DLL.CanBus.CanOpenSlaveDevice"不具有带有 Int32 类型参数的构造函数。
Windows Forms设计器在序列化窗体时会尝试处理所有成员变量。当遇到以下情况时会报错:
InitializeComponent() 方法中创建对象CanOpenSlaveDevice 只有带参数的构造函数private void InitializeComponent()
{
// ... UI控件初始化 ...
// ❌ 错误:在设计器生成的方法中创建业务对象
m_slaveDevice = new CanOpenSlaveDevice(nodeId: 1);
// ❌ 错误:注册事件处理
m_slaveDevice.OnRpdoReceived += SlaveDevice_OnRpdoReceived;
// ...
}
public SlaveTestForm()
{
InitializeComponent();
// ✅ 正确:在构造函数中创建,并检查DesignMode
if (!DesignMode)
{
m_slaveDevice = new CanOpenSlaveDevice(nodeId: 1);
// 注册事件
m_slaveDevice.OnRpdoReceived += SlaveDevice_OnRpdoReceived;
m_slaveDevice.OnNmtStateChanged += SlaveDevice_OnNmtStateChanged;
m_slaveDevice.OnSdoReadRequest += SlaveDevice_OnSdoReadRequest;
m_slaveDevice.OnSdoWriteRequest += SlaveDevice_OnSdoWriteRequest;
// 初始化日志
AppendLog("CANopen从站测试程序已启动");
AppendLog("节点ID: " + m_slaveDevice.NodeId.ToString());
AppendLog("点击'启动从站'按钮开始测试\n");
}
}
private void InitializeComponent()
{
// ✅ 仅包含UI控件的初始化代码
this.Text = "CANopen从站设备测试";
// ... 其他UI控件初始化 ...
}
DesignMode 是 Component 类的属性,用于判断当前是否处于设计器模式。
true:正在Visual Studio设计器中查看窗体false:程序正在运行时执行if (!DesignMode)
{
// 仅在运行时执行的代码
// - 创建业务对象
// - 连接数据库
// - 启动定时器
// - 注册事件
}
```csharp // ✅ InitializeComponen