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

时间:2020-03-05 18:39:17  来源:igfitidea点击:

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

我已经将ListView类细分为模板化的SortableListView <T>类,因此它在显示内容和排序方面可能会更聪明。

不幸的是,这似乎破坏了VS2005和2008中的Visual Studio Forms Designer。

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

  • 找不到类型" 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类移至单独的程序集中,以便可以单独进行编译,但这没有什么区别。

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

解决方案

回答

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

using My.Other.Namespace;

设计器生成的代码文件的顶部。恼人的是,当设计师重新生成页面时,它一直被吹走。

回答

包含MyApp.Controls.SortableListView的程序集是否没有在GAC中安装?

回答

当我们添加列表视图时,是否将其添加到工具箱中,然后将其添加到表单中?

回答

when you added the listview, did you add it to the toolbox and then add it to the form?

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

怀疑可能是由于泛型导致的,这使我实际找到了解决方案。

对于需要为其创建SortableListView的每个类,我都定义了一个"存根类",如下所示

class ImagesListView : SortableListView<Image> { }

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

现在可以使用了,万岁!

值得庆幸的是,我能够做到这一点,因为我的所有类型都是预先知道的,而我仅将SortableListView用作减少重复代码的方法。

回答

我有一个类似的用户控件,它指的是远程服务(我不能保证在设计时就可用)。

MSDN上的这篇帖子建议我添加

if (this.DesignMode) return;

控件的Load函数,或者在我的情况下是WCF客户端初始化之前的那一点。做到了。

所以

private readonly Client _client = new Client();

变成

private Client _client;

public new void Load()
{
    if(DesignMode) return;
    _client = new Client();
}