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

时间:2008-08-12 23:17:01

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

我有一个.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类转换为单独的程序集,以便可以单独编译,但这没有区别。

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

11 个答案:

答案 0 :(得分:24)

因为x86 / x64架构而发生在我身上。

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

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

答案 1 :(得分:6)

我曾经遇到过这样的问题(不一样)过去我的控件在我的表单的不同命名空间中,即使它在同一个项目中也是如此。为了解决这个问题,我必须添加一个

using My.Other.Namespace;

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

答案 2 :(得分:6)

  

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

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

怀疑它可能是由于仿制药导致我实际找到了解决方案。

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

class ImagesListView : SortableListView<Image> { }

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

它现在有效,万岁!

幸运的是,我能够这样做,因为我的所有类型都是预先知道的,而我只是使用SortableListView作为减少重复代码的方法。

答案 3 :(得分:5)

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

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

答案 4 :(得分:2)

也许你忘了添加:

    /// <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
        // ...
    }

答案 5 :(得分:2)

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

答案 6 :(得分:2)

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

答案 7 :(得分:1)

我有类似的东西 - 用户控件指的是远程serice(我无法保证在设计时可用)。

This post on 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();
}

答案 8 :(得分:1)

我有同样的问题。在我的情况下,这个问题是由于资源初始化。我将以下代码从InitializeComponent方法移至ctor(调用InitializeComponent后)。之后,这个问题得到了解决:

this->resources = (gcnew System::ComponentModel::ComponentResourceManager(XXX::typeid));

答案 9 :(得分:1)

我遇到了同样的问题。删除我自己的* .Designer.cs文件控件之后问题就解决了。回到原始代码后,问题仍然解决了。所以它似乎是Visual Sudio缓存的一个问题。目前我无法重现这个问题。

如果您遇到问题,请尝试移植文件夹

C:\用户\ YOURNAME \应用程序数据\本地\微软\ VisualStudio的\ VERSION \设计\ ShadowCache

有效吗?

答案 10 :(得分:-3)

在我的情况下,问题是我的项目的文件夹名称!为什么我这么想: 我使用SVN并在'trunk \ SGIMovel'中完美运行。但是在名为“OS#125 \ SGIMovel”的分支文件夹中,我无法打开设计器以获取使用自定义控件并在trunk文件夹中工作的表单。

离开#并且工作得很好。

谢谢你。