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

Ori*_*rds 33 .net c# visual-studio-2005 visual-studio-2008 winforms

我有一个.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) 
Run Code Online (Sandbox Code Playgroud)

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

this.imagesTab.Controls.Add( this.listViewImages );
Run Code Online (Sandbox Code Playgroud)

listViewImages声明为

private MyApp.Controls.SortableListView<Image> listViewImages;
Run Code Online (Sandbox Code Playgroud)

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

this.listViewImages = new MyApp.Controls.SortableListView<Image>();
Run Code Online (Sandbox Code Playgroud)

正如前面提到的,程序编译和运行完美,我已经尝试将SortableListView类转换为单独的程序集,因此它可以单独编译,但这没有区别.

我不知道从哪里开始.任何帮助,将不胜感激!

Val*_*Val 28

它发生在我身上,因为x86/x64架构.

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

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

  • 果然,将我的目标CPU更改为x86为我解决了这个问题.谢谢! (4认同)
  • 这是微软的完全BS. (4认同)
  • 我真的想要一个x64版本的Visual Studio. (4认同)
  • 与 2017 年相比,仍然...... (2认同)
  • 这个解决方案引导我走上了正确的道路!即使在 VS 2019 中,包含表单的项目也应该真正以“AnyCPU”为目标,如果您必须从用户控件或重写控件调用 x64 库,请通过检查控件的“DesignMode”属性来保护该调用,并且如果控件在成员变量中使用 x64 代码中的类型,您需要将它们转换为“对象”类型,并根据需要在函数中进行强制转换。请记住,Windows 窗体设计器将尝试实例化该类。 (2认同)

Ori*_*rds 8

当您添加listview时,是否将其添加到工具箱中,然后将其添加到表单中?

不,我刚刚编辑Main.Designer.cs并将其更改System.Windows.Forms.ListViewMyApp.Controls.SortableListView<Image>

怀疑它可能是由于泛型使我真正找到了解决方案.

对于我需要为其创建SortableListView的每个类,我定义了这样的"存根类"

class ImagesListView : SortableListView<Image> { }
Run Code Online (Sandbox Code Playgroud)

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

它现在有效,万岁!

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


lom*_*axx 6

在过去,我有一个像这样的问题(不一样)我的控件在我的表单的不同命名空间中,即使它在同一个项目中.为了解决它,我不得不添加一个

using My.Other.Namespace;
Run Code Online (Sandbox Code Playgroud)

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


Mar*_*ata 5

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

要清楚,您需要首先修复所有代码合并问题.这只是迫使VS重新加载它们的工作.

  • 这是不正确的.如果您收到任何这些警告,则图形视图会被破坏.什么都不会显示,所以你不能"移动一些东西来神奇地修复它".op正在抱怨,只有一个错误列表,没有gui. (4认同)