2008-12-02 5 views
2

Я получаю эту ошибку:Как связать GridView со списком нескольких типов?

System.Reflection.TargetException: объект не соответствует типу цели.

при попытке связать List<IEvent>, где IEvent может быть назначением, днем ​​рождения или несколькими другими типами событий, связанных с календарем.

ответ

-1

Этого не может быть сделано, не используйте сетку, если вам нужна эта функциональность, это единственный способ обойти ее.

+0

Это может быть сделано, есть несколько обходных путей: использование наследования, а не интерфейсы, провайдеры используют, использовать пользовательские BoundFields (http://iridescence.no/post/FixingBoundFieldSupportforCompositeObjects.aspx) ... – 2010-01-06 16:00:00

2

ChanChan, GridView делает поддержку не привязку к набору интерфейсов, Попробуйте redisigning приложения, чтобы обеспечить привязку только к набору concreate классов. Единственным обходным решением для этого является использование базового класса (в вашем случае Event) и привязка к коллекции событий.

 public class Event 
     { 
      public DateTime StartDate { get; set; } 
     } 
     public class Birthday : Event 
     {  

      public DateTime? EndDate { get; set; } 
     } 
     public class Appointment : Event 
     {  

      public string Place { get; set; } 
     } 
     public class EventCollection : Collection<Event> 
     { 
      public static EventCollection GetEvents() 
      { 
       var events = new EventCollection(); 
       events.Add(new Birthday 
       { 
        EndDate = DateTime.Now.AddDays(1), 
        StartDate = DateTime.Now 
       }); 
       events.Add(new Appointment 
       { 
        Place = "Gallery", 
        StartDate = DateTime.Now 
       }); 
       return events; 
      } 
     } 

Пожалуйста, обратите внимание, что наследование от базовых классов создает «является» отношение, но наследующий от интерфейсов создает «может сделать» отношения. Другими словами, ИМО, реализующий IEvent , будет плохим дизайном, поскольку День рождения - это событие. Я бы наследовал от базового класса здесь.

Надеюсь, что это поможет, Клапан.

1

Это немного больно, чтобы сделать это таким образом, но можно связать список нескольких типов с GridView - вам просто нужно реализовать TypeDescriptionProvider для вашего базового типа.

Подробнее в этой статье: Polymorphic Databinding Solutions

Смежные вопросы