在 Windows 窗体设计器中加载窗体时出现“找不到类型”错误

Posted

技术标签:

【中文标题】在 Windows 窗体设计器中加载窗体时出现“找不到类型”错误【英文标题】:"Could not find type" error loading a form in the Windows Forms Designer 【发布时间】:2010-09-05 18:38:29 【问题描述】:

我有一个 .NET 2.0 Windows 窗体应用程序,它大量使用了 ListView 控件。

我已将 ListView 类子类化为模板化的 SortableListView<T> 类,因此它可以更智能地显示事物并自行排序。

不幸的是,这似乎破坏了 VS2005 和 2008 中的 Visual Studio 窗体设计器。

程序编译并运行良好,但是当我尝试在设计器中查看拥有表单时,出现以下错误:

找不到类型“MyApp.Controls.SortableListView”。请确保引用了包含此类型的程序集。如果此类型是您开发项目的一部分,请确保项目已成功构建。

没有可用于此错误的堆栈跟踪或错误行信息

变量“listViewImages”要么未声明,要么从未赋值。

在 MyApp.Main.Designer.cs 行:XYZ 列:1

Call stack:
at System.ComponentModel.Design.Serialization.CodeDomSerializerBase.Error(IDesignerSerializationManager manager, String exceptionText, String helpLink)
at System.ComponentModel.Design.Serialization.CodeDomSerializerBase.DeserializeExpression(IDesignerSerializationManager manager, String name, CodeExpression expression)
at System.ComponentModel.Design.Serialization.CodeDomSerializerBase.DeserializeExpression(IDesignerSerializationManager manager, String name, CodeExpression expression)
at System.ComponentModel.Design.Serialization.CodeDomSerializerBase.DeserializeStatement(IDesignerSerializationManager manager, CodeStatement statement) 

有问题的代码行是它实际添加到表单的位置,并且是

this.imagesTab.Controls.Add( this.listViewImages );

listViewImages 被声明为

private MyApp.Controls.SortableListView<Image> listViewImages;

并在InitializeComponent方法中实例化如下:

this.listViewImages = new MyApp.Controls.SortableListView<Image>();

如前所述,程序编译和运行完美,我尝试将SortableListView 类移出一个单独的程序集,以便可以单独编译,但这没有区别。

我不知道从这里去哪里。任何帮助将不胜感激!

【问题讨论】:

【参考方案1】:

这发生在我身上是因为 x86 / x64 架构。

由于 Visual Studio(开发工具本身)没有 x64 版本,因此无法将 x64 控件加载到 GUI 设计器中。

最好的方法可能是在 x86 下调整 GUI,并在必要时为 x64 编译它。

【讨论】:

果然,将我的目标 CPU 更改为 x86 为我解决了这个问题。谢谢! 这对微软来说是完全的废话。 我真的想要一个 x64 版本的 Visual Studio。 这个解决方案让我走上了正确的道路!即使在 VS 2019 中,包含表单的项目也应该真正以“AnyCPU”为目标,如果您必须从用户控件或覆盖的控件调用 x64 库,请通过检查控件的 DesignMode 属性来保护该调用,如果控件is 在成员变量中使用 x64 代码中的类型,您需要将它们转换为 object 类型并在函数中根据需要进行强制转换。请记住,Windows 窗体设计器将尝试实例化该类。【参考方案2】:

添加listview的时候,是不是先添加到工具箱,然后再添加到表单中?

不,我刚刚编辑了Main.Designer.cs,并将其从System.Windows.Forms.ListView 更改为MyApp.Controls.SortableListView&lt;Image&gt;

怀疑这可能是由于泛型导致我真正找到了解决方案。

对于我需要为其创建 SortableListView 的每个类,我都定义了一个像这样的“存根类”

class ImagesListView : SortableListView<Image>  

然后让Main.Designer.cs 文件引用这些存根类而不是SortableListView

现在可以了,万岁!

谢天谢地,我能够做到这一点,因为我的所有类型都是预先知道的,而且我只使用 SortableListView 作为减少重复代码的方法。

【讨论】:

嗨 Orion...我遇到了与您上面提到的相同的问题...我无法理解部分“对于我需要为其创建 SortableListView 的每个类,我定义了一个'stub class' 像此类 ImagesListView :SortableListView “你做了什么来解决这个问题?你能详细解释一下吗?您是否创建了另一个新类,然后将其引用到 Designer.cs ? 显然有 9 个人理解这一点并使其为他们工作。谁能解释一下做什么,比如 Gowtham 我不明白该怎么做?【参考方案3】:

过去我遇到过这样的问题(尽管不一样),我的控件与我的表单位于不同的命名空间中,即使它位于同一个项目中。要修复它,我必须添加一个

using My.Other.Namespace;

到顶部设计器生成的代码文件。令人讨厌的是,当设计师重新生成页面时,它总是被吹走。

【讨论】:

VS2013 中的同样问题,最终通过将构建目标平台从 x64 更改为 Any CPU 来解决。删除 bin 和 obj 目录会导致更多问题。【参考方案4】:

我也遇到了这个问题,与在 *.Designer.cs 文件中合并大量 SVN 更改(有冲突)有关。解决方案是仅以图形方式打开设计视图,编辑控件(将其向左然后向右移动)并重新保存设计。 *.Designer.cs 文件神奇地改变了,警告在下次编译时消失了。

需要明确的是,您需要先修复所有代码合并问题。这只是强制 VS 重新加载它们的解决方法。

【讨论】:

这根本不是真的。如果您收到任何这些警告,则图形视图已损坏。什么都不会显示,所以你不能“移动一些东西来神奇地修复它”。操作员抱怨的只有一个错误列表,没有 gui。 我强烈反对;这对我来说就像一个魅力(使用框架 4.0)。当最初显示设计者警告时,只显示了几秒钟,然后表格被正确绘制。我添加了一个按钮,删除了按钮,并重建了解决方案;警告全部消失。 Dirk - 你可以认为这不是真的,但这就是发生在我身上的事情。我花了几个小时试图修复它。我希望我仍然拥有 Designer.cs 文件的前后版本,但我没有。显然 Visual Studio 中存在一个错误,它无法正确刷新某些内部元数据,而我发现修复它的唯一方法是通过重新保存图形视图来强制刷新。 如果您认为这不是真的,请不要投反对票。 Visual Studio 缓存设计文件的方式存在错误,这是一种解决方法。当然,您需要先修复错误,然后再解决此问题以使 Visual Studio 能够通过它。 在 VS 2015 中为我工作。设计器代码中的某些内容可能以错误的顺序添加。 (是否先点击“Proceed to Design View”,以便我可以在 Designer 中修改布局。)【参考方案5】:

包含 MyApp.Controls.SortableListView 的程序集不会安装在 GAC 中吧?

【讨论】:

【参考方案6】:

添加listview的时候,是不是先添加到工具箱,然后再添加到表单中?

【讨论】:

【参考方案7】:

也许你忘了补充:

    /// <summary>
    /// Required designer variable.
    /// </summary>
    private System.ComponentModel.IContainer components = null;

    /// <summary>
    /// Release all resources used.
    /// </summary>
    /// <param name="disposing">true if managed resources should be removed otherwise; false.</param>
    protected override void Dispose(bool disposing)
    
        if (disposing && (components != null))
        
            components.Dispose();
        
        base.Dispose(disposing);
    

    private void InitializeComponent()
    
        // ...
        this.components = new System.ComponentModel.Container(); // Not necessarily, if You do not use
        // ...
    

【讨论】:

【参考方案8】:

我也遇到了同样的问题。删除我自己对 *.Designer.cs-File 的一些控件后,问题就解决了。回到原始代码后,问题仍然解决了。所以这似乎是Visual Sudio缓存的问题。目前我无法重现此问题。

如果遇到问题,请尝试清空文件夹

C:\Users\YOURNAME\AppData\Local\Microsoft\VisualStudio\VERSION\Designer\ShadowCache

成功了吗?

【讨论】:

我在加载我在另一台机器上启动的设计器(VS 2017,.NET 4.7.1)时遇到问题。自定义控件设计器很好,编译正常,但是在我删除 ShadowCache 之前,表单设计器无法正确加载。【参考方案9】:

我有类似的东西 - 用户控件指的是远程服务(我不能保证在设计时可用)。

This post on MSDN建议我加

if (this.DesignMode) return;

到控件的加载函数,或者在我的情况下到 WCF 客户端初始化之前的点。那成功了。

所以

private readonly Client _client = new Client();

变成

private Client _client;

public new void Load()

    if(DesignMode) return;
    _client = new Client();

【讨论】:

【参考方案10】:

我有同样的问题。在我的情况下,这个问题是由于资源初始化造成的。我将以下代码从InitializeComponent 方法移动到ctor(在调用InitializeComponent 之后)。之后这个问题就解决了:

this->resources = (gcnew System::ComponentModel::ComponentResourceManager(XXX::typeid));

【讨论】:

【参考方案11】:

在我的情况下,问题是我项目的文件夹名称!为什么我这么认为: 我使用 SVN,并且在 'trunk\SGIMovel' 中完美运行。但是在名为“OS#125\SGIMovel”的分支文件夹中,我无法打开使用自定义控件并在主干文件夹中工作的表单的设计器。

只要下车 # 就可以了。

【讨论】:

以上是关于在 Windows 窗体设计器中加载窗体时出现“找不到类型”错误的主要内容,如果未能解决你的问题,请参考以下文章

C#程序在VS编译器加载时出现找不到方法,无法显示该程序窗体设计器

在 Windows 窗体中加载与显示事件

使用 C# windows 窗体向 Ms Access 数据库插入新记录时出现语法错误

Xcode - 在 AppDelegate 中加载声音时出现 Apple Mach-O 链接器错误

在Python中加载DLL时出现Windows错误1114

Panel 中加载窗体