我知道这是一个老话题,但这些事情又会发生,所以我认为我的贡献将来可能会有用。
Emiswelt 说:“您将需要一个不带参数的构造函数,它在每个表单中调用 InitializeComponent() 方法。” 这并不是真正需要的。您可以在派生表单上声明自定义参数化构造函数并正常调用“InitializeComponent”方法(也可以调用自定义构造函数)。重要的是您的构造函数调用“InitializeComponent”(用于新控件)和基本构造函数调用“InitializeComponent”(用于继承的组件)。这种情况在运行时会起作用,但您不会在 Visual Studio 设计器上看到继承的控件。要在设计时显示所有控件,您应该只在基类中添加一个不带参数的简单构造函数。
例如,如果您的基础是一个带有一个按钮和两个单选按钮的表单:
using System.Windows.Forms;
namespace Test
{
public partial class Form1 : Form
{
public Form1(string foo)
{
//use "foo" here
InitializeComponent(); //here button and radios will be initialized
}
}
}
您可以在设计工具上看到它,并且您可以毫无问题地避免空白构造函数(没有参数)。Form2 现在继承自 Form1:
namespace Test
{
public partial class Form2 : Form1
{
public Form2(string foo) : base(foo)
{
//you can use "foo" here even if it is passed to base class too
InitializeComponent();
}
}
}
没有空白的构造函数,它将正常编译和运行。在 rutime,您的 Form2 将显示与 Form1 相同的控件集。但是...您在设计时看不到它,因为 Visual Studio 无法识别“InitializeComponent”方法的位置并显示错误。为什么?因为在调用链的某处应该有一个没有参数的构造函数。解决方案是对基类进行简单修改:
using System.Windows.Forms;
namespace Test
{
public partial class Form1 : Form
{
public Form1(string foo):base()
{
//use foo here
}
public Form1() //Visual studio designer likes this!
{
InitializeComponent();
}
}
}
就这样。