views:

2282

answers:

7

I have a .NET 2.0 windows forms app, which makes heavy use of the ListView control.

I've subclassed the ListView class into a templated SortableListView<T> class, so it can be a bit smarter about how it displays things, and sort itself.

Unfortunately this seems to break the Visual Studio Forms Designer, in both VS2005 and 2008.

The program compiles and runs fine, but when I try view the owning form in the designer, I get these Errors:

  • Could not find type 'MyApp.Controls.SortableListView'. Please make sure that the assembly that contains this type is referenced. If this type is a part of your development project, make sure that the project has been successfully built.

There is no stack trace or error line information available for this error

  • The variable 'listViewImages' is either undeclared or was never assigned.

At MyApp.Main.Designer.cs Line:XYZ Column: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)

The line of code in question is where it is actually added to the form, and is

this.imagesTab.Controls.Add( this.listViewImages );

listViewImages is declared as

private MyApp.Controls.SortableListView<Image> listViewImages;

and is instantiated in the InitializeComponent method as follows:

this.listViewImages = new MyApp.Controls.SortableListView<Image>();

As mentioned earlier, the program compiles and runs perfectly, and I've tried shifting the SortableListView class out to a seperate assembly so it can be compiled seperately, but this makes no difference.

I have no idea where to go from here. Any help would be appreciated!

+1  A: 

I've had a problem like this (tho not the same) in the past where my control was in a different namespace to my form even tho it was in the same project. To fix it I had to add a

using My.Other.Namespace;

to the top of the designer generated code file. The annoying thing was it kept getting blown away when the designer regenerated the page.

lomaxx
A: 

@lomaxx

To fix it I had to add a using My.Other.Namespace;

Thanks!.

I gave it a go, and also because my Image class (from SortableListView<Image>) references some other namespaces, tried using those other namespaces too, but it unfortunately didn't fix it :-(

Orion Edwards
+1  A: 

The assembly that contains MyApp.Controls.SortableListView isn't installed in the GAC by any chance is it?

lomaxx
A: 

No it's not in the GAC (it's currently just in the .exe, I moved it back).

Tried adding the assembly to the GAC an no win there either.

I'm beginning to think that it's some undocumented limitation where it doesn't understand generics or so on.

Orion Edwards
+1  A: 

when you added the listview, did you add it to the toolbox and then add it to the form?

lomaxx
+3  A: 

when you added the listview, did you add it to the toolbox and then add it to the form?

No, I just edited Main.Designer.cs and changed it from System.Windows.Forms.ListView to MyApp.Controls.SortableListView<Image>

Suspecting it might have been due to the generics led me to actually finding a solution.

For each class that I need to make a SortableListView for, I defined a 'stub class' like this

class ImagesListView : SortableListView<Image> { }

Then made the Main.Designer.cs file refer to these stub classes instead of the SortableListView.

It now works, hooray!

Thankfully I am able to do this because all my types are known at compile-time, and I'm only using the SortableListView as a method of reducing duplicate code.

Orion Edwards
A: 

I had something similar - a user control was referring to a remote serice (which I couldn't guarantee being available at design time).

This post on MSDN suggested that I add

if (this.DesignMode) return;

to the Load function of the control, or in my case to the point before the WCF client was initialised. That did the trick.

So

private readonly Client _client = new Client();

becomes

private Client _client;

public new void Load()
{
    if(DesignMode) return;
    _client = new Client();
}
Unsliced