Конкретная реализация общей формы не работает в дизайнере - PullRequest
1 голос
/ 15 мая 2009

У меня есть базовый класс, определенный ниже (я также использую компоненты DevExpress):

public abstract partial class BaseFormClass<R> : XtraForm where R : DataRow
{
  ...
}

Вопреки тому, что я читал откуда-то еще, я все еще могу разработать этот класс. Мне не нужно было создавать конкретный класс для этого. Но когда я создаю конкретный класс, унаследованный от него (как показано ниже), этот класс не будет работать в конструкторе.

public partial class ConcreteFormClass : BaseFormClass<StronglyTypedRow>
{
  ...
}

Я получаю это сообщение:

Дизайнер не может быть показан для этот файл, потому что ни один из классов внутри это может быть разработано. дизайнер осмотрел следующее классы в файле: ConcreteFormClass --- База учебный класс 'BaseFormClass' не может быть загружен. Убедитесь, что на сборку ссылались и что все проекты были построены.

Кто-нибудь видел это раньше? Какой-нибудь известный обходной путь?

Ответы [ 2 ]

4 голосов
/ 15 мая 2009

Извините, но это просто не сработает (это позор - раньше я хотел, чтобы вы тоже могли это делать). Проблема в базовой методологии дизайнера.

Чтобы представить вам модель вашей формы, она на самом деле не пытается построить саму форму; если бы он это сделал, вы столкнулись бы с другими проблемами - что если ваша форма не имеет конструктора без параметров? Вместо этого он фактически создает экземпляр базового класса вашей формы. Затем он просматривает ваш InitializeComponents() метод и «накладывает» на все элементы управления, которые вы там определили, на базовую форму.

Так что понятно, почему это не сработает. Вы можете создать экземпляр BaseFormClass, потому что для его создания создается экземпляр XtraForm, который является конкретным. Но вы не можете создать экземпляр ConcreteFormClass, потому что для этого нужно создать экземпляр BaseFormClass, который является абстрактным.

Самый простой способ для этого - просто сделать BaseFormClass неабстрактным. (Если вы хотите быть абсолютно уверенным, что никто не может создать его, возможно, вы могли бы сделать конструктор по умолчанию приватным? Я не уверен, может ли дизайнер справиться с этим, но я не понимаю, почему он не смог.) такова жизнь. Пожаловаться на Microsoft и, возможно, будет лучше в Visual Studio 2012.

0 голосов
/ 09 марта 2010

Это похоже на проблему, похожую на то, как заставить дизайнера отображать формы с абстрактным базовым классом. Я не сделал ни одного универсального множественного наследования, но вы можете хотя бы попробовать мой подход и посмотреть, работает ли он.

Редактировать: Да, хорошо, только что попробовал, мое решение работает точно. Вам просто нужно изменить определение средних классов и определение форм (в #if DEBUG)

Дайте мне знать, сможете ли вы попробовать!

...