我在C#应用程序中有几种形式。我使用Visual Studio 2010 Beta,但是使用.NET 3.5和C#3。
我有一个基本表单,在Shd命名空间中称为FilteredQueryViewForm,我想要一些其他表单来继承它(因为它们基本上会做同样的事情,但有一些补充)。
我在FilteredQueryViewForm类中将内容从private更改为protected,因此可以从派生表单中访问它们。在此之后,我创建了一个派生表单,并将基类设置为FilteredQueryViewForm。
派生类的设计者抱怨Shd.FilteredQueryViewForm没有任何构造函数......无论它有一个具有3个参数的事实。我认为参数可能是一个问题,所以我还创建了一个没有参数的(公共的,当然)构造函数,但它仍然不起作用。错误消息是相同的:
“未找到类型'Shd.FilteredQueryViewForm'的构造函数。”
派生类的设计者不会加载。 我已经尝试重新启动vs2010beta,重新创建派生表单,但似乎没有任何帮助。谷歌在这个问题上没有给我带来任何有用的结果。 :(
这是Visual Studio 2010 Beta的问题吗?或者我做错了什么?
答案 0 :(得分:21)
您将需要一个没有参数的构造函数,这些构造函数在每个表单中调用InitializeComponent()方法。 然后关闭设计器窗口,重建解决方案并尝试重新打开设计器。这应该工作。重建解决方案至关重要。
问题是,如果你创建一个继承自Shd.FilteredQueryViewForm的表单,设计器将尝试调用父表单的构造函数,但是它不是从代码加载这个表单而是从它的构建程序集加载。
答案 1 :(得分:2)
我知道这是一个古老的话题,但这些事情又发生了,所以我认为我的贡献可能在将来有用。
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();
}
}
}
这就是全部。
答案 2 :(得分:1)
我认为你的意思是你添加基类时你的Form1.cs [design]没有更新。我有同样的问题。奇怪的是,当你按下start时,程序会运行得很好,当你运行它时,你会在你的Form上看到你的基类组件,但是当你处于编辑模式时则不会。
只需双击解决方案资源管理器上的Form1.cs即可。它对我有用。
答案 3 :(得分:0)
确保在使用“ AnyCPU”构建选项编译的程序集中定义了基本表单。
答案 4 :(得分:0)
我已经尝试了所有其他答案,但就我而言,问题出在项目属性中。 (我已经在默认的新 WinForms 项目中进行了实验)
我的项目在 .NET Framework 4.7.1 目标框架上
仅此而已。
答案 5 :(得分:-4)
我遇到了类似的问题,但与基本表单的_Load方法中的代码相关的异常不同,因此没有一个解决方案对我有帮助。设计时有一个例外,运行时不会发生(空值引用另一个类的静态实例)。我的解决方案是对该方法中的所有代码抛出try-catch块。