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
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?
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.
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.
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ę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>{}
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