Наследование WinForms и Визуальный дизайнер
От: e.slyusar  
Дата: 05.09.11 03:13
Оценка:
Добрый день. Возникла следующая проблемма:
Есть базовый класс:

internal abstract class BaseForm<T> : Form
 where T : BaseItem {...}


internal sealed class SpecificForm : BaseForm<MyNode> {}


при наследовании от этого типа, открыть форму (потомка) в дизайнере не получается (MS Visual Studio 2010)
возникает ошибка:


Illegal characters in path.    

Instances of this error (1)  
 
Call Stack:
 
at System.IO.Path.CheckInvalidPathChars(String path)
at System.IO.Path.Combine(String path1, String path2)
at Microsoft.VisualStudio.Platform.VsAppDomainManager.d__1.MoveNext()
at Microsoft.VisualStudio.Platform.VsAppDomainManager.InnerResolveHandler(String name)
at Microsoft.VisualStudio.Platform.VsAppDomainManager.ResolveHandler(Object sender, ResolveEventArgs args)
at System.AppDomain.OnAssemblyResolveEvent(RuntimeAssembly assembly, String assemblyFullName)


вторя ошибка:

 The designer could not be shown for this file because none of the classes within it can be designed. The designer inspected the following classes in the file: UnitForm --- The base class 'PTeam.Mediaplan.MediaplanDictionaryItemForm' could not be loaded. Ensure the assembly has been referenced and that all projects have been built.    
 
Call Stack:
 
at System.ComponentModel.Design.Serialization.CodeDomDesignerLoader.EnsureDocument(IDesignerSerializationManager manager)
at System.ComponentModel.Design.Serialization.CodeDomDesignerLoader.PerformLoad(IDesignerSerializationManager manager)
at Microsoft.VisualStudio.Design.Serialization.CodeDom.VSCodeDomDesignerLoader.PerformLoad(IDesignerSerializationManager serializationManager)
at Microsoft.VisualStudio.Design.Serialization.CodeDom.VSCodeDomDesignerLoader.DeferredLoadHandler.Microsoft.VisualStudio.TextManager.Interop.IVsTextBufferDataEvents.OnLoadCompleted(Int32 fReload)



если же добавить в ирархию наследование новый (промежуточный) тип:

internal abstract class BaseSpecificForm : BaseForm<MyNode> {}


и унаследовать от этого типа

internal sealed class SpecificForm : BaseSpecificForm  {}


то форма SpecificForm открывается в дизайнере форм.

Как можно упростить иерархию наследования и обеспечить возможность редактирование макета формы через встроенный дизайнер MS VisualStudio?
Re: Наследование WinForms и Виуальный дизайнер
От: Osaka  
Дата: 05.09.11 04:56
Оценка:
e> internal abstract class BaseForm<T> : Form
e> в дизайнере не
e> получается (MS Visual Studio 2010) возникает ошибка:
Дизайнер winforms парсит код формы как текст, написан был до появления в
языке всяких <T>, и, похоже, подобное надругательство не осиливает. И
вообще, visual inheritance — это утраченная технология Древних, современному
поколению дизайнерописателей неподвластная.
Posted via RSDN NNTP Server 2.1 beta
Данное сообщение является художественным произведением и освещает вымышленные события в вымышленном мире. Все совпадения с реальностью являются случайными. Не является инвестиционной рекомендацией.
Re[2]: Наследование WinForms и Виуальный дизайнер
От: e.slyusar  
Дата: 05.09.11 05:39
Оценка:
Здравствуйте, Osaka, Вы писали:

e>> internal abstract class BaseForm<T> : Form

e>> в дизайнере не
e>> получается (MS Visual Studio 2010) возникает ошибка:
O>Дизайнер winforms парсит код формы как текст, написан был до появления в
O>языке всяких <T>, и, похоже, подобное надругательство не осиливает. И
O>вообще, visual inheritance — это утраченная технология Древних, современному
O>поколению дизайнерописателей неподвластная.


т.е. получается что generics и Визуальный дизайнер не совместимы?
Re[3]: Наследование WinForms и Виуальный дизайнер
От: bizhan  
Дата: 05.09.11 08:42
Оценка:
Здравствуйте, e.slyusar, Вы писали:

ES>Здравствуйте, Osaka, Вы писали:


e>>> internal abstract class BaseForm<T> : Form

e>>> в дизайнере не
e>>> получается (MS Visual Studio 2010) возникает ошибка:

ES>т.е. получается что generics и Визуальный дизайнер не совместимы?


Совместимы, только через одно место. Надо сделать пустой класс, наследник от BaseForm<T>, с конкретным типом, а
от него уже наследовать свою форму. Это фейковый класс не будет открываться в дизайнере, что пофиг, а своя форма будет:

// file1.cs
public class FakeForm : BaseForm<MyForm>
{
...
}

// file2.cs
public class MyForm : FakeForm
{
...
}


Неудобно и некрасиво, но дочерние формы можно конструировать. А вот если планируется
в BaseForm класть общие контролы, то увы.
Re[3]: Наследование WinForms и Виуальный дизайнер
От: Аноним  
Дата: 05.09.11 08:42
Оценка:
Здравствуйте, e.slyusar, Вы писали:

ES>Здравствуйте, Osaka, Вы писали:


e>>> internal abstract class BaseForm<T> : Form

e>>> в дизайнере не
e>>> получается (MS Visual Studio 2010) возникает ошибка:
O>>Дизайнер winforms парсит код формы как текст, написан был до появления в
O>>языке всяких <T>, и, похоже, подобное надругательство не осиливает. И
O>>вообще, visual inheritance — это утраченная технология Древних, современному
O>>поколению дизайнерописателей неподвластная.


ES>т.е. получается что generics и Визуальный дизайнер не совместимы?


В умелых руках совместимы
см. например WinForms из BL Toolkit
Re[4]: Наследование WinForms и Виуальный дизайнер
От: e.slyusar  
Дата: 05.09.11 09:44
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, e.slyusar, Вы писали:


ES>>Здравствуйте, Osaka, Вы писали:


e>>>> internal abstract class BaseForm<T> : Form

e>>>> в дизайнере не
e>>>> получается (MS Visual Studio 2010) возникает ошибка:
O>>>Дизайнер winforms парсит код формы как текст, написан был до появления в
O>>>языке всяких <T>, и, похоже, подобное надругательство не осиливает. И
O>>>вообще, visual inheritance — это утраченная технология Древних, современному
O>>>поколению дизайнерописателей неподвластная.


ES>>т.е. получается что generics и Визуальный дизайнер не совместимы?


А>В умелых руках совместимы

А>см. например WinForms из BL Toolkit


можно на конкретное место ткнуть?
Re[4]: Наследование WinForms и Виуальный дизайнер
От: e.slyusar  
Дата: 05.09.11 09:50
Оценка:
Здравствуйте, bizhan, Вы писали:

B>Здравствуйте, e.slyusar, Вы писали:


ES>>Здравствуйте, Osaka, Вы писали:


e>>>> internal abstract class BaseForm<T> : Form

e>>>> в дизайнере не
e>>>> получается (MS Visual Studio 2010) возникает ошибка:

ES>>т.е. получается что generics и Визуальный дизайнер не совместимы?


B>Совместимы, только через одно место. Надо сделать пустой класс, наследник от BaseForm<T>, с конкретным типом, а

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

B>
B>// file1.cs
B>public class FakeForm : BaseForm<MyForm>
B>{
B>...
B>}

B>// file2.cs
B>public class MyForm : FakeForm
B>{
B>...
B>}
B>


B>Неудобно и некрасиво, но дочерние формы можно конструировать. А вот если планируется

B>в BaseForm класть общие контролы, то увы.


да я собственно так и сделал — только на мой взгляд не совсем это красиво, хак какой то получается.
Вот и спрашиваю у многоуважаемого сообщества — может быть кто то решал такую проблему?!
или же ее решать только архитектурно?
Re[4]: Наследование WinForms и Виуальный дизайнер
От: e.slyusar  
Дата: 05.09.11 09:58
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, e.slyusar, Вы писали:


ES>>Здравствуйте, Osaka, Вы писали:


e>>>> internal abstract class BaseForm<T> : Form

e>>>> в дизайнере не
e>>>> получается (MS Visual Studio 2010) возникает ошибка:
O>>>Дизайнер winforms парсит код формы как текст, написан был до появления в
O>>>языке всяких <T>, и, похоже, подобное надругательство не осиливает. И
O>>>вообще, visual inheritance — это утраченная технология Древних, современному
O>>>поколению дизайнерописателей неподвластная.


ES>>т.е. получается что generics и Визуальный дизайнер не совместимы?


А>В умелых руках совместимы

А>см. например WinForms из BL Toolkit


В BlToolKit тоже через фейковые объекты сделано (или я не то нашел)


public class EditPersonFormBase : BizEntityForm<EditPersonForm, Person> {}



public partial class EditPersonForm : EditPersonFormBase
{
    public EditPersonForm()
    {
        InitializeComponent();
    }

    protected override void SetBizEntity(Person person)
    {
        personBinder.Object = person;
    }
}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.