Общий базовый класс для WinForm UserControl - PullRequest
37 голосов
/ 24 марта 2009

Я создал базовый базовый класс для WinForm UserControl:

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

И UserControl, основанный на этом:

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

Работает нормально, но MyControl нельзя редактировать в VisualStudio Designer, потому что он говорит, что не может загрузить базовый класс. Я попытался определить другой класс BaseUserControl, не являющийся универсальным, надеясь, что он загрузит его, но уловка не работает.

У меня уже есть обходной путь: определите интерфейс IMyInterface , а затем создайте свой элемент управления как

public partial class MyControl : UserControl, IMyInterface<SomeClass>

Но я теряю свои базовые виртуальные методы (не страшно, но все же ...).

Есть ли способ создать базовый универсальный класс для UserControl с возможностью его редактирования в VisualStudio Designer?

Ответы [ 4 ]

35 голосов
/ 24 марта 2009

Мы делаем то же самое, и мы работаем, сначала специализируя класс, и производные от специализированного класса. Используя код из вашего примера, это означает что-то вроде:

public partial class UserControl : UserControlDesignable 
{

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

Дизайнер по-прежнему иногда ведет себя неуверенно, но в большинстве случаев это работает.

14 голосов
/ 24 марта 2009

Вам придется обмануть конструктора, добавив «обычный» класс, который наследуется от вашей базовой базовой формы. Ваша проектируемая форма должна наследоваться от этого класса. Следующие 2 определения класса находятся в одном файле. Вам нужно убедиться, что класс, который наследуется от базового базового пользовательского элемента управления, является последним классом в файле.

public MyForm : EditableCustomerForm
{}

public EditableCustomerForm : GenericForm<Customer>
{}

Дизайнер отобразит первый класс в файле кода, с которым он сталкивается.

3 голосов
/ 13 августа 2013

Ну, это похоже на ошибку в Visual studio.

Путем углубления в структуру (фактически путем добавления RootDesignerSerializer с пользовательским типом, полученным из CodeDomSerializer и переопределения метода serialize), я смог доказать, что провайдер VS Code Dom фактически анализирует универсальные классы, и вместо того, чтобы рассматривать его как универсальный класс, он рассматривает его как обычный класс с именем class<T>, который Type.GetType(), конечно, не может найти.

Я все еще ищу способ обойти это, но в то же время можно использовать решения выше.

Есть сообщение об ошибке Microsoft.Connect, пожалуйста, проголосуйте по этому номеру https://connect.microsoft.com/VisualStudio/feedback/details/797279/win-forms-designer-error-when-inheriting-from-a-generic-form

0 голосов
/ 25 марта 2018

Версия Visual Studio> = VS2015.1

Начиная с VS2015.1 , Windows Forms Designer показывает классы, которые имеют общий базовый класс без каких-либо проблем. Таким образом, обходной путь, который есть в других статьях, больше не требуется для более новых версий VS, и следующий класс будет показан в конструкторе без каких-либо проблем:

public class SomeClassControl:GenericControl<SomeClass>
{
}

Старые версии Visual Studio

Для более старых версий Visual Studio используйте обходной путь, который описан в других статьях:

public class SomeClassControl:SomeClassControlBase
{
}
public class SomeClassControlBase:GenericControl<SomeClass>{}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...