10

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

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

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

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

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

并且派生类的设计器不会加载。我尝试重新启动 vs2010beta,重新创建派生形式,但似乎没有任何帮助。谷歌在这个问题上没有为我提供任何有用的结果。:(

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

4

6 回答 6

26

您将需要一个不带参数的构造函数,它在每个表单中调用 InitializeComponent() 方法。然后关闭设计器窗口,重建解决方案并尝试重新打开设计器。那应该行得通。重建解决方案至关重要。

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

于 2009-08-01T16:37:38.617 回答
3

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

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();
        }
    }
}

就这样。

于 2015-07-30T15:47:01.923 回答
1

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

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

于 2015-04-02T02:39:27.447 回答
0

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

于 2020-10-30T23:49:31.810 回答
0

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

  1. 打开项目属性(项目 -> 属性 -> 构建)打开属性
  2. 将“平台目标”设置为“任何 CPU”设置平台
  3. 从“Form1”类继承“Form2”类
  4. 重建项目重建

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

就这样。

于 2021-05-28T17:39:44.667 回答
-4

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

于 2020-02-26T18:54:37.087 回答