Generic base class for WinForm UserControl

Stworzyłem generyczną klasę bazową dla WinForm UserControl:

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

I UserControl oparty na tym:

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

Działa dobrze, ale MyControl nie może być edytowany w VisualStudio Designer, ponieważ mówi, że nie może załadować klasy bazowej. Próbowałem zdefiniować inną klasę BaseUserControl, non generic, mając nadzieję, że ją załaduje, ale ta sztuczka nie działa.

Mam już obejście: zdefiniuj interfejs, IMyInterface, a następnie utwórz moją kontrolę jako

public partial class MyControl : UserControl, IMyInterface<SomeClass>

Ale tracę moje podstawowe metody wirtualne (nic wielkiego, ale i tak...).

Czy istnieje sposób na stworzenie podstawowej klasy generycznej dla kontrolera UserControl, z możliwością jej edycji w VisualStudio Designer?

Author: Filini, 2009-03-24

4 answers

Robimy to samo i pracujemy, specjalizując się najpierw w klasie i czerpiemy z klasy specjalistycznej. Używając kodu z twojego przykładu oznacza to coś w stylu:

public partial class UserControl : UserControlDesignable 
{

...
}
public class UserControlDesignable : BaseUserControl<Someclass> { }

Projektant nadal czasami zachowuje się niepewnie - ale przez większość czasu działa.

 35
Author: bernhardrusch,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-03-24 14:34:23

Będziesz musiał oszukać projektanta, dodając 'zwykłą' klasę, która dziedziczy z ogólnej formy podstawowej. Twoja forma powinna dziedziczyć z tej klasy. Poniższe 2 definicje klas znajdują się więc w tym samym pliku. Musisz się upewnić, że klasa, która dziedziczy z generic base user-control, jest ostatnią klasą w pliku.

public MyForm : EditableCustomerForm
{}

public EditableCustomerForm : GenericForm<Customer>
{}

Projektant wyświetli pierwszą klasę w pliku kodu, który napotka.

 14
Author: Frederik Gheysels,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-03-24 14:27:58

Wygląda na to, że to błąd w Visual studio.

Zagłębiając się w framework (właściwie dodając {[0] } z niestandardowym typem pochodzącym z CodeDomSerializer i nadpisując metodę serialize), byłem w stanie udowodnić, że dostawca VS Code Dom parsuje błędne klasy generyczne i zamiast traktować je jako klasy generyczne, rozważa je jako zwykłą klasę o nazwie class<T>, której Type.GetType() oczywiście nie można znaleźć.

Wciąż szukam sposobu na obejście it, ale w międzyczasie można skorzystać z powyższych rozwiązań.

Jest Microsoft.Podlinkuj stronę :https://connect.microsoft.com/VisualStudio/feedback/details/797279/win-forms-designer-error-when-inheriting-from-a-generic-form
 3
Author: yoel halb,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-08-15 07:26:06

Wersja Visual Studio > = VS2015.1

Począwszy od VS2015.1 , Windows Forms Designer pokazuje klasy, które mają generyczną klasę bazową bez żadnego problemu. Tak więc obejście, które znajduje się w innych postach, nie jest już wymagane dla nowszych wersji VS i następująca klasa będzie wyświetlana w designerze bez żadnego problemu:

public class SomeClassControl:GenericControl<SomeClass>
{
}

Starsze wersje Visual Studio

W przypadku starszych wersji programu Visual Studio użyj obejścia opisanego w innych posty:

public class SomeClassControl:SomeClassControlBase
{
}
public class SomeClassControlBase:GenericControl<SomeClass>{}
 0
Author: Reza Aghaei,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-03-31 13:01:50