Перекрестное перетаскивание пользовательского типа объектов в WinForms C#

этот вопрос - это близко к тому, что меня интересует, но не совсем.

у меня есть приложение .NET WinForms, написанное на C#. У меня есть ListView control, который отображает массив объектов C#. Я подключил его, чтобы вы могли перетаскивать эти элементы listview в другую форму в том же приложении, и он правильно передает массив объектов (тип Session) к обработчику drop для этой другой формы.

однако теперь я хочу поддержать межпроцессное перетаскивание, где я запускаю несколько экземпляров моего приложения. Это появляется что это будет работать (например,GetDataPresent succeeds), но в конечном итоге выдает исключение, когда я на самом деле пытаюсь получить данные-не могу бросить object[] до Session[].

if (e.Data.GetDataPresent("Fiddler.Session[]"))
{
   Session[] oDroppedSessions;
   try
   {
      oDroppedSessions = (Session[])e.Data.GetData("Fiddler.Session[]");
   }
   catch (Exception eX)
   {  // reaches here 
   }
}

кто-нибудь знает, если я должны реализовать ISerializable для моих объектов, чтобы сделать эту работу? Обычно я бы просто попробовал, но реализация ISerializable для этого класса будет достаточно нетривиально, и я беспокоюсь, что могут быть странные побочные эффекты от этого.


обновление реализация ISerializable не помогает-- метод никогда не вызывается. Аналогично, добавив Serializable атрибут к классу не имеет никакого влияния вообще. Есть другие идеи?

3 ответов


вы пересекаете границу процесса, ссылки на объекты недопустимы в другом процессе. Класс DataObject поддерживает сериализацию объектов, чтобы получить их через стену, он использует BinaryFormatter. Итак, да, вам нужно применить атрибут [Serializable] к вашему классу и убедиться, что ваши объекты могут де/сериализоваться должным образом.


Ok это выстрел, вместо того, чтобы использовать весь массив сеансов, попробуйте сделать это индивидуально, как это...

   Session[] oDroppedSessions;
   try
   {
      if (e.Data.GetData("Fiddler.Session[]") != null){
          object[] objs = e.Data.GetData("Fiddler.Session[]");
          if (objs != null && objs.Length > 1){
             oDroppedSessions = new Session[objs.Length];
             int nIndex = 0;
             foreach(object obj in objs){
                if (obj is Session){
                  oDroppedSessions[nIndex] = (Session)obj;
                  nIndex++;
                }
             }
          }
      }
   }
   catch (Exception eX)
   {  // reaches here }

стоит выстрелить, кроме как стрелять себе в ногу, поскольку я не полностью понимаю часть сеанса, попробуйте...

надеюсь, это поможет, С уважением, Том.


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