在Windows窗体设计器中加载窗体时出现"找不到类型"错误
我有一个.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(); }