.NET继承(WinForms)表单 - VS设计器问题

时间:2009-08-01 16:26:36

标签: c# winforms visual-studio-2010-beta-1 visual-inheritance

我在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的问题吗?或者我做错了什么?

6 个答案:

答案 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即可。它对我有用。 Do this

答案 3 :(得分:0)

确保在使用“ AnyCPU”构建选项编译的程序集中定义了基本表单。

答案 4 :(得分:0)

我已经尝试了所有其他答案,但就我而言,问题出在项目属性中。 (我已经在默认的新 WinForms 项目中进行了实验)

  1. 打开项目属性(project -> properties -> Build)Open properties
  2. 将“平台目标”设置为“任何 CPU”Set platform
  3. 从“Form1”类继承“Form2”类Inherit
  4. 重建项目 Rebuild

我的项目在 .NET Framework 4.7.1 目标框架上

仅此而已。

答案 5 :(得分:-4)

我遇到了类似的问题,但与基本表单的_Load方法中的代码相关的异常不同,因此没有一个解决方案对我有帮助。设计时有一个例外,运行时不会发生(空值引用另一个类的静态实例)。我的解决方案是对该方法中的所有代码抛出try-catch块。