我有一个.NET 2.0 Windows窗体应用程序,它大量使用了ListView控件。
我已经将ListView类子类化为模板化的SortableListView< T >类,因此在如何显示事物以及对自身进行排序方面可能会更聪明。
不幸的是,这似乎破坏了VS2005和2008中的Visual Studio Forms Designer。
该程序可以编译并正常运行,但是当我尝试在设计器中查看拥有的表单时,出现以下错误:
-
找不到类型" MyApp.Controls.SortableListView"。请确保引用了包含此类型的程序集。如果此类型是开发项目的一部分,请确保已成功构建该项目。
没有可用于此错误的堆栈跟踪或错误行信息
-
变量" listViewImages"未声明或从未分配。
在MyApp.Main.Designer.cs行:XYZ列:1
1 2 3 4 5
| 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) |
有问题的代码行是将其实际添加到表单的位置,并且是
1
| this.imagesTab.Controls.Add( this.listViewImages ); |
listViewImages声明为
1
| private MyApp.Controls.SortableListView<Image> listViewImages; |
并在InitializeComponent方法中实例化如下:
1
| this.listViewImages = new MyApp.Controls.SortableListView<Image>(); |
如前所述,该程序可以编译并完美运行,并且我尝试将SortableListView类移至单独的程序集中,以便可以单独进行编译,但这没有什么区别。
我不知道从这里去哪里。任何帮助,将不胜感激!
由于x86 / x64体系结构,这件事发生在我身上。
由于Visual Studio(开发工具本身)没有x64版本,因此无法将x64控件加载到GUI设计器中。
最好的方法可能是在x86下调整GUI,并在必要时针对x64进行编译。
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
怀疑可能是由于泛型导致的,这使我实际找到了解决方案。
对于需要为其创建SortableListView的每个类,我都定义了一个"存根类",如下所示
1
| class ImagesListView : SortableListView<Image> { } |
然后使Main.Designer.cs文件引用这些存根类而不是SortableListView。
现在可以使用了,万岁!
值得庆幸的是,我能够做到这一点,因为我的所有类型都是预先知道的,而我只使用SortableListView作为减少重复代码的方法。
过去我遇到过这样的问题(不尽相同),其中我的控件位于与表单不同的名称空间中,即使它位于同一项目中。要修复它,我必须添加一个
1
| using My.Other.Namespace; |
设计器生成的代码文件的顶部。恼人的是,当设计师重新生成页面时,它一直被吹走。
我也有这个问题,与* .Designer.cs文件中合并大量SVN更改(有冲突)有关。解决方案是仅以图形方式打开设计视图,编辑控件(将其向左然后向右移动)并重新保存设计。 * .Designer.cs文件进行了神奇的更改,并且在下一次编译时警告消失了。
为了清楚起见,您需要首先解决所有代码合并问题。这只是迫使VS重新加载它们的一种解决方法。
也许您忘了补充:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| /// <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
// ...
} |
当您添加列表视图时,是否将其添加到工具箱中,然后将其添加到表单中?
包含MyApp.Controls.SortableListView的程序集是否没有在GAC中安装?
我曾经也有过一样的问题。删除了我自己的* .Designer.cs-File控件后,问题解决了。回到原始代码后,问题仍然得以解决。因此,Visual Sudio缓存似乎是一个问题。目前,我无法重现此问题。
如果遇到问题,请尝试清空该文件夹
C: Users 您的NAME AppData Local Microsoft VisualStudio VERSION Designer ShadowCache
奏效了吗?
我遇到过同样的问题。就我而言,此问题是由于资源初始化引起的。我将以下代码从InitializeComponent方法移动到ctor(调用InitializeComponent之后)。之后,此问题得以解决:
1
| this->resources = (gcnew System::ComponentModel::ComponentResourceManager(XXX::typeid)); |
我有类似的东西-用户控件是指远程服务(我不能保证在设计时就可用)。
MSDN上的这篇文章建议我添加
1
| if (this.DesignMode) return; |
控件的Load功能,或者在WCF客户端初始化之前。做到了。
所以
1
| private readonly Client _client = new Client(); |
变成
1 2 3 4 5 6 7
| private Client _client;
public new void Load()
{
if(DesignMode) return;
_client = new Client();
} |
就我而言,问题是我项目的文件夹名称!为什么我这样认为:
我使用SVN,并且在" trunk SGIMovel"中运行完美。但是在名为" OS#125 SGIMovel"的分支文件夹中,我无法打开使用自定义控件并可以在主干文件夹中使用的表单的设计器。
刚下车,效果很好。
不用了,谢谢。