Classe di base generica per WinForm UserControl

Ho creato una class base generica per un controllo utente WinForm:

public partial class BaseUserControl : UserControl { public virtual void MyMethod() { // some base stuff here } } 

E un UserControl basato su quello:

 public partial class MyControl : BaseUserControl { public override void MyMethod() { // some specific stuff here base.MyMethod(); } } 

Funziona bene, ma MyControl non può essere modificato in VisualStudio Designer, perché dice che non può caricare la class base. Ho provato a definire un’altra class BaseUserControl, non generica, sperando che la caricasse, ma il trucco non sembra funzionare.

Ho già una soluzione alternativa: definire un’interfaccia, IMyInterface e quindi creare il mio controllo come

 public partial class MyControl : UserControl, IMyInterface 

Ma perdo i miei metodi virtuali di base (non un grosso problema, ma ancora …).

C’è un modo per creare una class generica di base per un UserControl, con la possibilità di modificarlo in VisualStudio Designer?

Stiamo facendo la stessa cosa e lavoriamo specializzandoci prima su una class e derivando dalla class specializzata. Usando il codice del tuo esempio questo significa qualcosa come:

 public partial class UserControl : UserControlDesignable { ... } public class UserControlDesignable : BaseUserControl { } 

A volte il designer agisce ancora a disagio, ma la maggior parte delle volte funziona.

Dovrai ingannare il progettista aggiungendo una class ‘normale’ che eredita dal tuo modulo base generico. Il tuo modulo designabile dovrebbe quindi ereditare da questa class. Le seguenti 2 definizioni di class sono quindi nello stesso file. Dovrai assicurarti che la class che eredita dal controllo utente di base generico sia l’ultima class nel file.

 public MyForm : EditableCustomerForm {} public EditableCustomerForm : GenericForm {} 

Il progettista visualizzerà la prima class nel file di codice che incontra.

Bene, questo sembra essere un bug in Visual Studio.

Scavando nel framework (in realtà aggiungendo un RootDesignerSerializer con un tipo personalizzato derivato da CodeDomSerializer e sovrascrivendo il metodo serialize ), sono stato in grado di provare che il provider del VS Code Dom sta effettivamente analizzando erroneamente le classi generiche e invece di considerarlo come una class generica lo considera come una class regolare con la class name class , che Type.GetType() può ovviamente trovare.

Sto ancora cercando un modo per aggirarlo, ma nel frattempo si possono usare le soluzioni di cui sopra.

C’è una segnalazione di bug Microsoft.Connect su di esso, si prega di votare su https://connect.microsoft.com/VisualStudio/feedback/details/797279/win-forms-designer-error-when-inheriting-from-a- generic-modulo

Versione di Visual Studio> = VS2015.1

A partire da VS2015.1 , Windows Form Designer mostra le classi che hanno una class base generica senza problemi. Quindi la soluzione alternativa che è in altri post non è più necessaria per le versioni più recenti di VS e la class seguente verrà visualizzata in Designer senza alcun problema:

 public class SomeClassControl:GenericControl { } 

Versioni precedenti di Visual Studio

Per le versioni precedenti di Visual Studio, utilizza la soluzione alternativa descritta in altri post:

 public class SomeClassControl:SomeClassControlBase { } public class SomeClassControlBase:GenericControl{}