我有一个.NET 2.0 Windows窗体应用程序,它大量使用ListView
控件。
我已将ListView
类子类化为模板SortableListView<T>
类,因此它可以更明智地显示它是如何显示事物并对其进行排序。
不幸的是,这似乎打破了VS2005和2008中的Visual Studio Forms Designer。
程序编译并运行正常,但是当我尝试在设计器中查看拥有的表单时,我得到了这些错误:
此错误没有可用的堆栈跟踪或错误行信息
在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
类转换为单独的程序集,以便可以单独编译,但这没有区别。
我不知道从哪里开始。任何帮助将不胜感激!
答案 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)
GAC中没有安装包含MyApp.Controls.SortableListView的程序集吗?
答案 5 :(得分:2)
当您添加listview时,是否已将其添加到工具箱中,然后将其添加到表单中?
答案 6 :(得分: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
// ...
}
答案 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文件夹中工作的表单。
离开#并且工作得很好。
谢谢你。