【问题标题】:"Could not find type" error loading a form in the Windows Forms Designer在 Windows 窗体设计器中加载窗体时出现“找不到类型”错误
【发布时间】: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 类移出一个单独的程序集,以便可以单独编译,但这没有区别。

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

【问题讨论】:

    标签: c# .net winforms visual-studio-2008 visual-studio-2005


    【解决方案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”的分支文件夹中,我无法打开使用自定义控件并在主干文件夹中工作的表单的设计器。

              只要下车 # 就可以了。

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2023-03-12
                • 2011-05-25
                • 1970-01-01
                • 2022-12-11
                • 1970-01-01
                • 2012-10-31
                • 2020-09-01
                • 1970-01-01
                相关资源
                最近更新 更多