.NETinheritance(WinForms)表单 – VS设计器问题

我在C#应用程序中有几种forms。 我使用Visual Studio 2010 Beta,但是使用.NET 3.5和C#3。

我有一个基本forms,在Shd命名空间中称为FilteredQueryViewForm,我想要一些其他forms来inheritance它(因为它们基本上会做同样的事情,但有一些补充)。

我在FilteredQueryViewForm类中将内容从private更改为protected,因此可以从派生表单中访问它们。 在此之后,我创建了一个派生表单,并将基类设置为FilteredQueryViewForm。

派生类的设计者抱怨Shd.FilteredQueryViewForm没有任何构造函数……不管它有一个具有3个参数的事实。 我认为参数可能是一个问题,所以我也创建了一个没有参数的(公共的,当然)构造函数,但它仍然不起作用。 错误消息是相同的:

“未找到类型’Shd.FilteredQueryViewForm’的构造函数。”

并且派生类的设计者不会加载。 我已经尝试重新启动vs2010beta,重新创建派生表单,但似乎没有任何帮助。 谷歌在这个问题上没有给我带来任何有用的结果。 🙁

这是Visual Studio 2010 Beta的问题吗? 或者我做错了什么?

您将需要一个没有参数的构造函数,这些构造函数在每个表单中调用InitializeComponent()方法。 然后关闭设计器窗口,重建解决方案并尝试重新打开设计器。 这应该工作。 重建解决方案至关重要。

问题是,如果你创建一个inheritance自Shd.FilteredQueryViewForm的表单,设计器将尝试调用父表单的构造函数,但是它不是从代码加载这个表单而是从它的构建程序集加载。

我知道这是一个古老的话题,但这些事情又发生了,所以我认为我的贡献可能在将来有用。

Emiswelt说:“你需要一个没有参数的构造函数,它可以在你的每个表单中调用InitializeComponent()方法。” 这不是真的需要。 您可以在派生表单上声明自定义参数化构造函数,并通常调用“InitializeComponent”方法(也可以调用自定义构造函数)。 重要的是你的构造函数调用“InitializeComponent”(对于新控件)和基础构造函数调用“InitializeComponent”(对于inheritance的组件)。 这种情况将在运行时工作,但您不会在Visual Studio设计器上看到inheritance的控件。 要在设计时显示所有控件,您应该只在基类中添加一个没有参数的简单构造函数。

例如,如果您的基础是带有按钮和两个单选按钮的表单:

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现在inheritance自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(); } } } 

就这样。

我认为你的意思是你添加基类时你的Form1.cs [design]没有更新。 我有同样的问题。 奇怪的是,当你按下start时程序会运行得很好,你运行它时会在Form上看到你的基类组件,但是当你处于编辑模式时则不会。

只需双击解决方案资源管理器上的Form1.cs即可。 它对我有用。 做这个