在 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<Image>
怀疑这可能是由于泛型导致我真正找到了解决方案。
对于我需要为其创建 SortableListView 的每个类,我都定义了一个像这样的“存根类”
class ImagesListView : SortableListView<Image>
然后让Main.Designer.cs
文件引用这些存根类而不是SortableListView
。
现在可以了,万岁!
谢天谢地,我能够做到这一点,因为我的所有类型都是预先知道的,而且我只使用 SortableListView
作为减少重复代码的方法。
【讨论】:
嗨 Orion...我遇到了与您上面提到的相同的问题...我无法理解部分“对于我需要为其创建 SortableListView 的每个类,我定义了一个'stub class' 像此类 ImagesListView :SortableListView过去我遇到过这样的问题(尽管不一样),我的控件与我的表单位于不同的命名空间中,即使它位于同一个项目中。要修复它,我必须添加一个
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编译器加载时出现找不到方法,无法显示该程序窗体设计器
使用 C# windows 窗体向 Ms Access 数据库插入新记录时出现语法错误